Оптимизация

Момент

Память о прошлых шагах, которая превращает κ в √κ

Шаг 67 из 117 · ~30 мин

Правило

vk+1=βvk+f(xk),xk+1=xkαvk+1\htmlData{k=vel}{v_{k+1}} = \htmlData{k=beta}{\beta} \, v_k + \nabla f(x_k), \qquad x_{k+1} = x_k - \alpha \, \htmlData{k=vel}{v_{k+1}}

— экспоненциальное среднее градиентов, а не градиент. Раскроем рекурсию:

vk=f(xk)+βf(xk1)+β2f(xk2)+v_k = \nabla f(x_k) + \beta \nabla f(x_{k-1}) + \beta^2 \nabla f(x_{k-2}) + \dots

Отсюда два прочтения, оба полезные:

  • физическое: шарик с инерцией, катящийся по ландшафту. Он не останавливается на каждом склоне, а накапливает движение;
  • вычислительное: усреднение градиентов. Компоненты, которые из шага в шаг согласованы, складываются; те, что меняют знак, гасят друг друга.

Второе объясняет, почему момент помогает именно на вытянутых ландшафтах. По широкой оси градиент всегда указывает в одну сторону, и вклад накапливается до 11β\frac{1}{1-\beta} раз. По узкой оси знак чередуется, и колебания подавляются.

Множитель 11β\frac{1}{1-\beta} стоит запомнить: при β=0.9\beta = 0.9 это 1010, при β=0.99\beta = 0.99100100. Это и «эффективная длина памяти», и во сколько раз вырастает эффективный шаг вдоль согласованного направления. Отсюда практическое правило: подняв β\beta, шаг α\alpha обычно приходится уменьшить.

√κ вместо κ

Главный результат: при оптимально подобранных α\alpha и β\beta множитель сокращения ошибки становится

ρmom=κ1κ+1вместоρGD=κ1κ+1\rho_{\text{mom}} = \frac{\sqrt{\kappa} - 1}{\sqrt{\kappa} + 1} \qquad\text{вместо}\qquad \rho_{\text{GD}} = \frac{\kappa - 1}{\kappa + 1}

с оптимальными значениями

β=(κ1κ+1)2,α=4(μ+L)2\beta^* = \left(\frac{\sqrt{\kappa}-1}{\sqrt{\kappa}+1}\right)^2, \qquad \alpha^* = \frac{4}{(\sqrt{\mu} + \sqrt{L})^2}

Проверено численно на κ=100\kappa = 100 (μ=1\mu = 1, L=100L = 100): теоретический оптимум β=0.669\beta^* = 0.669, α=0.0331\alpha^* = 0.0331 доводит лосс до 10610^{-6} за 69 шагов, тогда как градиентному спуску с его оптимальным шагом нужно 444. Отношение 6.46.4, а множитель падает с 0.9800.980 до 0.8180.818 — то есть ровно до того значения, которое GD имеет при κ=10\kappa = 10.

Это и есть смысл «κ\sqrt{\kappa}»: момент делает задачу с κ=100\kappa = 100 такой же по трудности, как задача с κ=10\kappa = 10 для обычного спуска. Для κ=104\kappa = 10^4 разница уже стократная.

Оговорка, которую стоит знать: κ\sqrt{\kappa} — теоретический предел для методов первого порядка (нижняя граница Нестерова). Быстрее не может ни один метод, использующий только градиенты. Так что момент — не эвристика, а оптимальный по порядку метод.

Переключайтесь между спуском и моментом на третьем ландшафте и подвигайте β\beta.

лосс, логарифмическая шкала

шаг α 0.019
итераций 150
f в конце
6.33e-3
обусловленность κ
100
порог 2/L
0.02
 
сходится

Оптимум для момента здесь β = 0.669, α = 0.0331 — 69 шагов против 444 у спуска. Поставьте β = 0.9 при том же шаге и увидите перерегулирование: слишком много памяти при слишком большом шаге.

