¿Cómo funciona el método Adam de descenso de gradiente estocástico?

45

Estoy familiarizado con los algoritmos básicos de descenso de gradiente para entrenar redes neuronales. He leído el documento que propone a Adam: ADAM: UN MÉTODO PARA LA OPTIMIZACIÓN ESTOCÁSTICA .

Si bien definitivamente tengo algunas ideas (al menos), el documento parece tener un nivel demasiado alto para mí en general. Por ejemplo, una función de costo es a menudo una suma de muchas funciones diferentes, por lo tanto, se debe hacer una gran cantidad de cálculos para optimizar su valor; los descensos de gradiente estocástico, hasta donde entiendo el tema, calculan la optimización solo para un subconjunto de estas funciones. Para mí no está claro, cómo Adam hace esto y por qué esto resulta en un error de entrenamiento disminuido para todo .J(θ)J(θ)

Creo que Adam actualiza su gradiente teniendo en cuenta el gradiente anterior. ¿Lo llaman algo así como utilizar el impulso? ¿Qué es exactamente este impulso? Según el algoritmo de la página dos del documento, ¿es algún tipo de promedio móvil, como algunas estimaciones del primer y segundo momento del gradiente "regular"?

Prácticamente, sospecharía que Adam le permite a uno usar tamaños de paso efectivos más grandes para disminuir el gradiente y, por lo tanto, el error de entrenamiento en combinación con la aproximación estocástica. Por lo tanto, el vector de actualización resultante debería "saltar" más en dimensiones espaciales, más bien describiendo alguna curva como lo harían los algoritmos normales de descenso de gradiente.

¿Alguien puede desmitificar cómo trabaja Adam? ¿Especialmente cómo converge, específicamente por qué funciona el método de Adam y cuál es exactamente el beneficio?

daniel451
fuente
1
Debe proporcionar un mejor título para su pregunta. ¿Qué es exactamente lo que quieres preguntar sobre Adam? Incluso si es en general, trate de hacerlo un poco más buscable.
Charlie Parker el

Respuestas:

40

El artículo de Adam dice: "... muchas funciones objetivas se componen de una suma de subfunciones evaluadas en diferentes submuestras de datos; en este caso, la optimización se puede hacer más eficiente tomando pasos de gradiente con subfunciones individuales ..." Aquí, simplemente significa que la función objetivo es una suma de errores sobre los ejemplos de entrenamiento, y el entrenamiento puede realizarse en ejemplos individuales o minibatches. Esto es lo mismo que en el descenso de gradiente estocástico (SGD), que es más eficiente para problemas a gran escala que el entrenamiento por lotes porque las actualizaciones de parámetros son más frecuentes.

En cuanto a por qué trabaja Adam, usa algunos trucos.

Uno de estos trucos es el impulso, que puede dar una convergencia más rápida. Imagine una función objetivo que tiene la forma de un cañón largo y estrecho que gradualmente se inclina hacia un mínimo. Digamos que queremos minimizar esta función usando el descenso de gradiente. Si comenzamos desde algún punto en la pared del cañón, el gradiente negativo apuntará en la dirección del descenso más pronunciado, es decir, principalmente hacia el suelo del cañón. Esto se debe a que las paredes del cañón son mucho más empinadas que la pendiente gradual del cañón hacia el mínimo. Si la tasa de aprendizaje (es decir, el tamaño del escalón) es pequeña, podríamos descender al fondo del cañón y luego seguirla hacia el mínimo. Pero, el progreso sería lento. Podríamos aumentar la tasa de aprendizaje, pero esto no cambiaría la dirección de los pasos. En este caso, sobrepasaríamos el piso del cañón y terminaríamos en la pared opuesta. Luego repetiríamos este patrón, oscilando de pared a pared mientras avanzamos lentamente hacia el mínimo. El impulso puede ayudar en esta situación.

Momentum simplemente significa que se agrega una fracción de la actualización anterior a la actualización actual, de modo que las actualizaciones repetidas en una dirección particular se componen; acumulamos impulso, moviéndonos más y más rápido en esa dirección. En el caso del cañón, acumularíamos ímpetu en la dirección del mínimo, ya que todas las actualizaciones tienen un componente en esa dirección. Por el contrario, moverse hacia adelante y hacia atrás a través de las paredes del cañón implica invertir constantemente la dirección, por lo que el impulso ayudaría a amortiguar las oscilaciones en esas direcciones.

Otro truco que usa Adam es seleccionar adaptativamente una tasa de aprendizaje separada para cada parámetro. Los parámetros que normalmente recibirían actualizaciones más pequeñas o menos frecuentes reciben actualizaciones más grandes con Adam (lo contrario también es cierto). Esto acelera el aprendizaje en los casos en que las tasas de aprendizaje adecuadas varían según los parámetros. Por ejemplo, en redes profundas, los gradientes pueden volverse pequeños en las primeras capas, y tiene sentido aumentar las tasas de aprendizaje para los parámetros correspondientes. Otro beneficio de este enfoque es que, dado que las tasas de aprendizaje se ajustan automáticamente, la sintonización manual se vuelve menos importante. El SGD estándar requiere un ajuste cuidadoso (y posiblemente un ajuste en línea) de las tasas de aprendizaje, pero esto es menos cierto con Adam y los métodos relacionados. Todavía es necesario seleccionar hiperparámetros,

Métodos relacionados :

Momentum a menudo se usa con SGD estándar. Una versión mejorada se llama impulso de Nesterov o gradiente acelerado de Nesterov. Otros métodos que usan tasas de aprendizaje ajustadas automáticamente para cada parámetro incluyen: Adagrad, RMSprop y Adadelta. RMSprop y Adadelta resuelven un problema con Adagrad que podría hacer que el aprendizaje se detenga. Adam es similar a RMSprop con impulso. Nadam modifica a Adam para usar el impulso de Nesterov en lugar del impulso clásico.

referencias :

Kingma y Ba (2014) . Adam: un método para la optimización estocástica.

Goodfellow y col. (2016) . Aprendizaje profundo, capítulo 8.

Diapositivas del curso de Geoff Hinton

Dozat (2016) . Incorporando Nesterov Momentum en Adam.

usuario20160
fuente
2
(+1) La comunidad se beneficiaría enormemente si pudiera actualizar su respuesta para incluir más información sobre las pruebas de las convergencias de Adán y sus correcciones, como "Sobre la convergencia de Adán y más allá" openreview.net/forum?id=ryQu7f- RZ
Restablecer Monica
2
Gracias @Sycorax, intentaré actualizar cuando tenga tiempo
user20160
1
IIUC, Adam usa algo similar al impulso, pero diferente. Como escribió, el método de impulso agrega la actualización actual a una fracción (grande) de la actualización anterior. En contraste, Adam usa un promedio exponencialmente decreciente de los últimos gradientes donde la mayoría de los métodos SGD usan el gradiente actual. Es decir, cada paso Adam toma solo una pequeña fracción del gradiente actual. Entonces, a diferencia de una bola simple que acumula impulso, Adam se comporta como una bola pesada con fricción, como se explica en las GAN entrenadas por una regla de actualización de dos escalas de tiempo convergen a un equilibrio local de Nash . w
Oren Milman
Continuando con mi último comentario, esta respuesta explica las diferencias entre Adam y rmsprop con ímpetu, mientras se enfoca en cómo el comportamiento de ímpetu de Adam es diferente del comportamiento habitual de ímpetu. (Esa respuesta también incluye el código Python para simular y mostrar gráficamente cómo se comportan los diferentes métodos).
Oren Milman