gB,t=∇F(wt)+etg_{\mathcal B,t}=\nabla F(w_t)+e_t
wt+1=wt−ηtgB,tw_{t+1}=w_t-\eta_t g_{\mathcal B,t}

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

一筆太吵、全批太慢:mini-batch 折衷

Single-sample SGD 每步只抽一筆,方差大、更新不穩;full-batch 又太慢。Mini-batch SGD 每次隨機抽 bb 筆(batch size),用這小批的平均梯度更新——兼顧 SGD 的效率與 full-batch 的穩定性,是深度學習最主流的訓練方式。文獻常簡稱「SGD」,別跟 §4 的單樣本版搞混。

資料怎麼切:式 (23)–(24)

優化前常把 nn 筆資料隨機分成 ⌊n/b⌋\lfloor n/b \rfloor 個大小為 bb 的不相交批次(simple random sampling without replacement)。設資料集 D\mathcal{D}、第 ii 批 Bi\mathcal{B}_i:

amp;⋃i=1⌊n/b⌋Bi=D,amp;Bi∩Bj=∅,∀i,j∈{1,…,⌊n/b⌋},i≠j. \begin{align*} & \bigcup_{i=1}^{\lfloor n / b\rfloor} \mathcal{B}_{i}=\mathcal{D}, \tag{23}\\ & \mathcal{B}_{i} \cap \mathcal{B}_{j}=\varnothing, \quad \forall i, j \in\{1, \ldots,\lfloor n / b\rfloor\}, i \neq j . \tag{24} \end{align*}

也可用 bootstrapping(有放回抽樣),批次不再互斥,上式就不成立。

Epoch 是什麼?(Definition 1)

一個 epoch = 所有 ⌊n/b⌋\lfloor n/b \rfloor 個 batch 各用過一次做更新。跑完一 epoch 通常還會再跑好幾個 epoch,直到收斂。口語:把整份訓練資料「掃一輪」。

更新規則:式 (25)