Второй ландшафт стоит посетить обязательно. На круглой чаше момент вредит: он перелетает минимум, потому что накопленная скорость не даёт остановиться. Ускоритель нужен там, где есть что ускорять.

Нестеров

Отличие в одной строке: градиент измеряется не там, где стоим, а там, где окажемся, если продолжим по инерции.

vk+1=βvk+f(xkαβvkс упреждением)v_{k+1} = \beta v_k + \nabla f\big(\underbrace{x_k - \alpha\beta v_k}_{\text{с упреждением}}\big)

Смысл — не проехать поворот. Обычный момент узнаёт о смене склона, уже пролетев мимо; Нестеров смотрит вперёд и начинает торможение раньше. Практически это даёт меньшее перерегулирование и лучшую константу в оценке, хотя порядок κ\sqrt{\kappa} тот же.

Сравните на первом ландшафте при β=0.9\beta = 0.9: у момента заметный выброс за минимум, у Нестерова он меньше.

Как это выглядит в фреймворках

Здесь есть ловушка, стоящая денег. PyTorch реализует момент так:

vβv+g,xxαvv \leftarrow \beta v + g, \qquad x \leftarrow x - \alpha v

а часть литературы (и TensorFlow в некоторых режимах) — так:

vβv+(1β)g,xxαvv \leftarrow \beta v + (1-\beta) g, \qquad x \leftarrow x - \alpha v

Разница в множителе (1β)(1-\beta): во второй форме vv — настоящее среднее градиентов, и эффективный шаг равен α\alpha; в первой — сумма, и эффективный шаг равен α1β\frac{\alpha}{1-\beta}. При β=0.9\beta = 0.9 это десятикратная разница в реальном шаге.

Отсюда конкретное следствие: перенося гиперпараметры между фреймворками или между статьёй и кодом, проверяйте форму. Значение lr=0.1, momentum=0.9 означает разные вещи в двух конвенциях.

Что момент не делает

  • не уменьшает κ\kappa. Задача остаётся той же; меняется зависимость алгоритма от неё;
  • не гарантирует монотонности. Лосс с моментом может расти на отдельных шагах, и это нормально — инерция проносит через локальные подъёмы;
  • не спасает от плохой обусловленности полностью. 106=103\sqrt{10^6} = 10^3 — всё ещё тысяча шагов. Стандартизация и нормализация уменьшают саму κ\kappa и потому эффективнее.

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

Источники

  • Polyak — Some methods of speeding up the convergence of iteration methods — Heavy ball, оригинальный метод
  • Goh — Why Momentum Really Works — Разбор с картинками и спектральный анализ

Проверки

0 из 2
  1. Что делает момент

    Отметьте все верные утверждения о моменте.

  2. Оптимальные параметры момента

    Реализуйте momentum_facts(mu, L, beta) — верните [kappa, gd_rate, mom_rate, effective_gain]:

    • kappa = L/μL/\mu;
    • gd_rate = κ1κ+1\dfrac{\kappa - 1}{\kappa + 1} — множитель обычного спуска при оптимальном шаге;
    • mom_rate = κ1κ+1\dfrac{\sqrt\kappa - 1}{\sqrt\kappa + 1} — множитель момента при оптимальных α\alpha и β\beta (то есть от переданного beta не зависит);
    • effective_gain = 11β\dfrac{1}{1 - \beta} — во сколько раз усиливается согласованная компонента при переданном beta.

    Обратите внимание, что третье и четвёртое числа отвечают на разные вопросы: одно про наилучшее достижимое, другое про конкретный выбор β\beta.

    Проверка, которая обязана сойтись точно: mom_rate равна β\sqrt{\beta^*}, где β=(κ1κ+1)2\beta^* = \left(\dfrac{\sqrt\kappa-1}{\sqrt\kappa+1}\right)^2 — оптимальный коэффициент. Это тождество, и оно связывает две формулы, которые обычно приводят раздельно.

    функция momentum_facts

    Загрузка редактора…

    Ctrl/⌘ + Enter