Estoy entrenando una red neuronal usando i) SGD y ii) Adam Optimizer. Cuando uso SGD normal, obtengo una curva de pérdida de entrenamiento suave versus iteración como se ve a continuación (la roja). Sin embargo, cuando utilicé el Adam Optimizer, la curva de pérdida de entrenamiento tiene algunos picos. ¿Cuál es la explicación de estos picos?
Detalles del modelo:
14 nodos de entrada -> 2 capas ocultas (100 -> 40 unidades) -> 4 unidades de salida
Estoy utilizando los parámetros por defecto para Adán beta_1 = 0.9
, beta_2 = 0.999
, epsilon = 1e-8
y batch_size = 32
.
neural-networks
deep-learning
adam
Abdul Fatir
fuente
fuente
Respuestas:
Los picos son una consecuencia inevitable del Mini-Batch Gradient Descent en Adam (
batch_size=32
). Algunos mini lotes tienen datos desafortunados 'por casualidad' para la optimización, lo que induce esos picos que ves en tu función de costos usando Adam. Si prueba el descenso de gradiente estocástico (igual que el usobatch_size=1
), verá que hay incluso más picos en la función de costo. No ocurre lo mismo en Batch GD (completo) porque usa todos los datos de entrenamiento (es decir, el tamaño del lote es igual a la cardinalidad de su conjunto de entrenamiento) en cada época de optimización. Como en su primer gráfico, el costo está disminuyendo monotónicamente sin problemas, parece que el título ( i) Con SGD ) es incorrecto y está utilizando el Descenso de gradiente de lote (completo) en lugar de SGD.En su gran curso de aprendizaje profundo en Coursera , Andrew Ng explica con gran detalle esto usando la imagen a continuación:
fuente
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.
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.drop_last
. Tamaño de lote pequeño = alta varianzaAhora, ¿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).
fuente