Полный градиент точно усредняет все строки, но один шаг может стоить миллионы вычислений. SGD заменяет его шумной оценкой по мини-батчу. Шум удешевляет обновления, помогает исследовать ландшафт и одновременно мешает точному финишу — а значит, обучение приходится не только запускать, но и вовремя останавливать.

Миллион примеров ради одного шага

Эмпирический риск имеет вид

R^(θ)=1ni=1ni(θ).\widehat R(\theta)=\frac1n\sum_{i=1}^n\ell_i(\theta).

Полный градиент

g(θ)=1ni=1ni(θ)g(\theta)=\frac1n\sum_{i=1}^n\nabla\ell_i(\theta)

требует прохода по всей выборке. Если n=108n=10^8, параметры обновятся только после чтения ста миллионов объектов: сутки счёта — и одна-единственная точка траектории. Мини-батч BtB_t размера bb даёт

g^t=1biBti(θt),θt+1=θtηtg^t.\widehat g_t=\frac1b\sum_{i\in B_t}\nabla\ell_i(\theta_t), \qquad \theta_{t+1}=\theta_t-\eta_t\widehat g_t .

При равномерном независимом выборе индексов

E[g^tθt]=g(θt).\mathbb E[\widehat g_t\mid\theta_t]=g(\theta_t).

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

Весь урок мы будем считать на реальных данных: почасовой велопрокат, 1737917\,379 строк. Час суток закодирован тремя парами гармоник, как в уроке о базисных признаках, добавлены температура, влажность, ветер и признак рабочего дня — итого 1010 признаков плюс свободный член. Цель стандартизована, потери квадратичные. Точное решение нормальных уравнений даёт MSE=0,454\mathrm{MSE}_\star=0{,}454, то есть R2=0,546R^2=0{,}546. Это дно, к которому будут стремиться все наши траектории; ниже него не опустится никакой оптимизатор, и всякое сравнение мы ведём именно с этим числом.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Три панели с облаками точек: при батче 4 разброс 0.322, при батче 32 — 0.111, при батче 256 — 0.039; в каждой панели чёрная стрелка полного градиента упирается в красную точку — центр облака
Рис. 61.1. Облако мини-батчей центрировано на полном градиенте

Каждая синяя точка — оценка градиента по одному случайному батчу (реальный велопрокат, координаты R^/wsin\partial\widehat R/\partial w_{\sin} и R^/wcos\partial\widehat R/\partial w_{\cos} первой гармоники часа). Чёрная стрелка — точный g(θ)g(\theta), красная точка — его конец. Центр облака совпадает с концом стрелки при любом bb: оценка несмещённая. Меняется только разброс — 0,3220{,}322, 0,1110{,}111 и 0,0390{,}039 при b=4b=4, 3232 и 256256.

Батч — это выборка, а не приближение

Полезно раз и навсегда разделить две вещи. Мини-батч — не «грубое приближение» полного градиента в смысле округления. Это статистическая оценка: несмещённая, со своей дисперсией и своим доверительным интервалом. Для каждой координаты jj

Var ⁣[g^t,j]=1bVar ⁣[ji(θt)],\operatorname{Var}\!\left[\widehat g_{t,j}\right] =\frac{1}{b}\operatorname{Var}\!\left[\nabla_j\ell_i(\theta_t)\right],

если индексы выбраны независимо. Отсюда стандартное отклонение

sd ⁣[g^t,j]=σjb,\operatorname{sd}\!\left[\widehat g_{t,j}\right] =\frac{\sigma_j}{\sqrt b},

где σj\sigma_j — разброс индивидуальных градиентов по строкам. Это тот самый корень из урока о законе больших чисел, только усредняем мы теперь не отклики, а векторы производных.

