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

Ландшафт один, походка разная

В уроке 22 мы условились: антиградиент указывает направление самого быстрого локального убывания. Из этого не следует, что идти надо именно туда. Направление наибыстрейшего спуска — свойство одного шага; нам же нужен маршрут из десятков тысяч шагов, и жадность на каждом из них не гарантирует короткого пути.

Оптимизатор — это правило, по которому история наблюдённых градиентов превращается в очередной сдвиг весов:

θt+1=θtηDt(g1,,gt).\theta_{t+1}=\theta_t-\eta\,D_t\bigl(g_1,\ldots,g_t\bigr).

Обычный градиентный спуск — частный случай с самой короткой памятью:

Dt=gt.D_t=g_t .

Все методы этого урока отличаются только видом DtD_t. Минимумы функции потерь от выбора DtD_t не сдвигаются ни на волос: они заданы данными и моделью. Меняется путь, скорость и — что важнее всего в переопределённой области из урока 59 — то, какой именно из множества почти одинаково хороших минимумов будет найден.

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

Возьмём модельную функцию — она модельная сознательно, зато считается на бумаге:

f(x,y)=12(x2+κy2),f=(x, κy).f(x,y)=\tfrac12\bigl(x^2+\kappa y^2\bigr),\qquad \nabla f=(x,\ \kappa y).

Градиентный спуск с шагом η\eta распадается на две независимые геометрические прогрессии:

xt+1=(1η)xt,yt+1=(1ηκ)yt.x_{t+1}=(1-\eta)x_t,\qquad y_{t+1}=(1-\eta\kappa)y_t.

Устойчивость требует 1ηκ<1|1-\eta\kappa|<1, то есть η<2/κ\eta<2/\kappa: крутая координата запрещает большой шаг. А скорость по пологой координате равна 1η1-\eta — при η<2/κ\eta<2/\kappa она не может быть быстрее, чем 12/κ1-2/\kappa. Число κ\kappa (отношение кривизн, оно же число обусловленности) целиком определяет беду: чем оно больше, тем сильнее разрыв между тем шагом, который можно сделать, и тем, который нужен.

При наилучшем η=2/(1+κ)\eta=2/(1+\kappa) расстояние до минимума за один шаг умножается на

ρ=κ1κ+1,\rho=\frac{\kappa-1}{\kappa+1},

и при κ=100\kappa=100 это ρ0,980\rho\approx0{,}980 — на каждый шаг приходится всего два процента прогресса. Чтобы сократить расстояние в 10310^{3} раз, нужно

T=ln103ln(1/ρ)6,910,0200346T=\frac{\ln 10^{3}}{\ln(1/\rho)}\approx\frac{6{,}91}{0{,}0200}\approx346

шагов при κ=100\kappa=100 и примерно в десять раз больше при κ=1000\kappa=1000: число шагов растёт линейно по κ\kappa. Это не про «медленный компьютер», это про форму чаши.

Почему шаг нельзя просто увеличить

Мы уже знаем, что шаг ограничен: крутая координата требует η<2/κ\eta<2/\kappa, иначе прогрессия расходится. Теперь спросим, чего мы из-за этого лишаемся.

Представим, что шаги сделаны совсем мелкими, а считаем мы их очень часто. Точки сольются в гладкую кривую, которая просто скатывается ко дну, всё время поворачивая в сторону наискорейшего спуска. Назовём её идеальной траекторией и будем держать как эталон: реальный метод идёт по ней рывками и ровно настолько хорош, насколько точно за ней успевает.

Сравнение эталона с рывками сразу показывает, где потери. У идеальной кривой нет ограничения на длину шага — она просто скользит по склону. У метода оно есть, и диктует его самое крутое направление, каким бы редким оно ни было. Вдоль пологого дна оврага разрешённый шаг оказывается чудовищно мал.

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

Овраг с обусловленностью κ=80\kappa=80. Синяя линия — идеальная траектория: она идёт ко дну по дуге, не оглядываясь на длину шага. Красные точки — спуск с наилучшим шагом 0,0250{,}025: они послушно ложатся на неё, потому что шаг мал. Зелёная ломаная — тяжёлый шарик: он размашисто пересекает овраг, но приходит к минимуму за 4444 шага против 277277 у спуска.

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

