完整講解與原文對照 / Full explanation and source comparison 原文對照說明: 下方保留原教材的完整講解與教授祕笈,部分原始表述有待校正。教學與實作以本頁上方公式及校正為準。 本版統一平均損失。若改用總和,梯度與學習率需相應縮放。全資料梯度太貴?每次只抽一筆 反向傳播能高效算梯度,但若每步都要對全部 n n n 筆資料 求平均梯度(full-batch),資料一大就吃不消。 隨機梯度下降(SGD) 的解法很直接:每步只隨機抽一筆 i i i ,用它的梯度近似全體梯度——便宜、可擴展,是深度學習預設優化法的鼻祖(隨機逼近 1951;ML 應用約 1998)。
問題設定:式 (20)–(21) 有 n n n 筆資料 { x i } \{\boldsymbol{x}_i\} { x i } 、標籤 { l i } \{l_i\} { l i } ,總 loss 是各樣本 loss 的平均:
minimize w 1 n ∑ i = 1 n f i ( w ) . (20)
\underset{\boldsymbol{w}}{\operatorname{minimize}} \frac{1}{n} \sum_{i=1}^{n} f_{i}(\boldsymbol{w}) . \tag{20}
w minimize n 1 i = 1 ∑ n f i ( w ) . ( 20 )
全梯度是各樣本梯度的平均(式 (21)):
∇ f ( w ) = 1 n ∑ i = 1 n ∇ f i ( w ) . (21)
\nabla f(\boldsymbol{w})=\frac{1}{n} \sum_{i=1}^{n} \nabla f_{i}(\boldsymbol{w}) . \tag{21}
∇ f ( w ) = n 1 i = 1 ∑ n ∇ f i ( w ) . ( 21 )
Full-batch 更新要算上式右邊的完整求和 ,每輪 O ( n ) O(n) O ( n ) ,n n n 百萬、十億時非常慢。
SGD 更新:式 (22) SGD 每步只抽一個索引 i i i ,用單樣本梯度 更新:
w ( k + 1 ) : = w ( k ) − η ( k ) ∇ f i ( w ( k ) ) , (22)
\boldsymbol{w}^{(k+1)}:=\boldsymbol{w}^{(k)}-\eta^{(k)} \nabla f_{i}\left(\boldsymbol{w}^{(k)}\right), \tag{22}
w ( k + 1 ) := w ( k ) − η ( k ) ∇ f i ( w ( k ) ) , ( 22 )
而不是 w ( k + 1 ) : = w ( k ) − η ∇ f ( w ( k ) ) \boldsymbol{w}^{(k+1)}:=\boldsymbol{w}^{(k)}-\eta \nabla f(\boldsymbol{w}^{(k)}) w ( k + 1 ) := w ( k ) − η ∇ f ( w ( k ) ) 。梯度是有雜訊的估計 ,但期望方向仍指向全梯度,且每步成本低很多。
自適應學習率 η ( k ) \eta^{(k)} η ( k ) SGD 通常讓 η ( k ) \eta^{(k)} η ( k ) 隨迭代改變 ——離最優點還遠時步子大,靠近時步子小。常見選擇:
η ( k ) : = 1 k , η ( k ) : = 1 k , η ( k ) : = η (固定) .
\eta^{(k)} :=\frac{1}{k}, \qquad \eta^{(k)} :=\frac{1}{\sqrt{k}}, \qquad \eta^{(k)} :=\eta \text{(固定)}.
η ( k ) := k 1 , η ( k ) := k 1 , η ( k ) := η (固定) .
η ( k ) = 1 / k \eta^{(k)} = 1/k η ( k ) = 1/ k :早期大步探索,後期細調;
η ( k ) = 1 / k \eta^{(k)} = 1/\sqrt{k} η ( k ) = 1/ k :衰減比 1 / k 1/k 1/ k 慢,實務也常用;
固定 η \eta η :實作簡單,但理論上可能停在最優附近 O ( η ) \mathcal{O}(\eta) O ( η ) 的鄰域(§4.2 會細講)。
與後續 mini-batch 的關係 這裡的 SGD 嚴格說是 single-sample SGD (每步一筆)。實務上常說的「SGD」多半是 mini-batch SGD (§4.1),用一小批平均梯度,在速度與穩定之間折衷——下一節 kp8 專講。
教授祕笈:SGD——用一筆帳單估全公司平均(式 (20)–(22)) 同學,反向傳播已經能把每一筆資料的梯度算得很漂亮了。問題換成會計室的:公司有 n n n 張帳單,總損失是這 n n n 張的平均 。每次開會若都把全部帳單加總再決定調薪,資料一到百萬、十億,會計還沒加完,市場已經收盤。隨機梯度下降(SGD) 的作法很無賴、也很有效:隨機抽一張 帳單,就當它代表全公司,先改一版參數。整節一句話:用一筆帳單估全公司平均——便宜、吵、但方向的期望值還是對的。
先把任務講成一句人話 我們要最小化的是所有樣本損失的平均;全梯度是所有單樣本梯度的平均,每步成本隨 n n n 線性膨脹。SGD 每步只抽一個索引 i i i ,用 ∇ f i \nabla f_i ∇ f i 代替 ∇ f \nabla f ∇ f 來更新。梯度帶雜訊,可是期望仍指向全梯度,而且每步成本跟 n n n 脫鉤。
鷹架式:先直覺,再符號 先把會計室的三種開會方式講清楚:
全公司大會(full-batch) :把 n n n 張帳單逐張算梯度再平均,方向準,成本 O ( n ) O(n) O ( n ) 。 抽一張就散會(SGD) :隨機抓一張,用那一張的梯度當公司決策。 自適應步長 :離目標還遠時步子大,靠近時步子小——帳單再吵,步長也該越來越謹慎。 這裡的 SGD 嚴格說是 single-sample SGD (每步一筆)。路上聽到人家說「我們用 SGD 訓練」,多半其實是下一節 KP-8 的 mini-batch。
符號逐個拆 有 n n n 筆資料 { x i } \{\boldsymbol{x}_i\} { x i } 、標籤 { l i } \{l_i\} { l i } ,總目標是各張帳單的平均(式 (20)):
minimize w 1 n ∑ i = 1 n f i ( w ) . (20) \underset{\boldsymbol{w}}{\operatorname{minimize}}\ \frac{1}{n}\sum_{i=1}^{n} f_{i}(\boldsymbol{w}). \tag{20} w minimize n 1 i = 1 ∑ n f i ( w ) . ( 20 )
全梯度就是把每張帳單的梯度加起來再除以 n n n (式 (21)):
∇ f ( w ) = 1 n ∑ i = 1 n ∇ f i ( w ) . (21) \nabla f(\boldsymbol{w})=\frac{1}{n}\sum_{i=1}^{n}\nabla f_{i}(\boldsymbol{w}). \tag{21} ∇ f ( w ) = n 1 i = 1 ∑ n ∇ f i ( w ) . ( 21 )
SGD 不求和,只抽一個 i i i (式 (22)):
w ( k + 1 ) : = w ( k ) − η ( k ) ∇ f i ( w ( k ) ) . (22) \boldsymbol{w}^{(k+1)}:=\boldsymbol{w}^{(k)}-\eta^{(k)}\nabla f_{i}\bigl(\boldsymbol{w}^{(k)}\bigr). \tag{22} w ( k + 1 ) := w ( k ) − η ( k ) ∇ f i ( w ( k ) ) . ( 22 )
對照式 (4) 的 full-batch 更新 w ( k + 1 ) : = w ( k ) − η ∇ f ( w ( k ) ) \boldsymbol{w}^{(k+1)}:=\boldsymbol{w}^{(k)}-\eta\nabla f(\boldsymbol{w}^{(k)}) w ( k + 1 ) := w ( k ) − η ∇ f ( w ( k ) ) ,差別只有一句:右邊從「全公司平均」換成「手上那一張」。
學習率常隨迭代改,原文列了三種常見 schedule:
η ( k ) : = 1 k , η ( k ) : = 1 k , η ( k ) : = η (固定) . \eta^{(k)}:=\frac{1}{k},\qquad \eta^{(k)}:=\frac{1}{\sqrt{k}},\qquad \eta^{(k)}:=\eta\ \text{(固定)}. η ( k ) := k 1 , η ( k ) := k 1 , η ( k ) := η (固定) .
1 / k 1/k 1/ k :早期大步探路,後期細調。 1 / k 1/\sqrt{k} 1/ k :衰減比 1 / k 1/k 1/ k 慢,實務也常見。 固定 η \eta η :實作最省事,但理論上可能停在最優附近 O ( η ) \mathcal{O}(\eta) O ( η ) 的鄰域——KP-9 會把這件事情講死。 真的算一遍:四張帳單,抽一張就改政策 把參數當成一維的「公司對平均開銷的估計」w w w 。每張帳單 f i ( w ) = 1 2 ( w − t i ) 2 f_i(w)=\tfrac12(w-t_i)^{2} f i ( w ) = 2 1 ( w − t i ) 2 ,所以 ∇ f i = w − t i \nabla f_i=w-t_i ∇ f i = w − t i 。四張帳單金額 t = ( 2 , 4 , 6 , 8 ) t=(2,\ 4,\ 6,\ 8) t = ( 2 , 4 , 6 , 8 ) ,真正的平均是 5 5 5 ,也就是 w ∗ = 5 w^{*}=5 w ∗ = 5 。現在公司瞎猜 w = 0 w=0 w = 0 ,學習率 η = 0.2 \eta=0.2 η = 0.2 。
四張單的梯度:0 − 2 = − 2 0-2=-2 0 − 2 = − 2 、0 − 4 = − 4 0-4=-4 0 − 4 = − 4 、0 − 6 = − 6 0-6=-6 0 − 6 = − 6 、0 − 8 = − 8 0-8=-8 0 − 8 = − 8 。全公司平均梯度 ( − 2 − 4 − 6 − 8 ) / 4 = − 5 (-2-4-6-8)/4=-5 ( − 2 − 4 − 6 − 8 ) /4 = − 5 。
決策方式 用到的梯度 更新 w ← w − η ⋅ ( ⋅ ) w\leftarrow w-\eta\cdot(\cdot) w ← w − η ⋅ ( ⋅ ) 新的 w w w 這一腳算了幾張單 Full-batch(式 (21)+(4)) − 5 -5 − 5 0 − 0.2 × ( − 5 ) 0-0.2\times(-5) 0 − 0.2 × ( − 5 ) 1.0 1.0 1.0 4 4 4 SGD 抽到第 1 張(t = 2 t=2 t = 2 ) − 2 -2 − 2 0 − 0.2 × ( − 2 ) 0-0.2\times(-2) 0 − 0.2 × ( − 2 ) 0.4 0.4 0.4 1 1 1 SGD 抽到第 4 張(t = 8 t=8 t = 8 ) − 8 -8 − 8 0 − 0.2 × ( − 8 ) 0-0.2\times(-8) 0 − 0.2 × ( − 8 ) 1.6 1.6 1.6 1 1 1
三條路都往 5 5 5 走,沒有走反。可是步長差很多:抽到小帳單只挪 0.4 0.4 0.4 ,抽到大帳單挪 1.6 1.6 1.6 ,全公司平均剛好居中 1.0 1.0 1.0 。這就是「有雜訊的估計」——方向的期望對,單次實現會偏。
再看學習率怎麼縮。固定 η = 0.2 \eta=0.2 η = 0.2 對照兩種遞減:
迭代 k k k η = 1 / k \eta=1/k η = 1/ k η = 1 / k \eta=1/\sqrt{k} η = 1/ k 固定 0.2 0.2 0.2 1 1 1 1.000 1.000 1.000 1.000 1.000 1.000 0.200 0.200 0.200 4 4 4 0.250 0.250 0.250 0.500 0.500 0.500 0.200 0.200 0.200 9 9 9 0.111 0.111 0.111 0.333 0.333 0.333 0.200 0.200 0.200 16 16 16 0.063 0.063 0.063 0.250 0.250 0.250 0.200 0.200 0.200
k = 16 k=16 k = 16 時,1 / k 1/k 1/ k 已經只剩 0.063 0.063 0.063 ,固定步長還在 0.200 0.200 0.200 晃——這張表後面會在 KP-9 變成「為什麼固定 η \eta η 停不進最優點」的伏筆。
先留一個反轉 把 w w w 直接放到最優點 5 5 5 。四張單的梯度變成 3 3 3 、1 1 1 、− 1 -1 − 1 、− 3 -3 − 3 ,全公司平均是 0 0 0 ——大會決議:什麼都別改。可是 SGD 若抽到第一張,w ← 5 − 0.2 × 3 = 4.4 w\leftarrow 5-0.2\times3=4.4 w ← 5 − 0.2 × 3 = 4.4 ,已經完美的估計被一張帳單改壞了 。聽起來很荒謬,深度學習每天都在幹這事:不是因為算法笨,是因為單張帳單的梯度期望等於全梯度,但方差不是零。你用吵的估計量換來每步只要算一筆;靠近最優時,這份吵會讓你在目標附近晃,這也是後面要遞減 η \eta η 、或改用 mini-batch 的理由。
換個場景,自己找出同一條路 把「公司帳單」換成餐廳試吃 :要估全菜單的平均鹹度,每道菜都嘗一遍是 full-batch;閉著眼夾一口就調配方,是 SGD。夾到的那口可能偏鹹或偏淡,但多次隨機試吃的平均,仍會指向全菜單的真實鹹度。
留一題:t = ( 1 , 3 , 5 ) t=(1,\ 3,\ 5) t = ( 1 , 3 , 5 ) ,w = 2 w=2 w = 2 ,η = 0.5 \eta=0.5 η = 0.5 。先算三張單的 ∇ f i \nabla f_i ∇ f i 與全梯度,再分別寫出抽到每一張時式 (22) 的新 w w w 。哪一張會讓你走離 w ∗ = 3 w^{*}=3 w ∗ = 3 ?算完你會發現:即使期望方向對,單次抽樣仍可能暫時走錯邊。
大家最容易在這裡搞混 第一個誤解:SGD 每步仍要掃完整個資料集。錯,式 (22) 只碰一個 i i i ,成本與 n n n 無關;掃完整集的是式 (21)。第二個誤解:SGD 一定比 full-batch 收斂更快。錯,它每步便宜,所以單位時間 常更划算,但步數路徑更吵,沒人保證更少迭代就到終點。第三個誤解:路上說的「SGD」就是本節這個每步一筆。深度學習口語裡的 SGD,十之八九是 KP-8 的小批次平均。
跨知識點掛勾 KP-2 :式 (4) 用的是式 (21) 那種全梯度;本節把右邊換成單樣本。 KP-6 :∇ f i \nabla f_i ∇ f i 不是天上掉下來的,正是對第 i i i 筆資料跑一次反向傳播得到的。 KP-8 :一筆太吵、全批太慢,折衷是一次抽 b b b 筆——帳單改成「一小疊」。 KP-9 :固定 η \eta η 的 SGD 會停在 O ( η ) \mathcal{O}(\eta) O ( η ) 鄰域,遞減步長才能讓長期誤差趨近 0 0 0 。 換句話重述 把整節濃縮成一句:總損失是 n n n 張帳單平均(式 (20)),全梯度也是平均(式 (21));SGD 每步只抽一張用 ∇ f i \nabla f_i ∇ f i 更新(式 (22)),並常用 1 / k 1/k 1/ k 或 1 / k 1/\sqrt{k} 1/ k 把步長收斂。
一句話收尾: 用一張帳單估全公司開銷——帳會抖,但算得起,期望方向仍指向真正的平均。