Что такое Adam optimizer и как работают его параметры (β1, β2, ε, learning rate)?

Краткий тезис

Adam (Adaptive Moment Estimation) — это популярный алгоритм оптимизации для глубокого обучения, сочетающий идеи Momentum (инерция) и RMSProp (адаптивный шаг для каждого параметра). Он хранит скользящие средние градиента (первый момент) и квадрата градиента (второй момент), а затем корректирует их смещение (bias correction) и обновляет веса. Параметры β1, β2, ε и rate|learning rate управляют скоростью затухания моментов, численной стабильностью и величиной шага. Adam стал стандартом для обучения LLM и многих других моделей благодаря устойчивости к зашумлённым градиентам и автоматической адаптации rate|learning rate.


1. Проблема оптимизации в глубоком обучении

При обучении нейронных сетей мы минимизируем функцию потерь L(θ) по параметрам θ. Классический стохастический градиентный спуск (SGD) обновляет θ = θ - lr * g, где g — градиент на мини-батче. Проблемы SGD:

  • Медленная сходимость на оврагах (функция сильно изогнута в одном направлении и полога в другом).
  • Застревание в локальных минимумах и седловых точках.
  • Чувствительность к выбору rate|learning rate — один lr для всех параметров неоптимален.

Для решения этих проблем были разработаны адаптивные методы: Momentum, RMSProp, AdaGrad, Adam.


2. Предшественники Adam

2.1 Momentum (импульс)

Добавляет инерцию: накапливает экспоненциально затухающее среднее градиентов.

v_t = β * v_{t-1} + g_t
θ_t = θ_{t-1} - lr * v_t

Типичное β = 0.9. Ускоряет движение в постоянном направлении и сглаживает колебания.

2.2 RMSProp (Root Mean Square Propagation)

Адаптирует rate|learning rate для каждого параметра, деля его на корень из скользящего среднего квадратов градиентов.

s_t = β * s_{t-1} + (1-β) * g_t²
θ_t = θ_{t-1} - lr * g_t / (√s_t + ε)

Параметр ε (epsilon) — малая константа для избежания деления на ноль.


3. Формулы Adam

Adam объединяет Momentum и RMSProp, добавляя bias correction (коррекцию смещения) для начальных шагов.

Обозначения

  • g_t — градиент на шаге t
  • β1, β2 — коэффициенты затухания для первого и второго моментов (обычно 0.9 и 0.999)
  • ε — малая константа (обычно 1e-8)
  • lr — learning rate (шаг обучения)

Шаги алгоритма

  1. Вычислить градиент g_t = ∇L(θ_{t-1})

  2. Обновить первый момент (среднее градиентов): m_t = β1 * m_{t-1} + (1 - β1) * g_t

  3. Обновить второй момент (среднее квадратов градиентов): v_t = β2 * v_{t-1} + (1 - β2) * g_t²

  4. Коррекция смещения (bias correction): m̂_t = m_t / (1 - β1^t) v̂_t = v_t / (1 - β2^t)

  5. Обновить параметры: θ_t = θ_{t-1} - lr * m̂_t / (√v̂_t + ε)

Почему bias correction На начальных шагах m_t и v_t инициализируются нулями, поэтому они смещены в сторону нуля. Деление на (1 - β^t) исправляет это, особенно важно на первых шагах.


4. Детальный разбор параметров

4.1 β1 (первый момент, momentum)

  • Назначение: определяет, как быстро забываются старые градиенты при вычислении среднего.
  • Диапазон: [0, 1). Чем ближе к 1, тем больше инерция.
  • Типичное значение: 0.9.
  • Влияние:
    • β1 = 0.9 → учитывается примерно 10 последних градиентов (экспоненциальное окно).
    • Слишком высокий β1 (0.99) → медленная реакция на изменения, риск overshooting.
    • Слишком низкий β1 (0.5) → почти как SGD, теряется преимущество momentum.

4.2 β2 (второй момент, адаптивный шаг)

  • Назначение: управляет скользящим средним квадратов градиентов, определяя адаптивный learning rate для каждого параметра.
  • Диапазон: [0, 1). Обычно очень близок к 1.
  • Типичное значение: 0.999.
  • Влияние:
    • β2 = 0.999 → окно ~1000 шагов. Позволяет оценивать дисперсию градиентов на длинной истории.
    • Если β2 слишком мал (0.9), оценка дисперсии становится шумной, шаги могут быть нестабильными.
    • Если β2 слишком близок к 1 (0.9999), адаптация замедляется, алгоритм хуже подстраивается под изменения ландшафта.

4.3 ε (epsilon)

  • Назначение: численная стабильность — предотвращает деление на ноль в знаменателе √v̂_t + ε.
  • Типичное значение: 1e-8 (иногда 1e-7).
  • Влияние:
    • Слишком большое ε (1e-4) снижает влияние адаптивного шага, приближая Adam к SGD с momentum.
    • Слишком маленькое ε (1e-12) может вызвать численные проблемы при очень малых v̂_t (например, при насыщении нейронов).
    • В некоторых реализациях (AdamW) ε может быть увеличено до 1e-6 для стабильности.