Проверим закон на данных. Для батчей от 11 до 10241024 мы измерили Eg^g2\sqrt{\mathbb E\|\widehat g-g\|^2} по 300300 повторениям каждый. Наклон прямой в логарифмических осях получился 0,498-0{,}498 при теоретическом 1/2-1/2. При b=1b=1 типичная ошибка оценки равна 2,642{,}64 — сама норма полного градиента при этом порядка единицы, то есть одиночный пример указывает направление почти наугад. При b=1024b=1024 ошибка падает до 0,0850{,}085.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева лог-лог график измеренного разброса оценки градиента по размеру батча с наклоном минус 0.50; справа две кривые: цена шага растёт как b, выигрыш в тишине — как корень из b
Рис. 61.2. Шум убывает как корень, а цена растёт линейно

Слева: измеренный разброс оценки против размера батча. Точки ложатся на прямую с наклоном 0,498-0{,}498 — закон 1/b1/\sqrt b выполняется на реальных данных. Справа: та же картина в терминах платы. Батч в сто раз больше стоит в сто раз дороже, а шум уменьшает лишь в десять раз. Кривые расходятся, и расхождение — это и есть цена точности.

Закон корня: чем мы платим за тишину

Из σ/b\sigma/\sqrt b следует неприятная арифметика. Чтобы уменьшить шум вдвое, надо увеличить батч вчетверо; чтобы уменьшить его в десять раз — в сто раз. Стоимость же шага растёт с bb примерно линейно, пока не насытится устройство. Значит,

цена шагавыигрыш в тишине  bb=b.\frac{\text{цена шага}}{\text{выигрыш в тишине}}\ \propto\ \frac{b}{\sqrt b}=\sqrt b .

Плата за каждую следующую «единицу спокойствия» растёт. Наши измерения это подтверждают: переход от b=4b=4 к b=256b=256 — это в 6464 раза больше вычислений на шаг и ровно в 8,178{,}17 раза меньше разброса, при теоретических 64=8\sqrt{64}=8.

Честная ось времени

Эпоха — обработка примерно nn примеров; при батче bb число обновлений в эпохе равно

Tэпоха=nb,T_{\text{эпоха}}=\left\lceil\frac{n}{b}\right\rceil,

то есть для нашего велопроката 17379/6427217\,379/64\approx272 шага. Сравнивать два режима по числу шагов нечестно: один мог прочитать в сотни раз больше данных. Сравнивать по эпохам честнее, но и это ответ лишь на один из трёх вопросов. Их три:

шаги  сколько раз мы двинули веса,\text{шаги}\ \longleftrightarrow\ \text{сколько раз мы двинули веса}, примеры  сколько данных прочитано,\text{примеры}\ \longleftrightarrow\ \text{сколько данных прочитано}, секунды  сколько это стоило.\text{секунды}\ \longleftrightarrow\ \text{сколько это стоило.}

Мы дали трём режимам одинаковый бюджет данных — 400000400\,000 прочитанных примеров — и один и тот же шаг η=0,35/L\eta=0{,}35/L. Батч 88 успел сделать 5000050\,000 обновлений, батч 646462506250, батч 512512 — всего 781781. После первой тысячи примеров лидирует мелкий батч (0,5180{,}518 против 0,6720{,}672 у крупного): дешёвые шаги важнее их точности, пока мы далеко от минимума. Но к концу бюджета порядок меняется на противоположный: 0,5350{,}535 у b=8b=8 против 0,4550{,}455 у b=512b=512 при дне 0,4540{,}454. Мелкий батч быстро добежал до окрестности минимума и остался в ней дрожать.

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

Слева — по числу обновлений: кажется, что b=8b=8 учится «за меньшее число шагов». Справа — по числу прочитанных примеров, то есть при равном бюджете данных: преимущество почти исчезает, а в конце мелкий батч оказывается выше остальных. Пунктир — точный минимум 0,4540{,}454. Одна и та же тренировка, два разных вывода — потому что разные оси.

Порог устойчивости

Для квадратичной задачи полный градиентный спуск с постоянным шагом ведёт себя как умножение ошибки в каждом собственном направлении на множитель 1ηλ1-\eta\lambda. Значит, сходимость требует 1ηλ<1|1-\eta\lambda|<1 для всех λ\lambda, то есть

0<η<2L,L=λmax.0<\eta<\frac{2}{L},\qquad L=\lambda_{\max}.

