Оптимизатор не меняет, где расположены минимумы функции потерь, но меняет траекторию, скорость и часто то, к какому из многих решений придёт обучение. История градиентов может задавать инерцию или отдельный масштаб каждой координаты.

Шарик в узком овраге

Рассмотрим

f(x,y)=x2+100y2.f(x,y)=x^2+100y^2.

По yy поверхность в сто раз круче. Обычный gradient descent с единым шагом либо скачет между стенками оврага, либо при малом η\eta медленно ползёт по xx. Плохая обусловленность — отношение кривизн 100 — делает один масштаб неудобным для двух направлений.

Momentum накапливает скорость:

vt=βvt1+gt,θt+1=θtηvt.v_t=\beta v_{t-1}+g_t,\qquad \theta_{t+1}=\theta_t-\eta v_t.

Поперечные градиенты меняют знак и частично сокращаются, продольные сохраняют знак и накапливаются. Траектория меньше зигзагообразна.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Контуры узкой квадратичной долины и траектории SGD и Momentum от одной точки
Рис. 62.1. Momentum гасит поперечный зигзаг

Красная траектория SGD многократно пересекает ось долины. Синяя momentum сохраняет продольную скорость и уменьшает поперечные колебания. Точки поставлены через равное число градиентных вычислений.

Соглашения Momentum

В библиотеках встречается запись

vt=βvt1+(1β)gt,v_t=\beta v_{t-1}+(1-\beta)g_t,

где постоянный градиент даёт vgv\to g, а не g/(1β)g/(1-\beta). Поэтому одинаковые η,β\eta,\beta в двух соглашениях не означают одинаковую траекторию.

Nesterov momentum вычисляет градиент в точке, сдвинутой по текущей скорости, как будто смотрит вперёд. Для выпуклых задач это даёт ускоренные оценки сходимости, но в нейросетях преимущество зависит от режима.

AdaGrad: редкая координата получает шанс

AdaGrad накапливает квадраты градиентов:

Gt,j=Gt1,j+gt,j2,θt+1,j=θt,jηGt,j+εgt,j.G_{t,j}=G_{t-1,j}+g_{t,j}^2, \qquad \theta_{t+1,j}=\theta_{t,j} -\frac{\eta}{\sqrt{G_{t,j}}+\varepsilon}g_{t,j}.

Координата с частыми большими градиентами получает уменьшающийся шаг, редкая — сохраняет крупный. Это полезно для разреженных текстов: вес редкого слова обновляется нечасто и не должен сразу иметь тот же накопленный тормоз, что частое слово.

Недостаток: Gt,jG_{t,j} только растёт, поэтому шаг может затухнуть слишком сильно и обучение практически остановится.

RMSProp и экспоненциальная память

RMSProp заменяет вечную сумму скользящим средним:

vt=β2vt1+(1β2)gt2,θt+1=θtηgtvt+ε.v_t=\beta_2v_{t-1}+(1-\beta_2)g_t^2, \qquad \theta_{t+1}=\theta_t-\eta\frac{g_t}{\sqrt{v_t}+\varepsilon}.

Квадраты берутся покоординатно. Старая история забывается экспоненциально; характерное окно порядка 1/(1β2)1/(1-\beta_2). При β2=0,999\beta_2=0{,}999 память охватывает примерно тысячу шагов.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Импульс градиента во времени и отклик накопителя квадратов для вечной суммы и экспоненциального среднего
Рис. 62.2. Память AdaGrad и RMSProp

В момент t=20t=20 возникает большой градиент. AdaGrad сохраняет его вклад навсегда, RMSProp постепенно забывает. Нижняя панель показывает эффективный шаг 1/v1/\sqrt v: у AdaGrad он не восстанавливается, у RMSProp возвращается.

Adam соединяет два момента

Adam хранит экспоненциальные средние градиента и его квадрата:

mt=β1mt1+(1β1)gt,m_t=\beta_1m_{t-1}+(1-\beta_1)g_t, vt=β2vt1+(1β2)gt2.v_t=\beta_2v_{t-1}+(1-\beta_2)g_t^2.

При нулевой инициализации ранние значения смещены к нулю, поэтому применяют коррекцию:

m^t=mt1β1t,v^t=vt1β2t,\widehat m_t=\frac{m_t}{1-\beta_1^t},\qquad \widehat v_t=\frac{v_t}{1-\beta_2^t}, θt+1=θtηm^tv^t+ε.\theta_{t+1}=\theta_t- \eta\frac{\widehat m_t}{\sqrt{\widehat v_t}+\varepsilon}.

Числитель задаёт сглаженное направление, знаменатель — масштаб координаты. ε\varepsilon предотвращает деление на ноль и влияет на поведение при очень малых градиентах.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Кривые необ corrected и corrected первого момента для постоянного градиента в первые двадцать шагов
Рис. 62.3. Зачем Adam исправляет начальное смещение

При постоянном g=1g=1 необработанный mtm_t начинает с 1β11-\beta_1 и медленно растёт к единице. Деление на 1β1t1-\beta_1^t сразу восстанавливает правильный масштаб. Аналогичная коррекция действует для vtv_t.