Ровно это и делает инерция. Обычный шарик, скатываясь в чашу, не останавливается на каждом миллиметре, чтобы заново посмотреть на уклон: у него есть скорость, и он переносит её из прошлого в будущее. Метод с моментом устроен так же — слагаемое β(xkxk1)\beta\,(x_k-x_{k-1}) и есть накопленная скорость, а множитель β<1\beta<1 играет роль трения, которое не даёт разогнаться до бесконечности. Поперёк оврага скорость на соседних шагах меняет знак и гасит сама себя, а вдоль дна она копится шаг за шагом. «Момент» здесь не красивое слово: это обычная механическая инерция, записанная в двух строчках.

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 .

Ту же схему можно записать без вспомогательной переменной — как «шаг плюс доля предыдущего смещения»:

θt+1=θtηgt+β(θtθt1),\theta_{t+1}=\theta_t-\eta g_t+\beta(\theta_t-\theta_{t-1}),

откуда и старое название «метод тяжёлого шарика»: шарик с массой не может мгновенно развернуться поперёк оврага.

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

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева контуры вытянутого эллипса и три траектории из точки девять и один: красная GD мелко зигзагует, синяя Momentum качается шире, но продвигается, фиолетовая Adam идёт почти по дну; справа падение f по числу градиентов в логарифмической шкале
Рис. 62.1. Один овраг, один бюджет, три походки

Модельный овраг f=x2+100y2f=x^2+100y^2, старт из точки (9;1)(9;1), бюджет 60 вычисленных градиентов, у каждого метода свой лучший η\eta из сетки. GD доходит до f=8,38f=8{,}38, Momentum — до 0,0200{,}020, Adam — до 0,00740{,}0074. По дороге GD меняет знак координаты yy все 60 раз, Momentum — 13. Тот же бюджет, разница в тысячу раз.

Числа с рисунка стоит проговорить вслух. Стартовое значение f(9;1)=81+100=181f(9;1)=81+100=181. Градиентный спуск с наилучшим шагом снял с него меньше чем в двадцать два раза; момент — почти в девять тысяч раз; Adam — в двадцать четыре тысячи. Все трое считали одинаковое число градиентов, то есть потратили одинаковые деньги.

Сколько шагов помнит инерция

Раскроем рекурсию:

vt=k=0t1βkgtk.v_t=\sum_{k=0}^{t-1}\beta^k g_{t-k}.

Это взвешенная сумма прошлого с геометрически убывающими весами. Сумма весов при постоянном градиенте равна

k0βk=11β,\sum_{k\ge0}\beta^k=\frac1{1-\beta},

то есть эффективный шаг вдоль устойчивого направления вырастает в 1/(1β)1/(1-\beta) раз: при β=0,9\beta=0{,}9 — в десять, при β=0,99\beta=0{,}99 — в сто. Характерная глубина памяти тоже равна 1/(1β)1/(1-\beta) шагов.

Нестеровская версия вычисляет градиент не в текущей точке, а в сдвинутой по уже накопленной скорости:

vt=βvt1+f(θtηβvt1),θt+1=θtηvt.v_t=\beta v_{t-1}+\nabla f(\theta_t-\eta\beta v_{t-1}),\qquad \theta_{t+1}=\theta_t-\eta v_t .

Смысл поправки — «сначала посмотри, куда тебя несёт, потом измеряй наклон». Для гладких выпуклых задач это даёт доказуемо лучшую оценку числа шагов; в нейросетях выигрыш зависит от режима, и его надо измерять, а не предполагать.

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

Инерция работает с направлением. Второе семейство работает с масштабом координаты. AdaGrad копит квадраты градиентов покоординатно:

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

Это в точности шаг в изменённой метрике: если ввести диагональную матрицу

Ht=diag(Gt,1,,Gt,d),H_t=\operatorname{diag}\bigl(\sqrt{G_{t,1}},\ldots,\sqrt{G_{t,d}}\bigr),

то обновление записывается как θt+1=θtηHt1gt\theta_{t+1}=\theta_t-\eta H_t^{-1}g_t — формально то же самое, что растяжение осей перед обычным спуском.

Координата, по которой градиент часто велик, быстро набирает GG и получает маленький множитель; редкая координата сохраняет крупный шаг. Это ровно тот случай, что описан в уроке 24 для разреженных текстов: вес слова, встретившегося в пяти письмах из четырёх с половиной тысяч, не должен тащить на себе тормоз, заработанный словом «to».

Проверим это на настоящем корпусе SMS-спама, с которым мы работали в уроке 42: 4457 обучающих сообщений, словарь из 1553 слов, встретившихся не менее чем в пяти письмах, заполненность матрицы признаков 0,78 % — то есть 99,2 % всех клеток нули.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева облако точек: множитель шага AdaGrad падает с ростом частоты слова, две штриховые линии показывают медианы для редких и частых слов; справа три столбика точности SGD, AdaGrad и Adam
Рис. 62.2. Реальный разреженный текст: редкому слову — крупный шаг

