16 - 動量梯度下降(Momentum)——畀模型一個「衝力」
平時用純粹 Gradient Descent,模型會好似踩單車上落山谷:• 落斜快、上斜慢;• 斜坡窄嘅位仲會左揈右擺 —— 學得又慢又暈。
Momentum 就係喺單車後面加部助力摩打:吸收過去幾步嘅推力,累積動能,一路衝落谷底又唔會偏離正路。
1️⃣ 物理直覺:滾雪球 vs. 步步為營
純 GD每一步淨係睇當下斜率,好似行石春路,每粒石都要慢慢踏實先敢下一步。
Momentum將之前嘅梯度做 指數加權平均 (EMA),變成「速度向 量」。當方向一致時就加速滾;遇到反方向斜率就會被減速,但唔會即刻掉頭。
效果:
過窄谷時唔會左右震到嘔。
喺平坦區/鞍點都仲有慣性,唔會卡死。
2️⃣ 數學好簡單
# v_t = 動量 (速度)
v_t = β · v_{t-1} + (1-β) · g_t
# 參數更新
θ = θ - α · v_t
變量解釋:
g_t = 當前梯度 ∂J/∂θ
β = 0.9 常用(保留 90% 過去方向)
α = Learning Rate
唔似 Adam,要偏差修正;Momentum 直接用 v_t 已經夠穩。
3️⃣ 真・貼地例子
開車過青馬大橋
橫風勁:純 GD = 即刻搬軚盤,車蛇咁走;Momentum = 電子穩定功能,吸收多次風力後平均修正,條線行得筆直。
滑雪大回轉
純 GD = 見凹坑即煞,速度斷斷續續;Momentum = 靠慣性飛過細坑,整體時間縮短。
電商動態定價
即時梯度計嘅價格調整會因單一大額訂單而大幅波動;加 Momentum 後,價格曲線平滑,客戶唔會懷疑系統壞咗。
機械臂夾貨
Camera 偵測到目標位置嘅 noise 令梯度方向不停變;Momentum 令夾子行走軌跡平順,唔怕因噪聲搞到「震機」。
4️⃣ Momentum 三大好處
痛點 | 純 GD | 加 Momentum |
狹長谷地 | 左右震、行極唔落 | 平滑穿過 |
平坦鞍點 | 梯度近 0 → 停滯 | 靠慣性滑過 |
收斂速度 | 緩慢 | 加速 2–5× |
5️⃣ 參數點揀?
β(衝力係數)• 0.9:經典;• 0.99:超平滑(BERT 預訓練常用);• 0.8:想更敏捷。
α(學習率)可先用無 Momentum 時嘅值,再觀察 Loss:• 太慢 → α × 2;• 發散 → α ÷ 2 或 β ↑。
Warm-up初期可用較細 α 或較細 β,免得速度一下太大「飛車」。
6️⃣ PyTorch 10 行示範
beta, lr = 0.9, 1e-2
v = {}
for name, p in model.named_parameters():
v[p] = torch.zeros_like(p.data)
for x, y in loader: # 每個 mini-batch
y_hat = model(x)
loss = criterion(y_hat, y)
loss.backward()
with torch.no_grad():
for p in model.parameters():
g = p.grad
v[p] = beta * v[p] + (1 - beta) * g # EMA 梯度 = 速度
p -= lr * v[p] # 更新參數
p.grad.zero_()
7️⃣ 常見陷阱 & Debug
速度爆衝
現象:Loss 直接變 NaN。
解:減 α 或加 Gradient Clipping。
學得仲慢
可能 β 太高 → 減到 0.8;或者 α 過細。
BatchNorm + 大 Momentum
大模型用同步 BN 時,過大 β 會令 BN 統計追唔切,可考慮 β=0.9 配合 Learning-Rate Decay。
8️⃣ 延伸:Momentum 係好多進階 Optimizer 嘅老祖宗
Nesterov Momentum (NAG):先衝一步再量度梯度,轉彎更早。
RMSProp:Momentum 套用喺梯度平方 → 自適應 lr。
Adam:Momentum (一階) + RMSProp (二階) 雙保險。
✅ 總結 — Momentum 值得你上手
概念簡單:一個 EMA 平滑梯度。
實作容易:只多一行計 v_t。
效果明顯:減震盪、提速、越過鞍點。
萬用配件:CNN、RNN、Transformer、強化學習、Tabular… 都啱用。
下一次你見到 Loss 曲線「鋸齒+龜速」,記住開返 Momentum,畀部摩打你嘅模型,讓佢一路順風,飛奔去最低點!🏎️💨