中文翻译暂不可用,显示俄语原文。

Как работает связь между SGD и Adam? Почему Adam лучше для LLM?

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

SGD (Stochastic Gradient Descent) и Adam (Adaptive Moment Estimation) — два фундаментальных оптимизатора в глубоком обучении. SGD обновляет веса с фиксированной скоростью обучения, что делает его чувствительным к зашумленным градиентам и редким признакам. Adam комбинирует momentum (сглаживание градиентов) и адаптивную скорость обучения (нормировка на дисперсию градиентов), что обеспечивает более быструю и стабильную сходимость. Для LLM с их огромными и зашумленными градиентами Adam (особенно AdamW) стал стандартом, так как он эффективно обрабатывает разреженные градиенты, автоматически подстраивает rate|learning rate под каждый параметр и требует меньше ручной настройки.


1. Термин: Оптимизатор в глубоком обучении

Оптимизатор — это алгоритм, который обновляет веса нейронной сети (параметры θ) на основе градиента функции потерь L, чтобы минимизировать ошибку. Градиент ∇L(θ) показывает направление наискорейшего возрастания потерь; оптимизатор двигается в противоположном направлении.

Ключевая проблема градиенты в глубоких сетях (особенно LLM) зашумлены из-за стохастической природы мини-батчей, имеют разный масштаб для разных слоёв и могут содержать редкие, но важные признаки. Разные оптимизаторы решают эти проблемы по-разному.


2. SGD (Stochastic Gradient Descent) — базовый оптимизатор

Формула обновления

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

где:

  • θ_t — веса на шаге t
  • lr — фиксированная скорость обучения (rate|learning rate)
  • g_t — градиент на шаге t (∇L(θ_t))

Как работает SGD просто вычитает градиент, умноженный на константу lr, из текущих весов.

Проблемы SGD

  1. Постоянная скорость обучения один lr для всех параметров. Если lr слишком велик — расходится; слишком мал — медленно сходится.
  2. Чувствительность к зашумленным градиентам каждый шаг может сильно колебаться, особенно на «оврагах» (ravenes) — участках, где функция потерь имеет разную кривизну в разных направлениях.
  3. Плохая работа с редкими признаками параметры, которые обновляются редко (например, эмбеддинги редких слов), получают те же обновления, что и частые, что замедляет их обучение.
  4. Застревание в локальных минимумах и седловых точках: без momentum SGD может «застрять» на плато.

Вариация — SGD with Momentum

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

Momentum (β ≈ 0.9) накапливает экспоненциально затухающее среднее градиентов, сглаживая колебания и ускоряя движение в правильном направлении.


3. Adam (Adaptive Moment Estimation) — адаптивный оптимизатор

Adam объединяет две идеи: momentum (сглаживание градиентов) и адаптивную скорость обучения (нормировка на дисперсию градиентов).

Формулы обновления (упрощённо):

m_t = β1 * m_{t-1} + (1 - β1) * g_t          # момент (первый момент)
v_t = β2 * v_{t-1} + (1 - β2) * g_t^2        # дисперсия (второй момент)

m_hat = m_t / (1 - β1^t)                      # коррекция смещения
v_hat = v_t / (1 - β2^t)

θ_{t+1} = θ_t - lr * m_hat / (sqrt(v_hat) + ε)

где:

  • m_t — экспоненциально затухающее среднее градиентов (momentum)
  • v_t — экспоненциально затухающее среднее квадратов градиентов (дисперсия)
  • β1, β2 — коэффициенты затухания (обычно 0.9 и 0.999)
  • ε — маленькая константа (1e-8) для избежания деления на ноль
  • m_hat, v_hat — коррекция смещения, компенсирующая начальную оценку нулём

Как работает

  1. Momentum (m_hat): сглаживает градиенты, ускоряет сходимость в направлениях с постоянным градиентом.
  2. Адаптивная скорость (sqrt(v_hat)): делит learning rate на корень из дисперсии градиентов. Параметры с большими градиентами (крутые склоны) получают меньший шаг, параметры с малыми градиентами (пологие участки) — больший шаг. Это автоматически подстраивает lr под каждый параметр.
  3. Коррекция смещения на первых шагах m_t и v_t смещены к нулю; коррекция исправляет это.

AdamW — улучшенная версия отделяет weight decay (L2-регуляризацию) от обновления градиента, что улучшает обобщение и стабильность.


4. Сравнение SGD и Adam

ХарактеристикаSGD (с momentum)Adam
Скорость обученияФиксированная для всех параметровАдаптивная (своя для каждого параметра)
MomentumОпционально (добавляется отдельно)Встроен (первый момент)
Обработка зашумленных градиентовПлохая (колебания)Хорошая (нормировка на дисперсию)
Обработка редких признаковПлохая (все параметры обновляются одинаково)Хорошая (редкие параметры получают больший шаг)
Скорость сходимостиМедленная (требует точной настройки lr)Быстрая (автоматическая адаптация)
Требует настройки lrДа, критичноМенее критично (работает в широком диапазоне)
Обобщение (generalization)Часто лучше (меньше переобучение)Иногда хуже (может переобучаться)
Популярность для LLMРедкоСтандарт (AdamW)

5. Почему Adam лучше для LLM?

LLM (Large Language Models) имеют специфические свойства, которые делают Adam предпочтительным:

5.1 Зашумленные градиенты

LLM обучаются на огромных корпусах текста с мини-батчами. Градиенты от разных батчей сильно варьируются (шум). Adam сглаживает этот шум через momentum и нормирует на дисперсию, делая шаги более стабильными. SGD без momentum будет сильно колебаться, замедляя сходимость.

5.2 Разреженные градиенты (sparse gradients)

В LLM многие параметры (особенно эмбеддинги редких токенов) получают градиенты редко. Adam автоматически увеличивает learning rate для таких параметров (так как их дисперсия мала), ускоряя их обучение. SGD обновляет все параметры с одинаковой скоростью, что замедляет обучение редких признаков.

5.3 Разный масштаб градиентов в разных слоях

В глубоких сетях градиенты в нижних слоях (ближе к входу) часто малы (проблема исчезающих градиентов), а в верхних — велики. Adam адаптирует learning rate к каждому слою, позволяя нижним слоям учиться быстрее. SGD с фиксированным lr либо заставит нижние слои учиться медленно, либо верхние — расходиться.

5.4 Быстрая сходимость

LLM требуют огромных вычислительных ресурсов. Adam сходится за меньшее количество шагов (эпох) по сравнению с SGD, что экономит время и деньги. Например, при обучении GPT-3 AdamW позволил достичь целевого loss на 30-40% быстрее, чем SGD с momentum.

5.5 Меньше ручной настройки

Adam имеет стандартные гиперпараметры (lr=1e-4, β1=0.9, β2=0.999, ε=1e-8), которые работают для большинства LLM. SGD требует тщательного подбора lr и momentum, а также learning rate scheduling (изменение lr по расписанию), что усложняет эксперименты.

5.6 Стабильность при больших батчах

LLM часто обучаются с большими батчами (тысячи примеров). Adam лучше справляется с такими условиями, так как нормировка на дисперсию делает шаги менее чувствительными к размеру батча.


6. Когда SGD может быть лучше?

Несмотря на преимущества Adam, SGDmomentum) иногда предпочтительнее:

  • Тонкая настройка (fine-tuning) небольших моделей SGD может дать лучшее обобщение, если модель уже близка к оптимуму.
  • Задачи с малым количеством данных Adam может переобучаться из-за адаптивной скорости; SGD с хорошим lr scheduling более устойчив.
  • Когда важна интерпретируемость SGD проще анализировать (один lr).
  • Ограниченные вычислительные ресурсы Adam требует хранения m_t и v_t для каждого параметра (в 2 раза больше памяти), что критично для очень больших моделей.

Однако для LLM эти случаи редки. AdamW — де-факто стандарт для обучения и fine-tuning LLM (GPT, LLaMA, BERT и др.).


7. Пример кода на Python (PyTorch)

import torch
import torch.nn as nn
import torch.optim as optim

# Простая модель
model = nn.Linear(10, 2)

# SGD с momentum
optimizer_sgd = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

# Adam (стандартный)
optimizer_adam = optim.Adam(model.parameters(), lr=1e-3, betas=(0.9, 0.999))

# AdamW (рекомендуется для LLM)
optimizer_adamw = optim.AdamW(model.parameters(), lr=1e-4, weight_decay=0.01)

# Цикл обучения
for epoch in range(10):
    for batch in dataloader:
        inputs, targets = batch
        outputs = model(inputs)
        loss = nn.CrossEntropyLoss()(outputs, targets)
        
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

Важно для LLM обычно используют AdamW с weight decay (0.01-0.1) и learning rate около 1e-4 (для fine-tuning) или 3e-4 (для обучения с нуля).


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

Задача Сравнить сходимость SGD (с momentum) и Adam при обучении небольшой языковой модели (например, GPT-2) на задаче классификации текста (IMDb reviews).

Инструменты

Шаги:

  1. Загрузите предобученную модель GPT-2 (distilgpt2) и токенизатор.
  2. Заморозьте все слои, кроме последнего классификационного (linear head).
  3. Создайте два экземпляра модели (один для SGD, другой для Adam).
  4. Обучите первую с SGD (lr=0.01, momentum=0.9) и вторую с Adam (lr=1e-4) на 3 эпохи.
  5. Логируйте loss на каждом шаге и accuracy на валидации после каждой эпохи.
  6. Постройте графики loss и accuracy для обоих оптимизаторов.

Ожидаемый результат

  • Adam сойдётся быстрее (меньше шагов для достижения минимального loss).
  • Adam покажет более высокую accuracy на валидации (на 2-5%).
  • SGD будет колебаться сильнее (больше шума на графике loss).
  • При увеличении learning rate SGD может расходиться, Adam останется стабильным.

Расширение Попробуйте AdamW с weight decay и сравните с Adam — увидите улучшение обобщения (меньше переобучения).


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

ВопросТема
670Другие оптимизаторы (RMSprop, AdaGrad, Nadam) и их сравнение с Adam
671Learning rate scheduling (cosine annealing, warmup) — как улучшить сходимость Adam
672Weight decay и L2-регуляризация — почему AdamW лучше Adam
673Влияние размера батча на выбор оптимизатора
674Gradient accumulation — как обучить LLM с ограниченной памятью
675Mixed precision training (FP16) — совместимость с Adam

10. Навигация


Навигация