На нашей матрице признаков L=1,45L=1{,}45 и μ=0,31\mu=0{,}31, число обусловленности κ=L/μ=4,6\kappa=L/\mu=4{,}6, а порог 2/L=1,382/L=1{,}38. Шаг 0,5/L0{,}5/L спокойно приводит к минимуму, 1,9/L1{,}9/L уже качает траекторию поперёк долины, а 2,05/L2{,}05/L — уносит потери за 10310^3 за сотню шагов. Порог здесь не метафора: это точное число, которое считается из данных до всякого обучения.

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

Пол из шума

Постоянный шаг в SGD не приводит к минимуму даже в идеальной выпуклой задаче. Причина видна из простой оценки: около минимума полезный сигнал g(θ)0g(\theta)\to0, а шум σ/b\sigma/\sqrt b никуда не девается. Траектория стабилизируется в «шаровом облаке» вокруг минимума, радиус которого растёт с η\eta и падает с bb. Для квадратичной задачи асимптотический избыток риска ведёт себя как

E[R^(θt)]R^  ησ22b11ηL/2,\mathbb E\left[\widehat R(\theta_t)\right]-\widehat R_\star \ \approx\ \frac{\eta\,\sigma^2}{2b}\cdot\frac{1}{1-\eta L/2},

то есть примерно линейно по η\eta вдали от порога и взрывается у него. Измерения на велопрокате при b=32b=32: шаг 0,05/L0{,}05/L даёт финальные потери 0,45550{,}4555 (избыток 0,00170{,}0017 над дном), шаг 1,6/L1{,}6/L0,6330{,}633 (избыток 0,1790{,}179). Увеличение шага в 3232 раза подняло избыток в 106106 раз: линейная часть объясняет 3232, остальное добавил множитель близости к порогу.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева три кривые потерь для шагов 0.5/L, 1.9/L и 2.05/L: плавное убывание, колебания и расходимость; справа зависимость избытка потерь от постоянного шага в логарифмических осях, растущая почти линейно
Рис. 61.4. Порог 2/L и пол из шума

Слева: полный градиентный спуск при трёх шагах. Ниже порога 2/L=1,382/L=1{,}38 кривая монотонно убывает, у порога появляются колебания, за порогом потери уходят вверх. Справа: SGD с батчем 3232 и постоянным шагом. Каждая точка — уровень, на котором траектория застревает. От 0,00170{,}0017 до 0,1790{,}179 избытка — пол из шума поднимается вместе с шагом.

Расписание шага

Классические условия Роббинса—Монро требуют

tηt=,tηt2<.\sum_{t}\eta_t=\infty,\qquad \sum_{t}\eta_t^2<\infty .

Первая сумма запрещает остановиться слишком рано: суммарного «пути» должно хватить, чтобы добраться до минимума из любой начальной точки. Конечность второй ограничивает накопленный шум и заставляет пол опускаться к нулю. Последовательность ηt=1/t\eta_t=1/t удовлетворяет обоим условиям, ηt=1/t\eta_t=1/\sqrt t — только первому, ηt=1/t2\eta_t=1/t^2 — только второму.

На практике используют прогрев (warmup), ступенчатое уменьшение, косинусное угасание

ηt=η02(1+cosπtT)\eta_t=\frac{\eta_0}{2}\left(1+\cos\frac{\pi t}{T}\right)

и one-cycle. Формально косинусное расписание конечно и потому не проверяет условия Роббинса—Монро — оно просто доводит шаг до нуля к концу заданного бюджета. Этого достаточно: при b=32b=32 и бюджете 300000300\,000 примеров постоянный шаг 1,2/L1{,}2/L оставил нас на 0,55160{,}5516, а тот же шаг с косинусным угасанием — на 0,45420{,}4542 при дне 0,45380{,}4538. Избыток уменьшился в 235235 раз без единого дополнительного прочитанного примера.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева кривые потерь для постоянного шага, 1/t, косинуса и прогрева с косинусом: угасающие уходят заметно ниже; справа сами формы расписаний
Рис. 61.5. Угасание шага снимает дрожание

