Условие
Чем отличается SGD от Adam? Когда что использовать? Зачем нужны learning rate schedules?
Решение
Подход
SGD.
w ← w − η · ∇L(w) (на батче). Простой, надёжный. С импульсом (momentum) работает заметно лучше: эффективно усредняет градиент по нескольким шагам, помогая преодолевать локальные «ущелья».
Adam.
Поддерживает индивидуальные адаптивные learning rate для каждого параметра. Использует первое (m_t) и второе (v_t) моменты градиентов:
m_t = β₁ m_{t-1} + (1 − β₁) g_tv_t = β₂ v_{t-1} + (1 − β₂) g_t²w ← w − η · m̂_t / (sqrt(v̂_t) + ε)
Когда что.
- SGD with momentum часто даёт лучший финальный качество на CV/классификации изображений. Стандарт в больших моделях типа ResNet.
- Adam быстро сходится, надёжно работает «из коробки», особенно на трансформерах и небольших датасетах. AdamW (отдельный weight decay) — стандарт для трансформеров.
- SGD vs Adam: Adam генерализуется хуже на больших сверточных сетях. SGD с momentum + правильный schedule часто бьёт Adam по final accuracy.
Learning rate schedules.
- Step decay: умножаем lr на 0.1 каждые N эпох.
- Cosine annealing: lr плавно убывает по косинусу до нуля.
- Warmup: первые
kшагов lr растёт от 0 до базового — критично для трансформеров. - One-cycle: lr сначала растёт, потом падает; популярен в fastai.
import torch.optim as optim
opt = optim.AdamW(model.parameters(), lr=3e-4, weight_decay=0.01)
sched = optim.lr_scheduler.CosineAnnealingLR(opt, T_max=epochs)
for epoch in range(epochs):
train_one_epoch()
sched.step()Подводные камни
- Adam с большим lr на трансформерах без warmup — рецепт NaN. Всегда warmup в первые ~1k шагов.
- Weight decay в Adam работает не как L2 в SGD (через градиент). Используйте AdamW, в котором decay добавлен корректно.
- Learning rate vs batch size. При увеличении батча в k раз — увеличивайте lr примерно в
sqrt(k)(или k для linear scaling rule). - SGD без momentum обычно не нужен — momentum 0.9 берётся по умолчанию почти всегда.
- Lr слишком маленький → долгая сходимость; слишком большой → расходимость или осцилляции. Прогон learning rate finder (Smith) экономит часы.
Эталонный ответ
SGD with momentum — надёжно, генерализуется лучше на CV; Adam/AdamW — быстро сходится и хорошо работает на NLP/трансформерах. Lr-schedule с warmup + cosine/step decay почти всегда улучшает результат. AdamW (отдельный weight decay) — выбор по умолчанию для трансформеров.