Почему незавершённая оптимизация может быть полезной регуляризацией?
Полный градиент точно усредняет все строки, но один шаг может стоить
миллионы вычислений. SGD заменяет его шумной оценкой по мини-батчу. Шум
удешевляет обновления, помогает исследовать ландшафт и одновременно мешает
точному финишу — а значит, обучение приходится не только запускать, но и
вовремя останавливать.
Миллион примеров ради одного шага
Эмпирический риск имеет вид
R(θ)=n1i=1∑nℓi(θ).
Полный градиент
g(θ)=n1i=1∑n∇ℓi(θ)
требует прохода по всей выборке. Если n=108, параметры обновятся только
после чтения ста миллионов объектов: сутки счёта — и одна-единственная точка
траектории. Мини-батч Bt размера b даёт
gt=b1i∈Bt∑∇ℓi(θt),θt+1=θt−ηtgt.
При равномерном независимом выборе индексов
E[gt∣θt]=g(θt).
Направление шумно, но в среднем верно. Это ровно та же логика, что в
оценке среднего по выборке: маленькая случайная горсть говорит о
целом — с ошибкой, которую можно посчитать.
Весь урок мы будем считать на реальных данных: почасовой велопрокат,
17379 строк. Час суток закодирован тремя парами гармоник, как в
уроке о базисных признаках, добавлены температура, влажность,
ветер и признак рабочего дня — итого 10 признаков плюс свободный член.
Цель стандартизована, потери квадратичные. Точное решение
нормальных уравнений даёт MSE⋆=0,454, то есть
R2=0,546. Это дно, к которому будут стремиться все наши траектории; ниже
него не опустится никакой оптимизатор, и всякое сравнение мы ведём именно с
этим числом.
Рис. 61.1. Облако мини-батчей центрировано на полном градиенте
Каждая синяя точка — оценка градиента по одному случайному батчу (реальный
велопрокат, координаты ∂R/∂wsin и
∂R/∂wcos первой гармоники часа). Чёрная стрелка
— точный g(θ), красная точка — его конец. Центр облака совпадает с
концом стрелки при любом b: оценка несмещённая. Меняется только разброс —
0,322, 0,111 и 0,039 при b=4, 32 и 256.
Батч — это выборка, а не приближение
Полезно раз и навсегда разделить две вещи. Мини-батч — не «грубое
приближение» полного градиента в смысле округления. Это статистическая
оценка: несмещённая, со своей дисперсией и своим доверительным интервалом.
Для каждой координаты j
Var[gt,j]=b1Var[∇jℓi(θt)],
если индексы выбраны независимо. Отсюда стандартное отклонение
sd[gt,j]=bσj,
где σj — разброс индивидуальных градиентов по строкам. Это тот самый
корень из урока о законе больших чисел, только усредняем мы
теперь не отклики, а векторы производных.
Проверим закон на данных. Для батчей от 1 до 1024 мы измерили
E∥g−g∥2 по 300 повторениям каждый.
Наклон прямой в логарифмических осях получился −0,498 при теоретическом
−1/2. При b=1 типичная ошибка оценки равна 2,64 — сама норма полного
градиента при этом порядка единицы, то есть одиночный пример указывает
направление почти наугад. При b=1024 ошибка падает до 0,085.
Рис. 61.2. Шум убывает как корень, а цена растёт линейно
Слева: измеренный разброс оценки против размера батча. Точки ложатся на
прямую с наклоном −0,498 — закон 1/b выполняется на реальных
данных. Справа: та же картина в терминах платы. Батч в сто раз больше стоит в
сто раз дороже, а шум уменьшает лишь в десять раз. Кривые расходятся, и
расхождение — это и есть цена точности.
Закон корня: чем мы платим за тишину
Из σ/b следует неприятная арифметика. Чтобы уменьшить шум вдвое,
надо увеличить батч вчетверо; чтобы уменьшить его в десять раз — в сто раз.
Стоимость же шага растёт с b примерно линейно, пока не насытится
устройство. Значит,
выигрышвтишинеценашага∝bb=b.
Плата за каждую следующую «единицу спокойствия» растёт. Наши измерения это
подтверждают: переход от b=4 к b=256 — это в 64 раза больше вычислений
на шаг и ровно в 8,17 раза меньше разброса, при теоретических
64=8.
Честная ось времени
Эпоха — обработка примерно n примеров; при батче b число обновлений в
эпохе равно
Tэпоха=⌈bn⌉,
то есть для нашего велопроката 17379/64≈272 шага. Сравнивать два режима по числу шагов нечестно: один мог прочитать
в сотни раз больше данных. Сравнивать по эпохам честнее, но и это ответ лишь
на один из трёх вопросов. Их три:
Мы дали трём режимам одинаковый бюджет данных — 400000 прочитанных
примеров — и один и тот же шаг η=0,35/L. Батч 8 успел сделать
50000 обновлений, батч 64 — 6250, батч 512 — всего 781. После
первой тысячи примеров лидирует мелкий батч (0,518 против 0,672 у
крупного): дешёвые шаги важнее их точности, пока мы далеко от минимума. Но к
концу бюджета порядок меняется на противоположный: 0,535 у b=8 против
0,455 у b=512 при дне 0,454. Мелкий батч быстро добежал до
окрестности минимума и остался в ней дрожать.
Слева — по числу обновлений: кажется, что b=8 учится «за меньшее число
шагов». Справа — по числу прочитанных примеров, то есть при равном бюджете
данных: преимущество почти исчезает, а в конце мелкий батч оказывается выше
остальных. Пунктир — точный минимум 0,454. Одна и та же тренировка,
два разных вывода — потому что разные оси.
Порог устойчивости
Для квадратичной задачи полный градиентный спуск с постоянным шагом ведёт
себя как умножение ошибки в каждом собственном направлении на множитель
1−ηλ. Значит, сходимость требует ∣1−ηλ∣<1 для всех
λ, то есть
0<η<L2,L=λmax.
На нашей матрице признаков L=1,45 и μ=0,31, число обусловленности
κ=L/μ=4,6, а порог 2/L=1,38. Шаг 0,5/L спокойно приводит к
минимуму, 1,9/L уже качает траекторию поперёк долины, а 2,05/L —
уносит потери за 103 за сотню шагов. Порог здесь не метафора: это точное
число, которое считается из данных до всякого обучения.
Статья Роббинса и Монро — точка рождения всей темы. В ней нет ни нейросетей,
ни изображений: речь о том, как найти корень уравнения, если каждое измерение
зашумлено. Ответ — двигаться маленькими, постепенно затухающими шагами. Через
семьдесят лет тот же рецепт крутит миллиардные модели.
Пол из шума
Постоянный шаг в SGD не приводит к минимуму даже в идеальной выпуклой задаче.
Причина видна из простой оценки: около минимума полезный сигнал
g(θ)→0, а шум σ/b никуда не девается. Траектория
стабилизируется в «шаровом облаке» вокруг минимума, радиус которого растёт с
η и падает с b. Для квадратичной задачи асимптотический избыток риска
ведёт себя как
E[R(θt)]−R⋆≈2bησ2⋅1−ηL/21,
то есть примерно линейно по η вдали от порога и взрывается у него.
Измерения на велопрокате при b=32: шаг 0,05/L даёт финальные потери
0,4555 (избыток 0,0017 над дном), шаг 1,6/L — 0,633
(избыток 0,179). Увеличение шага в 32 раза подняло избыток в 106 раз:
линейная часть объясняет 32, остальное добавил множитель близости к порогу.
Слева: полный градиентный спуск при трёх шагах. Ниже порога 2/L=1,38
кривая монотонно убывает, у порога появляются колебания, за порогом потери
уходят вверх. Справа: SGD с батчем 32 и постоянным шагом. Каждая точка —
уровень, на котором траектория застревает. От 0,0017 до 0,179 избытка
— пол из шума поднимается вместе с шагом.
Расписание шага
Классические условия Роббинса—Монро требуют
t∑ηt=∞,t∑ηt2<∞.
Первая сумма запрещает остановиться слишком рано: суммарного «пути» должно
хватить, чтобы добраться до минимума из любой начальной точки. Конечность
второй ограничивает накопленный шум и заставляет пол опускаться к нулю.
Последовательность ηt=1/t удовлетворяет обоим условиям,
ηt=1/t — только первому, ηt=1/t2 — только второму.
На практике используют прогрев (warmup), ступенчатое уменьшение, косинусное
угасание
ηt=2η0(1+cosTπt)
и one-cycle. Формально косинусное расписание конечно и потому не проверяет
условия Роббинса—Монро — оно просто доводит шаг до нуля к концу заданного
бюджета. Этого достаточно: при b=32 и бюджете 300000 примеров
постоянный шаг 1,2/L оставил нас на 0,5516, а тот же шаг с косинусным
угасанием — на 0,4542 при дне 0,4538. Избыток уменьшился в 235 раз
без единого дополнительного прочитанного примера.
Слева — потери по числу прочитанных примеров, справа — сами расписания.
Постоянный шаг быстро спускается и застревает на уровне 0,5516;
угасающие расписания к концу бюджета сходятся на 0,4542 — практически на
дно. Прогрев в первых 400 шагах здесь почти ничего не меняет: задача
квадратичная и хорошо обусловленная, а прогрев спасает там, где начальные
градиенты велики и плохо масштабированы.
Русская линия: квазиградиент Ермольева
Пока в статистике развивалась стохастическая аппроксимация, в Киеве
складывалась своя школа. Юрий Михайлович Ермольев в Институте кибернетики АН
УССР занимался задачами стохастического программирования — оптимизацией, где
и целевая функция, и ограничения заданы средними по случайности. Его книга
«Методы стохастического программирования» (М.: Наука, 1976) ввела в обиход
понятие стохастического квазиградиента: направления, которое не обязано
быть несмещённой оценкой градиента и даже не обязано существовать как
градиент — достаточно, чтобы в среднем оно составляло острый угол с
направлением убывания.
Формально требуется лишь
E[ξt∣θt]=g(θt)+rt,∥rt∥→0,
и тогда при условиях Роббинса—Монро метод
θt+1=Π(θt−ηtξt) сходится. Эта постановка
охватывает случаи, где мини-батч смещён: недифференцируемые потери,
конечно-разностные оценки, вложенные средние, проекция на множество
ограничений из урока о задачах с ограничениями. Современные
приёмы, которые формально ломают несмещённость — обрезка градиента, hard
example mining, аппроксимация внутреннего ожидания одной выборкой, — живут
именно в этой теории, а не в исходной схеме Роббинса—Монро.
Рядом стоит вторая ветвь той же школы: Аркадий Немировский и Давид Юдин в
конце 1970-х описали, каких скоростей в принципе нельзя превзойти для
выпуклых задач, и придумали метод зеркального спуска, где выбор геометрии
подстраивается под форму допустимого множества. Из их нижних оценок следует,
что O(1/T) для общих выпуклых задач с шумом — не слабость SGD, а
свойство самой задачи. Стоит помнить об этом, читая очередное обещание
«ускорить обучение в десять раз».
Лаборатория батча и расписания
Батч, шаг и расписание при общем бюджете данных
График шире экрана — листайте по горизонтали →
Загружается живая иллюстрация…
Бюджет в лаборатории фиксирован: восемь тысяч примеров, как их ни дели.
Начните с постоянного шага и переберите батчи: при b=1 траектория —
клубок, при b=256 — гладкая дуга, которая не успевает дойти. Затем
доводите шаг до порога 2/L и наблюдайте, как аккуратная дуга превращается в
поперечные скачки, а потом в расходимость. Наконец включите косинусное
угасание и посмотрите на золотой пунктир «пола»: он опускается, хотя
прочитано ровно столько же данных.
Ранняя остановка: где разворачивается validation
Оптимизация и обучение — разные цели. Оптимизатор минимизирует
R на обучающей выборке; нас же интересует
истинный риск. После некоторого момента дальнейшая минимизация
обучающего среднего перестаёт улучшать будущее качество и начинает его
ухудшать: модель дописывает в веса шум конкретных меток.
Мы поставили честный эксперимент на реальных данных. Двести случайных часов
велопроката, из них 50 в обучении и 150 в validation; 53 признака —
шестнадцать гармоник часа плюс погодные и их взаимодействия; к целям добавлен
дополнительный шум с фиксированным seed, чтобы имитировать грязные метки.
Полный градиентный спуск, тридцать тысяч шагов.
Результат: validation достигает минимума 1,76 на шаге 54, а к концу
поднимается до 3,33 — в 1,89 раза хуже. Обучающая ошибка за то же
время падает с 0,632 до 0,081. Тот, кто смотрел только на train,
увидел бы восьмикратное улучшение и не заметил, что модель испортилась вдвое.
Рис. 61.6. Ранняя остановка на реальных данных с зашумлёнными метками
Ось шагов логарифмическая. Train падает монотонно — как и должен. Validation
разворачивается на шаге 54, и дальше каждая новая тысяча шагов делает
модель хуже. Серая область — эпохи, в которых мы улучшаем подгонку и
ухудшаем будущий риск. Зелёный пунктир — лучший ridge на том же разбиении:
1,753 против 1,760 у ранней остановки.
Почему остановка похожа на ridge
Совпадение с ridge из урока о регуляризации не случайно.
Разложим линейную задачу по собственным направлениям матрицы
n1X⊤X с собственными числами λk. Градиентный спуск из
нуля после t шагов восстанавливает k-ю компоненту решения с множителем
fkGD=1−(1−ηλk)t,
а ridge со штрафом α — с множителем
fkridge=λk+αλk.
Обе функции равны нулю при λk→0 и стремятся к единице при больших
λk; при малых ηλt обе ведут себя как ηλkt.
Отсюда знаменитое соответствие
α≈ηt1.
Дольше учим — слабее штраф. При η=0,5 и t=50 направление с
λ=1,5 выучено полностью (1,000), направление с λ=0,02
— на 0,395 (ridge при α=1/(ηt)=0,04 даёт 0,333), а
направление с λ=0,001 — всего на 0,025. Максимальное расхождение
двух кривых на сетке равно 0,209: соответствие качественное, а не
тождество.
Рис. 61.7. Ранняя остановка гасит те же направления, что и ridge
По горизонтали — собственное число направления, по вертикали — доля
выученного сигнала. Сплошные линии: градиентный спуск после 10, 50 и
200 шагов. Пунктир: ridge с α=1/(ηt). Каждая пара идёт рядом:
и остановка, и штраф пропускают сильные направления и подавляют слабые. С
ростом числа шагов переход сдвигается влево — регуляризация ослабевает.
Заодно понятно, почему ранняя остановка часто помогает именно шумным задачам:
направления с малым λ плохо определены данными, и именно в них
селится шум. Спуск добирается до них последними. Эту же спектральную картину
мы видели в PCA — только там мы отбрасывали слабые направления
явно, а здесь просто не успеваем их выучить.
Patience, checkpoint и цена подглядывания
Реальная кривая validation не гладкая: она шумит, потому что validation
конечен. Отсюда правило patience — ждать p проверок без улучшения, прежде
чем остановиться. Оно сглаживает случайные провалы, но не создаёт новой
независимости.
Если проверять validation каждые десять шагов и выбирать лучший из тысяч
замеров, то сам минимум становится оптимистичным: мы выбрали максимум по
шумной выборке. Для m независимых замеров с шумом τ типичный
оптимизм растёт как
E[j≤mmaxεj]≈τ2lnm.
При m=1000 множитель 2ln1000=3,72: почти четыре стандартных
отклонения бесплатного «улучшения». Это та же цена поиска, которую разбирает
урок про oracle inequality, и лечится она независимым test.
Перемешивание, редкие группы и стратификация
Если данные отсортированы по классу или по времени, последовательные батчи
систематически смещены: градиент подолгу смотрит на один режим. Shuffle
возвращает оценкам почти равномерность. Но для временных рядов бездумное
перемешивание разрушает содержательный порядок оценки — модель начинает
подглядывать в будущее, и это уже утечка, а не оптимизация.
Отдельная опасность — редкая группа. Пусть её доля p; тогда вероятность,
что в батче размера b не окажется ни одного её представителя, равна
P(группанепопала)=(1−p)b.
Возьмём реальные числа: в SMS Spam Collection 747 спам-сообщений из 5574,
то есть p=0,134. При b=8 доля батчей без единого спама равна
0,8668=0,316 — почти треть шагов не содержит информации о редком
классе вовсе. При b=32 это уже 0,0100, один шаг из ста.
Стратифицированный батч, где доля редких фиксирована, уменьшает дисперсию —
если затем правильно взвесить слагаемые. Простое принудительное равенство
классов меняет саму задачу: оптимизируется перевзвешенный риск, и выходные
вероятности требуют коррекции prior и калибровки, как в
уроке о порождающих классификаторах. Это допустимый выбор, но он должен быть
записан явно, а не спрятан в сэмплере.
Микробатчи и эффективный размер
Память устройства ограничена, и большой батч часто собирают из микробатчей:
несколько прямых-обратных проходов, градиенты складываются, обновление одно.
g=M1m=1∑Mg(m),beff=Mbmicro.
При неизменных параметрах внутри цикла это в точности воспроизводит большой
батч. Но эквивалентность легко потерять: BatchNorm считает статистики внутри
микробатча, случайная аугментация даёт разные преобразования, обрезка
градиента, применённая к каждому микробатчу отдельно, — это уже другая
операция, чем обрезка суммы.
Слагаемые этой суммы не обязаны лежать на одной машине. Если каждый
микробатч живёт у своего владельца и не покидает его устройства, усреднение
градиентов превращается в федеративное обучение: формула та же,
а вот равенство долей и одинаковость распределений — уже нет.
Ходовое эвристическое правило переноса рецепта — линейное масштабирование
шага вместе с батчем:
η(b)=η0⋅b0b,bη(b)=b0η0=const,
то есть неизменной сохраняется именно комбинация η/b, задающая пол из
шума. Правило работает лишь пока η(b) остаётся заметно ниже порога
2/L; дальше его страхуют прогревом.
Отсюда практическое правило отчётности: указывать микробатч, эффективный
батч и число устройств. При переносе рецепта на вдвое большее число
ускорителей эффективный батч удваивается, шум падает в 2 раз — и
шаг обычно поднимают, добавляя прогрев, чтобы не задеть порог устойчивости.
Шум как неявная регуляризация — осторожно
Популярное объяснение: мелкий батч чаще покидает узкие минимумы, а плоские
области лучше обобщают. Первая часть верна — амплитуда дрожания растёт с
η/b, и из узкой ямы шум действительно выбивает. Вторая часть требует
осторожности: «плоскость» зависит от параметризации. В сети с ReLU можно
умножить веса одного слоя на c, а следующего — на 1/c; функция не
изменится, а кривизна изменится сильно. Значит, само по себе значение
гессиана не является характеристикой качества.
Честная формулировка проще: шум SGD — часть определения алгоритма, и решение,
к которому он приходит, зависит от η, b и расписания. Меняя их, мы
меняем не скорость, а конечную модель. Именно поэтому связка «батч + шаг +
расписание» проверяется по эмпирическому риску на нескольких
seed, а не по одной удачной кривой.
Журнал обучения
Что писать в журнал, чтобы запуск можно было понять постфактум:
train loss,validation loss,ηt,∥gt∥,время,seed.
Норма градиента — самый дешёвый детектор беды. Резкий всплеск означает
нестабильность или испорченный батч; норма, ушедшая в ноль при высокой
потере, — насыщение активаций либо ошибка кода. Перед долгим запуском
градиент проверяют конечными разностями на малой гладкой модели:
2hf(θ+hej)−f(θ−hej)≈∂θj∂f,
помня, что слишком большое h даёт ошибку аппроксимации, а слишком малое —
ошибку округления. Такой тест ловит неверный знак и пропущенное слагаемое, но
ничего не говорит о скорости SGD — это проверка кода, а не оптимизатора.
Сборка
Мини-батч — это выборка, а не приближение: несмещённая оценка со стандартным
отклонением σ/b. Отсюда всё остальное. Шум делает шаги дешёвыми
и потому быстрыми в начале, но ставит пол, который при постоянном шаге не
опускается: 0,5516 вместо 0,4542 на нашем велопрокате. Порог
устойчивости 2/L считается заранее и не обсуждается. Расписание опускает
пол бесплатно. Ранняя остановка — не хитрость, а регуляризатор, почти
совпадающий с ridge: 1,760 против 1,753 на одном и том же разбиении.
А сравнение двух рецептов честно только при равном бюджете прочитанных
данных, показанном расписании и нескольких seed.
Дальше — урок 62: momentum накапливает направление, AdaGrad и
Adam дают каждой координате свой масштаб. Ландшафт при этом не меняется —
меняется траектория и то, в какую из многих одинаково хороших точек мы
придём.