訓練與最佳化

批次正規化

深度網路難以訓練,部分原因在於流入每一層的值的分布會隨著下層更新而不斷漂移——一個移動的目標,迫使學習率變小變怯。批次正規化(Ioffe 與 Szegedy,2015)以動態標準化某層的輸入來對付它:對每個特徵,它減去用當前小批次算出的平均、再除以標準差,使每個特徵抵達時大致是零均值、單位變異數。回報非常顯著——訓練快得多也穩定得多、能容忍更高的學習率、並降低對權重初始化方式的敏感度。它是 ResNet 等極深 CNN 的關鍵推手。

機制上,對小批次上的某特徵 x,BN 計算批次平均 μ_B 與變異數 σ²_B,正規化 x̂ = (x − μ_B) / √(σ²_B + ε),再施加可學習的縮放 γ 與平移 β 得到 y = γ x̂ + β。關鍵細節是 γ 與 β 是可訓練參數:純正規化會剝奪該層表達非零均值或大變異特徵的能力,所以 BN 讓網路在有用之處學會抵銷正規化——若最佳,它甚至能恢復恆等映射。在 CNN 中,統計量是逐通道計算的,在批次與所有空間位置上匯總,因此一組 γ 與 β 共享於整張特徵圖。

它為何有效,最初歸因於減少「內部協變量偏移」(漂移的輸入分布),但後續研究(Santurkar 等人)主張更深層的原因是 BN 平滑了損失地形,使梯度更可預測、容許更大的步。無論機制為何,BN 也注入了溫和而有用的正則化:因為每個樣本的正規化取決於批次中隨機的其它成員,網路看到的激活值帶有些許雜訊,精神上類似丟棄法(dropout)。

BN 有兩個惡名昭彰的尖角。第一,它在訓練與推論時行為不同:訓練時用當前批次的統計量,但推論時可能沒有批次,於是改用訓練期間累積的平均與變異數的滑動平均。忘記把模型切到 eval 模式是經典錯誤,會悄悄毀掉準確率。第二,當批次極小(統計量變得不可靠)或批次在各裝置間非獨立同分布時,BN 會退化,這也是為何小批次的偵測與分割常以群組正規化取代它、或使用同步 BN,以及為何 transformer 改用層正規化。

在驗證或部署前務必呼叫 model.eval()(PyTorch)或設定 training=False。eval 模式下 BN 使用其儲存的滑動統計量;若仍處於 train 模式,每次預測都取決於批次中其它樣本,導致同一張影像得到不同分數——這是個微妙且常被回報的生產環境錯誤。

又稱
BatchNormBN