完整講解與原文對照 / Full explanation and source comparison
一筆太吵、全批太慢:mini-batch 折衷
Single-sample SGD 每步只抽一筆,方差大、更新不穩;full-batch 又太慢。Mini-batch SGD 每次隨機抽 b 筆(batch size),用這小批的平均梯度更新——兼顧 SGD 的效率與 full-batch 的穩定性,是深度學習最主流的訓練方式。文獻常簡稱「SGD」,別跟 §4 的單樣本版搞混。
資料怎麼切:式 (23)–(24)
優化前常把 n 筆資料隨機分成 ⌊n/b⌋ 個大小為 b 的不相交批次(simple random sampling without replacement)。設資料集 D、第 i 批 Bi:
amp;i=1⋃⌊n/b⌋Bi=D,amp;Bi∩Bj=∅,∀i,j∈{1,…,⌊n/b⌋},i=j.(23)(24)
也可用 bootstrapping(有放回抽樣),批次不再互斥,上式就不成立。
Epoch 是什麼?(Definition 1)
一個 epoch = 所有 ⌊n/b⌋ 個 batch 各用過一次做更新。跑完一 epoch 通常還會再跑好幾個 epoch,直到收斂。口語:把整份訓練資料「掃一輪」。
更新規則:式 (25)
第 k 步用到的 batch 記作 Bk′:
w(k+1):=w(k)−η(k)b1i∈Bk′∑∇fi(w(k)).(25)
實務上 1/b 有時省略,不影響方向。GPU 平行算 batch 內梯度,是 mini-batch 大規模訓練快的主因。
Proposition 1:收斂率與梯度誤差
設 mini-batch 梯度是全梯度的近似(式 (26)):
b1i∈Bt′∑∇fi(w(t))=∇f(w(t))+et.(26)
固定 η(k)=η 時,收斂率(Proposition 1):
- 非凸或凸 f:O(t1+∥et∥22)(式 (27));
- μ-strongly convex 的 fi:O((1−Lμ)t+∥et∥22)(式 (28))。
b 越大,mini-batch 梯度越接近全梯度,∥et∥22 越小,收斂率越接近 full-batch(式 (31));但每步計算也變重——這是經典 速度 vs 每步成本 權衡。
梯度誤差的期望(式 (29)–(30)):
amp;E[∥et∥22]=(1−nb)bσ2,(without replacement)amp;E[∥et∥22]=bσ2,(with replacement)(29)(30)
σ2 是資料集梯度方差。兩種抽樣下 b→n(或 b→∞)都讓雜訊變小,但每步變慢。
口語小結
| 方法 |
每步用幾筆 |
特點 |
| Full-batch |
n |
穩、貴 |
| SGD(§4) |
1 |
快、吵 |
| Mini-batch |
b |
實務最常用,b 調速度與穩定 |
選 batch size 沒有銀彈:太小更新抖、太大每 epoch 步數少且占記憶體——通常 32、64、128、256 等是常見起點。
教授祕笈:Mini-Batch 與 Epoch——一疊一疊批改考卷(式 (23)–(30))
同學,上一節那位會計每看到一張帳單就改一次公司政策,改到手抖。教務處有對應的畫面:若每改一張考卷就重訂評分標準,標準會瘋;若把全班改完才調一次,準是準了,天亮了才改完第一輪。Mini-batch SGD 是兩者之間那疊:「一次拿 b 張,改完這一疊再調一次標準」。文獻常把這套也叫「SGD」,別跟 KP-7 的單樣本版搞混。整節一句話:一疊一疊批改——一筆太吵、全班太慢,b 張一疊是實務主流。
先把任務講成一句人話
把 n 筆訓練資料切成大小約 b 的小疊,每步用這一疊的平均梯度更新;所有小疊都用過一輪,叫做一個 epoch。b 越大,這一疊越像全班平均、雜訊越小,但每步也越重。
鷹架式:先直覺,再符號
先把三種改卷節奏對上算法,再看切疊規則:
- 全班改完再調(full-batch):穩、貴,每步 n 張。
- 改一張就調(KP-7 的 SGD):快、吵,每步 1 張。
- 改一疊再調(mini-batch):每步 b 張,GPU 還能平行改同一疊。
切疊的預設是無放回:考卷發成互斥的幾疊,發完為止。也可以有放回(bootstrapping),那疊與疊就可能重複抽到同一張。
符號逐個拆
優化前常把資料隨機分成 ⌊n/b⌋ 個大小為 b 的不相交批次(simple random sampling without replacement)。資料集 D、第 i 疊 Bi 滿足(式 (23)–(24)):
i=1⋃⌊n/b⌋Bi=D.(23)
Bi∩Bj=∅,i=j.(24)
式 (23) 說:所有疊合起來就是全班;式 (24) 說:兩疊沒有同一張卷。改用有放回抽樣時,互斥不再成立,這兩式就作廢。
Definition 1:一個 epoch=所有 ⌊n/b⌋ 個 batch 各用過一次做更新。口語就是把整份訓練資料掃一輪;收斂前通常會掃很多輪。
第 k 步用到的那一疊記作 Bk′,更新是疊內平均(式 (25)):
w(k+1):=w(k)−η(k)b1i∈Bk′∑∇fi(w(k)).(25)
對照式 (22),只是把「一張」換成「這一疊的平均」。實務上 1/b 有時省略,方向不變,等於把學習率重新定義一次。GPU 平行算疊內梯度,是大規模訓練快的主因。
把小疊梯度寫成全梯度加一個誤差(式 (26)):
b1i∈Bt′∑∇fi(w(t))=∇f(w(t))+et.(26)
固定 η(k)=η 時,Proposition 1 給收斂率:非凸或凸是 O(1/t+∥et∥22)(式 (27));若各 fi 還是 μ-strongly convex,則是 O((1−μ/L)t+∥et∥22)(式 (28))。重點不是把大 O 背下來,而是看見那多出來的 ∥et∥22:疊越小,這一項越大,收斂就越不像 full-batch。
誤差有多大,看你怎麼抽卷(式 (29)–(30)):
E[∥et∥22]=(1−nb)bσ2(without replacement).(29)
E[∥et∥22]=bσ2(with replacement).(30)
σ2 是資料集裡各筆梯度的方差。b 往 n 走(或有放回時 b 往無限走),雜訊都變小,每步也變慢——速度對上每步成本,沒有銀彈。常見起點仍是 32、64、128、256。
真的算一遍:四張考卷、兩疊、一個 epoch
沿用 KP-7 的四張單:在 w=5(剛好是最優點)時,四筆梯度是 3、1、−1、−3,全班平均 ∇f=0,樣本方差 σ2=(9+1+1+9)/4=5。取 b=2,則 ⌊n/b⌋=2,一個 epoch 恰好兩疊。無放回先發成 B1={3,1}、B2={−1,−3},η=0.5。
| 節奏 | 用到的平均梯度 | 更新 | 新的 w |
| 疊 1(式 (25)) | 21(3+1)=2 | 5−0.5×2 | 4.0 |
| 疊 2(同一 epoch) | 21(−1−3)=−2 | 4.0−0.5×(−2) | 5.0 |
| 若改成一次只改第 1 張(式 (22)) | 3 | 5−0.5×3 | 3.5 |
| 若改成全班(式 (21)) | 0 | 5−0.5×0 | 5.0 |
兩疊各用一次,epoch 結束,人又回到 5。不是白改:我們站在最優點上,小疊梯度的期望是 0,走兩步會抖回來。若還沒到最優,兩疊會合力往正確方向走,只是比全班平均更吵、比單張更穩。單張那一腳直接衝到 3.5,抖得明顯比較大。
再把式 (29)、(30) 的期望誤差算死。σ2=5,n=4:
| 疊大小 b | 無放回式 (29) | 有放回式 (30) |
| 1 | (1−1/4)×5/1=3.75 | 5.00 |
| 2 | (1−2/4)×5/2=1.25 | 2.50 |
| 4 | (1−4/4)×5/4=0 | 1.25 |
同一 b,無放回永遠比較安靜——因為式 (29) 多乘了 (1−b/n),考卷不重複,資訊不浪費。b=n 且無放回時誤差是 0,那就是 full-batch,一個 epoch 只走一步。有放回就算把疊開到全班那麼大,仍剩 1.25 的雜訊,因為同一張卷可能被抽好幾次、有人沒被抽到。
先留一個反轉
改完第一疊,w 從 5 掉到 4;改完第二疊,又回到 5。一 epoch 走了兩步卻回到原點——看起來像教務處在空轉。反轉在:空轉是因為我們已經站在最優,兩疊的平均梯度恰好一正一負。換到 w=0 那種還沒改完的狀態,同一套切疊不會抵消成零,而會像 KP-7 那樣整體往 5 推,只是每疊步伐不同。另一個反直覺:不是 b 越大就絕對比較好。b=n 時 ∥et∥22 最小,可是每步成本回到 O(n),而且一個 epoch 只更新一次——準得像全班平均,慢得也像全班平均。
換個場景,自己找出同一條路
把改考卷換成工廠抽檢:全數檢驗是 full-batch;每做完一件就調機台是單樣本 SGD;每滿一箱 b 件才調一次,是 mini-batch。一箱用過一輪所有箱子,就是一個 epoch。有放回像把檢完的零件丟回輸送帶再抽,無放回像檢過就進合格區、不重複。
留一題:n=6 筆,梯度暫記為 6,4,2,0,−2,−4,b=3,η=0.1,當前 w=1。先確認 ⌊n/b⌋ 與一個 epoch 有幾步;再任選一種無放回切法,用式 (25) 走完一個 epoch。最後用 σ2 自己估一下(先算六筆的平均梯度,再算方差),把 b=3 代入式 (29) 與 (30),看無放回安靜多少。
大家最容易在這裡搞混
第一個誤解:一個 epoch 等於一次 full-batch 更新。錯,Definition 1 是「每一疊都用過一次」;若 n=1024、b=32,一個 epoch 有 32 次更新,不是 1 次。第二個誤解:式 (25) 的 1/b 漏寫算法就錯。方向其實不變,只是學習率的刻度改了;真正會錯的是把 mini-batch 當成「把 b 筆梯度加起來卻不平均、又沿用舊 η」,步長會悄悄放大 b 倍。第三個誤解:式 (29) 與 (30) 可以混用。前者是無放回、多一個 (1−b/n);後者是有放回/bootstrap。b 接近 n 時兩者差最多——無放回已經幾乎沒雜訊,有放回還在 σ2/b。
跨知識點掛勾
- KP-2:full-batch 是 b=n 的極端,用的是式 (21) 那種全梯度。
- KP-6:疊裡每一筆的 ∇fi,仍靠反向傳播從出口倒灌回來;mini-batch 只改「一次拿幾筆一起平均」,不改傳話規則。
- KP-7:單樣本是 b=1 的極端,式 (22) 是式 (25) 的特例。
- KP-9:會把固定 η 下 ∥et∥22 怎麼讓 SGD 停在鄰域、以及跟全梯度 O(1/t) 差在哪,講成命題。
- KP-10、KP-11:AdaGrad、RMSProp、Adam 幾乎都跑在 mini-batch 上,歷史統計也是一疊一疊累積的。
換句話重述
把整節濃縮成一句:無放回把考卷切成互斥的 b 張一疊(式 (23)–(24)),每疊平均梯度更新(式 (25)),掃完所有疊是一個 epoch;b 越大 E[∥et∥22] 越小(式 (29)–(30)),每步也越貴。
一句話收尾: 改卷別一張就改標準、也別全班改完才動——一疊一疊批,一個 epoch 就是全班掃過一輪。