Optimizadores de descenso de gradiente: de SGD a Adam
El problema central
Entrenar una red neuronal significa minimizar una función de pérdida sobre potencialmente miles de millones de parámetros . El descenso de gradiente lo hace iterativamente:
donde es el learning rate. El problema es que calcular el gradiente completo sobre todo el dataset resulta prohibitivamente costoso, por lo que utilizamos variantes estocásticas.
Descenso de gradiente estocástico (SGD)
SGD calcula el gradiente sobre un mini-batch aleatorio de tamaño :
Esto introduce ruido, pero ese ruido actúa como regularizador y ayuda a escapar de mínimos estrechos. Con momentum, acumulamos un vector de velocidad:
El momentum () suaviza las actualizaciones y acelera la convergencia en direcciones de gradiente consistentes.
AdaGrad
AdaGrad adapta el learning rate por parámetro según los gradientes al cuadrado acumulados:
Los parámetros que reciben gradientes grandes obtienen un learning rate efectivo menor. Esto ayuda con variables dispersas, como embeddings de palabras, pero el crecimiento monótono de hace que el learning rate termine decayendo casi hasta cero.
RMSProp
RMSProp corrige el problema de decaimiento de AdaGrad con una media móvil exponencial:
Un valor típico es . El learning rate efectivo se estabiliza en lugar de decaer indefinidamente.
Adam
Adam (Adaptive Moment Estimation) combina momentum y RMSProp:
Como , las primeras estimaciones están sesgadas hacia cero. La corrección del sesgo es:
Los valores por defecto , , funcionan bien en una amplia variedad de tareas.
AdamW
Adam tiene una sutileza: la regularización L2 mediante weight decay interactúa con los learning rates adaptativos de una forma no deseada. AdamW desacopla el weight decay de la actualización del gradiente:
Es la opción estándar para entrenar Transformers y LLM modernos.
Uso con PyTorch
import torch.optim as optim
# SGD with momentum
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=1e-4)
# Adam
optimizer = optim.Adam(model.parameters(), lr=1e-3, betas=(0.9, 0.999))
# AdamW (preferred for Transformers)
optimizer = optim.AdamW(model.parameters(), lr=3e-4, weight_decay=0.01)
# Learning rate scheduler
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=100)
Calendarios del learning rate
Independientemente del optimizador, el calendario del learning rate tiene un gran impacto:
| Calendario | Descripción | Caso de uso |
|---|---|---|
| Constante | fijo | Experimentos rápidos |
| Step decay | Multiplica por cada épocas | Entrenamiento estilo ResNet |
| Cosine annealing | sigue una curva coseno | Deep learning general |
| Warmup + cosine | Warmup lineal y después coseno | Transformers, LLM |
| OneCycleLR | Subida rápida y bajada lenta | Entrenamientos cortos |
Cuándo utilizar cada opción
- SGD + momentum: visión por computador (ResNet, ConvNet) — a menudo alcanza mejor generalización que Adam con el calendario adecuado
- Adam/AdamW: NLP, Transformers y cualquier tarea con gradientes dispersos
- RMSProp: RNN y reinforcement learning
- AdaGrad: variables de entrada dispersas, NLP con representaciones bag-of-words
Ideas clave
- SGD es un baseline fuerte para visión; Adam/AdamW domina en lenguaje
- Desacopla el weight decay del escalado adaptativo del gradiente: usa AdamW, no Adam + L2
- El calendario del learning rate suele importar tanto como el optimizador
- El warmup evita inestabilidad al inicio del entrenamiento de Transformers