動量(momentum)
純 SGD 朝當前小批次梯度的方向走一步,然後就忘掉它。動量(momentum)給最佳化器記憶與慣性,就像一顆沿坡滾下的重球:球不會在每一瞬間停下來重新決定方向,而是保有由它走過的路累積出的速度。當梯度持續指向同一方向時,速度增長,球在綿長平緩的坡上加速。當梯度在狹窄峽谷中來回翻轉(極小值附近常見的地形)時,相反的分量在移動平均中互相抵消,而一致地朝谷底的分量則保留下來,於是動量抑制了浪費的左右震盪,加快沿谷底的前進。
具體上我們維護一個速度向量 v,初始化為零,每一步在移動前把舊速度與新梯度 g 混合:v ← μ v + g,再 θ ← θ − η v。這裡 μ(mu)是動量係數,是 [0,1) 之間的數,表示保留多少過去,通常取 0.9;η 是學習率,θ 是參數。當 μ = 0 時就退回普通 SGD。速度是過去梯度的指數移動平均,因此某個梯度的影響在後續步驟中按 μ、μ²、μ³…衰減。在梯度大致固定的穩態下,速度收斂到 g/(1−μ),所以動量實際上把步長放大了 1/(1−μ) 倍——在 μ = 0.9 時約 10 倍。這就是為何加入動量時常須調低學習率。
Nesterov 加速梯度(NAG)是一個更精巧的變體:它在「前瞻位置」評估梯度——也就是速度即將把參數帶到的地方——而非當前點。直覺上,球查看它要去的方向的坡度,而非它站立處的坡度,因而能在越過之前先煞車。對平滑的凸問題,Nesterov 方法達到可被證明優於普通梯度下降的收斂率,實務上也常比古典動量帶來雖小但穩定的優勢。
在電腦視覺中,帶動量的 SGD(μ = 0.9)加上權重衰減與學習率排程,是訓練出里程碑式 CNN(AlexNet、VGG 與 ResNet 家族)的主力,而且在卷積影像分類器上至今仍常能匹敵甚至勝過 Adam 等自適應最佳化器,並往往泛化得略好。自適應方法在 transformer 上較佔優勢,但動量仍是強而簡單的預設選擇。
留意兩種常見慣例。有些框架寫 v ← μ v + g;θ ← θ − η v(梯度原樣加入),有些寫 v ← μ v + (1−μ) g(真正的平均)或把 η 併入 v。它們在數值上並不等價,所以在不同程式庫間直接照搬動量值,可能悄悄改變你的有效學習率。