¿Por qué la tasa de aprendizaje hace que los pesos de mi red neuronal se disparen?

9

Estoy usando tensorflow para escribir redes neuronales simples para un poco de investigación y he tenido muchos problemas con los pesos 'nan' durante el entrenamiento. Probé muchas soluciones diferentes, como cambiar el optimizador, cambiar la pérdida, el tamaño de los datos, etc., pero fue en vano. Finalmente, noté que un cambio en la tasa de aprendizaje hizo una diferencia increíble en mis pesos.

Usando una tasa de aprendizaje de .001 (que pensé que era bastante conservadora), la función minimizar aumentaría la pérdida exponencialmente. Después de una época, la pérdida podría saltar de un número de miles a un billón y luego al infinito ('nan'). Cuando bajé la tasa de aprendizaje a .0001, todo funcionó bien.

1) ¿Por qué un solo orden de magnitud tiene tal efecto?

2) ¿Por qué la función minimizar realiza literalmente lo contrario de su función y maximiza la pérdida? Me parece que eso no debería ocurrir, sin importar la tasa de aprendizaje.

abeoliver
fuente
¿Puedes decir cómo has inicializado tus pesas?
Himanshu Rai
Sugiero probar el solucionador Adam. Parece tener un mejor comportamiento y un mejor valor predeterminado, y es posible que pueda usar las tasas de aprendizaje predeterminadas para ello.
DW

Respuestas:

9

Puede encontrar útil el Capítulo 8 de Deep Learning . En él, los autores discuten el entrenamiento de modelos de redes neuronales. Es muy complejo, así que no me sorprende que estés teniendo dificultades.

Una posibilidad (además del error del usuario) es que su problema está muy mal condicionado. Los métodos de descenso de gradiente utilizan solo la primera información derivada (gradiente) al calcular una actualización. Esto puede causar problemas cuando la segunda derivada (el hessiano) está mal condicionada.

Cita de los autores:

H

El problema del mal acondicionamiento generalmente se cree que está presente en los problemas de entrenamiento de la red neuronal. El mal acondicionamiento puede manifestarse al hacer que SGD se atasque en el sentido de que incluso pasos muy pequeños aumentan la función de costo. [mi énfasis agregado]

Los autores proporcionan una derivación simple para mostrar que este puede ser el caso. Usando el descenso de gradiente, la función de costo debería cambiar (a segundo orden) por

ε22solTHsol-εsolTsol

solHεεε

vbox
fuente
2
Me parece que esta respuesta de quora ofrece una explicación bastante intuitiva a los malos condicionamientos del hessiano.
Oren Milman
3

1) ¿Por qué un solo orden de magnitud tiene tal efecto?

2) ¿Por qué la función minimizar realiza literalmente lo contrario de su función y maximiza la pérdida? Me parece que eso no debería ocurrir, sin importar la tasa de aprendizaje.

Hay dos razones principales. Primero, no está utilizando los mismos datos en el primer paso que en el segundo. Si en el primer paso el modelo aprende esos valores y cae en un mínimo local, entonces es muy probable que produzca una mayor pérdida para los nuevos valores.

La segunda razón es la forma de la función de costo. Intenta minimizar el valor en pequeños pasos, la longitud de esos pasos viene dada por dos factores: el gradiente y la tasa de aprendizaje. Imagen su función es como x ^ 2. Si sus valores están cerca de 0, el gradiente será más pequeño que si fuera más, pero si su tasa de aprendizaje es grande, entonces, en lugar de acercarse a 0, aumentará el error porque su nuevo punto se basa en la calificación y la tasa de aprendizaje está más allá de 0 que su paso anterior. Y esto puede suceder varias veces.

Eche un vistazo a este enlace: http://www.statisticsviews.com/details/feature/5722691/Getting-to-the-Bottom-of-Regression-with-Gradient-Descent.html

Si ve las cifras con alfa 0.01 y alfa 0.12, verá cómo en la primera figura la tasa de aprendizaje es pequeña y, por lo tanto, el gradiente se acerca al mínimo, pero en el segundo caso la tasa de aprendizaje es tan grande que el gradiente se mueve más allá en cada paso.

jorgemf
fuente
1
Con respecto a la segunda razón: esta respuesta demuestra (usando funciones simples) cuándo el descenso del gradiente podría divergir. Esa respuesta también tiene código Python para que pueda experimentar y ver cómo se comporta el descenso del gradiente en diferentes escenarios ...
Oren Milman