Глубокое обучение
Оптимизация: SGD -> AdamW
Цели урока
- Понять как момент ускоряет SGD и сглаживает колебания
- Объяснить принцип адаптивного lr в Adam
- Различать Adam и AdamW и знать когда что использовать
- Применять schedulers для управления lr в процессе обучения
Нейросеть не обучается - loss стоит на месте. Меняем optimizer с SGD на Adam - loss начинает падать. Через 50 эпох plateau. Добавляем cosine scheduler - loss снова падает до нового минимума. Выбор оптимизатора и scheduler часто важнее архитектуры.
- **GPT-3/4:** обучались на AdamW с warmup + cosine decay - стандарт для LLM
- **ResNet на ImageNet:** SGD с momentum=0.9 и StepLR даёт лучшую точность чем Adam
- **Fine-tuning:** маленький lr (1e-5) + warmup чтобы не сломать pretrained веса
- **Быстрый прототип:** Adam с lr=3e-4 работает «из коробки» без тюнинга
От Robbins-Monro к AdamW
Стохастическая оптимизация началась с работы Herbert Robbins и Sutton Monro в 1951 году, чей метод стохастической аппроксимации лежит в основе SGD. Boris Polyak добавил момент в 1964 году, чтобы гасить колебания. В 2011 году John Duchi, Elad Hazan и Yoram Singer предложили AdaGrad с адаптивным learning rate для каждого параметра. Diederik Kingma и Jimmy Ba объединили адаптивные шаги с моментом в Adam (2014), который стал оптимизатором по умолчанию. В 2017 году Ilya Loshchilov и Frank Hutter показали, что L2-регуляризация в Adam некорректно связана с адаптивным шагом, и предложили AdamW с decoupled weight decay - сейчас это стандарт для обучения трансформеров.
Предварительные знания
- Градиенты и chain rule из backpropagation
- Как функция потерь минимизируется градиентным спуском
- Векторы и частные производные
SGD с моментом
Шарик катится с горы. Обычный SGD - это шарик без инерции: остановился, посмотрел вниз, сделал шаг. Медленно и дёргано. **SGD с моментом** добавляет инерцию: шарик набирает скорость в стабильных направлениях и тормозит при смене направления.
Математически: накапливаем **вектор скорости** `v` как экспоненциальное скользящее среднее градиентов. Параметр `momentum` (обычно 0.9) определяет насколько важна история - 90% от предыдущей скорости и 10% от текущего градиента.
**Nesterov Momentum** (NAG) - улучшенная версия: сначала делаем шаг по накопленной скорости, потом корректируем. Даёт более точное направление. В PyTorch: `SGD(nesterov=True)`.
SGD с momentum=0.9 на шаге t имеет v_{t-1}=0.5. Текущий градиент grad_t=0.2. Чему равно v_t?
Adam: адаптивный learning rate
SGD с моментом использует одинаковый learning rate для всех параметров. Проблема: редкие признаки получают маленькие градиенты и обновляются медленно, частые - большие и нестабильны. **Adam (Adaptive Moment Estimation)** даёт каждому параметру свой эффективный learning rate, автоматически адаптируясь.
Adam отслеживает два момента: **m** (среднее градиентов, как в momentum) и **v** (среднее квадратов градиентов). Параметры с большой историей градиентов получают меньший шаг, параметры с малой историей - больший.
Adam обновляет параметр с большой историей больших градиентов (v велик). Шаг обновления будет:
Weight Decay и L2 регуляризация
Модель обучилась идеально на train set, но провалилась на test - переобучение. Один из способов борьбы: **L2 регуляризация** добавляет штраф за большие веса к функции потерь. Большие веса означают что модель слишком чувствительна к конкретным признакам.
**Weight Decay** - другое название того же понятия, но с важным нюансом для Adam. В SGD L2 и weight decay математически эквивалентны. В Adam - нет: L2 добавляет градиент в числитель, где Adam его адаптирует. **AdamW** (Adam + decoupled weight decay) применяет decay напрямую к весам, минуя адаптацию.
**AdamW vs Adam:** GPT, BERT, и все современные LLM тренируются на AdamW. Разница: в Adam weight decay «размывается» адаптивным learning rate. AdamW держит decay постоянным - более предсказуемая регуляризация.
Почему AdamW предпочтительнее Adam с weight_decay при обучении трансформеров?
Learning Rate Scheduler
Фиксированный learning rate - компромисс: большой lr быстро находит область минимума, но не может в него войти; маленький lr точен, но начинает медленно. **Scheduler** меняет lr по расписанию: начинаем большим, постепенно уменьшаем по мере обучения.
**Практика:** для большинства задач - CosineAnnealingLR. Для трансформеров и LLM - warmup + cosine decay. OneCycleLR хорош для CV с коротким обучением. Главное правило: в конце обучения lr должен быть в 10-100 раз меньше начального.
Маленький learning rate всегда лучше - точнее обновления
Слишком маленький lr застревает в плохих локальных минимумах и учится бесконечно долго
Функция потерь не выпуклая. Умеренный lr позволяет «перепрыгнуть» плохие минимумы. Scheduler даёт лучшее из двух миров: начальный исследовательский lr и финальный уточняющий
Зачем трансформерам нужен warmup в начале обучения?
Оптимизаторы SGD -> AdamW
- SGD + momentum: инерция сглаживает колебания, ускоряет движение вдоль долины
- Adam: адаптивный lr через два момента (m, v) - параметры с большими grad получают меньший шаг
- AdamW: weight decay отдельно от адаптации - стандарт для трансформеров и LLM
- Scheduler: lr schedule (warmup + cosine) критичен для сходимости больших моделей
- Выбор: Adam/AdamW для NLP, SGD+momentum для CV с тщательным тюнингом
Связанные темы
Оптимизаторы работают в связке с регуляризацией и инициализацией весов.
- Регуляризация: Dropout, BatchNorm — Другие методы борьбы с переобучением
- Backpropagation — Откуда берутся градиенты для оптимизатора
- Трансформеры — AdamW + warmup - стандарт для обучения трансформеров
Вопросы для размышления
- Почему для NLP часто лучше Adam, а для CV - SGD с моментом?
- Как warmup взаимодействует с механизмом bias correction в Adam?
- При fine-tuning pretrained модели - какой lr и scheduler выбрать и почему?
Связанные уроки
- dl-10 — Регуляризация и оптимизаторы настраивают обучение вместе
- dl-02 — Backprop даёт градиенты, которые потребляет оптимизатор
- ml-09-gradient-descent — SGD и AdamW развивают обычный градиентный спуск
- ml-28-optimizers — То же семейство оптимизаторов из курса ML
- calc-19-gradient — Градиент задаёт направление наискорейшего спуска
- calc-20-extrema-multi — Оптимизация ищет минимумы поверхности потерь