vt=μvt−1−ηgt,wt+1=wt+vtv_t=\mu v_{t-1}-\eta g_t,\qquad w_{t+1}=w_t+v_t
vt=−η∑s=1tμt−sgs(v0=0)v_t=-\eta\sum_{s=1}^{t}\mu^{t-s}g_s\quad(v_0=0)

完整講解與原文對照 / Full explanation and source comparison

梯度下降太「短視」?加一點慣性

純梯度下降每一步只看當下的梯度方向,在狹長的 loss 山谷裡容易左右來回震盪、走得很慢。動量(Momentum) 是 Rumelhart 等人提出的一招改良:不只信現在的梯度,還保留一部分上一步更新的方向,讓優化路徑更平滑、收斂更快。

核心更新:式 (8)

把原本式 (4) 的「只看當前梯度」改成「歷史 + 當前梯度」:

(Δw)(k):=α(Δw)(k−1)−η(k)∇f(w(k)),(8) (\Delta \boldsymbol{w})^{(k)}:=\alpha(\Delta \boldsymbol{w})^{(k-1)}-\eta^{(k)} \nabla f\left(\boldsymbol{w}^{(k)}\right), \tag{8}

其中 α>0\alpha\gt 0 是動量係數,控制「上一動保留多少」。參數更新仍是:

w(k+1):=w(k)+(Δw)(k). \boldsymbol{w}^{(k+1)}:=\boldsymbol{w}^{(k)}+(\Delta \boldsymbol{w})^{(k)} .

直覺:像推球下山

圖 (Fig. 2) 對比了有無動量的等高線軌跡;圖 (Fig. 3) 用向量加法說明:α(Δw)(k−1)\alpha(\Delta \boldsymbol{w})^{(k-1)} 與 −η(k)∇f-\eta^{(k)}\nabla f 合成後,側向分量互相抵消,前進分量被保留。

什麼時候特別有用

一句話:動量 = 梯度下降 + 慣性,讓優化不只「看腳下」,還「記得剛才往哪走」。

教授祕笈:動量——推購物車過狹長走道(式 (8))

同學,上一節把梯度下降講成「看腳下坡度、反方向走一步」。今天超市還沒打烊,我們把那台車推進一條又長又窄的走道:兩側全是貨架,正前方才是結帳口。純梯度下降在這種狹長山谷裡,會像沒有慣性的推車——每撞一下就猛轉方向,左右撞架、往前卻龜速。Rumelhart 等人給的解藥叫動量(Momentum):讓推車記得剛才往哪衝,帶著慣性走。整節一句話:動量 = 梯度下降 + 慣性。

先把任務講成一句人話

純梯度下降每一步只信當下的坡度,在狹長 loss 山谷(ravine)裡容易左右來回震盪。動量更新不只看這一腳,還把上一步的更新方向留一部分下來,讓沿山谷的速度累積、側向晃動互相抵消,路徑更直、收斂更快。

鷹架式:先直覺,再符號

先把走道畫面釘住,再碰公式:

圖 Fig. 2 對比有無動量的等高線軌跡;Fig. 3 用向量加法畫同一件事:歷史更新乘上 α\alpha,再跟當前的 −η∇f-\eta\nabla f 合成。

符號逐個拆

式 (8) 把 KP-2 的式 (4)「只看當前梯度」改成「歷史 + 當前」:

(Δw)(k):=α(Δw)(k−1)−η(k)∇f(w(k)),(8) (\Delta \boldsymbol{w})^{(k)}:=\alpha(\Delta \boldsymbol{w})^{(k-1)}-\eta^{(k)} \nabla f\left(\boldsymbol{w}^{(k)}\right), \tag{8}

參數還是用式 (2) 那套往前加:

w(k+1):=w(k)+(Δw)(k). \boldsymbol{w}^{(k+1)}:=\boldsymbol{w}^{(k)}+(\Delta \boldsymbol{w})^{(k)} .

每個符號對應走道上的一個動作:

真的算一遍:一推看出慣性怎麼拆左右

