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

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

Раздел: [Нейронные сети](https://ml-book.com/s/neural-nets/) · Страница темы: https://ml-book.com/t/optimizers/ · Обновлено: 2026-07-07 · Источник: ml-book.com, учебник делается сообществом

## Интуиция

Представь шарик, скатывающийся по ландшафту функции потерь. Стохастический градиентный спуск (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−β_1^t) и v̂ = v/(1−β_2^t) — поправка смещения (bias correction): m и v стартуют с нулей и в первые шаги занижены, поправка компенсирует это. Типичные значения: β_1 = 0.9, β_2 = 0.999.

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

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

> 🎛 Интерактивная визуализация — на странице темы: https://ml-book.com/t/optimizers/

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

Для трансформеров и 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?» — защищает от разноса в первые шаги, пока статистики моментов не накопились.

## Связанные темы

- [Градиентный спуск](https://ml-book.com/t/gradient-descent/)
- [Обратное распространение ошибки](https://ml-book.com/t/backprop/)
- [Практика обучения: батчи, dropout, batchnorm](https://ml-book.com/t/training-practice/)
- [Претрейнинг и scaling laws](https://ml-book.com/t/pretraining/)

---

Интерактив, тест из 12 вопросов и карточки терминов — на странице темы: https://ml-book.com/t/optimizers/
Весь учебник в markdown: https://ml-book.com/llms-full.txt · Оглавление для агентов: https://ml-book.com/llms.txt