Слева — потери по числу прочитанных примеров, справа — сами расписания. Постоянный шаг быстро спускается и застревает на уровне 0,55160{,}5516; угасающие расписания к концу бюджета сходятся на 0,45420{,}4542 — практически на дно. Прогрев в первых 400400 шагах здесь почти ничего не меняет: задача квадратичная и хорошо обусловленная, а прогрев спасает там, где начальные градиенты велики и плохо масштабированы.

Русская линия: квазиградиент Ермольева

Пока в статистике развивалась стохастическая аппроксимация, в Киеве складывалась своя школа. Юрий Михайлович Ермольев в Институте кибернетики АН УССР занимался задачами стохастического программирования — оптимизацией, где и целевая функция, и ограничения заданы средними по случайности. Его книга «Методы стохастического программирования» (М.: Наука, 1976) ввела в обиход понятие стохастического квазиградиента: направления, которое не обязано быть несмещённой оценкой градиента и даже не обязано существовать как градиент — достаточно, чтобы в среднем оно составляло острый угол с направлением убывания.

Формально требуется лишь

E[ξtθt]=g(θt)+rt,rt0,\mathbb E\left[\xi_t\mid\theta_t\right]=g(\theta_t)+r_t, \qquad \|r_t\|\to0,

и тогда при условиях Роббинса—Монро метод θt+1=Π(θtηtξt)\theta_{t+1}=\Pi\left(\theta_t-\eta_t\xi_t\right) сходится. Эта постановка охватывает случаи, где мини-батч смещён: недифференцируемые потери, конечно-разностные оценки, вложенные средние, проекция на множество ограничений из урока о задачах с ограничениями. Современные приёмы, которые формально ломают несмещённость — обрезка градиента, hard example mining, аппроксимация внутреннего ожидания одной выборкой, — живут именно в этой теории, а не в исходной схеме Роббинса—Монро.

Рядом стоит вторая ветвь той же школы: Аркадий Немировский и Давид Юдин в конце 1970-х описали, каких скоростей в принципе нельзя превзойти для выпуклых задач, и придумали метод зеркального спуска, где выбор геометрии подстраивается под форму допустимого множества. Из их нижних оценок следует, что O(1/T)O(1/\sqrt T) для общих выпуклых задач с шумом — не слабость SGD, а свойство самой задачи. Стоит помнить об этом, читая очередное обещание «ускорить обучение в десять раз».

Лаборатория батча и расписания

Батч, шаг и расписание при общем бюджете данных

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

Бюджет в лаборатории фиксирован: восемь тысяч примеров, как их ни дели. Начните с постоянного шага и переберите батчи: при b=1b=1 траектория — клубок, при b=256b=256 — гладкая дуга, которая не успевает дойти. Затем доводите шаг до порога 2/L2/L и наблюдайте, как аккуратная дуга превращается в поперечные скачки, а потом в расходимость. Наконец включите косинусное угасание и посмотрите на золотой пунктир «пола»: он опускается, хотя прочитано ровно столько же данных.

Ранняя остановка: где разворачивается validation

Оптимизация и обучение — разные цели. Оптимизатор минимизирует R^\widehat R на обучающей выборке; нас же интересует истинный риск. После некоторого момента дальнейшая минимизация обучающего среднего перестаёт улучшать будущее качество и начинает его ухудшать: модель дописывает в веса шум конкретных меток.

Мы поставили честный эксперимент на реальных данных. Двести случайных часов велопроката, из них 5050 в обучении и 150150 в validation; 5353 признака — шестнадцать гармоник часа плюс погодные и их взаимодействия; к целям добавлен дополнительный шум с фиксированным seed, чтобы имитировать грязные метки. Полный градиентный спуск, тридцать тысяч шагов.

Результат: validation достигает минимума 1,761{,}76 на шаге 5454, а к концу поднимается до 3,333{,}33 — в 1,891{,}89 раза хуже. Обучающая ошибка за то же время падает с 0,6320{,}632 до 0,0810{,}081. Тот, кто смотрел только на train, увидел бы восьмикратное улучшение и не заметил, что модель испортилась вдвое.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Синяя кривая train MSE монотонно падает с 1.22 до 0.08, красная кривая validation сначала снижается до 1.76 на шаге 54, затем растёт до 3.33; вертикаль отмечает checkpoint, горизонтальная зелёная линия — лучший ridge
Рис. 61.6. Ранняя остановка на реальных данных с зашумлёнными метками

