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)$ — следите, чтобы не взорвать.