Momentum — инерция спуска

Momentum добавляет спуску инерцию: шарик, катящийся с горы, не дёргается на каждой неровности, а набирает скорость по дну.

Метод момента (Momentum) — модификация спуска, накапливающая скользящее среднее градиентов: $v_{k+1}=\beta v_k-\alpha\nabla f(x_k)$, $x_{k+1}=x_k+v_{k+1}$.

Физическая интуиция

Чистый градиентный спуск — как муравей, который на каждом шаге заново решает, куда ползти, и потому дёргается в овраге. Momentum превращает муравья в тяжёлый шар: у него есть скорость $v$, которая накапливается. Вдоль дна оврага градиенты согласованно толкают в одну сторону — скорость растёт, шар разгоняется. Поперёк оврага градиенты на соседних шагах противоположны — они взаимно гасятся, колебания затухают. Итог: быстрее по дну, тише поперёк.

Формула

$$v_{k+1}=\beta\,v_k-\alpha\,\nabla f(x_k),\qquad x_{k+1}=x_k+v_{k+1}.$$

Здесь $\beta\in[0,1)$ — коэффициент инерции (трения), обычно $0.9$. При $\beta=0$ получаем обычный спуск. Чем ближе $\beta$ к единице, тем «тяжелее» шар и длиннее его память. Эффективно момент усредняет последние $\sim 1/(1-\beta)$ градиентов: при $\beta=0.9$ это около $10$ шагов.

Реализация на овраге

Тот же овраг $f=x^2+100y^2$, что мучил чистый спуск. Сравним прогресс.

def grad(v):
    return [2 * v[0], 200 * v[1]]

def f(v):
    return v[0] ** 2 + 100 * v[1] ** 2

def momentum(alpha, beta, steps=100):
    x = [10.0, 1.0]
    vel = [0.0, 0.0]
    for k in range(1, steps + 1):
        g = grad(x)
        vel = [beta * vel[i] - alpha * g[i] for i in range(2)]
        x = [x[i] + vel[i] for i in range(2)]
    return x, f(x)

x_plain, f_plain = momentum(0.003, 0.0)   # обычный спуск
x_mom, f_mom = momentum(0.003, 0.9)       # с моментом
print("Без момента  (beta=0.0): x=({:.3f}, {:.4f}) f={:.4f}".format(x_plain[0], x_plain[1], f_plain))
print("С моментом   (beta=0.9): x=({:.3f}, {:.4f}) f={:.4f}".format(x_mom[0], x_mom[1], f_mom))

Вывод:

Без момента  (beta=0.0): x=(5.478, 0.0000) f=30.0108
С моментом   (beta=0.9): x=(0.035, 0.0053) f=0.0040

За одинаковые $100$ шагов чистый спуск дополз лишь до $f\approx 30.0$, а момент — до $f\approx 0.004$, то есть в тысячи раз ближе ко дну. Инерция вдоль пологого направления $x$ дала колоссальный выигрыш.

Эффект усреднения

Почему гасятся колебания? Если поперёк оврага градиент чередует знак ($+g,-g,+g,\dots$), их скользящее среднее стремится к нулю — скорость в этом направлении не накапливается. А вдоль дна знак постоянный, среднее равно самому градиенту, усиленному множителем $\approx 1/(1-\beta)$. Так момент автоматически «фильтрует» полезную составляющую от шумной.

Как работает под капотом

Momentum можно понимать как дискретизацию уравнения движения шарика с трением: $m\ddot x = -\nabla f - c\dot x$. Коэффициент $\beta$ играет роль (обратного) трения. Это объясняет и риск: при слишком большом $\beta$ шар «проскакивает» минимум по инерции и какое-то время колеблется вокруг него, прежде чем осесть. Поэтому $\beta=0.9$ — компромисс между разгоном и устойчивостью. Момент — стандарт де-факто в обучении нейросетей (SGD with momentum).

Частые ошибки

  • $\beta$ близко к 1 без уменьшения $\alpha$. Эффективный шаг $\sim\alpha/(1-\beta)$ резко растёт — можно взорваться.
  • Не обнулять скорость при рестарте. Старая скорость утянет в неверную сторону.
  • Ждать монотонного убывания. Из-за инерции $f$ может на пару шагов подрасти, проскочив дно, — это нормально.

Итоги

  • Momentum накапливает скорость: $v_{k+1}=\beta v_k-\alpha\nabla f$, $x_{k+1}=x_k+v_{k+1}$.
  • Разгоняет вдоль дна оврага и гасит поперечные колебания.
  • $\beta\approx 0.9$; эффективный шаг $\sim\alpha/(1-\beta)$ — следите, чтобы не взорвать.
Проверьте себя
1. Как Momentum гасит осцилляцию поперёк оврага?
AУвеличивает шаг
BЧередующиеся по знаку градиенты взаимно усредняются к нулю
CОбнуляет градиент
DИспользует гессиан
2. Что делает коэффициент $\beta$ в методе момента?
AЗадаёт learning rate
BЗадаёт инерцию: память о прошлых градиентах ($\beta=0$ — обычный спуск)
CЗадаёт число шагов
DНормирует данные
3. Чем опасно слишком большое $\beta$ при том же $\alpha$?
AНичем
BЭффективный шаг $\sim\alpha/(1-\beta)$ резко растёт — возможна расходимость
CМетод замедляется
DГрадиент становится нулевым