Explicación de Spikes en pérdida de entrenamiento vs. iteraciones con Adam Optimizer

16

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-8y batch_size = 32.

i) Con SGD ii) Con AdamCon SGD Con adam

Abdul Fatir
fuente
Para futuros avisos, la reducción de su tasa de aprendizaje inicial puede ayudar a eliminar los picos en Adam
negrita

Respuestas:

12

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 uso batch_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:

Funciones de costo

xboard
fuente
2
'SGD ... usa todos los datos de entrenamiento', ¿estás seguro de esto? Esto significa que los pesos se actualizan después de que todos los datos se envían, pero esto se llama gd de lote completo, no sgd. Estocástico implica minibatch
Alex
Gracias @Alex por señalar mi error, ya lo arreglé y mejoré la respuesta con referencia para obtener más información.
xboard
@xboard - No, estoy usando el descenso de gradiente mini-lote para el primero.
Abdul Fatir
6

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-tu)/ /(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).

ragulpr
fuente