Saltar al contenido

Pérdida de NaN al entrenar la red de regresión

Estate atento porque en esta noticia hallarás la solución que buscas.Esta división ha sido evaluado por nuestros especialistas para garantizar la calidad y veracidad de nuestro post.

Solución:

La regresión con redes neuronales es difícil de hacer funcionar porque la salida no tiene límites, por lo que es especialmente propenso al problema de los gradientes explosivos (la causa probable de los nans).

Históricamente, uno key La solución a los gradientes explosivos era reducir la tasa de aprendizaje, pero con la llegada de los algoritmos de tasa de aprendizaje adaptable por parámetro como Adam, ya no es necesario establecer una tasa de aprendizaje para obtener un buen rendimiento. Hay muy pocas razones para usar SGD con impulso, a menos que sea un fanático de las redes neuronales y sepa cómo ajustar el programa de aprendizaje.

Aquí hay algunas cosas que podría intentar:

  1. Normalice sus salidas mediante la normalización por cuantiles o la puntuación z. Para ser riguroso, calcule esta transformación en los datos de entrenamiento, no en todo el conjunto de datos. Por ejemplo, con la normalización por cuantiles, si un ejemplo está en el percentil 60 del conjunto de entrenamiento, obtiene un valor de 0,6. (También puede cambiar los valores normalizados del cuantil en 0,5 para que el percentil 0 sea -0,5 y el percentil 100 sea +0,5).

  2. Agregar regularización, ya sea aumentando la tasa de deserción o agregando penalizaciones L1 y L2 a los pesos. La regularización de L1 es análoga a la selección de funciones, y dado que usted dijo que reducir la cantidad de funciones a 5 brinda un buen rendimiento, L1 también puede hacerlo.

  3. Si esto aún no ayuda, reduzca el tamaño de su red. Esta no siempre es la mejor idea ya que puede dañar el rendimiento, pero en su caso tiene una gran cantidad de neuronas de primera capa (1024) en relación con las funciones de entrada (35), por lo que puede ayudar.

  4. Aumente el tamaño del lote de 32 a 128. 128 es bastante estándar y podría aumentar potencialmente la estabilidad de la optimización.

La respuesta de 1″ es bastante buena. Sin embargo, todas las correcciones parecen solucionar el problema indirectamente en lugar de directamente. Recomendaría usar el recorte de degradado, que recortará cualquier degradado que esté por encima de cierto valor.

En Keras puedes usar clipnorm=1 (consulte https://keras.io/optimizers/) para simplemente recortar todos los gradientes con una norma superior a 1.

Me enfrenté al mismo problema antes. Busco y encuentro esta pregunta y respuestas. Todos los trucos mencionados anteriormente son importantes para entrenar una red neuronal profunda. Los probé todos, pero aún obtuve NAN.

También encuentro esta pregunta aquí. https://github.com/fchollet/keras/issues/2134. Cité el resumen del autor de la siguiente manera:

Quería señalar esto para que esté archivado para otras personas que puedan experimentar este problema en el futuro. Me encontré con mi función de pérdida que de repente devolvió un nan después de que llegó tan lejos en el proceso de entrenamiento. Revisé el relus, el optimizador, la función de pérdida, mi abandono de acuerdo con el relus, el tamaño de mi red y la forma de la red. Todavía estaba teniendo una pérdida que finalmente se convirtió en un nan y me estaba frustrando bastante.

Entonces me di cuenta. Puedo tener alguna mala entrada. Resultó que una de las imágenes que estaba entregando a mi CNN (y haciendo la normalización media) no era más que 0. No estaba comprobando este caso cuando resté la media y normalicé por la desviación estándar y, por lo tanto, terminé con una matriz ejemplar que no era más que la de nan. Una vez que arreglé mi función de normalización, mi red ahora entrena perfectamente.

Estoy de acuerdo con el punto de vista anterior: la entrada es sensible para su red. En mi caso, Utilizo el valor logarítmico de la estimación de densidad como entrada. El valor absoluto podría ser muy grande, lo que puede resultar en NaN después de varios pasos de gradientes. Creo que la verificación de entrada es necesaria. Primero, debe asegurarse de que la entrada no incluir -inf o inf, o algunos números extremadamente grandes en valor absoluto.

Si te gusta la programación, tienes la habilidad dejar una división acerca de qué le añadirías a esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *