Pasé una cantidad de tiempo increíble depurando gradientes explosivos y comportamientos similares. Su respuesta dependerá de la función de pérdida, datos, arquitectura, etc. Hay cientos de razones. Voy a nombrar algunos.
- Dependiendo de la pérdida. Es necesario recortar las pérdidas de probabilidad de probabilidad, de lo contrario, puede evaluar cerca
log(0)
de malas predicciones / valores atípicos en el conjunto de datos, causando gradientes explosivos. La mayoría de los paquetes (antorcha, tensorflow, etc.) implementan recorte por defecto para sus pérdidas.
- Valores atípicos en el conjunto de datos.
- ϵy= ( x - u ) / ( s + ϵ )sϵy
- El lote final en una época puede ser pequeño si el conjunto de datos no es divisible por lote. En el cargador de datos de antorcha hay una bandera
drop_last
. Tamaño de lote pequeño = alta varianza
Ahora, ¿por qué lo ves con Adam y no con SGD? Claramente alcanzaste una pérdida menor con Adam. Como se señaló anteriormente, si el 99.9% del conjunto de datos tiene valores óptimos en un punto, excepto alguna observación, esta puede ser esa observación que grita "NO" y salta de los mínimos locales cuando se selecciona al azar a un lote. Si lo ve cada paso dataset_size//batch_size+1
, probablemente se deba a que el tamaño final del lote es pequeño. Apuesto a que también verás un pico de SGD si dejas que alcance una menor pérdida.
Bonificación: Su disminución realmente rápida con el optimizador de impulso (Adam) podría significar que alguna capa (¿capa de entrada? ¿Capa de salida?) Se inicializa fuera de escala (a pesos grandes / pequeños).