在神經網絡的結構中,我們常常可以看見歸一化(Normalization)如BN的出現,無論是模型的backbone或者是neck的設計都與它有著重大的關系。
因此引發了我對它的思考,接下來我將從
是什么(知識領域,誕生來源),為什么(解決了什么問題),怎么做(公式原理,未來如何使用和設計)的三個哲學維度去討論它。
是什么
從整體到局部 — 先說“屬于哪個研究方向 / 框架
歸一化(Normalization)在深度學習里的位置
研究領域 / 交叉學科:
優化理論(改變梯度分布、條件數、收斂性)
表征學習/歸一化技術(穩定內部表示、減少訓練敏感性)
統計估計(如何準確地估計均值/方差、樣本數對估計方差的影響)
分布式系統工程(SyncBN 涉及跨設備通信)
核心問題:網絡訓練中各層輸入分布隨訓練迭代變化(所謂“internal covariate shift” 的實踐問題)、訓練穩定性、梯度尺度與收斂速度、以及隱式正則化。
解決思路家族:按“聚合域”可分——跨樣本(Batch-based,如 BN / SyncBN)、逐樣本但分組(GroupNorm)、逐樣本全部通道(LayerNorm)、逐通道逐樣本空間上(InstanceNorm)等。每種方法在統計樣本數、耦合程度、計算/通信開銷上有不同折中。
這些名詞可能現在絕對有些晦澀難懂,不過后面我會一一解釋。
BN的來源
我現在會扮演一個合適的角色,從0到1帶著你推演為什么需要BN里面的數學操作去解決什么問題
那我們就從**“還沒有 BN 時代”**開始推演,像個深度學習數理偵探一樣,一步步鎖定問題,然后自然推導出 BN 的數學操作。
1?? 案件背景:還沒有 BN 的深度網絡
在早期(2014 年以前),深度神經網絡(尤其是 CNN、RNN)在訓練時會遇到幾個老大難問題:
1 梯度消失 / 梯度爆炸
網絡層數一多,梯度在反向傳播中會被不斷乘上權重的導數。
如果導數平均值 < 1 → 梯度指數級衰減(梯度消失);
如果導數平均值 > 1 → 梯度指數級放大(梯度爆炸)。
2 內部協變量偏移(Internal Covariate Shift)
當我們更新前面層的參數時,后面層的輸入分布就會改變。
這意味著后面層在每個訓練 step 面對的不是一個穩定的任務,而是“每次輸入分布都不同”的任務。
概念
“協變量”是指模型中某一層的輸入(對這一層來說,輸入就是它的特征分布)。
“偏移”是指輸入的分布發生了變化。
在深度網絡中,每一層的輸入分布并不是固定的,因為前面層的參數在訓練中不斷變化。
內部協變量偏移:訓練過程中,深層網絡的中間層輸入分布(均值、方差、形狀)會不斷變化。
影響
如果某一層輸入分布一直變化,那么這一層需要不斷“重新適應”新的輸入分布,訓練起來就很慢。
這相當于你在學做飯,但每天給你的食材味道、大小都不一樣,你需要不斷調整調料用量 → 學習速度慢。
3 學習速度極慢
分布漂移(Distribution Shift)
概念
更寬泛的概念,指訓練數據分布與測試數據分布不一致。
例如:訓練時圖片都在晴天拍,測試時大部分是雨天 → 模型性能下降。
ICS 是一種特殊的分布漂移,只不過它發生在網絡內部層與層之間,不是訓練集與測試集之間。
關系
分布漂移:外部視角,通常是數據集問題。
內部協變量偏移:內部視角,是訓練過程中網絡自身制造的“數據分布變化”。
因為分布漂移,學習率不敢設太高,否則容易發散。
想加速收斂很困難。
以上這就是歸一化的定位以及來源,它屬于表征學習,優化理論的領域,來源于神經網絡訓練時遇到的傳統的幾個問題,梯度爆炸/消失,內部協變量偏移(Internal Covariate Shift),學習速度極慢
理解了是什么,其實我們也就引出了為什么,為什么其實就是去解決它誕生來源的幾個問題
為什么
抽象和解決問題
2?? 偵探分析:輸入分布的“統計混亂”
我們先盯著一個中間層的輸入特征 𝑥看:
假設該層有 100 個神經元,輸入來自上一層輸出。
每個 batch 輸入時,
x 的均值(mean)和標準差(std)會隨 batch 波動。
如果上游權重剛更新過,這些統計量就可能發生明顯變化。
這就像你教一個學生解方程,每次題目里的數字分布都完全變樣,他很難學到穩定的解法。
數學上,這種不穩定性會導致梯度更新方向變化劇烈,訓練過程震蕩。
3?? 第一個線索:標準化能穩定分布
在傳統機器學習(比如 SVM、KNN)中,我們早就知道特征標準化可以讓優化更快:
為什么特征標準化可以加快優化
假設我們有一個簡單的模型:
如果 xxx 的均值很偏(比如都在 500 左右),那么偏置 b 就要去抵消這個大偏移,浪費了很多學習能力。當時我就想到
這句話如何理解,如果樣本的數據整體均值比較偏,那模型不就應該是解決這個偏的問題,學習這個 偏 嗎,為什么說是浪費了很多學習能力。
1. “偏”有兩種來源
(a) 有意義的偏
偏本身攜帶了任務相關的信息,模型需要去捕捉它。
例子:識別黑夜 vs 白天的照片,亮度均值的偏移是關鍵信息。
這種偏是 語義性的,不能被 BN 抹掉,否則會丟失有效特征。
(b) 無意義的偏(數據分布的偶然偏移)
偏的產生可能是因為采集方式、批次差異、傳感器參數等,和任務標簽沒有直接關系。
例子:同一類貓的照片,有的拍攝時曝光偏高,有的偏低,這個亮度變化與“貓”的類別無關。
模型如果直接學習這種無關的偏,就等于浪費參數去“擬合無關信號”,還可能降低泛化能力。
2. 為什么“浪費學習能力”
模型是有限容量的(參數有限,優化能力有限)。
如果早期層需要去適配這種無意義的偏:
一部分參數會被迫去調節不同 batch/樣本間的均值和方差差異
這些參數的更新會因為數據批次差異而震蕩(優化不穩定)
真正與任務有關的模式(如形狀、紋理、結構信息)會被延遲學習
簡單來說:
如果模型花了很多梯度和迭代去修正這些批次間的“量綱偏差”,那它能用來學習語義特征的“精力”就被分走了。
3. 怎么判斷“偏”要不要學?
這在理論上很難提前知道,但可以有經驗判斷:
如果偏是全局一致且標簽相關 → 需要保留(BN 就要小心設計)
如果偏是批次/樣本之間不穩定且與標簽無關 → 適合用 BN 去消除
實踐中,我們很難精確分類,所以 BN 這種方法是基于“假設大部分批次間均值/方差偏移是無關的”來設計的
4?? 關鍵問題:深度網絡的標準化該怎么做(以BN為例)?
偵探的推理來到關鍵一步:
在深度網絡中,我們不能只在輸入層做一次標準化,因為中間層的分布也會漂移。
那我們能不能在每一層的每個訓練 step都做一次標準化,把漂移控制住?
于是,BN 的核心想法出現了:
以上其實就是為什么的整個思考,它與前面的BN 的誕生邏輯串起來了
痛點:早期網絡沒有 BN,內部協變量偏移 + 輸入特征分布不穩定 → 訓練慢、難收斂
關鍵假設:均值/方差的批次波動多數與任務無關
操作:對每個 batch 的特征做標準化,讓它的均值 ≈ 0,方差 ≈ 1
好處:
梯度更新更穩定(步長不用太小)
不用浪費參數去適配輸入量綱差異
網絡可以更快進入學習“形狀/模式”等更有意義的特征階段
怎么做
公式推演
接下來我會帶著你進行歸一化數學公式上的推演,推演遵循每個操作都講清楚,是什么(參數的意義),為什么(通過參數解決什么問題),怎么做(通過什么公式用參數去解決問題)
每個操作的「一句話總結」
常見問題
問題 1:為什么把特征強制為 0-mean,1-var 會限制網絡表達能力?γ,β 為什么解決這個問題?
直覺理解
BN 前的標準化:
問題 2:推理階段沒有 batch 的概念或 batch 很小是什么意思?
問題 3:標準化消除了輸入尺度對激活的影響,減小參數尺度與優化耦合,有哪些地方被標準化了?
未來如何使用和設計歸一化
實踐設計示例
場景 | 建議歸一化 | 理由 |
---|---|---|
ImageNet 分類,大 batch | BN | 批內統計穩定,加速收斂 |
單張圖像生成 / 風格遷移 | IN 或 GN | 不依賴 batch |
多 GPU 小 batch | SyncBN 或 GN | BN 單卡統計不穩,GN 可替代 |
移動端輕量模型 | GN | 穩定且無需 batch,硬件友好 |
Transformer | LN | 序列長度不固定,適合逐樣本標準化 |
多任務 / 自適應 | SN | 學習動態選擇歸一化方式 |