Слева: множитель 1/G1/\sqrt{G} после трёх эпох на реальном SMS-спаме. Медиана у слов из 5–8 писем — 153,0; у слов, встретившихся хотя бы в 300 письмах, — 6,1. Разрыв в 25 раз возник сам собой, из истории градиентов. Справа: точность на 1115 отложенных сообщениях при собственном лучшем η\eta для каждого метода — SGD 98,30 %, AdaGrad 98,74 %, Adam 98,83 %.

У вечной суммы есть цена: 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}.

Развернув рекурсию, видим взвешенное среднее прошлых квадратов с суммой весов, равной единице (с точностью до начального смещения):

vt=(1β2)k=0t1β2kgtk2.v_t=(1-\beta_2)\sum_{k=0}^{t-1}\beta_2^{\,k}g_{t-k}^2 .

Квадраты берутся покоординатно, старое забывается геометрически, окно памяти — порядка 1/(1β2)1/(1-\beta_2) шагов: при β2=0,9\beta_2=0{,}9 это десяток, при β2=0,999\beta_2=0{,}999 — тысяча.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Сверху последовательность градиентов с одиночным всплеском на шаге двадцать, снизу множители шага AdaGrad и RMSProp в логарифмической шкале: жёлтая кривая AdaGrad падает и не возвращается, зелёная RMSProp восстанавливается
Рис. 62.3. Один выброс и две памяти

Модельный опыт: градиент равен 0,10{,}1, а на шаге 20 случайно оказался равен 33. Множитель шага AdaGrad падает с 2,242{,}24 и к сотому шагу стоит на 0,310{,}31 — в 7,1 раза ниже, чем был; событие давней истории всё ещё тормозит обучение. RMSProp с β2=0,9\beta_2=0{,}9 возвращает половину прежнего шага через 34 шага и приходит в пределы 10 % через 67.

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 .

Числитель задаёт сглаженное направление (это инерция), знаменатель — масштаб координаты (это RMSProp). Вместе:

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

Полезное следствие: длина шага почти не зависит от величины градиента. Если градиент по координате стабилен, то m^g\widehat m\approx g и v^g\sqrt{\widehat v}\approx|g|, поэтому

Δθjηgjgj=η.|\Delta\theta_j|\approx\eta\,\frac{|g_j|}{|g_j|}=\eta .

Adam переводит η\eta из «множителя при градиенте» в «размер шага в единицах весов» — отсюда и знаменитое значение по умолчанию 10310^{-3}, которое работает в задачах с совершенно разными масштабами потерь.

Слова «инвариантен к диагональному перемасштабированию» — самые важные в этой цитате. Умножьте одну координату признака на тысячу: градиент по соответствующему весу тоже умножится на тысячу, но и v\sqrt{v} умножится на тысячу, и отношение не изменится. Именно эту инвариантность мы сейчас увидим на настоящих данных.

Зачем нужна коррекция смещения

Инициализация m0=v0=0m_0=v_0=0 — не безобидная деталь. При постоянном g=1g=1 имеем m1=1β1=0,1m_1=1-\beta_1=0{,}1 и v1=1β2=0,001v_1=1-\beta_2=0{,}001, поэтому без коррекции первый множитель равен

m1v1=0,10,0316=103,16,\frac{m_1}{\sqrt{v_1}}=\frac{0{,}1}{0{,}0316}=\sqrt{10}\approx3{,}16 ,

то есть первый шаг был бы втрое длиннее задуманного η\eta. Коррекция делит на 1β1t1-\beta_1^t и 1β2t1-\beta_2^t и возвращает обеим оценкам правильный масштаб.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева синяя кривая некорректированного первого момента медленно поднимается к единице, красная сразу равна единице; справа множитель шага без коррекции начинается с трёх с небольшим и спускается к единице
Рис. 62.4. Старт из нуля и лекарство от него

Постоянный градиент g=1g=1. Некорректированный mtm_t доползает до 0,990{,}99 только к шагу 44 — почти полсотни шагов метод недооценивает направление. Исправленные m^t\widehat m_t и v^t\widehat v_t равны единице точно, при любом tt. Справа виден побочный эффект несимметричной инициализации: без коррекции самый первый шаг был бы в 103,16\sqrt{10}\approx3{,}16 раза длиннее.

Реальные данные: когда масштабы врозь

