💡一句話定義
白話:深層網路的每一層都在被前面層「餵數字」。如果這些數字忽大忽小、分布一直變,後面的層就很難學。BN 的工作,就是在每一層前面裝一個整流器,先把數字整成固定的分布,再交給下一層。
🏃用接力賽來想
🎮互動:看每層分布被拉直
打開 / 關閉 Batch Norm 開關,再按「模擬訓練」。關掉時每層分布會各自漂移(均值亂跑、變異數變大);打開時每層都被壓回 μ≈0、σ≈1。
看每層輸出分布如何從歪斜 → 標準化
🌀它到底解決什麼問題?
深層網路訓練時,前面層的參數一直在更新,於是後面每一層收到的輸入分布也一直在變——這個現象叫做 內部協變量偏移(Internal Covariate Shift, ICS)。後面的層被迫花力氣去追前面層的變化,而不是專心學任務本身,結果就是:學習率不敢調大、訓練慢、容易卡住。
BN 把每一層的輸入「釘」在穩定的分布上,後面的層看到的尺度固定,就能安心學。這帶來幾個實際好處:
分布穩定,梯度不易爆炸,收斂更快。
對權重初始值不再那麼挑剔。
mini-batch 統計本身帶噪音,略減過擬合。
減少梯度消失/爆炸,深層網路更好訓練。
🧮BN 的數學(4 步)
② mini-batch 變異數 σ²B = (1/m) Σ (xi − μB)²
③ 標準化 x̂i = (xi − μB) / √(σ²B + ε)
④ 縮放平移 yi = γ · x̂i + β ← γ、β 可學習
第 ③ 步把數字壓成標準常態;第 ④ 步的 γ、β 很關鍵——它讓網路「如果標準化過頭了,可以自己還原回去」,所以 BN 不會硬性剝奪網路的表達能力。ε 是一個很小的數,避免除以 0。
⚖️訓練 vs 推論:行為不一樣(必考)
這是 iPAS 最愛考的細節:BN 在訓練和推論時用的統計量不同。
| 階段 | 用哪個統計量 | 為什麼 |
|---|---|---|
| 訓練 | 當前 mini-batch 的 μ、σ² | 邊訓練邊算,同時累積「移動平均」備用 |
| 推論 | 訓練期間累積的移動平均 μ、σ² | 推論常常一次只有一筆、或 batch 很小,不能靠當下批次統計 |
model.eval()),否則 BN 仍用批次統計,結果會不穩、甚至一筆資料就崩。🔀BatchNorm vs LayerNorm
兩者都是正規化,差別在沿哪個維度算統計量。這決定了它們各自適合的場景。
| 面向 | BatchNorm | LayerNorm |
|---|---|---|
| 正規化維度 | 跨「批次」同一特徵 | 單一樣本內、跨「特徵」 |
| 對 batch 大小 | 敏感,小 batch 統計不穩 | 不受 batch 大小影響 |
| 訓練/推論 | 不一致(需移動平均、切 eval) | 一致,較單純 |
| 典型場景 | CNN、影像 | RNN、Transformer、序列 |
✅自我檢測
Q1. BN 把每層輸入標準化成什麼?為什麼還要 γ、β?
Q2. 為什麼推論時不能用當下批次的統計量?
Q3. 為什麼 Transformer 用 LayerNorm 而不是 BatchNorm?
Q4. 「內部協變量偏移」是什麼?BN 如何緩解?
🎯重點整理
- 是什麼:對每層輸入按 mini-batch 標準化成 μ=0、σ=1,再用可學習的 γ、β 還原尺度。
- 解決什麼:緩解內部協變量偏移,讓分布穩定 → 訓練更快更穩。
- 好處:可用更大學習率、降低初始化敏感、輕微正則化、緩解梯度消失/爆炸。
- 訓練 vs 推論:訓練用批次統計、推論用移動平均;部署要切 eval 模式。
- 選型:CNN/影像用 BatchNorm;序列/Transformer 用 LayerNorm。