跳至主要内容

深度學習中的優化技巧 - 批次標準化 (Batch Normalization, BN)

核心目標:改變誤差曲面 (Error Surface) 的地貌

在優化過程中,如果誤差曲面非常崎嶇(例如在某些參數方向斜率變化極小,在另一些方向斜率極大),即使是簡單的模型也很難訓練。 Batch Normalization 的本質就是「把山剷平」,讓誤差曲面變得比較平滑且不崎嶇,進而使訓練變得更容易。

changing-landscape

為什麼誤差曲面會崎嶇?

  • 輸入特徵的尺度 (Scale) 差異: 當輸入特徵 x1,x2x_1, x_2 的數值範圍差距很大時,對應的參數 W1,W2W_1, W_2 對 Loss 的影響力(斜率)也會產生巨大差異。
  • 深層網路的連鎖反應: 即使輸入層做了標準化,經過第一層權重 W1W_1 運算後,輸出的分佈可能又會變得混亂,導致後續層級(如 W2W_2)的訓練依舊困難。

運作機制:特徵標準化 (Feature Normalization)

為了讓不同維度的特徵具有相似的數值範圍,我們會進行以下處理:

  1. 計算平均值 (μ\mu) 與標準差 (σ\sigma): 針對每一個維度,計算該批次資料的平均值與標準差。
  2. 標準化 (Standardization): 將數值減去平均值並除以標準差,得到平均值為 0、變異數 (Variance) 為 1 的新分佈。
  3. 擺放位置: 在實作上,標準化可以放在激活函數(Activation Function)之前 (zz) 或之後 (aa),兩者差異不大。若使用 Sigmoid,建議放在 zz 處以維持在斜率較大的區域。
considering-deep-learning-1considering-deep-learning-1
對向量的對應 element 做求平均、標準差的運算,求得向量 μ,σ\mu,\sigma對每個向量 zz 利用 μ,σ\mu,\sigma 對對應 element 進行歸一化,得到z^i\hat{z}_i

為什麼稱為「批次 (Batch)」標準化?

  • 實務限制: 理想上應對整個資料集進行標準化,但因 GPU 記憶體無法一次讀取百萬筆資料,實務上改為對一個 Mini-batch 內的資料計算 μ\muσ\sigma 作為近似。
  • 參數關聯性: 做了 BN 後,同一個 Batch 內的不同資料會變得彼此關聯(因為它們共用同一組 μ\muσ\sigma)。
  • 學習參數 (γ\gammaβ\beta): 標準化後會再乘上 γ\gamma 並加上 β\beta,這兩個是由網路學習出來的參數,讓模型有能力調整輸出的分佈,而不被強制鎖定在平均值 0。
considering-batch-normalizationbatch-normalization
Mini-batch 估計 μ,σ\mu,\sigma 造成樣本間關聯可學習參數 γ,β\gamma,\beta 讓標準化輸出保有彈性

測試階段 (Testing/Inference) 的處理

在測試時通常只有單筆資料,無法計算 Batch 的 μ\muσ\sigma

  • 解決方案: 在訓練過程中計算 μ\muσ\sigma移動平均 (Moving Average)
  • 執行方式: 測試時直接套用訓練階段累積下來的平均值 (μˉ\bar{\mu}) 與標準差 (σˉ\bar{\sigma}) 進行運算。

batch-normalization-testing

Batch Normalization 的優點與爭議

  • 具體優點:
    1. 加速訓練: 達到相同正確率所需的時間大幅縮短。
    2. 容許更高的學習率 (Learning Rate): 因為曲面變平滑了。
    3. 改善收斂: 讓原本難以訓練的 Sigmoid 網路也能成功訓練。
  • 理論爭議:
    • 原始論文認為 BN 有用是因為解決了 Internal Covariate Shift(內部協變量偏移)。
    • 後續研究打臉了上述觀點,認為 BN 最關鍵的作用是改變了 Error Surface 的平滑度

batch-normalization-compare