NEWSIO+ 教育系列01 自己訓練一個 AI02 從照片還原 3D03 深度學習
主線 B · 模組 B4動手做 // 四個實驗台

每一層
都 站穩

Batch Norm 到底把什麼「正規化」了?為什麼 Transformer 改用 LayerNorm 和 pre-norm?

深的網路是一層接一層的乘法。每一層把數字放大一點,疊幾十層之後就爆掉;每一層縮小一點,疊幾十層之後就只剩接近 0。Normalization 的做法很直接:在層與層之間,把一群數字減掉平均、除以標準差,硬拉回同一個尺度。這個模組問兩件事:「一群」是哪一群,還有這個動作要放在哪裡。

SEC.01 / SIGNAL SCALE

一層一層看:訊號會縮掉,也會爆開

下面是一個 8 層的全連接網路,每層 96 個神經元,權重是真的隨機抽的。我們丟 200 筆隨機輸入進去,畫出每一層輸出的直方圖。權重尺度滑桿控制每個權重平均有多大。先關著 BatchNorm 拉滑桿,看第 8 層變成什麼樣子;再打開。

PROBE A / 8 層網路的 activation 分佈動手做 // 拉權重尺度,開關 BatchNorm
第 1 層輸出的標準差—
第 8 層輸出的標準差—
第 8 層 ÷ 第 1 層—
第 8 層沒訊號或飽和的比例—
—
沒有 BN 時,tanh 在 k 小的時候一層比一層窄,第 8 層幾乎全是 0;k 大的時候全部被推到 ±1 的兩端(飽和,梯度接近 0)。ReLU 更明顯:k 不等於 √2 ≈ 1.41 時,標準差每層乘上一個固定倍數(k ÷ √2),8 層下來可以差到幾十倍甚至上百倍。打開 BN 後,每一層在進 activation 前都被拉回平均 0、標準差 1,不管 k 是多少,8 層的形狀幾乎一樣。網路寬度、筆數、直方圖範圍都是示意設定,但每個數字都是用這組隨機權重真的算出來的。
深網路是連乘每層的尺度差一點,連乘 8 次、50 次之後就是 0 或無限大。前向的訊號這樣,反向的梯度也這樣。
BN = 每層重新校正一次用這個 batch 的平均和標準差把數字拉回 0 和 1,再讓模型自己學要不要移回去(γ、β)。
真正要解的是兩件事講義的總結:normalization 要解的是「signal scale 與 gradient flow」,訊號的尺度和梯度能不能流回去。
細看 · BN 的四個數字、訓練和推論不一樣、它為什麼有效
μB = 平均(x) σ²B = 平均((x − μB)²) x̂ = (x − μB) / √(σ²B + ε) y = γ·x̂ + β (每個 channel 各算一組,平均跨過整個 batch)

動機:講義說訓練難是因為參數太多要調,而且一層的更新強烈依賴其他所有層。靈感來自輸入正規化:「想要 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 效果會打折。

SEC.02 / WHICH AXES

「一群數字」是哪一群:BN、LN、IN、GN

CNN 某一層的輸出是一塊四維的數字,形狀寫成 [N, C, H, W]:N 是這個 batch 有幾張圖,C 是幾個 channel,H×W 是每個 channel 的空間位置。下面把 H 和 W 攤平成一條(H·W),畫成一個立方體。四種 normalization 的公式完全一樣,都是減平均、除標準差,唯一的差別是哪些格子一起算平均。點方法,看哪些格子被塗成同一組。

PROBE B / 哪些維度被平均動手做 // 點 BN / LN / IN / GN,調 group 數
這一組有幾個數字一起算平均—
整層共有幾組(平均, 變異數)—
會不會被同一個 batch 的其他圖影響—
換成真實尺寸 N=16、C=64、H·W=28×28 時一組有幾個數字—
—
立方體是示意大小:6 張圖、6 個 channel、每個 channel 4 個位置。橘色是「和你選的那一格共用同一組平均、變異數」的所有格子。BN 是一片直立的板子:同一個 channel,跨過所有圖。LN 是一片橫的板子:同一張圖,所有 channel。IN 只剩一條:同一張圖、同一個 channel。GN 介於中間:同一張圖、一組 channel。把 group 數拉到 1 就是 LN,拉到 6(每組一個 channel)就是 IN。
BN 跨樣本,其他都不跨只有 BN 的平均裡混了別張圖。所以只有 BN 怕 batch 太小,也只有 BN 訓練和推論要分開處理。
LN 是「每個樣本自給自足」一句話、一張圖自己算自己的平均。batch 是 1 也能用,句子長短不一也沒差。
GN 是 LN 和 IN 的連續版group 數是一個旋鈕:1 組是 LN,每個 channel 一組是 IN,中間的值通常最好用。
細看 · LN、IN、GN、Switchable Norm 各自的理由

