Оптимизаторы: SGD, Momentum, Adam
Backprop выдал градиенты — но как именно делать шаг? От выбора оптимизатора зависит, будет модель учиться часами или неделями и сойдётся ли вообще. Разберём эволюцию: SGD → Momentum → RMSProp → Adam → AdamW.
Интуиция
Представь шарик, скатывающийся по ландшафту функции потерь. Стохастический градиентный спуск (SGD, stochastic gradient descent) — шарик без массы: каждый шаг он идёт строго против текущего градиента, посчитанного по случайному мини-батчу:
У этого шарика две проблемы. Первая — овраги: если поверхность вытянута (по одному направлению крутая, по другому пологая), шарик прыгает поперёк оврага и еле ползёт вдоль него. Вторая — шум: градиент по мини-батчу — лишь зашумлённая оценка настоящего, и траектория дёргается.
Как это работает
Momentum добавляет шарику массу: вместо сырого градиента накапливаем скорость — экспоненциальное скользящее среднее градиентов с коэффициентом β ≈ 0.9:
Колебания поперёк оврага противоположны по знаку и гасят друг друга, а вклад вдоль оврага накапливается — шарик разгоняется в правильном направлении. β = 0.9 — это, грубо, усреднение по последним ~10 градиентам.
RMSProp атакует другую проблему: у разных параметров разный масштаб градиентов. Он ведёт скользящее среднее квадратов градиентов и делит шаг на его корень: параметры с постоянно большими градиентами шагают скромнее, с маленькими — смелее. Это и есть адаптивный learning rate (per-parameter).
Adam (adaptive moment estimation) = momentum + RMSProp. Он ведёт два момента:
где m̂ = m/(1−β1t) и v̂ = v/(1−β2t) — поправка смещения (bias correction): m и v стартуют с нулей и в первые шаги занижены, поправка компенсирует это. Типичные значения: β1 = 0.9, β2 = 0.999.
AdamW — Adam с исправленным weight decay: штраф за большие веса применяется отдельным слагаемым θ ← θ − η·λ·θ, а не подмешивается в градиент (как в L2-регуляризации), где его исказила бы адаптивная нормировка. Сегодня AdamW — дефолт для обучения трансформеров.
Что выбирать на практике
Для трансформеров и 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 отличается от SGD с momentum?» — Adam добавляет второй момент (среднее квадратов градиентов) и делит шаг на его корень: адаптивный масштаб на каждый параметр + bias correction.
- «Зачем в Adam bias correction?» — m и v инициализируются нулями и в первые шаги занижены; поправка 1/(1−βt) устраняет смещение.
- «В чём разница Adam и AdamW?» — weight decay применяется отдельно от градиента, а не через L2-штраф, который искажается адаптивной нормировкой.
- «Зачем warmup?» — защищает от разноса в первые шаги, пока статистики моментов не накопились.