Distill: почему momentum действительно работает
Полный перевод статьи Габриэля Гоу (Distill, 2017): градиентный спуск и momentum на выпуклой квадратичной функции, собственные направления ошибки, число обусловленности, «квадратный корень» из него у momentum, нижняя граница Нестерова и стохастические градиенты.
Почему momentum действительно работает
Заглавный рисунок (интерактивный): линии уровня вытянутой «овражной» функции и траектория оптимизации из точки старта к минимуму. Ползунки: шаг , momentum . Траектория раскачивается из стороны в сторону, но быстро доходит до минимума.
Мы часто думаем о momentum как о способе гасить колебания и ускорять итерации, что ведёт к более быстрой сходимости. Но у него есть и другое интересное поведение. Он позволяет использовать более широкий диапазон шагов и создаёт собственные колебания. Что происходит?
Вот популярная история о momentum (Sutskever и др., 2013; Поляк, 1964; Rutishauser, 1959): градиентный спуск — это человек, идущий вниз с холма. Он идёт по самому крутому пути вниз; продвигается медленно, но верно. Momentum — тяжёлый шар, катящийся с того же холма. Добавленная инерция работает и как сглаживатель, и как ускоритель: гасит колебания и заставляет нас проноситься через узкие долины, небольшие бугры и локальные минимумы.
Эта стандартная история не ошибочна, но многих важных особенностей momentum она не объясняет. На самом деле momentum можно понять гораздо точнее, если изучать его на правильной модели.
Одна хорошая модель — выпуклая квадратичная функция. Она достаточно богата, чтобы воспроизвести локальную динамику momentum в реальных задачах, и при этом достаточно проста, чтобы её можно было понять в замкнутой форме. Этот баланс даёт нам мощную опору для понимания алгоритма.
Начнём с градиентного спуска. У этого алгоритма много достоинств, но скорость к ним не относится. Он прост: при оптимизации гладкой функции мы делаем небольшой шаг вдоль градиента:
При достаточно малом шаге градиентный спуск монотонно улучшает результат на каждой итерации. Он всегда сходится, хотя бы к локальному минимуму. А при нескольких слабых условиях на кривизну он может прийти туда даже с экспоненциальной скоростью.
Но экспоненциальное убывание, хоть и привлекательное в теории, на практике часто оказывается бесяще медленным. Обычно всё начинается хорошо — впечатляющее, почти мгновенное падение потерь. Но по ходу итераций дело замедляется. Появляется навязчивое ощущение, что вы продвигаетесь медленнее, чем должны. Что пошло не так?
Проблема может быть в давнем враге оптимизатора — патологической кривизне (pathological curvature). Говоря просто, это области , которые плохо отмасштабированы. Такие ландшафты часто описывают как долины, траншеи, каналы и овраги. Итерации либо прыгают между склонами, либо приближаются к оптимуму мелкими робкими шагами. Продвижение в некоторых направлениях почти останавливается. В этих неудачных областях градиентный спуск буксует.
Momentum предлагает следующую поправку к градиентному спуску. Мы даём ему кратковременную память:
Изменение безобидное и почти ничего не стоит. При мы получаем обратно градиентный спуск. Но при (иногда , если всё совсем плохо) это, похоже, именно тот толчок, который нам нужен. Итерации возвращают утраченные скорость и смелость и мчатся к оптимуму с новой энергией.
Специалисты по оптимизации называют это маленькое чудо «ускорением» (acceleration).
На первый взгляд новый алгоритм может показаться дешёвым трюком. Простая уловка, чтобы обойти самое странное поведение градиентного спуска, — сглаживатель колебаний между крутыми стенками каньона. Но истина, скорее, обратная. Это градиентный спуск — трюк. Во-первых, momentum даёт на многих функциях ускорение вплоть до квадратичного [сноска 1]. Это не мелочь: такое же ускорение дают быстрое преобразование Фурье, быстрая сортировка и алгоритм Гровера. Когда вселенная дарит вам квадратичное ускорение, пора присмотреться.
Но это ещё не всё. Нижняя граница, полученная Нестеровым (2013), утверждает, что momentum в определённом, очень узком и техническом смысле оптимален. Это не значит, что он лучший алгоритм для всех функций при всех обстоятельствах. Но он обладает удивительно красивыми математическими свойствами, которые утоляют очень человеческую жажду совершенства и завершённости. Но об этом позже. Пока скажем так: momentum — алгоритм «из Книги».
Прим. пер.: «алгоритм из Книги» (an algorithm for the book) — отсылка к выражению математика Пала Эрдёша о «Книге», где Бог записал самые изящные доказательства.
Первые шаги: градиентный спуск
Заголовок раздела «Первые шаги: градиентный спуск»Начнём с изучения градиентного спуска на простейшей нетривиальной модели — выпуклой квадратичной функции:
Пусть симметрична и обратима, тогда оптимальное решение находится в точке
Как ни проста эта модель, она достаточно богата, чтобы приближать многие функции (считайте своей любимой моделью кривизны — гессианом, информационной матрицей Фишера (Amari, 1998) и т. д.), и отражает все ключевые черты патологической кривизны. А главное, для градиентного спуска на этой функции можно написать точную замкнутую формулу.
Вот как это делается. Поскольку , итерации имеют вид
А теперь трюк. Есть очень естественное пространство, в котором все измерения градиентного спуска действуют независимо, — собственные векторы .
У каждой симметричной матрицы есть разложение по собственным значениям
и, по соглашению, будем считать, что отсортированы от наименьшего до наибольшего . Если сделать замену базиса , итерации распадаются и становятся такими:
Вернувшись в исходное пространство , видим, что
— вот и он, градиентный спуск в замкнутой форме.
Прим. пер.: что здесь написано. Ошибку раскладываем по собственным векторам матрицы . Каждая координата этой ошибки на каждом шаге просто умножается на одно и то же число . Например, при и множитель равен : через 10 шагов от этой части ошибки останется , через 50 — .
Разложение ошибки
Заголовок раздела «Разложение ошибки»У этого уравнения простая интерпретация. Каждый элемент — компонента ошибки начального приближения в базисе . Таких ошибок , и каждая идёт к минимуму своим собственным, отдельным путём, убывая экспоненциально с множителем на шаг. Чем ближе это число к , тем медленнее сходимость.
Для большинства шагов быстрее всех сходятся собственные векторы с наибольшими собственными значениями. Это даёт взрыв прогресса в первые итерации, а потом всё замедляется, когда проявляются трудности векторов с малыми собственными значениями. Записав вклад ошибки каждого собственного подпространства в функцию потерь,
мы можем визуализировать вклад каждой компоненты ошибки в потери.
Рисунок (интерактивный): оптимизацию можно рассматривать как сочетание нескольких задач-компонент — здесь трёх, с собственными значениями , и . Сверху — три кривые убывания ошибки по каждой компоненте, снизу — их сумма, то есть кривая потерь. Ползунок шага с отметкой «оптимальный шаг». При малом шаге быстро уходит только компонента с , а потери «застревают» на медленной компоненте ; при слишком большом шаге компонента начинает расходиться.
Выбор шага
Заголовок раздела «Выбор шага»Этот анализ сразу подсказывает, как выбирать шаг . Чтобы был сходимость, каждое должно быть строго меньше 1. Значит, все рабочие шаги лежат в интервале
Общая скорость сходимости определяется самой медленной компонентой ошибки — это либо , либо :
Эта общая скорость минимальна, когда скорости для и равны: это повторяет наше нестрогое наблюдение из прошлого раздела, что при оптимальном шаге первый и последний собственные векторы сходятся с одной скоростью. Доведя выкладки до конца, получаем:
Заметьте: скорость сходимости задачи определяет отношение . Оно встречается настолько часто, что у него есть имя и обозначение — число обусловленности (число обусловленностичисло обусловленностиEN condition numberОтношение самой большой кривизны к самой маленькой. Большое число обусловленности — вытянутый «овраг», где градиентный спуск зигзагует.):
Число обусловленности значит многое. Это мера того, насколько матрица близка к вырожденной. Это мера того, насколько решение устойчиво к возмущениям . А в нашем контексте число обусловленности показывает, насколько плохо будет работать градиентный спуск. Отношение идеально и даёт сходимость за один шаг (конечно, функция тогда тривиальна). К сожалению, чем больше отношение, тем медленнее градиентный спуск. Поэтому число обусловленности — прямая мера патологической кривизны.
Прим. пер.: пример с числами. Для трёх компонент с рисунка , , так что . Оптимальный шаг , скорость : каждый шаг убирает лишь 2 % самой медленной ошибки. Чтобы уменьшить её в миллион раз, нужно шагов.
Пример: полиномиальная регрессия
Заголовок раздела «Пример: полиномиальная регрессия»Анализ выше открывает важную мысль: не все ошибки одинаковы. Ошибки бывают разных видов — ровно , по одному на каждый собственный вектор . И градиентный спуск одни виды ошибок исправляет лучше, чем другие. Но что означают собственные векторы ? Удивительно, но во многих приложениях у них очень конкретный смысл.
Посмотрим, как это проявляется в полиномиальной регрессии. Даны одномерные данные ; задача — подогнать модель
к нашим наблюдениям . Эта модель нелинейна по входу , но линейна по весам, поэтому её можно записать как линейную комбинацию одночленов.
Рисунок (интерактивный): кривая модели как сумма одночленов с весами; ползунки весов меняют вклад каждого одночлена.
Благодаря линейности модель можно подогнать к данным линейной регрессией по невязке модели:
где
Путь сходимости, как мы знаем, проясняется, если смотреть на итерации в пространстве (собственных векторов ). Поэтому перепишем задачу регрессии в базисе . Сначала сменим базис: повернём в , а наши функции признаков — обратным поворотом в собственное пространство, . Теперь ту же регрессию можно понимать как регрессию по другому полиномиальному базису, с моделью
Эта модель тождественна старой. Но у новых признаков (я называю их «собственными признаками», eigenfeatures) и весов есть приятное свойство: каждая координата действует независимо от остальных. Теперь задача оптимизации по сути распадается на маленьких одномерных задач. И каждую координату можно оптимизировать жадно и независимо, по одной в любом порядке, — и получить итоговый глобальный оптимум. Собственные признаки к тому же гораздо информативнее.
Рисунок (интерактивный): точки данных и графики собственных признаков , упорядоченных по собственным значениям. Подписи: «Данные образуют 2 кластера. Первые 2 собственных признака отражают различия между кластерами. Дальше идут плавные изменения внутри кластеров, пики внутри кластеров и, наконец, зубчатые многочлены, которые сильно различаются на соседних точках». Точки можно перетаскивать.
Наблюдения с этого рисунка можно обосновать математически. Со статистической точки зрения мы хотим модель, в каком-то смысле устойчивую к шуму. Модель не может быть осмысленной, если малейшее возмущение наблюдений резко меняет её целиком. А собственные признаки — главные компоненты данных — дают ровно то разложение, которое нужно, чтобы упорядочить признаки по чувствительности к возмущениям . Самые устойчивые компоненты идут впереди (с наибольшими собственными значениями), самые чувствительные — в конце (с наименьшими).
Эта мера устойчивости, по весьма удобному совпадению, оказывается и мерой того, насколько легко сходится собственное подпространство. Значит, «патологические направления» — собственные подпространства, которые сходятся медленнее всего, — это и те, что сильнее всего чувствительны к шуму! Поэтому, начав с простой точки вроде (грубо злоупотребляя терминологией, будем считать её априорным предположением), мы следим за итерациями, пока не достигнем нужного уровня сложности. Посмотрим, как это происходит в градиентном спуске.
Рисунок (интерактивный): подгонка многочлена градиентным спуском по шагам. Справа — столбики вкладов каждого собственного признака; «когда собственное подпространство сошлось до трёх значащих цифр, столбик сереет». Сначала модель ловит грубую форму данных (большие собственные значения), а зубчатые компоненты, которые подгоняют шум, появляются лишь через очень много шагов. Наблюдения можно перетаскивать, чтобы изменить подгонку.
Этот эффект используется в эвристике ранней остановки (ранняя остановкаранняя остановкаEN early stopping): остановив оптимизацию раньше, часто можно получить результат, который лучше обобщается. Действительно, эффект ранней остановки очень похож на эффект более привычных методов регуляризации, например регрессии Тихонова. Оба метода стараются прямо подавить компоненты с наименьшими собственными значениями, хотя затухание по спектру у них устроено по-разному [сноска 2]. Но у ранней остановки есть явное преимущество. Когда шаг выбран, крутить больше нечего: параметров регуляризации нет. Более того, за одну оптимизацию у нас в распоряжении оказывается целое семейство моделей — от недообученных до переобученных. И этот подарок, похоже, ничего не стоит. Поистине прекрасный бесплатный обед (Hinton, NIPS 2015).
Прим. пер.: регрессия Тихонова — это гребневая регрессия (ridge, -регуляризация), которую вы видели в уроке о регуляризации.
Динамика momentum
Заголовок раздела «Динамика momentum»Вернёмся к momentum. Напомним: шаг momentum —
Поскольку , на квадратичной функции шаг выглядит так:
Следуя O’Donoghue и Candès (2015), проделаем те же движения: замена базиса и даёт правило обновления
в котором каждая компонента действует независимо от остальных (хотя и связаны между собой). Это позволяет переписать итерации так [сноска 3]:
Возвести матрицу в -ю степень можно многими способами. Но для случая есть изящная и малоизвестная формула (Williams, 1992) через собственные значения — и :
Формула довольно сложная, но главное вот что: она играет ровно ту же роль, что и отдельные скорости сходимости в градиентном спуске. Только вместо одной геометрической прогрессии у нас две связанные, и их значения могут быть вещественными или комплексными. Поэтому скорость сходимости — медленнейшая из двух скоростей, [сноска 4]. Построив её график, видим, что в пространстве параметров есть отчётливые области, которые раскрывают богатую классификацию видов сходимости (Flammarion и Bach, 2015):
Рисунок (интерактивный): карта на плоскости « по горизонтали, по вертикали»; цвет — скорость сходимости. Видны отдельные области, у каждой свой стиль сходимости. Наведя мышку на точку карты, видно соответствующую траекторию: при малом — плавное монотонное приближение, в средней области — колебания с затуханием, у правой границы ( близко к ) — колебания с переменой знака на каждом шаге, за границей — расходимость.
При каких и momentum сходится? Поскольку сходиться должны и , и , критерий сходимости теперь — . Диапазон допустимых шагов получается таким [сноска 5]:
При получаем прежний результат для градиентного спуска. Но заметьте немедленный выигрыш: momentum позволяет увеличить шаг почти вдвое, прежде чем начнётся расходимость.
Критический коэффициент затухания
Заголовок раздела «Критический коэффициент затухания»Настоящая магия, однако, начинается, когда мы находим «золотую середину» и . Сначала попробуем оптимизировать по .
У momentum есть интересная физическая интерпретация при малом (Qian, 1999): это дискретизация затухающего гармонического осциллятора. Рассмотрим физическую симуляцию в дискретном времени (как в видеоигре).
Подписи на рисунке оригинала: можно считать скоростью, которая затухает на каждом шаге и возмущается внешним силовым полем. А — положение нашей частицы, которое на каждом шаге немного сдвигается в направлении скорости .
Разберём это уравнение по частям, чтобы увидеть, как каждая компонента влияет на динамику системы. Ниже для итераций показана скорость частицы (горизонтальная ось) против её положения (вертикальная ось) — на фазовой диаграмме.
Рисунок (интерактивный): несколько фазовых диаграмм для разных . Слишком малое — частица ползёт к нулю медленно, без колебаний (передемпфирование). Слишком большое — спираль из многих витков вокруг нуля (недодемпфирование). Критическое — самый быстрый путь к нулю.
Эту систему лучше всего представлять как груз, подвешенный на пружине. Оттягиваем груз вниз на одну единицу и смотрим, по какому пути он возвращается в равновесие. В этой аналогии пружина — источник внешней силы , а равновесие — состояние, когда и положение , и скорость равны 0. Выбор решающим образом влияет на скорость возвращения в равновесие.
Критическое значение даёт скорость сходимости (в собственном подпространстве ) . Улучшение до квадратного корня по сравнению с градиентным спуском, у которого ! Увы, это относится только к ошибке в -м собственном подпространстве при фиксированном .
Прим. пер.: пример. Пусть . Градиентный спуск уменьшает эту компоненту ошибки в раза за шаг. При критическом momentum даёт множитель — в десять раз больше «откусывает» за шаг.
Оптимальные параметры
Заголовок раздела «Оптимальные параметры»Чтобы получить глобальную скорость сходимости, нужно оптимизировать и по , и по . Это более сложное дело [сноска 6], но ответ получается таким:
Подставьте это в скорость сходимости — и получите
Едва ли приложив дополнительные усилия, мы по сути извлекли квадратный корень из числа обусловленности! В принципе, для этого выигрыша нужно явно знать и . Но формулы подсказывают простое правило. Когда задача плохо обусловлена, оптимальное примерно вдвое больше, чем у градиентного спуска, а коэффициент momentum близок к . Так что ставьте как можно ближе к , а затем ищите самое большое , при котором ещё есть сходимость. Как и в градиентном спуске, находиться на острие ножа, у самой границы расходимости, — хорошее место.
Рисунок (интерактивный): то же разложение на компоненты с , и , но для momentum. Убывание уже не монотонное, зато значительно быстрее. Ниже — кривая и ползунки и . Подпись: «Заметьте, что оптимальные параметры не обязательно дают самую быструю сходимость — только самую быструю асимптотическую скорость сходимости».
Если у градиентного спуска кривая потерь была изящной и монотонной, то оптимизация с momentum показывает явные колебания. Эта рябь не ограничивается квадратичными функциями: на практике она возникает на самых разных функциях. Это не повод для тревоги, а признак того, что гиперпараметры нужно ещё подстроить.
Прим. пер.: проверим на числах. Возьмём ту же диагональную задачу с , . Оптимальные параметры momentum: , ; скорость против у градиентного спуска. До уменьшения ошибки в миллион раз — около 69 шагов вместо 690. Короткий код, который это проверяет:
import numpy as np
lam = np.array([0.01, 0.1, 1.0]) # собственные значения A: задача уже в «собственном» базисеx0 = np.ones(3) # начальная ошибка по каждому направлению
def loss_after(alpha, beta, steps): x, z = x0.copy(), np.zeros(3) for _ in range(steps): z = beta * z + lam * x # градиент функции 0.5 * sum(lam * x**2) равен lam * x x = x - alpha * z return 0.5 * np.sum(lam * x**2) # f(w) - f(w*)
a_gd = 2 / (lam.min() + lam.max()) # ≈ 1.98, β = 0s1, sn = np.sqrt(lam.min()), np.sqrt(lam.max())a_m, b_m = (2 / (s1 + sn))**2, ((sn - s1) / (sn + s1))**2 # ≈ 3.31 и 0.669
for k in (10, 50, 100, 200): print(k, f"GD {loss_after(a_gd, 0.0, k):.2e}", f"momentum {loss_after(a_m, b_m, k):.2e}")Ожидаемый вывод:
10 GD 3.39e-01 momentum 3.33e+0050 GD 6.83e-02 momentum 8.14e-06100 GD 9.25e-03 momentum 6.21e-14200 GD 1.69e-04 momentum 9.18e-31Видно ровно то, о чём говорит автор: на 10-м шаге momentum ещё хуже (колебания раскачали быструю компоненту), но дальше он уходит вперёд на много порядков.
Пример: задача раскраски
Заголовок раздела «Пример: задача раскраски»Посмотрим, как momentum ускоряет сходимость, на конкретном примере. На сетке пикселей пусть — граф, вершины которого — пиксели, — множество рёбер, соединяющих каждый пиксель с четырьмя соседями, а — небольшое множество из нескольких выделенных вершин. Рассмотрим задачу минимизации
Раскрашиватель (colorizer) тянет выделенные пиксели к 1. Сглаживатель (smoother) растекает цвет.
Оптимальное решение этой задачи — вектор из одних [сноска 7]. Если присмотреться к итерации градиентного спуска, видно, почему мы идём туда так долго. Шаг градиента для каждой компоненты — своего рода взвешенное среднее текущего значения и значений соседей:
Такое локальное усреднение хорошо сглаживает локальные колебания пикселей, но плохо использует глобальную структуру. Обновления похожи на каплю чернил, расплывающуюся в воде. Движение к равновесию идёт только через локальные поправки, поэтому, если ничего не менять, путь к решению медленный и мучительный. К счастью, momentum заметно ускоряет дело.
Рисунок (интерактивный): сетка пикселей, где из нескольких выделенных точек «растекается» цвет; рядом — тот же процесс с momentum, который заливает сетку гораздо быстрее. Подпись: «Собственные векторы задачи раскраски образуют обобщённый базис Фурье для . У наименьших собственных значений — низкие частоты, поэтому градиентный спуск хорошо исправляет высокочастотные ошибки, но плохо — низкочастотные».
В векторной форме задача раскраски выглядит так:
Квадратичная форма сглаживателя — это лапласиан графа (graph Laplacian). А раскрашиватель — небольшая поправка низкого ранга с линейным членом; — -й единичный вектор.
Матрица Лапласа [сноска 8], которая определяет поведение задачи оптимизации, — ценный мост между линейной алгеброй и теорией графов. Это богатая область, но для нашего разговора важен один факт. Обусловленность — здесь это отношение второго собственного значения к последнему (первое собственное значение всегда 0, и ему соответствует вектор из всех единиц) — напрямую связана со связностью графа.
Рисунок: три семейства графов. Подписи: «Графы „тесного мира“ — экспандеры и плотные графы — обусловлены прекрасно. Обусловленность сеток улучшается с ростом размерности. А длинные, тонкие графы вроде путей обусловлены плохо».
Эти наблюдения переносятся на задачу раскраски, и интуиция за ними должна быть понятна. В хорошо связанных графах информация быстро растекается по рёбрам, а в плохо связанных — нет. И этот принцип, доведённый до крайности, даёт класс функций, настолько трудных для оптимизации, что они показывают пределы методов первого порядка.
Пределы спуска
Заголовок раздела «Пределы спуска»Сделаем шаг назад. С помощью хитрого трюка мы улучшили сходимость градиентного спуска в квадратичное число раз, добавив всего одну вспомогательную последовательность. Но лучшее ли это, что мы можем? Нельзя ли ускориться ещё сильнее с двумя последовательностями? Может быть, выбирать и разумно и адаптивно? Так и тянет оседлать эту волну оптимизма — до кубического корня и дальше!
К сожалению, хотя улучшения алгоритма momentum существуют, все они упираются в определённую, критическую, почти неизбежную нижнюю границу.
Приключения в пространстве алгоритмов
Заголовок раздела «Приключения в пространстве алгоритмов»Чтобы понять пределы возможного, нужно сначала формально определить пространство алгоритмов, в котором мы ищем. Вот одно возможное определение. Наблюдение такое: и градиентный спуск, и momentum можно «развернуть». Действительно, поскольку
градиентный спуск можно записать как
Похожий трюк проходит и с momentum:
Прим. пер.: в этой формуле оригинала перед суммой стоит «»; по смыслу (шаг идёт против градиента) должен быть «». На вывод ниже это не влияет: коэффициенты в общей формуле могут быть любого знака.
На самом деле самые разные алгоритмы первого порядка — включая метод сопряжённых градиентов, AdaMax, усреднённый градиент и другие — можно записать (хотя и не так аккуратно) в такой развёрнутой форме. Поэтому класс алгоритмов, для которых
содержит momentum, градиентный спуск и целую кучу других алгоритмов, какие только можно придумать. Именно это предполагается в Предположении 2.1.4 у Нестерова (2013). Но пойдём ещё дальше и расширим класс, разрешив разные шаги для разных направлений:
Этот класс методов охватывает большинство популярных алгоритмов обучения нейросетей, включая AdamAdamEN Adam (adaptive moment estimation)Momentum + RMSProp + поправка смещения. Стандартный оптимизатор нейросетей с 2015 года. и AdaGrad. Будем называть его «линейными методами первого порядка» (Linear First Order Methods) и покажем одну функцию, на которой все эти методы в конце концов терпят неудачу.
Сопротивляющийся оракул
Заголовок раздела «Сопротивляющийся оракул»Раньше, говоря о задаче раскраски, мы заметили, что тонкие графы делают задачу оптимизации плохо обусловленной. Доведём это до крайности и возьмём граф из одного пути — функцию настолько плохо обусловленную, что один её вариант Нестеров назвал «худшей функцией в мире». Функция устроена так же, как задача раскраски, и мы назовём её выпуклой функцией Розенброка (Convex Rosenbrock):
Оптимальное решение этой задачи —
а число обусловленности задачи стремится к , когда стремится к бесконечности. Теперь посмотрим, как ведёт себя momentum на этой функции, стартуя с .
Рисунок (интерактивный, с ползунками и ): первые 50 итераций momentum на выпуклой функции Розенброка при ; по горизонтали — номер веса, по вертикали — номер итерации, цвет — ошибка. Подписи: «Поведение здесь такое же, как у любого линейного алгоритма первого порядка. Этот треугольник — „мёртвая зона“ итераций: здесь веса всегда равны 0, какими бы ни были параметры. Оставшееся расширяющееся пространство — „световой конус“ влияния итераций. С оптимальными параметрами momentum здесь работает очень хорошо».
Наблюдения с этого рисунка верны для любого линейного алгоритма первого порядка. Докажем это. Сначала заметим, что каждая компонента градиента зависит только от значений непосредственно до и после неё:
Поэтому раз мы стартуем с 0, компонента обязана стоически оставаться нулём, пока элемент до или после неё не станет ненулевым. А значит, по индукции, для любого линейного алгоритма первого порядка
Считайте это ограничение «скоростью света» для передачи информации. Сигналу ошибки нужно не меньше шагов, чтобы дойти от до . Поэтому можно сложить ошибки, которые ещё не могли измениться [сноска 9]:
С ростом число обусловленности приближается к . И разрыв закрывается: скорость сходимости, которую обещает momentum, совпадает с лучшей, на какую способен любой линейный алгоритм первого порядка. Мы приходим к разочаровывающему выводу: на этой задаче лучше сделать нельзя.
Как и многие подобные нижние границы, этот результат надо понимать не буквально, а по духу. Он, пожалуй, придаёт нашему исследованию ощущение завершённости. Но это не последнее слово в оптимизации первого порядка. Эта нижняя граница не исключает, например, возможности переформулировать задачу так, чтобы изменилось само число обусловленности! Пространства для ускорений ещё много, если понимать, где искать.
Прим. пер.: именно этим занимаются нормализация (урок 3.4.1) и предобусловливание в Adam и Muon: они меняют геометрию задачи, а не только правило шага.
Momentum со стохастическими градиентами
Заголовок раздела «Momentum со стохастическими градиентами»Остался последний вопрос. Всё обсуждение выше предполагало доступ к истинному градиенту — роскошь, которую современное машинное обучение позволяет себе редко. Чтобы вычислить точный градиент, нужен полный проход по всем данным, а это бывает непомерно дорого. Вместо этого как прямую замену часто используют случайные приближения градиента, например выборку мини-батча (мини-батчмини-батчEN mini-batchНебольшая случайная порция примеров, по которой считается одна оценка градиента и делается один шаг.). Приближение можно записать из двух частей:
Если оценка несмещённая, то есть , то полезно думать о приближённом градиенте как о впрыскивании в итерации особого шума. С помощью аппарата из предыдущих разделов с этим дополнительным членом можно работать напрямую. На квадратичной функции член ошибки аккуратно отделяется [сноска 10]:
где .
Член ошибки , зависящий от , — довольно «лохматый» объект. Следуя Flammarion и Bach (2015), будем моделировать его как независимый гауссов шум с нулевым средним. В этой упрощённой модели целевая функция тоже распадается на две отдельные компоненты — сумму детерминированной и стохастической ошибки [сноска 11], — показанные на рисунке.
Рисунок (интерактивный): математическое ожидание разложено на детерминированную и стохастическую части; мелкие чёрные точки — один запуск стохастического градиента; ползунки и . Подпись: «Как замечают Sutskever и др. (2013), у оптимизации две фазы. В начальной, переходной фазе величина шума меньше величины градиента, и momentum по-прежнему хорошо продвигается. Во второй, стохастической фазе шум пересиливает градиент, и momentum менее эффективен».
Заметьте: тут есть набор неприятных компромиссов, которые словно сталкивают две компоненты ошибки лбами. Например, уменьшение шага снижает стохастическую ошибку, но и замедляет сходимость. А увеличение momentum, вопреки распространённому мнению, заставляет ошибки накапливаться. Несмотря на эти нежелательные свойства, стохастический градиентный спуск с momentum, как было показано, работает на нейросетях вполне конкурентоспособно. Как заметили Sutskever и др. (2013), в машинном обучении переходная фаза, похоже, важнее фазы тонкой доводки. И недавно даже было высказано предположение (Zhang и др., 2016), что этот шум — хорошая вещь: он работает как неявный регуляризатор, который, подобно ранней остановке, не даёт переобучиться в фазе доводки.
Дальше — и ниже
Заголовок раздела «Дальше — и ниже»Исследование ускорения переживает небольшое возрождение в сообществе оптимизации. Если идеи этой статьи вас увлекли, почитайте Su, Boyd и Candès (2014): там идея momentum как дискретизации определённого дифференциального уравнения исследована полностью. Но есть и другие, менее физические интерпретации. Есть алгебраическая интерпретация momentum через приближающие многочлены (Rutishauser, 1959; Hardt, 2013). Появляются геометрические интерпретации (Bubeck и др., 2015; Drusvyatskiy и др., 2016), связывающие momentum с более старыми методами вроде метода эллипсоидов. Наконец, есть интерпретации, связывающие momentum с двойственностью (Allen-Zhu и Orecchia, 2014), — возможно, они подскажут, как ускорять методы второго порядка и квазиньютоновские методы (первый шаг — см. Нестеров, 2008). Но, как в притче о слепых, ощупывающих слона, momentum кажется чем-то большим, чем сумма частей. Однажды — надеюсь, скоро — разные точки зрения сойдутся в удовлетворительное целое.
Благодарности
Заголовок раздела «Благодарности»Я глубоко обязан Шану Картеру и Крису Оле за редакторскую работу, без которой статья была бы куда беднее. Шан Картер полностью переделал многие из моих исходных интерактивных виджетов, придал визуальную цельность всем рисункам и заметно ускорил работу страницы. Крис Ола дал безупречную редакторскую обратную связь на всех уровнях детализации и абстракции — от структуры содержания до выравнивания формул.
Я также благодарен Майклу Нильсену за название статьи, которое по-настоящему её связало. Маркос Хинестра помогал редактировать самые ранние черновики и поддерживал меня духовно, когда это было нужнее всего. Моя благодарность и рецензентам — Мэтту Хоффману и анонимному рецензенту B — за проницательные замечания и критику. Отдельно спасибо рецензенту B за то, что он указал на две нетривиальные ошибки в исходной рукописи (обсуждение здесь). Библиотека для линий уровня заглавной визуализации — совместная работа Бена Фредериксона, Джеффа Хира и Майка Бостока.
Большое спасибо за многочисленные pull request’ы и issues на GitHub. Особенно — Осемваро Педро, заметившему ошибку «на единицу» в одной из формул, и Дэну Шмидту, который вычитал весь проект и исправил множество опечаток и грамматических ошибок.
Обсуждение и рецензии
Заголовок раздела «Обсуждение и рецензии»Сноски автора
Заголовок раздела «Сноски автора»Сноска 1. Однако можно построить весьма специфические контрпримеры, где momentum не сходится даже на выпуклых функциях. Контрпример см. у Lessard, Recht и Packard (2016).
Сноска 2. В регрессии Тихонова к задаче добавляют квадратичный штраф и минимизируют
Напомним, что . Поэтому решение регрессии Тихонова —
Регуляризацию можно понимать как функцию, которая «гасит» наибольшие собственные значения:
Градиентный спуск можно считать похожим затуханием, но с другой скоростью:
Заметьте, что это затухание зависит от шага.
Сноска 3. Это верно, потому что обновления можно записать в матричной форме:
откуда, обратив матрицу слева, получаем
Сноска 4. Скорости сходимости можно выписать явно. Собственные значения —
Когда меньше нуля, корни комплексные, и скорость сходимости равна
Удивительно, но она не зависит ни от шага, ни от собственного значения . Когда корни вещественные, скорость сходимости равна
Прим. пер.: в оригинале модуль комплексных корней записан как — без множителя из формулы для . С этим множителем получается : произведение двух комплексно-сопряжённых корней равно . Вывод автора — скорость не зависит от — от этого не меняется.
Сноска 5. Это можно вывести, упростив неравенства для всех 4 + 1 случаев явной формулы скорости сходимости выше.
Сноска 6. Нужно оптимизировать
(здесь — модуль наибольшего собственного значения); оптимум достигается, когда у матриц, соответствующих крайним собственным значениям, корни характеристического многочлена кратные.
Сноска 7. Задача оптимизации выше ограничена снизу нулём, а вектор из всех этого нуля достигает.
Сноска 8. Явно её можно записать так:
Сноска 9. Ошибку мы измеряем бесконечной нормой; похожие результаты выводятся для норм 1 и 2.
Сноска 10. Итерации momentum —
что после замены переменных становится
Обратив матрицу слева и применив формулу рекурсивно, получаем окончательное решение.
Сноска 11. Для одномерной функции значение целевой функции равно
В третьем равенстве используется то, что , в четвёртом — что ошибки некоррелированы.
Прим. пер.: формулы этой сноски воспроизведены как в оригинале. Строго говоря, в первом слагаемом детерминированная часть должна стоять в квадрате, а вместо — дисперсия ; на смысл разложения «детерминированная ошибка + стохастическая ошибка» это не влияет.
Словарик
Заголовок раздела «Словарик»| EN | RU |
|---|---|
| momentum, heavy ball | momentum (метод тяжёлого шара) |
| step-size | шаг (learning rate) |
| pathological curvature | патологическая кривизна |
| convex quadratic | выпуклая квадратичная функция |
| eigenvalue decomposition, eigenspace | разложение по собственным значениям, собственное подпространство |
| condition number | число обусловленности |
| eigenfeatures | собственные признаки |
| early stopping | ранняя остановка |
| Tikhonov regression | регрессия Тихонова (гребневая, ridge) |
| damped harmonic oscillator | затухающий гармонический осциллятор |
| critical damping | критическое затухание |
| phase diagram | фазовая диаграмма |
| graph Laplacian | лапласиан графа |
| linear first order methods | линейные методы первого порядка |
| lower bound | нижняя граница |
| transient phase / stochastic phase | переходная фаза / стохастическая фаза |
| implicit regularizer | неявный регуляризатор |
Оригинал: Gabriel Goh, «Why Momentum Really Works», Distill, 2017, distill.pub/2017/momentum, CC BY 4.0. Перевод распространяется на тех же условиях.