第 kk 步用到的 batch 記作 Bk′\mathcal{B}_{k'}:

w(k+1):=w(k)−η(k)1b∑i∈Bk′∇fi(w(k)).(25) \boldsymbol{w}^{(k+1)}:=\boldsymbol{w}^{(k)}-\eta^{(k)} \frac{1}{b} \sum_{i \in \mathcal{B}_{k^{\prime}}} \nabla f_{i}\left(\boldsymbol{w}^{(k)}\right) . \tag{25}

實務上 1/b1/b 有時省略,不影響方向。GPU 平行算 batch 內梯度,是 mini-batch 大規模訓練快的主因。

Proposition 1:收斂率與梯度誤差

設 mini-batch 梯度是全梯度的近似(式 (26)):

1b∑i∈Bt′∇fi(w(t))=∇f(w(t))+et.(26) \frac{1}{b} \sum_{i \in \mathcal{B}_{t^{\prime}}} \nabla f_{i}\left(\boldsymbol{w}^{(t)}\right)=\nabla f\left(\boldsymbol{w}^{(t)}\right)+e_{t} . \tag{26}

固定 η(k)=η\eta^{(k)}=\eta 時,收斂率(Proposition 1):

bb 越大,mini-batch 梯度越接近全梯度,∥et∥22\|e_t\|_2^2 越小,收斂率越接近 full-batch(式 (31));但每步計算也變重——這是經典 速度 vs 每步成本 權衡。

梯度誤差的期望(式 (29)–(30)):

amp;E[∥et∥22]=(1−bn)σ2b,(without replacement)amp;E[∥et∥22]=σ2b,(with replacement) \begin{align*} & \mathbb{E}\left[\left\|e_{t}\right\|_{2}^{2}\right]=\left(1-\frac{b}{n}\right) \frac{\sigma^{2}}{b}, \quad \text{(without replacement)} \tag{29}\\ & \mathbb{E}\left[\left\|e_{t}\right\|_{2}^{2}\right]=\frac{\sigma^{2}}{b}, \quad \text{(with replacement)} \tag{30} \end{align*}

σ2\sigma^2 是資料集梯度方差。兩種抽樣下 b→nb \to n(或 b→∞b \to \infty)都讓雜訊變小,但每步變慢。

口語小結

方法 每步用幾筆 特點
Full-batch nn 穩、貴
SGD(§4) 1 快、吵
Mini-batch bb 實務最常用,bb 調速度與穩定

選 batch size 沒有銀彈:太小更新抖、太大每 epoch 步數少且占記憶體——通常 32、64、128、256 等是常見起點。

教授祕笈:Mini-Batch 與 Epoch——一疊一疊批改考卷(式 (23)–(30))

同學,上一節那位會計每看到一張帳單就改一次公司政策,改到手抖。教務處有對應的畫面:若每改一張考卷就重訂評分標準,標準會瘋;若把全班改完才調一次,準是準了,天亮了才改完第一輪。Mini-batch SGD 是兩者之間那疊:「一次拿 bb 張,改完這一疊再調一次標準」。文獻常把這套也叫「SGD」,別跟 KP-7 的單樣本版搞混。整節一句話:一疊一疊批改——一筆太吵、全班太慢,bb 張一疊是實務主流。

先把任務講成一句人話

把 nn 筆訓練資料切成大小約 bb 的小疊,每步用這一疊的平均梯度更新;所有小疊都用過一輪,叫做一個 epoch。bb 越大,這一疊越像全班平均、雜訊越小,但每步也越重。

鷹架式:先直覺,再符號

先把三種改卷節奏對上算法,再看切疊規則:

切疊的預設是無放回:考卷發成互斥的幾疊,發完為止。也可以有放回(bootstrapping),那疊與疊就可能重複抽到同一張。

符號逐個拆

優化前常把資料隨機分成 ⌊n/b⌋\lfloor n/b\rfloor 個大小為 bb 的不相交批次(simple random sampling without replacement)。資料集 D\mathcal{D}、第 ii 疊 Bi\mathcal{B}_i 滿足(式 (23)–(24)):

⋃i=1⌊n/b⌋Bi=D.(23) \bigcup_{i=1}^{\lfloor n/b\rfloor}\mathcal{B}_{i}=\mathcal{D}. \tag{23}

Bi∩Bj=∅,i≠j.(24) \mathcal{B}_{i}\cap\mathcal{B}_{j}=\varnothing,\quad i\neq j. \tag{24}

式 (23) 說:所有疊合起來就是全班;式 (24) 說:兩疊沒有同一張卷。改用有放回抽樣時,互斥不再成立,這兩式就作廢。

Definition 1:一個 epoch=所有 ⌊n/b⌋\lfloor n/b\rfloor 個 batch 各用過一次做更新。口語就是把整份訓練資料掃一輪;收斂前通常會掃很多輪。

第 kk 步用到的那一疊記作 Bk′\mathcal{B}_{k'},更新是疊內平均(式 (25)):

w(k+1):=w(k)−η(k)1b∑i∈Bk′∇fi(w(k)).(25) \boldsymbol{w}^{(k+1)}:=\boldsymbol{w}^{(k)}-\eta^{(k)}\frac{1}{b}\sum_{i\in\mathcal{B}_{k'}}\nabla f_{i}\bigl(\boldsymbol{w}^{(k)}\bigr). \tag{25}

對照式 (22),只是把「一張」換成「這一疊的平均」。實務上 1/b1/b 有時省略,方向不變,等於把學習率重新定義一次。GPU 平行算疊內梯度,是大規模訓練快的主因。

把小疊梯度寫成全梯度加一個誤差(式 (26)):

1b∑i∈Bt′∇fi(w(t))=∇f(w(t))+et.(26) \frac{1}{b}\sum_{i\in\mathcal{B}_{t'}}\nabla f_{i}\bigl(\boldsymbol{w}^{(t)}\bigr)=\nabla f\bigl(\boldsymbol{w}^{(t)}\bigr)+e_{t}. \tag{26}

固定 η(k)=η\eta^{(k)}=\eta 時,Proposition 1 給收斂率:非凸或凸是 O(1/t+∥et∥22)\mathcal{O}(1/t+\|e_{t}\|_{2}^{2})(式 (27));若各 fif_i 還是 μ\mu-strongly convex,則是 O((1−μ/L)t+∥et∥22)\mathcal{O}((1-\mu/L)^{t}+\|e_{t}\|_{2}^{2})(式 (28))。重點不是把大 O 背下來,而是看見那多出來的 ∥et∥22\|e_{t}\|_{2}^{2}:疊越小,這一項越大,收斂就越不像 full-batch。

誤差有多大,看你怎麼抽卷(式 (29)–(30)):

E[∥et∥22]=(1−bn)σ2b(without replacement).(29) \mathbb{E}\bigl[\|e_{t}\|_{2}^{2}\bigr]=\Bigl(1-\frac{b}{n}\Bigr)\frac{\sigma^{2}}{b} \quad\text{(without replacement)}. \tag{29}

E[∥et∥22]=σ2b(with replacement).(30) \mathbb{E}\bigl[\|e_{t}\|_{2}^{2}\bigr]=\frac{\sigma^{2}}{b} \quad\text{(with replacement)}. \tag{30}

σ2\sigma^{2} 是資料集裡各筆梯度的方差。bb 往 nn 走(或有放回時 bb 往無限走),雜訊都變小,每步也變慢——速度對上每步成本,沒有銀彈。常見起點仍是 3232、6464、128128、256256。

真的算一遍:四張考卷、兩疊、一個 epoch

沿用 KP-7 的四張單:在 w=5w=5(剛好是最優點)時,四筆梯度是 33、11、−1-1、−3-3,全班平均 ∇f=0\nabla f=0,樣本方差 σ2=(9+1+1+9)/4=5\sigma^{2}=(9+1+1+9)/4=5。取 b=2b=2,則 ⌊n/b⌋=2\lfloor n/b\rfloor=2,一個 epoch 恰好兩疊。無放回先發成 B1={3,1}\mathcal{B}_{1}=\{3,1\}、B2={−1,−3}\mathcal{B}_{2}=\{-1,-3\},η=0.5\eta=0.5。

節奏 用到的平均梯度 更新 新的 ww
疊 1(式 (25)) 12(3+1)=2\tfrac12(3+1)=2 5−0.5×25-0.5\times2 4.04.0
疊 2(同一 epoch) 12(−1−3)=−2\tfrac12(-1-3)=-2 4.0−0.5×(−2)4.0-0.5\times(-2) 5.05.0
若改成一次只改第 1 張(式 (22)) 33 5−0.5×35-0.5\times3 3.53.5
若改成全班(式 (21)) 00 5−0.5×05-0.5\times0 5.05.0

兩疊各用一次,epoch 結束,人又回到 55。不是白改:我們站在最優點上,小疊梯度的期望是 00,走兩步會抖回來。若還沒到最優,兩疊會合力往正確方向走,只是比全班平均更吵、比單張更穩。單張那一腳直接衝到 3.53.5,抖得明顯比較大。

再把式 (29)、(30) 的期望誤差算死。σ2=5\sigma^{2}=5,n=4n=4:

疊大小 bb 無放回式 (29) 有放回式 (30)
11 (1−1/4)×5/1=3.75(1-1/4)\times5/1=3.75 5.005.00
22 (1−2/4)×5/2=1.25(1-2/4)\times5/2=1.25 2.502.50
44 (1−4/4)×5/4=0(1-4/4)\times5/4=0 1.251.25

同一 bb,無放回永遠比較安靜——因為式 (29) 多乘了 (1−b/n)(1-b/n),考卷不重複,資訊不浪費。b=nb=n 且無放回時誤差是 00,那就是 full-batch,一個 epoch 只走一步。有放回就算把疊開到全班那麼大,仍剩 1.251.25 的雜訊,因為同一張卷可能被抽好幾次、有人沒被抽到。

先留一個反轉

改完第一疊,ww 從 55 掉到 44;改完第二疊,又回到 55。一 epoch 走了兩步卻回到原點——看起來像教務處在空轉。反轉在:空轉是因為我們已經站在最優,兩疊的平均梯度恰好一正一負。換到 w=0w=0 那種還沒改完的狀態,同一套切疊不會抵消成零,而會像 KP-7 那樣整體往 55 推,只是每疊步伐不同。另一個反直覺:不是 bb 越大就絕對比較好。b=nb=n 時 ∥et∥22\|e_{t}\|_{2}^{2} 最小,可是每步成本回到 O(n)O(n),而且一個 epoch 只更新一次——準得像全班平均,慢得也像全班平均。

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

把改考卷換成工廠抽檢:全數檢驗是 full-batch;每做完一件就調機台是單樣本 SGD;每滿一箱 bb 件才調一次,是 mini-batch。一箱用過一輪所有箱子,就是一個 epoch。有放回像把檢完的零件丟回輸送帶再抽,無放回像檢過就進合格區、不重複。

留一題:n=6n=6 筆,梯度暫記為 6,4,2,0,−2,−46,4,2,0,-2,-4,b=3b=3,η=0.1\eta=0.1,當前 w=1w=1。先確認 ⌊n/b⌋\lfloor n/b\rfloor 與一個 epoch 有幾步;再任選一種無放回切法,用式 (25) 走完一個 epoch。最後用 σ2\sigma^{2} 自己估一下(先算六筆的平均梯度,再算方差),把 b=3b=3 代入式 (29) 與 (30),看無放回安靜多少。

大家最容易在這裡搞混

第一個誤解:一個 epoch 等於一次 full-batch 更新。錯,Definition 1 是「每一疊都用過一次」;若 n=1024n=1024、b=32b=32,一個 epoch 有 3232 次更新,不是 11 次。第二個誤解:式 (25) 的 1/b1/b 漏寫算法就錯。方向其實不變,只是學習率的刻度改了;真正會錯的是把 mini-batch 當成「把 bb 筆梯度加起來卻不平均、又沿用舊 η\eta」,步長會悄悄放大 bb 倍。第三個誤解:式 (29) 與 (30) 可以混用。前者是無放回、多一個 (1−b/n)(1-b/n);後者是有放回/bootstrap。bb 接近 nn 時兩者差最多——無放回已經幾乎沒雜訊,有放回還在 σ2/b\sigma^{2}/b。

跨知識點掛勾

換句話重述

把整節濃縮成一句:無放回把考卷切成互斥的 bb 張一疊(式 (23)–(24)),每疊平均梯度更新(式 (25)),掃完所有疊是一個 epoch;bb 越大 E[∥et∥22]\mathbb{E}[\|e_{t}\|_{2}^{2}] 越小(式 (29)–(30)),每步也越貴。

一句話收尾: 改卷別一張就改標準、也別全班改完才動——一疊一疊批,一個 epoch 就是全班掃過一輪。