34 votos

Explicación de los picos de pérdida de entrenamiento frente a las iteraciones con Adam Optimizer

Estoy entrenando una red neuronal utilizando i) SGD y ii) Adam Optimizer. Si utilizo el SGD normal, obtengo un pérdida de formación frente a la iteración curva como se ve a continuación (la roja). Sin embargo, cuando utilicé el optimizador de Adam, 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 Adam beta_1 = 0.9 , beta_2 = 0.999 , epsilon = 1e-8 y un batch_size = 32 .

i) Con SGD With SGD ii) Con Adán With Adam

28voto

seanl Puntos 405

Los picos son una consecuencia inevitable de la técnica del Mini-Batch Gradient Descent en Adam ( batch_size=32 ). Algunos minilotes tienen "por casualidad" datos poco afortunados para la optimización, lo que induce esos picos que se ven en la función de costes con Adam. Si intenta el descenso de gradiente estocástico (igual que si utiliza batch_size=1 ) verá que hay aún más picos en la función de costes. Lo mismo no ocurre en (Full) Batch GD porque utiliza todos los datos de entrenamiento (es decir, el tamaño del lote es igual a la cardinalidad de su conjunto de entrenamiento) cada época de optimización. Como en tu primer gráfico el coste es monotónicamente decreciente, parece que el título ( i) Con SGD ) es incorrecto y está utilizando el descenso de gradiente por lotes (completo) en lugar de SGD.

En su gran Curso de aprendizaje profundo en Coursera Andrew Ng lo explica con todo lujo de detalles en la siguiente imagen:

Cost functions

23voto

mehaase Puntos 825

He pasado una cantidad insana de tiempo depurando gradientes explosivos y comportamientos similares. La respuesta dependerá de la función de pérdida, los datos, la arquitectura, etc. Hay cientos de razones. Voy a nombrar algunas.

  • Depende de la pérdida. Las pérdidas de Loglikelihood necesitan ser recortadas, si no, puede evaluar cerca de log(0) para las malas predicciones / valores atípicos en el conjunto de datos, causando la explosión de los gradientes. La mayoría de los paquetes (torch, tensorflow, etc.) implementan el recorte por defecto para sus pérdidas.
  • Valores atípicos en el conjunto de datos.
  • BatchNorm con un tamaño de lote pequeño y un épsilon grande $\epsilon$ (hiperparámetro). Con batchnorm como $y=(x-u)/(s+\epsilon)$ y, a continuación, con una pequeña $s$ y $\epsilon$ se pueden obtener altas magnitudes de $y$
  • El último lote de una época puede ser pequeño si el conjunto de datos no es divisible por el tamaño del lote. En el cargador de datos de Torch hay una bandera drop_last . Pequeño tamaño de lote = alta varianza

¿Ahora por qué lo ves con Adam y no con SGD? Está claro que con Adán has llegado a una pérdida menor. Como se señaló antes, si el 99,9% del conjunto de datos tiene óptimos en un punto excepto alguna observación, esto puede ser que la observación gritando "NO" y saltando fuera de los mínimos locales cuando se selecciona al azar a un lote. Si se ve cada dataset_size//batch_size+1 -pasos, probablemente se deba a que el tamaño del lote final es pequeño. Apuesto a que verás el pico de SGD también si dejas que alcance una pérdida menor.

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?) está inicializada muy fuera de escala (con pesos grandes/pequeños).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X