gt=∇F(wt)+ξt,E[ξt∣wt]=0g_t=\nabla F(w_t)+\xi_t,\quad \mathbb E[\xi_t\mid w_t]=0
E∥gt−∇F(wt)∥2=σ2\mathbb E\|g_t-\nabla F(w_t)\|^2=\sigma^2

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

全資料梯度太貴?每次只抽一筆

反向傳播能高效算梯度,但若每步都要對全部 nn 筆資料求平均梯度(full-batch),資料一大就吃不消。 隨機梯度下降(SGD) 的解法很直接:每步只隨機抽一筆 ii,用它的梯度近似全體梯度——便宜、可擴展,是深度學習預設優化法的鼻祖(隨機逼近 1951;ML 應用約 1998)。

問題設定:式 (20)–(21)

有 nn 筆資料 {xi}\{\boldsymbol{x}_i\}、標籤 {li}\{l_i\},總 loss 是各樣本 loss 的平均:

minimize⁡w1n∑i=1nfi(w).(20) \underset{\boldsymbol{w}}{\operatorname{minimize}} \frac{1}{n} \sum_{i=1}^{n} f_{i}(\boldsymbol{w}) . \tag{20}

全梯度是各樣本梯度的平均(式 (21)):

∇f(w)=1n∑i=1n∇fi(w).(21) \nabla f(\boldsymbol{w})=\frac{1}{n} \sum_{i=1}^{n} \nabla f_{i}(\boldsymbol{w}) . \tag{21}

Full-batch 更新要算上式右邊的完整求和,每輪 O(n)O(n),nn 百萬、十億時非常慢。

SGD 更新:式 (22)

SGD 每步只抽一個索引 ii,用單樣本梯度更新:

w(k+1):=w(k)−η(k)∇fi(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)−η∇f(w(k))\boldsymbol{w}^{(k+1)}:=\boldsymbol{w}^{(k)}-\eta \nabla f(\boldsymbol{w}^{(k)})。梯度是有雜訊的估計,但期望方向仍指向全梯度,且每步成本低很多。

自適應學習率 η(k)\eta^{(k)}

SGD 通常讓 η(k)\eta^{(k)} 隨迭代改變——離最優點還遠時步子大,靠近時步子小。常見選擇:

η(k):=1k,η(k):=1k,η(k):=η(固定). \eta^{(k)} :=\frac{1}{k}, \qquad \eta^{(k)} :=\frac{1}{\sqrt{k}}, \qquad \eta^{(k)} :=\eta \text{(固定)}.

與後續 mini-batch 的關係

這裡的 SGD 嚴格說是 single-sample SGD(每步一筆)。實務上常說的「SGD」多半是 mini-batch SGD(§4.1),用一小批平均梯度,在速度與穩定之間折衷——下一節 kp8 專講。

教授祕笈:SGD——用一筆帳單估全公司平均(式 (20)–(22))

同學,反向傳播已經能把每一筆資料的梯度算得很漂亮了。問題換成會計室的:公司有 nn 張帳單,總損失是這 nn 張的平均。每次開會若都把全部帳單加總再決定調薪,資料一到百萬、十億,會計還沒加完,市場已經收盤。隨機梯度下降(SGD)的作法很無賴、也很有效:隨機抽一張帳單,就當它代表全公司,先改一版參數。整節一句話:用一筆帳單估全公司平均——便宜、吵、但方向的期望值還是對的。

先把任務講成一句人話

我們要最小化的是所有樣本損失的平均;全梯度是所有單樣本梯度的平均,每步成本隨 nn 線性膨脹。SGD 每步只抽一個索引 ii,用 ∇fi\nabla f_i 代替 ∇f\nabla f 來更新。梯度帶雜訊,可是期望仍指向全梯度,而且每步成本跟 nn 脫鉤。

鷹架式:先直覺,再符號

先把會計室的三種開會方式講清楚:

這裡的 SGD 嚴格說是 single-sample SGD(每步一筆)。路上聽到人家說「我們用 SGD 訓練」,多半其實是下一節 KP-8 的 mini-batch。

符號逐個拆

有 nn 筆資料 {xi}\{\boldsymbol{x}_i\}、標籤 {li}\{l_i\},總目標是各張帳單的平均(式 (20)):

minimize⁡w 1n∑i=1nfi(w).(20) \underset{\boldsymbol{w}}{\operatorname{minimize}}\ \frac{1}{n}\sum_{i=1}^{n} f_{i}(\boldsymbol{w}). \tag{20}

全梯度就是把每張帳單的梯度加起來再除以 nn(式 (21)):

∇f(w)=1n∑i=1n∇fi(w).(21) \nabla f(\boldsymbol{w})=\frac{1}{n}\sum_{i=1}^{n}\nabla f_{i}(\boldsymbol{w}). \tag{21}

SGD 不求和,只抽一個 ii(式 (22)):

w(k+1):=w(k)−η(k)∇fi(w(k)).(22) \boldsymbol{w}^{(k+1)}:=\boldsymbol{w}^{(k)}-\eta^{(k)}\nabla f_{i}\bigl(\boldsymbol{w}^{(k)}\bigr). \tag{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)}),差別只有一句:右邊從「全公司平均」換成「手上那一張」。