Модельный овраг убедителен, но настоящие овраги не рисуют — их получают. Возьмём данные диагностики опухолей молочной железы из sklearn (569 объектов, 30 признаков) и обучим логистическую регрессию полным градиентом, 300 итераций. Признаки берём сырыми, как они записаны в файле: наибольшее стандартное отклонение превосходит наименьшее в 215 тысяч раз.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Две панели кривых логистической потери: слева на сырых признаках GD останавливается высоко, Adam уходит вниз; справа после стандартизации все пять методов приходят почти в одну точку
Рис. 62.5. Сырые признаки против стандартизованных

Слева — сырые признаки: за 300 итераций GD доходит до потери 0,2500{,}250, Momentum до 0,1990{,}199, RMSProp до 0,2290{,}229, AdaGrad до 0,1760{,}176, Adam до 0,0980{,}098. Справа — те же данные после стандартизации: 0,0400{,}040; 0,0370{,}037; 0,0350{,}035; 0,0380{,}038; 0,0270{,}027. Разрыв между лучшим и худшим сжался с 2,5 раза до 1,5. У каждого метода свой лучший η\eta из сетки в 33 значения от 10710^{-7} до 1010; начальная потеря у всех одна и та же, ln2=0,693\ln2=0{,}693.

Вывод из этой пары панелей стоит десятка формул: адаптивные методы в основном делают ту работу, которую вы не сделали при подготовке данных. Стандартизация дешевле, проверяемее и не мешает никакому оптимизатору.

Один и тот же шаг — нечестное сравнение

Самая частая ошибка в отчётах: «мы сравнили оптимизаторы при η=103\eta=10^{-3}». Масштаб обновления у методов разный по построению. У GD сдвиг пропорционален g|g|; у Adam он близок к η\eta независимо от g|g|, потому что m^/v^\widehat m/\sqrt{\widehat v} по модулю порядка единицы. Никакого общего η\eta не существует.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Пять U-образных кривых потери против learning rate в логарифмических осях, минимумы отмечены треугольниками и стоят на разных значениях, вертикальная штриховая линия отмечает общий шаг
Рис. 62.6. У каждого метода своя рабочая зона шага

Те же реальные данные, 200 итераций, полная сетка η\eta. Лучший шаг у GD — 3,21053{,}2\cdot10^{-5} (потеря 0,2880{,}288), у Adam — 3,21023{,}2\cdot10^{-2} (потеря 0,1340{,}134): разница в тысячу раз. Если всем выдать «удобный» шаг Adam, GD покажет потерю 188, а Momentum — 101, то есть оба развалятся, и вывод «адаптивные методы лучше» будет получен из ничего.

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

GD, Momentum, AdaGrad и Adam в одном овраге

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

По умолчанию лаборатория работает честно: каждому методу она подбирает свой лучший η\eta из сетки, ровно как рисунок 62.6. Начните с κ=1\kappa=1: круглая чаша, все четверо приходят в минимум почти сразу — на симметричной задаче адаптивность не нужна. Поднимайте κ\kappa и следите за счётчиком пересечений оси: у GD он растёт первым, и найденный для него η\eta упирается в потолок 2/κ2/\kappa.

Затем переключите режим на «общий η\eta для всех» и поднимайте шаг: вы увидите три разных порога устойчивости и то самое несправедливое сравнение, о котором шла речь выше. И наконец включите шум градиента σ\sigma: на гладкой детерминированной чаше покоординатная нормировка почти творит чудеса, но как только v\sqrt{v} начинает измерять не сигнал, а шум, порядок методов меняется. Именно поэтому выводы, полученные на модельной квадратичной задаче, нельзя переносить на обучение сети без проверки.

AdamW: decay, который снова стал сжатием

Для обычного SGD штраф λ2θ2\tfrac{\lambda}{2}\|\theta\|^2 и «затухание весов» — одно и то же:

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

В Adam это равенство ломается: слагаемое λθ\lambda\theta попадает в градиент, проходит через покоординатное деление на v^\sqrt{\widehat v} и сжимает разные веса по-разному. Координата с малым v\sqrt{v} получает огромное сжатие, координата с большим — почти никакого. AdamW отделяет decay от градиента:

θ(1ηλ)θηm^v^+ε.\theta\leftarrow(1-\eta\lambda)\theta- \eta\frac{\widehat m}{\sqrt{\widehat v}+\varepsilon}.
Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева три кривые модулей весов по координатам: серая без decay, синяя AdamW идёт рядом, красная с L2 в градиенте прижата и изломана; справа две гистограммы коэффициентов сжатия, красная растянута, синяя узкая
Рис. 62.7. Одинаково ли сжались веса

