Как работает связь между 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
- Постоянная скорость обучения один lr для всех параметров. Если lr слишком велик — расходится; слишком мал — медленно сходится.
- Чувствительность к зашумленным градиентам каждый шаг может сильно колебаться, особенно на «оврагах» (ravenes) — участках, где функция потерь имеет разную кривизну в разных направлениях.
- Плохая работа с редкими признаками параметры, которые обновляются редко (например, эмбеддинги редких слов), получают те же обновления, что и частые, что замедляет их обучение.
- Застревание в локальных минимумах и седловых точках: без 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 — коррекция смещения, компенсирующая начальную оценку нулём
Как работает
- Momentum (m_hat): сглаживает градиенты, ускоряет сходимость в направлениях с постоянным градиентом.
- Адаптивная скорость (sqrt(v_hat)): делит learning rate на корень из дисперсии градиентов. Параметры с большими градиентами (крутые склоны) получают меньший шаг, параметры с малыми градиентами (пологие участки) — больший шаг. Это автоматически подстраивает lr под каждый параметр.
- Коррекция смещения на первых шагах 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, SGD (с momentum) иногда предпочтительнее:
- Тонкая настройка (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).
Инструменты
- PyTorch, Hugging Face Transformers, Datasets
- Базовый ноутбук (Google Colab)
Шаги:
- Загрузите предобученную модель GPT-2 (distilgpt2) и токенизатор.
- Заморозьте все слои, кроме последнего классификационного (linear head).
- Создайте два экземпляра модели (один для SGD, другой для Adam).
- Обучите первую с SGD (lr=0.01, momentum=0.9) и вторую с Adam (lr=1e-4) на 3 эпохи.
- Логируйте loss на каждом шаге и accuracy на валидации после каждой эпохи.
- Постройте графики loss и accuracy для обоих оптимизаторов.
Ожидаемый результат
- Adam сойдётся быстрее (меньше шагов для достижения минимального loss).
- Adam покажет более высокую accuracy на валидации (на 2-5%).
- SGD будет колебаться сильнее (больше шума на графике loss).
- При увеличении learning rate SGD может расходиться, Adam останется стабильным.
Расширение Попробуйте AdamW с weight decay и сравните с Adam — увидите улучшение обобщения (меньше переобучения).
9. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 670 | Другие оптимизаторы (RMSprop, AdaGrad, Nadam) и их сравнение с Adam |
| 671 | Learning rate scheduling (cosine annealing, warmup) — как улучшить сходимость Adam |
| 672 | Weight decay и L2-регуляризация — почему AdamW лучше Adam |
| 673 | Влияние размера батча на выбор оптимизатора |
| 674 | Gradient accumulation — как обучить LLM с ограниченной памятью |
| 675 | Mixed precision training (FP16) — совместимость с Adam |
10. Навигация
- Предыдущий: 668
- Следующий: 670
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 668
- Следующий: 670
- Индекс: 00. Индекс разборов