Диагностика Mock-интервью
Главная · Нейронные сети

Оптимизаторы: SGD, Momentum, Adam

Backprop выдал градиенты — но как именно делать шаг? От выбора оптимизатора зависит, будет модель учиться часами или неделями и сойдётся ли вообще. Разберём эволюцию: SGD → Momentum → RMSProp → Adam → AdamW.

Интуиция

Представь шарик, скатывающийся по ландшафту функции потерь. Стохастический градиентный спуск (SGD, stochastic gradient descent) — шарик без массы: каждый шаг он идёт строго против текущего градиента, посчитанного по случайному мини-батчу:

θ ← θ − η·g

У этого шарика две проблемы. Первая — овраги: если поверхность вытянута (по одному направлению крутая, по другому пологая), шарик прыгает поперёк оврага и еле ползёт вдоль него. Вторая — шум: градиент по мини-батчу — лишь зашумлённая оценка настоящего, и траектория дёргается.

Как это работает

Momentum добавляет шарику массу: вместо сырого градиента накапливаем скорость — экспоненциальное скользящее среднее градиентов с коэффициентом β ≈ 0.9:

v ← β·v + g,    θ ← θ − η·v

Колебания поперёк оврага противоположны по знаку и гасят друг друга, а вклад вдоль оврага накапливается — шарик разгоняется в правильном направлении. β = 0.9 — это, грубо, усреднение по последним ~10 градиентам.

RMSProp атакует другую проблему: у разных параметров разный масштаб градиентов. Он ведёт скользящее среднее квадратов градиентов и делит шаг на его корень: параметры с постоянно большими градиентами шагают скромнее, с маленькими — смелее. Это и есть адаптивный learning rate (per-parameter).

Adam (adaptive moment estimation) = momentum + RMSProp. Он ведёт два момента:

m ← β1·m + (1−β1)·g     v ← β2·v + (1−β2)·g²     θ ← θ − η·m̂ / (√v̂ + ε)

где m̂ = m/(1−β1t) и v̂ = v/(1−β2t) — поправка смещения (bias correction): m и v стартуют с нулей и в первые шаги занижены, поправка компенсирует это. Типичные значения: β1 = 0.9, β2 = 0.999.

AdamW — Adam с исправленным weight decay: штраф за большие веса применяется отдельным слагаемым θ ← θ − η·λ·θ, а не подмешивается в градиент (как в L2-регуляризации), где его исказила бы адаптивная нормировка. Сегодня AdamW — дефолт для обучения трансформеров.

💡 Ключевая мысль Learning rate важнее выбора оптимизатора: плохой η угробит и Adam, а хорошо подобранный η часто делает даже SGD конкурентоспособным. Сначала тюнь η, потом всё остальное.

Что выбирать на практике

Для трансформеров и LLM ответ почти безальтернативный: AdamW с warmup и косинусным расписанием. SGD с momentum до сих пор жив в компьютерном зрении (ResNet-ы на нём часто обобщают чуть лучше), но требует более тщательного тюнинга. Типичные стартовые значения, которые стоит помнить: η ≈ 3·10−4 для файнтюнинга небольших моделей, β1 = 0.9, β2 = 0.999, weight decay ≈ 0.01–0.1 — и почти никто их не трогает, кроме learning rate.

Про расписание learning rate (learning rate schedule) достаточно знать два приёма. Warmup — первые сотни/тысячи шагов η линейно растёт от нуля: в начале обучения оценки моментов Adam ещё шумные, а градиенты большие, и полный шаг может разнести модель. Cosine schedule — после разогрева η плавно спадает по косинусу к почти нулю: крупные шаги в начале, аккуратная шлифовка в конце. Проверь в интерактиве: слишком большой η заставляет Momentum осциллировать через весь овраг, а слишком маленький — оставляет SGD ползти вдоль дна почти вечно.

⚠️ Подводный камень У Adam есть состояние: два момента на каждый параметр. Это ×2 к памяти под оптимизатор (для 7B-модели в fp32 — ещё ~56 ГБ поверх весов) — одна из главных статей расхода при обучении LLM и причина существования 8-bit оптимизаторов и ZeRO-шардинга. И не забывай: состояние оптимизатора нужно сохранять в чекпоинт.
🎤 На собеседовании
  • «Чем Adam отличается от SGD с momentum?» — Adam добавляет второй момент (среднее квадратов градиентов) и делит шаг на его корень: адаптивный масштаб на каждый параметр + bias correction.
  • «Зачем в Adam bias correction?» — m и v инициализируются нулями и в первые шаги занижены; поправка 1/(1−βt) устраняет смещение.
  • «В чём разница Adam и AdamW?» — weight decay применяется отдельно от градиента, а не через L2-штраф, который искажается адаптивной нормировкой.
  • «Зачем warmup?» — защищает от разноса в первые шаги, пока статистики моментов не накопились.