Ось шагов логарифмическая. Train падает монотонно — как и должен. Validation разворачивается на шаге 5454, и дальше каждая новая тысяча шагов делает модель хуже. Серая область — эпохи, в которых мы улучшаем подгонку и ухудшаем будущий риск. Зелёный пунктир — лучший ridge на том же разбиении: 1,7531{,}753 против 1,7601{,}760 у ранней остановки.

Почему остановка похожа на ridge

Совпадение с ridge из урока о регуляризации не случайно. Разложим линейную задачу по собственным направлениям матрицы 1nXX\frac1nX^\top X с собственными числами λk\lambda_k. Градиентный спуск из нуля после tt шагов восстанавливает kk-ю компоненту решения с множителем

fkGD=1(1ηλk)t,f^{\text{GD}}_k=1-(1-\eta\lambda_k)^{t},

а ridge со штрафом α\alpha — с множителем

fkridge=λkλk+α.f^{\text{ridge}}_k=\frac{\lambda_k}{\lambda_k+\alpha}.

Обе функции равны нулю при λk0\lambda_k\to0 и стремятся к единице при больших λk\lambda_k; при малых ηλt\eta\lambda t обе ведут себя как ηλkt\eta\lambda_k t. Отсюда знаменитое соответствие

α1ηt.\alpha\approx\frac{1}{\eta t}.

Дольше учим — слабее штраф. При η=0,5\eta=0{,}5 и t=50t=50 направление с λ=1,5\lambda=1{,}5 выучено полностью (1,0001{,}000), направление с λ=0,02\lambda=0{,}02 — на 0,3950{,}395 (ridge при α=1/(ηt)=0,04\alpha=1/(\eta t)=0{,}04 даёт 0,3330{,}333), а направление с λ=0,001\lambda=0{,}001 — всего на 0,0250{,}025. Максимальное расхождение двух кривых на сетке равно 0,2090{,}209: соответствие качественное, а не тождество.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Сплошные кривые доли выученного сигнала для 10, 50 и 200 шагов спуска и пунктирные кривые ridge с соответствующими альфа: пары кривых идут рядом, переход смещается влево с ростом числа шагов
Рис. 61.7. Ранняя остановка гасит те же направления, что и ridge

По горизонтали — собственное число направления, по вертикали — доля выученного сигнала. Сплошные линии: градиентный спуск после 1010, 5050 и 200200 шагов. Пунктир: ridge с α=1/(ηt)\alpha=1/(\eta t). Каждая пара идёт рядом: и остановка, и штраф пропускают сильные направления и подавляют слабые. С ростом числа шагов переход сдвигается влево — регуляризация ослабевает.

Заодно понятно, почему ранняя остановка часто помогает именно шумным задачам: направления с малым λ\lambda плохо определены данными, и именно в них селится шум. Спуск добирается до них последними. Эту же спектральную картину мы видели в PCA — только там мы отбрасывали слабые направления явно, а здесь просто не успеваем их выучить.

Patience, checkpoint и цена подглядывания

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

Если проверять validation каждые десять шагов и выбирать лучший из тысяч замеров, то сам минимум становится оптимистичным: мы выбрали максимум по шумной выборке. Для mm независимых замеров с шумом τ\tau типичный оптимизм растёт как

E[maxjmεj]  τ2lnm.\mathbb E\left[\max_{j\le m}\varepsilon_j\right]\ \approx\ \tau\sqrt{2\ln m}.

При m=1000m=1000 множитель 2ln1000=3,72\sqrt{2\ln1000}=3{,}72: почти четыре стандартных отклонения бесплатного «улучшения». Это та же цена поиска, которую разбирает урок про oracle inequality, и лечится она независимым test.

Перемешивание, редкие группы и стратификация

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

