Atlasingeniería

Aprendizaje automáticoOptimizaciónTema 3

Estocástico, momento y Adam

Calcular el gradiente con todos los datos es exacto y lentísimo. Usar un puñado por paso introduce ruido, y ese ruido resulta ser parte de por qué funciona.

Para este tema conviene tener claro:Descenso por gradiente: bajar la colina

El descenso por gradiente clásico calcula la pendiente usando el conjunto de datos completo antes de dar un paso. Con millones de ejemplos, eso significa muchísimo cálculo para avanzar una sola vez. La solución es tan directa que parece trampa: usar una muestra.

Estocástico: estimar el gradiente con un lote

El descenso estocástico estima el gradiente con un solo ejemplo, o —lo habitual— con un lote chico de decenas o cientos. Esa estimación es ruidosa, pero se obtiene miles de veces más rápido.

El resultado es que en el mismo tiempo se dan muchísimos más pasos, y en la práctica se llega mucho antes. El camino es errático en vez de suave, y eso importa menos de lo que parece: no hace falta bajar en línea recta, hace falta llegar.

Doce ejemplos de entrenamiento. Una pasada completa por todos ellos es una época.

1 / 6
Los tres recorren exactamente los mismos datos una vez. Lo que cambia es cuántas veces se mueven los pesos en esa pasada, y ése es el número que decide cuán rápido se llega.

Antes de seguir, predecí

Descenso estocástico con lotes de un solo ejemplo. ¿Cómo se ve la curva de costo?

El ruido además ayuda

El ruido además ayuda. Un gradiente exacto en una meseta o cerca de un punto de ensilladura se queda quieto; uno ruidoso se sacude y escapa.

También parece favorecer mínimos “anchos” antes que “angostos”, y hay evidencia de que los anchos generalizan mejor, porque son más tolerantes a pequeños desplazamientos. El tamaño del lote termina siendo un hiperparámetro con dos efectos: lotes grandes usan mejor la GPU y dan menos ruido; lotes chicos regularizan de hecho.

El momento, como una bola que rueda

La primera mejora es el momento. En vez de usar sólo el gradiente actual, se acumula un promedio de los anteriores, como una bola que baja rodando y conserva inercia.

Eso resuelve dos problemas a la vez: atraviesa mesetas donde el gradiente es débil pero consistente, y cancela el zigzagueo en valles angostos, porque las componentes que oscilan se promedian entre sí y las que apuntan siempre igual se refuerzan. Con una línea de código el entrenamiento suele acelerarse notablemente.

Adaptar la tasa por parámetro

La segunda idea es adaptar la tasa por parámetro. No todos los pesos necesitan el mismo paso: los que reciben gradientes grandes y frecuentes conviene moverlos poco, y los que reciben gradientes raros, mucho.

AdaGrad lo hizo dividiendo por la raíz de la suma acumulada de gradientes al cuadrado, con el defecto de que esa suma sólo crece y el paso termina extinguiéndose. RMSProp lo arregló usando un promedio móvil en vez de la suma total.

Adam combina las dos ideas

Adam combina las dos: momento sobre el gradiente y escala adaptativa por parámetro, más una corrección para los primeros pasos, cuando los promedios todavía están sesgados hacia cero.

Es el default razonable: funciona sin ajuste fino en la enorme mayoría de los casos, y por eso se usa en casi todo. Con la observación honesta de que, con la tasa de aprendizaje bien buscada, el estocástico con momento a veces generaliza mejor en visión. Y AdamW, que separa la regularización del paso adaptativo, es lo estándar hoy para modelos grandes.

Calentamiento y decaimiento

Dos prácticas que acompañan. El calentamiento: arrancar con una tasa muy chica y subirla en las primeras iteraciones, porque al principio los promedios internos son poco confiables y un paso grande puede desestabilizar todo.

Y el recorte de gradientes: si la norma del gradiente supera un umbral, escalarlo hacia abajo. Es lo que evita que un lote atípico produzca un paso enorme que destruya el entrenamiento, algo especialmente frecuente en modelos con secuencias.

Cuál usar, en la práctica

OptimizadorQué agregaCuándo conviene
SGDnada: el paso básicocon momento, sigue siendo el mejor para visión
SGD con momentoinercia: suaviza el zigzagueodefault histórico, converge a soluciones que generalizan bien
RMSProptasa por parámetro según su historiarecurrentes
Adammomento más tasa por parámetroel default: anda razonable casi siempre
AdamWAdam con la regularización bien hechael default real hoy en transformers
AdamW existe porque en Adam la penalización L2 interactúa mal con la tasa adaptativa: separar el decaimiento de pesos del gradiente cambia el resultado, y por eso reemplazó a Adam.

Cierre

Lotes chicos dan gradientes ruidosos y muchos más pasos, y ese ruido ayuda a escapar de mesetas. El momento acumula inercia y cancela el zigzagueo; las tasas adaptativas ajustan el paso por parámetro; Adam junta ambas y es el default, con calentamiento y recorte para que no explote.

Autoevaluación

¿Lo entendiste?

¿Por qué el descenso estocástico llega antes, si su gradiente es peor?
El ruido del gradiente estocástico, ¿en qué ayuda?
¿Qué agrega el momento?
¿Qué hace Adam además del momento?