完整講解與原文對照 / Full explanation and source comparison
梯度下降太「短視」?加一點慣性
純梯度下降每一步只看當下的梯度方向,在狹長的 loss 山谷裡容易左右來回震盪、走得很慢。動量(Momentum) 是 Rumelhart 等人提出的一招改良:不只信現在的梯度,還保留一部分上一步更新的方向,讓優化路徑更平滑、收斂更快。
核心更新:式 (8)
把原本式 (4) 的「只看當前梯度」改成「歷史 + 當前梯度」:
其中 是動量係數,控制「上一動保留多少」。參數更新仍是:
直覺:像推球下山
- 沒有動量:球每步只被當前坡度推一下,在窄谷兩側來回彈,像醉漢走路。
- 有動量:球帶著慣性往前滾,沿山谷方向累積速度,側向震盪被平均掉,整體路徑更直、更快。
圖 (Fig. 2) 對比了有無動量的等高線軌跡;圖 (Fig. 3) 用向量加法說明: 與 合成後,側向分量互相抵消,前進分量被保留。
什麼時候特別有用
- loss 曲面呈狹長山谷(ravine)時,純 GD 會在兩側來回;
- 梯度方向步與步之間變化劇烈時,動量能平滑更新;
- 後面 RMSProp、Adam 等也借鑑了「累積歷史資訊」這個思路(見 §5)。
一句話:動量 = 梯度下降 + 慣性,讓優化不只「看腳下」,還「記得剛才往哪走」。
教授祕笈:動量——推購物車過狹長走道(式 (8))
同學,上一節把梯度下降講成「看腳下坡度、反方向走一步」。今天超市還沒打烊,我們把那台車推進一條又長又窄的走道:兩側全是貨架,正前方才是結帳口。純梯度下降在這種狹長山谷裡,會像沒有慣性的推車——每撞一下就猛轉方向,左右撞架、往前卻龜速。Rumelhart 等人給的解藥叫動量(Momentum):讓推車記得剛才往哪衝,帶著慣性走。整節一句話:動量 = 梯度下降 + 慣性。
先把任務講成一句人話
純梯度下降每一步只信當下的坡度,在狹長 loss 山谷(ravine)裡容易左右來回震盪。動量更新不只看這一腳,還把上一步的更新方向留一部分下來,讓沿山谷的速度累積、側向晃動互相抵消,路徑更直、收斂更快。
鷹架式:先直覺,再符號
先把走道畫面釘住,再碰公式:
- 狹長走道:loss 沿著一個方向很平、垂直方向很陡——這就是 ravine。
- 沒有慣性的推車:每步只被當下坡度推一下,兩側貨架輪流撞,像醉漢走路。
- 有慣性的推車:上一推還在腿上,沿走道的分力會疊加,撞架的分力正負對消,整體往結帳口加速。
圖 Fig. 2 對比有無動量的等高線軌跡;Fig. 3 用向量加法畫同一件事:歷史更新乘上 ,再跟當前的 合成。
符號逐個拆
式 (8) 把 KP-2 的式 (4)「只看當前梯度」改成「歷史 + 當前」:
參數還是用式 (2) 那套往前加:
每個符號對應走道上的一個動作:
- :這一推真正讓購物車移動的向量。
- :動量係數,控制「上一推保留多少」; 就變回純梯度下降。
- :上一推的位移,也就是慣性本體。
- :這一腳的學習率,跟 KP-2 一樣。
- :現在腳下的坡度;前面的負號表示還是要下坡,不是跟著坡往上衝。
真的算一遍:一推看出慣性怎麼拆左右
設 、。走道方向叫 (往結帳口),撞貨架方向叫 。上一推 ——大半往前、稍微偏右。現在腳下坡度 :沿走道的坡很緩,側向卻陡得要命。
先算「這一腳只看坡度」會推多少:
再算動量那一項 ,兩項相加就是式 (8):
| 分量 | 純梯度下降(式 (4)) | 倍上一推 | 動量合成(式 (8)) |
|---|---|---|---|
| 沿走道 | |||
| 撞架 |
假設現在車在 。純 GD 下一步到 ;動量下一步到 。沿走道: 對上 ,快了十九倍;側向位移的絕對值: 對上 ,撞架輕很多。這就是 Fig. 3 的向量加法:前進分量被保留、側向分量互相抵消。
先留一個反轉
你的直覺大概是:慣性不就是「什麼方向都衝更遠」嗎?那側向也該撞得更慘才對。數字揭曉卻反了——側向位移變小,不變大。原因很土:上一推偏右 ,這一腳坡度把你往左拽 ,兩股力對消,剩下 。慣性不是無腦加速,它在 ravine 裡做的是低通濾波:常出現的方向(沿山谷)被記住,來回晃的方向被平均掉。另一個容易忽略的伏筆:第零步若 ,第一推其實跟純 GD 一模一樣——慣性是「養」出來的,不是一出生就有。
換個場景,自己找出同一條路
把超市走道換成推嬰兒車下緩坡的石階:長向是緩坡,左右是階梯的側緣。每一步只看當下傾斜,車會在左右緣來回磕;保留上一推的方向,長向速度疊起來,左右磕碰被抵掉。結構跟動量同一套:歷史方向 × ,加上當前 。
留一題自己算,數字換一換、骨架不變。,,,。先分別寫出純 GD 的 、動量的 ,再比哪個沿第一個分量走得遠、哪個第二個分量晃得小。答案不公布,對過式 (8) 就知道。
大家最容易在這裡搞混
第一個誤解:把 當成學習率。錯, 才是步長, 是「上一動留多少」。第二個誤解:以為動量保證找到全域最小值。錯,它只是讓路徑更平滑、在 ravine 裡少震盪,非凸地形該卡局部最低還是會卡。第三個誤解: 越大越好。 接近 時慣性極重,可能衝過谷底、甚至發散; 又退回醉漢推車。實務上常見落在 ~ 附近,但沒有萬能數字。
跨知識點掛勾
- KP-2:式 (4) 是「只看腳下」的純梯度下降;式 (8) 多的就是那一項 。
- KP-4:線搜索、最陡下降也是在挑「這一腳怎麼走」,但每步仍然短視;動量改的是跨步記憶,不是單步步長公式。
- KP-6:反向傳播負責把 算出來;動量是拿到梯度之後怎麼走,兩者疊在一起用。
- KP-11:RMSProp、Adam 也借鑑「累積歷史資訊」,只是累積的是梯度平方或一階矩,不是直接留 。
換句話重述
把整節濃縮成一句:狹長山谷裡純 GD 左右撞架(式 (4));動量用 保留上一推,與 合成(式 (8)),沿谷加速、側向對消。
一句話收尾: 推車過狹長走道,光看腳下會撞架——記得上一推的慣性,路才走得直、走得快。