Отдельная опасность — редкая группа. Пусть её доля pp; тогда вероятность, что в батче размера bb не окажется ни одного её представителя, равна

P(группа не попала)=(1p)b.\mathbb P(\text{группа не попала})=(1-p)^b .

Возьмём реальные числа: в SMS Spam Collection 747747 спам-сообщений из 55745574, то есть p=0,134p=0{,}134. При b=8b=8 доля батчей без единого спама равна 0,8668=0,3160{,}866^8=0{,}316 — почти треть шагов не содержит информации о редком классе вовсе. При b=32b=32 это уже 0,01000{,}0100, один шаг из ста.

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

Микробатчи и эффективный размер

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

g^=1Mm=1Mg^(m),beff=Mbmicro.\widehat g=\frac1M\sum_{m=1}^{M}\widehat g^{(m)}, \qquad b_{\text{eff}}=M\,b_{\text{micro}} .

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

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

Ходовое эвристическое правило переноса рецепта — линейное масштабирование шага вместе с батчем:

η(b)=η0bb0,η(b)b=η0b0=const,\eta(b)=\eta_0\cdot\frac{b}{b_0}, \qquad \frac{\eta(b)}{b}=\frac{\eta_0}{b_0}=\text{const},

то есть неизменной сохраняется именно комбинация η/b\eta/b, задающая пол из шума. Правило работает лишь пока η(b)\eta(b) остаётся заметно ниже порога 2/L2/L; дальше его страхуют прогревом.

Отсюда практическое правило отчётности: указывать микробатч, эффективный батч и число устройств. При переносе рецепта на вдвое большее число ускорителей эффективный батч удваивается, шум падает в 2\sqrt2 раз — и шаг обычно поднимают, добавляя прогрев, чтобы не задеть порог устойчивости.

Шум как неявная регуляризация — осторожно

Популярное объяснение: мелкий батч чаще покидает узкие минимумы, а плоские области лучше обобщают. Первая часть верна — амплитуда дрожания растёт с η/b\eta/b, и из узкой ямы шум действительно выбивает. Вторая часть требует осторожности: «плоскость» зависит от параметризации. В сети с ReLU можно умножить веса одного слоя на cc, а следующего — на 1/c1/c; функция не изменится, а кривизна изменится сильно. Значит, само по себе значение гессиана не является характеристикой качества.

Честная формулировка проще: шум SGD — часть определения алгоритма, и решение, к которому он приходит, зависит от η\eta, bb и расписания. Меняя их, мы меняем не скорость, а конечную модель. Именно поэтому связка «батч + шаг + расписание» проверяется по эмпирическому риску на нескольких seed, а не по одной удачной кривой.

Журнал обучения

Что писать в журнал, чтобы запуск можно было понять постфактум:

train loss,validation loss,ηt,g^t,время,seed.\text{train loss},\quad \text{validation loss},\quad \eta_t,\quad \|\widehat g_t\|,\quad \text{время},\quad \text{seed}.

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

f(θ+hej)f(θhej)2hfθj,\frac{f(\theta+he_j)-f(\theta-he_j)}{2h} \approx\frac{\partial f}{\partial\theta_j},

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

Сборка

Мини-батч — это выборка, а не приближение: несмещённая оценка со стандартным отклонением σ/b\sigma/\sqrt b. Отсюда всё остальное. Шум делает шаги дешёвыми и потому быстрыми в начале, но ставит пол, который при постоянном шаге не опускается: 0,55160{,}5516 вместо 0,45420{,}4542 на нашем велопрокате. Порог устойчивости 2/L2/L считается заранее и не обсуждается. Расписание опускает пол бесплатно. Ранняя остановка — не хитрость, а регуляризатор, почти совпадающий с ridge: 1,7601{,}760 против 1,7531{,}753 на одном и том же разбиении. А сравнение двух рецептов честно только при равном бюджете прочитанных данных, показанном расписании и нескольких seed.

Дальше — урок 62: momentum накапливает направление, AdaGrad и Adam дают каждой координате свой масштаб. Ландшафт при этом не меняется — меняется траектория и то, в какую из многих одинаково хороших точек мы придём.

Задачи