講義的一句話版本:輸入形狀記為 [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% 的準確率。

SEC.03 / BATCH SIZE

Batch 太小的時候,BN 的平均是猜的

BN 用「這個 batch」的平均去代表「整個資料集」的平均。batch 有 256 張時這個估計很準;只有 2 張時,平均就是這兩張的中間點,可能和整個資料集的平均差很遠。下面真的去抽樣:假設某個 channel 在整個資料集上平均 1.5、標準差 2,固定一張圖(它在這個 channel 的值是 3),每次替它隨機配上其他圖湊成一個 batch,看它被 BN 正規化之後變成多少。

PROBE C / 同一張圖,換一群同學動手做 // 拉 batch size,切換 BN / GN / LN
batch 平均的估計誤差 |μB − μ|(平均)—
batch 標準差的估計誤差 |σB / σ − 1|(平均)—
這張圖的輸出抖動多少(標準差)—
訓練時 vs 推論時,輸出平均差多少—
—
上圖:橘線是 BN 在每個 batch size 下,「訓練時用 batch 統計量」和「推論時用整體統計量」的輸出平均差多少(每個點抽 300 次);藍線是 GN / LN,它們只看這張圖自己,跟 batch 裡是誰無關,所以永遠是 0。下圖:目前 batch size 下抽 80 次,這張圖每次的輸出(灰色虛線是推論時的值)。batch = 2 時 BN 的輸出只會是 +1 或 −1:兩個數字減平均再除標準差,一定變成這樣。分佈的平均、標準差和這張圖的值都是示意設定,抽樣是真的。
小 batch = 統計量全是雜訊物件偵測、3D 醫學影像,一張 GPU 常常只放得下 1 到 2 張,BN 估出的平均和變異數就不能信。
訓練和推論對不上訓練時用 batch 統計量,推論時用移動平均。兩者差越多,模型上線後表現越差。
解法是不要跨樣本講義的核心需求:一種「完全獨立於 batch 維度」、每個樣本自給自足的正規化。這就是 LN、GN。
細看 · BN 的五個瓶頸、GN 為什麼 robust、何時用誰

對 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 之後,準確率會很快下降。

SEC.04 / PRE-NORM

Norm 放在哪:pre-norm 讓梯度走直達車

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 的直達路徑。

PROBE D / 24 層殘差堆疊的梯度流(示意模型)動手做 // 切換 pre / post,調子層強度
流回第 1 層的梯度大小(中位數,最上層 = 1)—
最差的 10% 只剩—
只看直達路徑:24 層連乘的倍率—
現在的寫法—
—
這是一個示意模型,不是真的 Transformer:把每一層對梯度的影響簡化成一個倍率。Post-norm 每一層的 LN 會除掉 x + F(x) 的尺度 √(1 + α²),子層再隨機加回一點;pre-norm 的直達路徑倍率是 1,子層只在旁邊加一點,而且越後面的層 x 越大、LN 後的子層佔比越小。每次隨機抽 300 個網路,實線是中位數,色帶是 10% 到 90%,虛線是另一種寫法的中位數。α = 1 時,post-norm 的直達路徑在 24 層之後只剩 2−12 ≈ 0.00024。
殘差是高速公路梯度可以不經過任何子層直接回到第 1 層。post-norm 在每個交流道都設了收費站(LN),pre-norm 沒有。
先縮限範圍再進子層講義:在進 attention、做 residual 相加之前先 norm,把特徵範圍限在一定區域,比較能避免多層累積發散,適合疊更深的 Transformer。
RMSNorm 連平均都不減大模型發現 LN 的關鍵是「縮放」不是「減平均」,所以乾脆只除以均方根,省下計算和記憶體往返。
細看 · RMSNorm、BN 和 activation 的順序、Normalization-free
LayerNorm:y = γ · (x − μ) / √(σ² + ε) + β  RMSNorm:y = γ · x / √(平均(x²) + ε)

百億參數時代的記憶體牆:大語言模型的訓練和推論裡,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)。

SEC.05 / MISCONCEPTIONS

常見誤解

這個模組最常被講錯的幾句話。

BN 有效是因為它修好了 internal covariate shift。有沒有 BN,每層分佈的變化差很小;故意加雜訊讓分佈不穩的 noisy BN 也一樣有效。比較好的解釋是它讓 loss landscape 和梯度更平滑。
加 BN 永遠有幫助。batch 只有 1 或 2 時統計量全是雜訊,訓練和推論還會對不上;序列和自迴歸生成根本湊不出 batch。這些情況要換 GN、LN 或 RMSNorm。
Normalization 只是讓數字別太大的數值技巧。它決定了訊號尺度和梯度能不能流回前面的層,直接影響能用多大的 learning rate、能疊多深、對初始化多敏感。放的位置(pre / post)也會影響深的網路好不好訓練。
LayerNorm 和 BatchNorm 只是換個維度平均,效果差不多。換維度改變的是「誰會影響你」:BN 的輸出取決於同一個 batch 的其他樣本,LN 只看自己。所以 LN 不需要 running stats、訓練和推論行為一致,batch 是 1 也能用。