Реальные данные, стандартизованные признаки, λ=0,05\lambda=0{,}05, η=0,05\eta=0{,}05, 400 шагов. Норма весов: без decay 5,845{,}84, с L2L_2 внутри градиента 1,421{,}42, у AdamW 4,604{,}60. Но главное — справа: коэффициент сжатия отдельных координат у L2L_2-варианта разбросан в 81,9 раза, у AdamW — лишь в 5,1. Один и тот же λ\lambda означает у них совершенно разную регуляризацию.

Практический вывод для регуляризации: число λ\lambda без имени оптимизатора ничего не значит, а переход с Adam на AdamW требует заново настроить λ\lambda, а не переписать одну букву в конфигурации.

Шор: растяжение пространства вместо угадывания шага

Мысль «поменяем метрику вместо того, чтобы мучить шаг» появилась задолго до AdaGrad, и появилась она в Киеве. Наум Зуселевич Шор (1937–2006), сотрудник Института кибернетики имени В. М. Глушкова, занимался задачами, где функция негладкая и обычный градиент попросту не определён. На рубеже 1960–1970-х годов он предложил субградиентные методы с растяжением пространства: после каждого шага координаты пересчитываются линейным преобразованием, вытягивающим то направление, вдоль которого метод топчется. Знаменитый rr-алгоритм Шора растягивает пространство в направлении разности двух последовательных субградиентов — то есть ровно в том направлении, где ландшафт оказался оврагом.

θt+1=θtηtBtBtgt,\theta_{t+1}=\theta_t-\eta_t\,B_tB_t^\top g_t,

где матрица BtB_t обновляется после каждого шага так, чтобы растянуть пространство вдоль gtgt1g_t-g_{t-1}. Сравните с AdaGrad: там роль BtBtB_tB_t^\top играет диагональная матрица diag(Gt,j1/2)\operatorname{diag}(G_{t,j}^{-1/2}). Идея одна и та же — заменить метрику; отличается только цена.

Обрезка градиента и численная точность

Иногда норма градиента взрывается — обычно в рекуррентных сетях или при неудачном сочетании шага и батча. Клиппинг по норме заменяет

ggmin(1, cg),g\leftarrow g\cdot\min\Bigl(1,\ \frac{c}{\|g\|}\Bigr),

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

ηэфф=ηcg,\eta_{\text{эфф}}=\eta\,\frac{c}{\|g\|},

и чем сильнее выброс, тем сильнее автоматическое торможение. Покоординатная обрезка устроена иначе: она поворачивает вектор, и это надо оговаривать в отчёте.

Численная точность тоже участвует в траектории. В смешанной точности малые градиенты округляются в ноль; loss scaling временно увеличивает их до представимого диапазона и делит обратно перед шагом:

L~=SL,g=1SL~,S104.\tilde L=S\cdot L,\qquad g=\frac1S\,\nabla\tilde L,\qquad S\sim10^{4} .

Появление NaN не доказывает, что плохо выбрана функция потерь, пока не проверены переполнение, ε\varepsilon и порядок операций.

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

Adam почти всегда быстрее уменьшает обучающую потерю — мы это и увидели. Но обучение не соревнование по скорости спуска. В переопределённом режиме из урока 59 существует целое многообразие параметров, дающих почти нулевую ошибку на обучении; оптимизатор молча выбирает из него один, и этот выбор — часть модели, а не часть вычислительной техники.

Спорить с этой цитатой можно и нужно: в трансформерах картина другая, там AdamW стал стандартом не от лени. Но методологический смысл её бесспорен: «достиг той же train loss» и «построил ту же функцию» — разные утверждения, и второе проверяется только на отложенных данных.

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

Порядок действий, который экономит месяцы:

  1. Приведите признаки к сопоставимым масштабам и проверьте нормализацию внутри сети. Половина «плохой обусловленности» лечится здесь и бесплатно.
  2. Возьмите проверенный baseline: AdamW для трансформеров, SGD с моментом для многих задач зрения, AdaGrad для разреженных выпуклых моделей.
  3. Настройте η\eta по логарифмической сетке и выберите расписание. Это дороже и важнее, чем выбор между Adam и SGD.
  4. Только потом трогайте λ\lambda, β1\beta_1, β2\beta_2 и размер батча. По одному решению за раз.
  5. Логируйте норму градиента, долю обрезанных шагов и отношение Δθ/θ\|\Delta\theta\|/\|\theta\| по слоям. Диагностика дешевле перебора.
  6. Сравнивайте на нескольких seeds и по validation, а тест открывайте один раз в конце, как договаривались в уроке 58.

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

Задачи