4.4 Learning rate (lr)

  • Назначение: глобальный масштаб шага обновления.
  • Типичные значения:
    • Для LLM: 3e-4 (0.0003) — стандарт для fine-tuning.
    • Для компьютерного зрения: 1e-3.
    • Для трансформеров с предобучением: 1e-4 – 5e-4.
  • Влияние:
    • Слишком большой lr → расходится (loss растёт).
    • Слишком маленький lr → медленная сходимость, риск застревания.
    • Adam менее чувствителен к lr, чем SGD, но всё равно требует настройки.

Сравнение параметров в разных оптимизаторах

Оптимизаторβ1β2εlr (типичный)
SGD0.01 – 0.1
Momentum0.90.01 – 0.1
RMSProp0.91e-80.001 – 0.01
Adam0.90.9991e-80.0001 – 0.001
AdamW0.90.9991e-80.0001 – 0.001

5. Bias correction — зачем и как работает

На первых шагах (t=1,2,...) m_t и v_t инициализируются нулями. Без коррекции:

  • m_1 = β1 * 0 + (1-β1) * g_1 = (1-β1) * g_1 — сильно меньше истинного среднего (которое должно быть ~g_1).
  • v_1 = (1-β2) * g_1² — аналогично.

Коррекция делит на (1 - β^t), что при t=1 даёт m̂_1 = m_1 / (1-β1) = g_1, v̂_1 = v_1 / (1-β2) = g_1². По мере роста t знаменатель стремится к 1, и коррекция становится незначительной.

Пример: β1=0.9, t=1 → 1-0.9^1 = 0.1, m̂_1 = m_1 / 0.1 = (0.1*g_1)/0.1 = g_1. Без коррекции шаг был бы в 10 раз меньше.


6. Преимущества и недостатки Adam

Преимущества

  • Адаптивный learning rate для каждого параметра — не нужно подбирать вручную.
  • Устойчивость к шумным градиентам (большие батчи, разреженные данные).
  • Быстрая сходимость на начальных этапах.
  • Мало гиперпараметров для настройки (обычно достаточно lr).
  • Хорошо работает "из коробки для широкого круга задач.

Недостатки

  • Не всегда обобщает лучше SGD — в некоторых задачах (например, ImageNet) SGD с momentum после тюнинга даёт лучшую точность на тесте.
  • Забывание второго момента — при резком изменении ландшафта (например, переход к другому датасету) Adam может медленно адаптироваться.
  • Чувствительность к β2 — неправильный β2 может привести к нестабильности.
  • Проблема с weight decay — классический Adam неправильно обрабатывает L2-регуляризацию (она смешивается с адаптивным шагом). Решение — AdamW.

7. AdamW и другие вариации

AdamW (Loshchilov & Hutter, 2017) исправляет weight decay: вместо добавления L2-штрафа к loss, он применяет weight decay отдельно после обновления Adam.

θ_t = θ_{t-1} - lr * m̂_t / (√v̂_t + ε) - lr * λ * θ_{t-1}

где λ — коэффициент weight decay. AdamW стал стандартом для обучения трансформеров (BERT, GPT).

Другие вариации:

  • Nadam — добавляет Nesterov momentum.
  • RAdam — исправляет проблему большого learning rate на ранних шагах.
  • LAMB — адаптирует lr для больших батчей.
  • AdaBelief — использует (g_t - m_t)² вместо g_t².

8. Практические рекомендации

  • Для LLM fine-tuning: lr = 3e-5 – 5e-5 (для полного fine-tuning) или 1e-4 – 3e-4 (для LoRA). β1=0.9, β2=0.999, ε=1e-8.
  • Для обучения с нуля: lr = 1e-3 – 3e-4, часто с warmup и cosine decay.
  • Если loss расходится: уменьшить lr в 10 раз или проверить ε (увеличить до 1e-7).
  • Если loss колеблется: увеличить β2 до 0.9999 или уменьшить lr.
  • Использовать AdamW вместо Adam для лучшей регуляризации.
  • Не забывать про bias correction — встроено в PyTorch/TensorFlow, но при ручной реализации обязательно.

Пример кода на PyTorch

import torch
import torch.nn as nn

model = nn.Linear(10, 1)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-8)

# Или AdamW:
optimizer = torch.optim.AdamW(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-8, weight_decay=0.01)

9. Пет-проект для закрепления

Задача: Сравнить сходимость SGD, Momentum, RMSProp и Adam на синтетической задаче (регрессия или классификация на простом датасете).

Инструменты: Python, PyTorch или NumPy, Matplotlib.

Шаги:

  1. Сгенерировать данные: y = 2x1 - 3x2 + 0.5*noise (линейная регрессия).
  2. Реализовать все четыре оптимизатора с нуля (без готовых функций).
  3. Обучить линейную модель (один слой) каждым оптимизатором с одинаковым lr=0.01.
  4. Построить графики loss по эпохам.
  5. Повторить с разными lr (0.1, 0.001) и разными β1, β2.
  6. Зафиксировать, какой оптимизатор быстрее сходится и при каких параметрах.

Ожидаемый результат: Adam и RMSProp сходятся быстрее SGD; Momentum ускоряет SGD; при большом lr SGD расходится, а Adam остаётся стабильным. Выводы о роли параметров.


10. Связь с другими вопросами

ВопросТема
660AdamW и отличие от Adam
661SGD with Momentum
662Learning rate schedulers (cosine, warmup)
663Gradient clipping
664Влияние batch size на выбор оптимизатора
665Сравнение оптимизаторов для LLM

11. Навигация


Навигация