迷你批次隨機梯度下降(mini-batch stochastic gradient descent)
假設你想知道一百萬人的平均意見,但每做一個決定前都全員調查實在太慢。於是你改為隨機抽一小群人——比方說 64 人——調查,依這個粗略但便宜的估計行動,下次再抽一批新的。經過許多輪,雜訊會平均掉,你整體上朝正確方向移動。迷你批次隨機梯度下降在訓練中正是這麼做:它從資料的一小撮隨機子集估計梯度,而非全部。
在機器學習中,目標通常是龐大資料集上的平均,f(x) = (1/N) 對 i 求和 f_i(x),其中 f_i 是第 i 個訓練樣本上的損失,N 可達數百萬。真正的梯度是全部 N 個樣本梯度的平均——每步計算都太貴。迷你批次 SGD 隨機抽一小批 B 個樣本(譬如 32 到 512),用它的平均梯度作為對真梯度便宜而有雜訊的估計:x_{k+1} = x_k - alpha_k * (1/|B|) 對 i 屬於 B 求和 grad f_i(x_k)。這個估計是無偏的(平均而言正確)但有雜訊。把資料完整走一遍稱為一個「epoch」;訓練會做許多 epoch,並重新洗牌資料。因為每步只花 |B| 個梯度而非 N 個,SGD 在相同計算量下做的更新步數遠多於全批次梯度下降——而這份吞吐量正是讓大模型訓練可行的原因。
SGD 是深度學習訓練的基礎主力,其變體(動量、Nesterov、Adam)都建立在它之上。兩個誠實的重點不可不提。第一,步長(學習率)必須隨時間遞減(或精心排程),有雜訊的迭代點才會穩定在極小附近、而非永遠在其周圍亂顫——形式上,凸情形下收斂只是次線性,固定預算下約 O(1/sqrt(k)) 階,每步遠慢於全梯度法。SGD 取勝不在每步收斂快,而在每步便宜。第二,梯度雜訊不純然是累贅:它幫助迭代點逃離鞍點與淺的局部極小,這也是 SGD 在實務上泛化良好的部分原因——是個真正有用的副作用,而非只是被容忍的誤差。
在 1,000,000 張影像上以批次大小 256 訓練:一個 epoch 約 3,900 次 SGD 更新。全批次梯度下降一個 epoch 只用全部 1,000,000 張影像做一次更新——學得慢得多。SGD 那 3,900 個便宜、有雜訊的步取得遠多的進展,即使每一步本身都在抖動。
在迷你批次上抽樣梯度:步有雜訊,但便宜且多。
SGD 的每步收斂只是次線性、約 O(1/sqrt(k))——慢於全梯度下降的線性速度。它在實際時間上取勝靠的是每步便宜、而非收斂快,且步長必須衰減(或排程),有雜訊的迭代點才會穩定下來,而非永遠在極小周圍彈跳。