訓練與最佳化

隨機梯度下降

想像你被蒙住眼睛站在起伏的山地上,想走到最低的山谷。誠實的做法是用全身去感受腳下的坡度再往下走;在機器學習裡,這意味著每走一步之前都要在整個訓練集上計算損失的梯度。這很準確,但當資料集有數百萬張影像時就慢得難以承受。隨機梯度下降(SGD)做了一筆交易:它不去感受完整的坡度,而是隨機抽出一小撮樣本(一個小批次,mini-batch),只在那裡量坡度,然後立刻邁步。每一步都是對真正下坡方向的雜訊估計,但在謹慎方法走一步的時間裡你已走了上千步,而這些估計平均起來會指向正確的下坡方向。

精確地說,令參數(網路所有權重)為向量 θ,訓練損失是資料集 N 個樣本上每筆損失 ℓ_i 的平均:L(θ) = (1/N) Σ_i ℓ_i(θ)。全批次梯度下降更新為 θ ← θ − η ∇L(θ),其中 ∇L 是梯度(各偏導數組成的向量,指向最陡上升方向,所以我們減去它以下降),η(eta)是學習率,一個很小的正步長。SGD 則隨機抽出一個含 m 個樣本的小批次 B,用 ĝ = (1/m) Σ_{i∈B} ∇ℓ_i(θ) 作為對 ∇L 的廉價估計,並更新 θ ← θ − η ĝ。由於批次是均勻隨機抽樣,ĝ 是真梯度的不偏估計量:平均而言它等於 ∇L,儘管任何單一批次都會偏離某個隨機量。

那個隨機量正是關鍵。小批次梯度的變異數(誤差平方的期望值)大致與 1/m 成正比,所以小批次較吵雜、大批次較平滑。這種雜訊並非純粹的麻煩:它扮演了隱式正則化(implicit regularizer)的角色,輕微擾動參數使其滑離尖銳而脆弱的極小值,傾向落入較平坦、對新資料泛化更好的盆地。它也幫助最佳化器逃離鞍點(saddle point,全梯度近乎零的平坦處),那些地方會讓確定性方法卡住。

學習率 η 決定每一步的大小,是最關鍵的單一旋鈕。太大,步伐會越過山谷,損失震盪甚至發散成 NaN;太小,訓練則龜速前進。古典隨機逼近理論(Robbins 與 Monro,1951)證明在凸問題上要收斂需讓學習率隨時間縮小,使 Σ η_t = ∞ 但 Σ η_t² < ∞。在現代深度學習中我們很少真的滿足這些條件;取而代之,我們用固定或排程的學習率,並接受 SGD 是在一個好解附近的「雜訊球」中徘徊,而非收斂到單一點。

以批次大小 256 在 ImageNet(128 萬張影像)上訓練 ResNet-50:一個週期就是 5,000 次 SGD 更新。全批次梯度下降每掃過一次資料才更新 1 次——SGD 數小時內就能得到好模型,而全批次幾乎無望。

常見的混淆:深度學習程式裡的「SGD」幾乎從不是指每步用一個樣本(真正的線上 SGD),而是指批次大小 32 到 1024 的小批次 SGD。人們仍叫它 SGD,因為無論批次多大,梯度都是隨機估計。

又稱
SGDmini-batch gradient descent