完整講解與原文對照 / Full explanation and source comparison
梯度下降:沿著最陡的下坡方向走
反向傳播和很多神經網路優化演算法,底層都靠一階優化方法,其中最經典的就是梯度下降(gradient descent)。歷史上 Cauchy(1874)最早提出這個想法,Hadamard(1908)加以精煉,Curry(1944)分析收斂性。因為 backprop = 梯度下降 + 鏈式法則,我們先從梯度下降本身學起。
問題設定:最小化可微函數
給一個可微函數 f(⋅),要對變數 w 做最小化(式 (1)):
wminimizef(w).(1)
數值優化從隨機選的初始點 w(0) 出發,每一步加一個更新量 Δw(式 (2)):
w(k+1):=w(k)+Δw.(2)
一直迭代,直到收斂(或夠接近)最優解 w∗。
L-smooth 與理想步長
假設 f(w) 的梯度是 L-smooth(L 是 Lipschitz 常數),代表梯度不會變化太劇烈。在這個設定下,更新規則變成(式 (3)):
Δw=−L1∇f(w(k))⟹w(k+1):=w(k)−L1∇f(w(k)).(3)
白話:沿著梯度的反方向走,步長取 1/L,就能保證每步都讓目標函數下降。
學習率 η:實務上的固定步長
問題來了——L 常常不知道、也算不出來。所以實務上改用固定的正步長 η>0,也就是大家熟悉的學習率(learning rate)(式 (4)):
Δw=−η∇f(w(k)),i.e.,w(k+1):=w(k)−η∇f(w(k)).(4)
η 太大可能震盪甚至發散,太小則收斂龜速——調學習率是訓練神經網路最常見的頭痛之一。若是最大化問題,步長改成 +η,就叫梯度上升(gradient ascent)。
學習率也可以用線搜索(line search)來選,傳統優化常用,深度學習較少——kp4 會細講。
凸 vs 非凸:收斂到哪裡不一樣
- 凸(convex)目標:迭代序列 {w(k)} 收斂到全域最低點 w∗,而且目標值單調遞減:
{w(0),w(1),w(2),…}→w∗,f(w(0))≥f(w(1))≥f(w(2))≥⋯≥f(w∗).
- 非凸(non-convex)目標:只能保證收斂到局部最低點。但別灰心——如 Fig. 1 所示,梯度下降在非凸地形上仍然表現不錯:雖然可能來回震盪,整體 loss 還是傾向下降。深度學習的 loss 幾乎都是非凸的,這正是為什麼我們需要 momentum、Adam 等進階技巧(後面章節會講)。
口語復盤:梯度下降就是「看現在坡度最陡往哪、就反方向走一步」;理想步長是 1/L,實務上用學習率 η 代替;凸函數找全域最優,非凸只能找局部最優但通常夠用。
教授祕笈:蒙眼下山——梯度下降式(1)到式(4)
同學,KP-1 說訓練就是下山找谷底。今天把眼睛矇起來:你看不到整座山,只能用腳底感覺「哪一邊最陡」,然後永遠走最陡的反方向。這就是梯度下降(gradient descent)。Cauchy 1874 年就想過這招;後來 backprop 不過是「梯度下降加鏈式法則」,所以公式要先在這裡站穩。
先把任務講成一句人話
給你一個可以微分的高度函數,從隨便一個起點出發,每一步加一個位移,一直走到夠接近谷底。蒙眼的人不會一次跳過整座山,他只問:現在腳下,往哪邊降得最快?然後反著坡走一小步。
鷹架式:先直覺,再符號
直覺:看現在坡度最陡往哪,就反方向走一步。 為什麼需要公式?因為「走一步」得講清楚走多遠、往哪走,不然蒙眼的人會掉下懸崖。現在才請符號出場。式 (1) 是任務本身——對變數 w 最小化可微函數 f(⋅):
wminimizef(w).(1)
從隨機初始點 w(0) 出發,每步加更新量 Δw,這是式 (2):
w(k+1):=w(k)+Δw.(2)
若梯度是 L-smooth(L 是 Lipschitz 常數,白話:坡度不會突然瘋掉),理想步長取 1/L,這是式 (3):
Δw=−L1∇f(w(k))⟹w(k+1):=w(k)−L1∇f(w(k)).(3)
麻煩來了:L 常常不知道、也算不出來。實務上改用固定正步長 η>0,也就是學習率,這是式 (4):
w(k+1):=w(k)−η∇f(w(k)).(4)
若問題改成最大化,把負號改成正號,就叫梯度上升。線搜索怎麼動態選 η,KP-4 再講。
真的算一遍:二次谷底,手算三步
讓 f(w)=w2(谷底在 0),則 ∇f=2w。此函數 L=2,理想步長 1/L=0.5。我們故意用較小的 η=0.1,從 w(0)=4 出發:
| k | w(k) | ∇f=2w | η∇f | w(k+1)=w−η∇f | f(w) |
| 0 | 4 | 8 | 0.8 | 3.2 | 16 |
| 1 | 3.2 | 6.4 | 0.64 | 2.56 | 10.24 |
| 2 | 2.56 | 5.12 | 0.512 | 2.048 | 6.5536 |
每步高度都在降:蒙眼走最陡反方向,真的在下山。
先留一個反轉
你可能覺得 η 越大走得越快。把 η 改成 1 試試:w=4−1⋅8=−4,高度還是 16;下一步 −4−1⋅(−8)=4,又彈回去。兩點之間永遠對打,谷底 0 一次都沒踩到。步子太大不是加速,是在山谷兩壁拍皮球。
換個場景,自己找出同一條路
同一套蒙眼邏輯,換到「調冷氣」:室溫 28∘C、目標 24∘C,誤差函數仍像一口碗。每次只看現在偏熱還是偏冷(梯度),反方向調一格(學習率)。請你自己用 f(w)=(w−1)2、w(0)=5、η=0.25 走兩步——結構與上表完全相同,只是谷底搬到 1。若 f 是凸的,序列會走到全域最低點 w∗,而且高度單調不增:f(w(0))≥f(w(1))≥⋯≥f(w∗)。深度學習的 loss 幾乎都非凸,只能保證局部最低,途中還可能震盪,但整體仍傾向下降。這也是後面 momentum、Adam 要出場的原因。
大家最容易在這裡搞混
第一個誤解:以為梯度下降一定找到全域最低點。只有凸目標才有這保證;非凸只能承諾局部最低。第二個誤解:以為理想步長 1/L 隨時拿得到。L 通常未知,所以才用 η 硬扛,也才會有「太大震盪、太小龜速」這門課最常見的頭痛。
跨知識點掛勾
這條更新規則是整章的地基。KP-3 會問蒙眼走了那麼久,什麼時候該宣布到站;KP-4 會把固定 η 換成「試走、太大就砍半」。Chap. 1 的 argmin 在這裡變成「一步一步減」。
換句話重述
梯度下降就是蒙眼下山:式 (1) 找谷底,式 (2) 每步加位移,式 (3) 理想步長 1/L,式 (4) 用學習率 η 代替;凸找全域、非凸找局部,但通常夠用。
一句話收尾: 蒙眼下山,永遠走最陡的反方向;步長是 η,太大會拍皮球。