Лаборатория оптимизаторов

SGD, Momentum, AdaGrad и Adam в одной долине

Загружается живая иллюстрация…

Сравните траектории при одинаковом числе вычислений градиента. Затем масштабируйте одну координату в сто раз: adaptive методы должны быстрее перестроить шаги. После этого поменяйте масштаб в середине обучения и сравните AdaGrad с RMSProp/Adam.

AdamW и weight decay

При SGD L2L_2-штраф и weight decay эквивалентны:

θ(1ηλ)θηg.\theta\leftarrow(1-\eta\lambda)\theta-\eta g.

В Adam добавление λθ\lambda\theta к градиенту проходит через покоординатное деление на v\sqrt v и перестаёт быть простым одинаковым сжатием весов. AdamW отделяет decay:

θ(1ηλ)θηm^v^+ε.\theta\leftarrow(1-\eta\lambda)\theta -\eta\frac{\widehat m}{\sqrt{\widehat v}+\varepsilon}.

Различие существенно для интерпретации регуляризации. Параметр decay нужно рассматривать вместе с learning-rate schedule.

Быстрый train не гарантирует лучший test

Adam часто быстро уменьшает training loss в начале, особенно при разреженных или неодинаково масштабированных градиентах. SGD с momentum иногда даёт лучшее обобщение после тщательно настроенного schedule. Причины связаны с неявным выбором решений, шумом и геометрией, а не с одним рейтингом.

Сравнивать нужно при равном бюджете и отдельной настройке разумных learning rates. Один и тот же η\eta несправедлив: масштабы обновлений различны. Нужны несколько seeds, train/validation кривые и финальная оценка риска.

Разреженные тексты

В мешке слов большинство координат нулевые. AdaGrad или Adam дают редкому признаку относительно крупный шаг, когда он появляется. Но embedding-таблица может получать градиенты лишь для нескольких строк; sparse implementation экономит память и вычисления.

Редкость не означает надёжность. Одно необычное слово может получить большой вес по нескольким примерам. Регуляризация, минимальная частота и проверка на новых авторах остаются необходимыми.

Gradient clipping

В рекуррентных сетях и нестабильных режимах норма градиента может взрываться. Clipping по норме заменяет

ggmin(1,cg).g\leftarrow g\min\left(1,\frac c{\|g\|}\right).

Направление сохраняется, длина ограничивается cc. Это аварийный ограничитель, но слишком частый clipping означает, что learning rate, данные или модель нуждаются в диагностике. В журнале полезно считать долю обрезанных шагов. Clipping отдельных координат устроен иначе: он способен повернуть вектор, поэтому порог и вариант метода входят в спецификацию эксперимента.

Численная точность тоже участвует в траектории. При mixed precision малые градиенты могут округляться в ноль; loss scaling временно увеличивает их до представимого диапазона, а затем возвращает масштаб. Взрыв NaN не доказывает плохую функцию потерь, пока не проверены переполнение, ε\varepsilon и порядок операций. Параметр ε\varepsilon особенно заметен, когда v\sqrt v сопоставим с ним: тогда адаптивное деление превращается почти в обычный постоянный масштаб.

Как выбирать оптимизатор

Начните с проверенного baseline: AdamW для многих трансформеров, SGD с momentum для ряда vision-задач, AdaGrad для разреженных выпуклых моделей. Настройте learning rate и schedule, затем weight decay и batch. Изменяйте один слой решения за раз.

Оптимизатор тесно связан с шумом SGD из урока 61 и может выбирать разные интерполяторы из урока 59. Поэтому «достиг одинакового train loss» не означает «построил ту же функцию».

Два масштаба одной квадратичной чаши

Рассмотрим

f(w1,w2)=12(100w12+w22).f(w_1,w_2)=\frac12(100w_1^2+w_2^2).

Gradient descent обновляет координаты как w1(1100η)w1w_1\leftarrow(1-100\eta)w_1 и w2(1η)w2w_2\leftarrow(1-\eta)w_2. Для устойчивости первой координаты требуется 0<η<0,020<\eta<0{,}02. При η=0,01\eta=0{,}01 она обнуляется за один шаг, а вторая умножается на 0,990{,}99 и затухает медленно. Увеличить общий шаг нельзя: траектория начнёт колебаться или расходиться вдоль крутого направления.

Если заменить координату u1=10w1u_1=10w_1, функция станет круглой: f=(u12+w22)/2f=(u_1^2+w_2^2)/2. AdaGrad и Adam пытаются приблизить такое масштабирование по истории градиентов, а momentum ускоряет устойчивое движение вдоль длинного направления. Ни один метод не знает истинную матрицу кривизны заранее.

Численный опыт должен сравнивать число вычисленных градиентов до одинакового loss, а затем validation-качество найденных решений. Победа на этой выпуклой чаше проверяет геометрию шага, но ничего не говорит о сдвиге популяции, калибровке или стоимости ошибки.

Задачи