Оптимизация
Адаптивные методы
AdaGrad, RMSProp, Adam, AdamW — свой масштаб шага для каждой координаты
Идея
Из урока 050: шаг задаётся максимальной кривизной, поэтому по плоским направлениям приходится ползти. Адаптивные методы дают каждой координате свой масштаб — то есть приближают диагональное предобусловливание, не считая гессиана.
Обратите внимание, что
Три поколения
AdaGrad накапливает все квадраты градиентов: , шаг .
Проблема видна сразу: знаменатель только растёт, значит шаг только убывает. При постоянном :
| шагов | накопитель | шаг при |
|---|---|---|
Шаг падает как и в итоге останавливает обучение независимо от того, сошлось оно или нет. Для выпуклых задач это даже правильно (условия Роббинса–Монро), для глубоких сетей — фатально.
RMSProp заменяет сумму на экспоненциальное среднее: . Теперь знаменатель выходит на стационарный уровень:
| шагов | шаг | |
|---|---|---|
Шаг больше не вырождается — он оседает на . Но посмотрите на первую строку: на старте шаг в тридцать раз больше заданного, потому что начинается с нуля и ещё не успел накопиться. Это и есть проблема, которую решает следующий метод.
Adam = RMSProp + момент + коррекция смещения.
Зачем коррекция смещения
Оба накопителя стартуют с нуля, поэтому в начале они систематически занижены. При постоянном единичном градиенте:
| сырое | доля от | после коррекции | |
|---|---|---|---|
Делители и ровно компенсируют недобор. Результат проверяется точно: при постоянном градиенте шаг Adam равен с первой же итерации и остаётся таким при . Без коррекции первые шаги были бы либо в десять раз меньше (по ), либо в тридцать раз больше (по ) — и они не компенсируют друг друга.
Что даёт масштабная инвариантность
Ключевое свойство: величина шага почти не зависит от масштаба градиента. Проверим, меняя градиент на пять порядков (при , из нулевого состояния):
Первые три строки — та самая инвариантность: умножьте лосс на тысячу, и Adam почти не заметит. Ради этого его и берут для задач с разномасштабными параметрами (эмбеддинги против bias’ов).
Последняя строка — предел, о котором редко говорят. При слагаемое перестаёт быть пренебрежимым, и инвариантность ломается: шаг падает на . То есть — не только «защита от деления на нуль», но и порог, ниже которого Adam ведёт себя как обычный SGD. На затухших градиентах это имеет значение.
AdamW: L2 внутри градиента — не то же самое
Тонкость, которая стоила сообществу нескольких лет плохих результатов.
| подход | что делает |
|---|---|
| L2 в лоссе (Adam) | , затем всё делится на |
| decoupled (AdamW) |
В первом случае штраф проходит через адаптивный знаменатель, значит его сила зависит от масштаба градиентов. Проверим на игрушечной задаче с , меняя величину градиента лосса:
| градиент лосса | Adam: | AdamW: |
|---|---|---|
AdamW даёт один и тот же результат при любом масштабе, Adam — разный, причём при малом градиенте лосса штраф начинает доминировать и результат меняется на порядок.
Отсюда практический вывод: у Adam «weight decay» и «L2-регуляризация» — разные вещи, а у
SGD они совпадают. Поэтому torch.optim.AdamW существует отдельно, и переносить
между SGD и Adam нельзя.
Когда адаптивность не помогает
Сравните Adam с моментом на двух ландшафтах виджета.
лосс, логарифмическая шкала
- f в конце
- 4.58e+13
- обусловленность κ
- 100
- порог 2/L
- 0.02
- разошлось
Порог 2/L относится к обычному спуску. У Adam эффективный шаг нормирован, поэтому он выдерживает α, при котором спуск давно разошёлся бы.
Здесь Adam в своей стихии: кривизна диагональна, и диагональный масштаб выпрямляет ландшафт почти полностью. Обратите внимание, что шаг 0.1 для него безопасен, хотя для спуска порог всего 0.02.
Второй ландшафт — тот же спектр, тот же , повёрнутый на . Adam теряет почти всё преимущество, потому что диагональ не видит поворота. Это фундаментальное ограничение: адаптивные методы приближают гессиан диагональной матрицей, и когда кривизна «наклонена», приближение плохое.
Прочие известные ограничения:
- обобщение. SGD с моментом часто даёт лучший тест при том же обучающем лоссе, особенно в свёрточных сетях. Причина обсуждается до сих пор;
- сходимость не гарантирована. У исходного доказательства Adam нашли ошибку; существуют выпуклые задачи, где он не сходится (отсюда AMSGrad);
- память. Два накопителя на параметр — то есть в три раза больше состояния, чем у SGD. Для больших моделей это существенная часть бюджета памяти.
Практика сегодня примерно такая: трансформеры и языковые модели — AdamW почти всегда, свёрточные сети — часто SGD с моментом, и обе привычки имеют эмпирические, а не теоретические основания.
Источники
- Kingma, Ba — Adam: A Method for Stochastic Optimization — Adam и коррекция смещения
- Loshchilov, Hutter — Decoupled Weight Decay Regularization — AdamW и почему L2 внутри градиента — не то же самое
Проверки
0 из 2Адаптивные методы и их пределы
Отметьте все верные утверждения об AdaGrad, RMSProp, Adam и AdamW.
Один шаг Adam
Реализуйте
adam_step(g, m, v, t, lr)— один шаг Adam для одного параметра. Константы фиксированы: , , .Верните
[m_new, v_new, m_hat, v_hat, step]:step— величина, которую вычитают из параметра, со знаком.Проверить себя проще всего первым случаем: из нулевого состояния при любом ненулевом градиенте
stepобязан оказаться практически равенlr. Если у вас там — забыта коррекция ; если — забыта коррекция .Загрузка редактора…
Ctrl/⌘ + Enter