設 α=0.9\alpha=0.9、η=0.1\eta=0.1。走道方向叫 xx(往結帳口),撞貨架方向叫 yy。上一推 (Δw)(k−1)=(1.0, 0.4)(\Delta \boldsymbol{w})^{(k-1)}=(1.0,\ 0.4)——大半往前、稍微偏右。現在腳下坡度 ∇f=(−0.5, 6.0)\nabla f=(-0.5,\ 6.0):沿走道的坡很緩,側向卻陡得要命。

先算「這一腳只看坡度」會推多少:

−η∇f=−0.1×(−0.5, 6.0)=(0.05, −0.6). -\eta\nabla f=-0.1\times(-0.5,\ 6.0)=(0.05,\ -0.6).

再算動量那一項 α(Δw)(k−1)=0.9×(1.0, 0.4)=(0.90, 0.36)\alpha(\Delta \boldsymbol{w})^{(k-1)}=0.9\times(1.0,\ 0.4)=(0.90,\ 0.36),兩項相加就是式 (8):

分量 純梯度下降(式 (4)) α\alpha 倍上一推 動量合成(式 (8))
沿走道 xx 0.050.05 0.900.90 0.950.95
撞架 yy −0.60-0.60 0.360.36 −0.24-0.24

假設現在車在 w(k)=(10.00, 1.00)\boldsymbol{w}^{(k)}=(10.00,\ 1.00)。純 GD 下一步到 (10.05, 0.40)(10.05,\ 0.40);動量下一步到 (10.95, 0.76)(10.95,\ 0.76)。沿走道:0.950.95 對上 0.050.05,快了十九倍;側向位移的絕對值:0.240.24 對上 0.600.60,撞架輕很多。這就是 Fig. 3 的向量加法:前進分量被保留、側向分量互相抵消。

先留一個反轉

你的直覺大概是:慣性不就是「什麼方向都衝更遠」嗎?那側向也該撞得更慘才對。數字揭曉卻反了——側向位移變小,不變大。原因很土:上一推偏右 0.360.36,這一腳坡度把你往左拽 0.600.60,兩股力對消,剩下 0.240.24。慣性不是無腦加速,它在 ravine 裡做的是低通濾波:常出現的方向(沿山谷)被記住,來回晃的方向被平均掉。另一個容易忽略的伏筆:第零步若 (Δw)(0)=0(\Delta \boldsymbol{w})^{(0)}=\boldsymbol{0},第一推其實跟純 GD 一模一樣——慣性是「養」出來的,不是一出生就有。

換個場景,自己找出同一條路

把超市走道換成推嬰兒車下緩坡的石階:長向是緩坡,左右是階梯的側緣。每一步只看當下傾斜,車會在左右緣來回磕;保留上一推的方向,長向速度疊起來,左右磕碰被抵掉。結構跟動量同一套:歷史方向 × α\alpha,加上當前 −η∇f-\eta\nabla f。

留一題自己算,數字換一換、骨架不變。α=0.8\alpha=0.8,η=0.2\eta=0.2,(Δw)(k−1)=(0.5, −0.4)(\Delta \boldsymbol{w})^{(k-1)}=(0.5,\ -0.4),∇f=(1.0, 2.0)\nabla f=(1.0,\ 2.0)。先分別寫出純 GD 的 Δw\Delta\boldsymbol{w}、動量的 Δw\Delta\boldsymbol{w},再比哪個沿第一個分量走得遠、哪個第二個分量晃得小。答案不公布,對過式 (8) 就知道。

大家最容易在這裡搞混

第一個誤解:把 α\alpha 當成學習率。錯,η\eta 才是步長,α\alpha 是「上一動留多少」。第二個誤解:以為動量保證找到全域最小值。錯,它只是讓路徑更平滑、在 ravine 裡少震盪,非凸地形該卡局部最低還是會卡。第三個誤解:α\alpha 越大越好。α\alpha 接近 11 時慣性極重,可能衝過谷底、甚至發散;α=0\alpha=0 又退回醉漢推車。實務上常見落在 0.80.8~0.990.99 附近,但沒有萬能數字。

跨知識點掛勾

換句話重述

把整節濃縮成一句:狹長山谷裡純 GD 左右撞架(式 (4));動量用 α\alpha 保留上一推,與 −η∇f-\eta\nabla f 合成(式 (8)),沿谷加速、側向對消。

一句話收尾: 推車過狹長走道,光看腳下會撞架——記得上一推的慣性,路才走得直、走得快。