學習率常隨迭代改,原文列了三種常見 schedule:

η(k):=1k,η(k):=1k,η(k):=η (固定). \eta^{(k)}:=\frac{1}{k},\qquad \eta^{(k)}:=\frac{1}{\sqrt{k}},\qquad \eta^{(k)}:=\eta\ \text{(固定)}.

真的算一遍:四張帳單,抽一張就改政策

把參數當成一維的「公司對平均開銷的估計」ww。每張帳單 fi(w)=12(w−ti)2f_i(w)=\tfrac12(w-t_i)^{2},所以 ∇fi=w−ti\nabla f_i=w-t_i。四張帳單金額 t=(2, 4, 6, 8)t=(2,\ 4,\ 6,\ 8),真正的平均是 55,也就是 w∗=5w^{*}=5。現在公司瞎猜 w=0w=0,學習率 η=0.2\eta=0.2。

四張單的梯度:0−2=−20-2=-2、0−4=−40-4=-4、0−6=−60-6=-6、0−8=−80-8=-8。全公司平均梯度 (−2−4−6−8)/4=−5(-2-4-6-8)/4=-5。

決策方式 用到的梯度 更新 w←w−η⋅(⋅)w\leftarrow w-\eta\cdot(\cdot) 新的 ww 這一腳算了幾張單
Full-batch(式 (21)+(4)) −5-5 0−0.2×(−5)0-0.2\times(-5) 1.01.0 44
SGD 抽到第 1 張(t=2t=2) −2-2 0−0.2×(−2)0-0.2\times(-2) 0.40.4 11
SGD 抽到第 4 張(t=8t=8) −8-8 0−0.2×(−8)0-0.2\times(-8) 1.61.6 11

三條路都往 55 走,沒有走反。可是步長差很多:抽到小帳單只挪 0.40.4,抽到大帳單挪 1.61.6,全公司平均剛好居中 1.01.0。這就是「有雜訊的估計」——方向的期望對,單次實現會偏。

再看學習率怎麼縮。固定 η=0.2\eta=0.2 對照兩種遞減:

迭代 kk η=1/k\eta=1/k η=1/k\eta=1/\sqrt{k} 固定 0.20.2
11 1.0001.000 1.0001.000 0.2000.200
44 0.2500.250 0.5000.500 0.2000.200
99 0.1110.111 0.3330.333 0.2000.200
1616 0.0630.063 0.2500.250 0.2000.200

k=16k=16 時,1/k1/k 已經只剩 0.0630.063,固定步長還在 0.2000.200 晃——這張表後面會在 KP-9 變成「為什麼固定 η\eta 停不進最優點」的伏筆。

先留一個反轉

把 ww 直接放到最優點 55。四張單的梯度變成 33、11、−1-1、−3-3,全公司平均是 00——大會決議:什麼都別改。可是 SGD 若抽到第一張,w←5−0.2×3=4.4w\leftarrow 5-0.2\times3=4.4,已經完美的估計被一張帳單改壞了。聽起來很荒謬,深度學習每天都在幹這事:不是因為算法笨,是因為單張帳單的梯度期望等於全梯度,但方差不是零。你用吵的估計量換來每步只要算一筆;靠近最優時,這份吵會讓你在目標附近晃,這也是後面要遞減 η\eta、或改用 mini-batch 的理由。

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

把「公司帳單」換成餐廳試吃:要估全菜單的平均鹹度,每道菜都嘗一遍是 full-batch;閉著眼夾一口就調配方,是 SGD。夾到的那口可能偏鹹或偏淡,但多次隨機試吃的平均,仍會指向全菜單的真實鹹度。

留一題:t=(1, 3, 5)t=(1,\ 3,\ 5),w=2w=2,η=0.5\eta=0.5。先算三張單的 ∇fi\nabla f_i 與全梯度,再分別寫出抽到每一張時式 (22) 的新 ww。哪一張會讓你走離 w∗=3w^{*}=3?算完你會發現:即使期望方向對,單次抽樣仍可能暫時走錯邊。

大家最容易在這裡搞混

第一個誤解:SGD 每步仍要掃完整個資料集。錯,式 (22) 只碰一個 ii,成本與 nn 無關;掃完整集的是式 (21)。第二個誤解:SGD 一定比 full-batch 收斂更快。錯,它每步便宜,所以單位時間常更划算,但步數路徑更吵,沒人保證更少迭代就到終點。第三個誤解:路上說的「SGD」就是本節這個每步一筆。深度學習口語裡的 SGD,十之八九是 KP-8 的小批次平均。

跨知識點掛勾

換句話重述

把整節濃縮成一句:總損失是 nn 張帳單平均(式 (20)),全梯度也是平均(式 (21));SGD 每步只抽一張用 ∇fi\nabla f_i 更新(式 (22)),並常用 1/k1/k 或 1/k1/\sqrt{k} 把步長收斂。

一句話收尾: 用一張帳單估全公司開銷——帳會抖,但算得起,期望方向仍指向真正的平均。