下面是一個 8 層的全連接網路,每層 96 個神經元,權重是真的隨機抽的。我們丟 200 筆隨機輸入進去,畫出每一層輸出的直方圖。權重尺度滑桿控制每個權重平均有多大。先關著 BatchNorm 拉滑桿,看第 8 層變成什麼樣子;再打開。
動機:講義說訓練難是因為參數太多要調,而且一層的更新強烈依賴其他所有層。靈感來自輸入正規化:「想要 unit Gaussian 的 activation?那就直接把它變成這樣。」
γ 和 β:硬拉成平均 0、標準差 1 可能太死,例如 sigmoid 會被限制在中間那段近乎線性的區域。γ、β 是學出來的參數,讓新變數可以有任何平均和標準差;γ = σ、β = μ 時等於什麼都沒做,所以 BN 不會讓模型的表達能力變差。
訓練時和推論時不一樣:訓練時 μ、σ 用當下這個 minibatch 算,它是「整個資料集統計量」的近似,batch 夠大才準(講義:最好大於 8 或 16,1 或 2 很糟)。推論時一次可能只有一張圖,所以改用訓練過程中累積的移動平均(running mean / running var),推論時固定不變;γ 還可以在推論前直接併進前一層的權重,不多花計算。
講義列的效果:改善梯度流、可以用更大的 learning rate、降低對初始化的強烈依賴、以一種有點奇妙的方式有正則化效果(batch 裡的其他樣本等於在加雜訊),可能稍微減少對 dropout 的需要。講義的 TLDR:用 BN 降低初始化的影響。
它為什麼有效:不是 internal covariate shift:原始論文的說法是 BN 減少「內部共變數偏移」,也就是每層輸入的分佈在訓練中一直變。講義引用的 How Does Batch Normalization Help Optimization?(Santurkar et al.)檢查了這件事:有沒有 BN,每層輸入分佈的平均和變異數變化差很小。更直接的實驗是 noisy BN:在 BN 後面故意加上隨時間變化的雜訊,讓分佈刻意不穩定,結果表現還是跟一般 BN 差不多。所以 BN 的效果和「分佈穩不穩」沒有關係。
那是什麼:BN 讓 loss landscape 和梯度變得更平滑。梯度更可靠、更好預測,任何 gradient descent 都比較好走,也可以跨更大步而不會掉進尖角或局部低點。講義也提到 L1-norm 版本的 BN 一樣有效,說明重點不在「精確的高斯分佈」。後續研究的新說法是 BN 降低了梯度的 Lipschitz 常數、隨機梯度平方的期望值和隨機梯度的變異數,而且傳統 BN 只有搭配 ReLU 時才會間接引發這三種效應,換成 sigmoid、tanh 效果會打折。
CNN 某一層的輸出是一塊四維的數字,形狀寫成 [N, C, H, W]:N 是這個 batch 有幾張圖,C 是幾個 channel,H×W 是每個 channel 的空間位置。下面把 H 和 W 攤平成一條(H·W),畫成一個立方體。四種 normalization 的公式完全一樣,都是減平均、除標準差,唯一的差別是哪些格子一起算平均。點方法,看哪些格子被塗成同一組。
講義的一句話版本:輸入形狀記為 [N, C, H, W]。BatchNorm 對 N、H、W 做歸一化,對小 batch size 效果不好;LayerNorm 對 C、H、W 歸一化,主要用在 RNN、Transformer;InstanceNorm 只對 H、W 歸一化,用在風格轉換;GroupNorm 把 channel 分組再歸一化;SwitchableNorm 把 BN、LN、IN 加權結合,讓網路自己學每一層該用哪一種。
Layer Norm:同一層的所有神經元共用一組平均和變異數,不同輸入樣本各有各的。BN 正好相反:每個神經元各算一組,同一個 minibatch 裡的樣本共用。LN 不依賴 mini-batch 的大小,也不依賴序列長度,所以 batch size 是 1 也能用,RNN 裡長度不一的序列也能正規化。對 RNN 來說,它對每一步的加總輸入做尺度變換,讓訓練和推論都更穩。
Instance Norm:BN 的統計量會受到 batch 裡其他樣本影響;IN 只用這張圖自己的統計量。為什麼適合風格轉換:調整 BN 的統計量或 γ、β 可以做 domain adaptation,而風格轉換正是「把每張圖當成一個 domain」的 domain adaptation 問題。講義的經驗:圖片、影片分類這類抽特徵的網路,大多數情況 BN 比 IN 好;生成類任務 IN 比 BN 好。
Group Norm:IN 和 LN 都是 GN 的特例。為什麼分組有道理:深度學習之前,SIFT、HOG、GIST 這些手工特徵本來就是分組計算、分組正規化;深度網路裡的特徵也不是完全獨立的,相同或相似的特徵可以分在同一組。
Switchable Normalization:在網路裡每一個 normalization 層,端到端地學該用哪一種(或怎麼混合)。講義的數字:最多提升約 3% 的準確率。
BN 用「這個 batch」的平均去代表「整個資料集」的平均。batch 有 256 張時這個估計很準;只有 2 張時,平均就是這兩張的中間點,可能和整個資料集的平均差很遠。下面真的去抽樣:假設某個 channel 在整個資料集上平均 1.5、標準差 2,固定一張圖(它在這個 channel 的值是 3),每次替它隨機配上其他圖湊成一個 batch,看它被 BN 正規化之後變成多少。
對 batch size 的高度依賴(講義列的三點):統計量不穩定,batch size 1 或 2 時雜訊過大;訓練與推論的行為落差,兩邊分佈不一致常引發性能劣化;硬體多卡同步開銷,SyncBatchNorm 要跨卡、跨節點同步統計量,通訊延遲很貴。
難以套用於序列與 NLP(另外兩點):句子長度各不相同,跨樣本在同一個時間步算統計量沒有自然的語意;RNN 和自迴歸生成是逐字輸出,batch 通常是 1,BN 根本用不上。
GN 的論點:BN 依賴 batch size,訓練時用大 batch(約 32)效果好,但測試時 batch 可能是 1,訓練和測試的統計量不一致。GN 的統計量只來自單一樣本的一組 channel,對 batch size robust,所以特別適合 detection 和 segmentation 這種一張 GPU 只放得下幾張大圖的任務。
何時用誰(講義的表):NLP / Transformer 以 LN、RMSNorm 為主,因為 BN 對序列長度和批量敏感;CV、物件偵測,大 batch 用 BN,小 batch 用 GN 或 SyncBN;Norm-free 需要更嚴謹的初始化和 learning rate 控制,是進階主題。
和 B3 的關係:講義這段之前在講大 batch 訓練的 linear scaling rule(batch 放大 k 倍,learning rate 也放大 k 倍,配合 warmup)。講義也提醒 batch 不能無限放大:ImageNet 實驗裡大約超過 8k 之後,準確率會很快下降。
Transformer 的每一層是一個殘差塊:輸入 x 走兩條路,一條穿過子層 F(attention 或 FFN),一條直接跳過去,最後相加。Post-norm 是相加之後再做 LN:x ← LN(x + F(x))。Pre-norm 是先 LN 再進子層,相加之後不再處理:x ← x + F(LN(x))。差別看起來只是括號換個位置,但反向傳播時,梯度在 post-norm 每一層都要穿過一次 LN,在 pre-norm 有一條完全不經過任何 LN 的直達路徑。
百億參數時代的記憶體牆:大語言模型的訓練和推論裡,normalization 的耗時主要在反覆讀取顯存算平均和變異數,是記憶體頻寬受限(memory-bound)。講義問:LayerNorm 的成功到底來自「平移到零均值」還是「尺度縮放」?實證發現中心化對梯度穩定的貢獻很小,尺度約束才是關鍵。
RMSNorm:不再減平均,直接除以特徵平方平均再開根號(root mean square)。少了兩次全域的 reduction,講義的數字是提速 10% 到 20%,已被 LLaMA 1/2/3、Mistral、Gemma 等開源大模型採用。為什麼效果差不多:講義的比喻是班級排名看的是每個人相對的分數差距,減不減班平均都不影響高低;Transformer 抽特徵主要靠權重高的那些,趨近 0 的特徵本來就是分數低的,梯度 0 也沒差。
Pre-norm 為什麼適合深的 Transformer:讓梯度更穩定地回流。進 attention 之前、residual 相加之前就先 norm,特徵範圍被限制住,多層 pass-by connection 比較不會發散。Post-norm 的梯度每層都要穿過 LN,層數一多就比較難訓練;實務上常要搭配 learning rate warmup(這點是一般經驗,不是講義原文)。
BN 和 activation 的順序:Post-activation BN 是 Conv / Linear → ReLU → BN。原始論文認為下一層的輸入就是 ReLU 的輸出 a,所以正規化 a 最直觀。問題是 ReLU 已經把所有負值砍成 0,BN 再去把一個被截斷、不對稱的分佈的平均拉回 0,兩者目標衝突。Pre-activation BN 是 Conv / Linear → BN → ReLU,ResNet-v2 等研究證明它更有效,成為現代網路的標準做法:Conv 的輸出 z 比較接近對稱的高斯分佈,在進 ReLU 之前先正規化,讓 ReLU 總是在平均 0、變異數 1 的輸入上運作,更多神經元保持活著(避免 dying ReLU),梯度更順,對初始化更不敏感,泛化也更好。BN 負責穩定分佈,ReLU 負責非線性,分工明確。講義在「pre-norm vs post-norm」那一頁也用 CNN 的兩種順序對照:Conv → BN → ReLU 和 ReLU → BN → Conv。
不過順序沒那麼神聖:講義引用的 Deep Learning 一書觀點:BN 比較適合理解成「減少不同層參數之間的二階關係」,而不是減少 covariate shift,所以放在 ReLU 之前或之後的差異未必是原理上的,實驗上的差別可能來自模型的其他細節。
Normalization-free:透過適當的初始化和殘差結構,不用 normalization 層也能讓梯度不爆炸、不消失。典型做法:依深度調整初始化的縮放因子;控制殘差分支的 scale,讓前向和反向的 variance 穩定;用像 1/√L(L 是層數)這種固定縮放避免累積放大。例子是 2019 年的 Fixup Initialization。代價是初始化和 learning rate 要控制得更嚴。
還有一層:講義把 normalization 分成三個層次:batch statistics(BN 穩定 CNN 的 activation)、sample-wise scale(LN / RMSNorm 不依賴 batch,適合序列和 Transformer)、operator-level stability(QK-Norm 直接控制 attention 的 logits)。
這個模組最常被講錯的幾句話。