所有归一化方法本质都做同一件事:把数据按某个维度”拉平”到标准分布,让每层输入的分布稳定下来。区别仅在于沿着张量的哪个维度算均值方差。掌握这把”万能钥匙”即可看穿 BN/LN/IN/GN/adaLN-Zero 的全部演化。
为什么需要归一化
不同特征量级差异巨大时,梯度被大特征主导,小特征几乎学不到,训练慢甚至不收敛。深层网络中每层输入分布会跟着前层参数变化(Internal Covariate Shift),后层不断追赶前层。
通用流程两步:
第二步保留模型表达能力——直接强行 0 均值 1 方差会丢信息,让模型自己学缩放与偏移。
万能钥匙:算均值方差的维度
CNN 张量 [N, C, H, W];Transformer 张量 [N, L, D]。所有方法的差异就是对哪些维度做归约。
| 方法 | 算均值方差的维度 | 得到几个 (μ, σ) | 依赖 batch size |
|---|---|---|---|
| BN | N + H + W(每通道独立) | C 个 | ✅ 强依赖 |
| LN(CNN) | C + H + W | N 个 | ❌ 不依赖 |
| LN(Transformer) | D | N×L 个 | ❌ 不依赖 |
| IN | H + W(每样本每通道独立) | N×C 个 | ❌ 不依赖 |
| GN | C/G + H + W(每样本每组独立) | N×G 个 | ❌ 不依赖 |
主流方法详解
Batch Normalization (BN, 2015)
沿 batch + 空间维度归一,每通道一个 μ/σ。
- ✅ 加速收敛,允许更大学习率,自带噪声正则
- ❌ 对 batch size 极度敏感(< 8 性能暴跌);训练(当前 batch)/推理(滑动平均)行为不一致;不适合变长序列
适用:大 batch 的 CNN(图像分类/检测/分割)。
Layer Normalization (LN, 2016)
沿特征维度归一,每个样本(甚至每个位置)一个 μ/σ。
- ✅ 与 batch size 无关;训练/推理同一公式;天然适合变长序列
- ❌ 大 batch CNN 上略逊于 BN
适用:所有 Transformer、RNN、生成模型、小 batch 任务。
Instance Normalization (IN, 2016)
每样本每通道独立,沿空间维度归一。
为什么适合风格迁移:图像内容主要存在于通道的均值/方差中,IN 去掉这部分等价于”剥离内容、保留风格”。
适用:CycleGAN、Neural Style Transfer、早期图像生成。
Group Normalization (GN, 2018)
把 C 个通道分成 G 组(默认 G=32),组内做 IN。介于 BN 与 IN 之间。
- ✅ 完全与 batch size 无关;小 batch 也稳
- ❌ 大 batch 略逊于 BN;需要选 G
适用:目标检测、实例分割、3D 卷积、视频理解等显存占用大的小 batch 任务。
Adaptive Normalization(条件归一化)
γ 与 β 不再是固定参数,而由条件信号动态生成。代表 AdaIN:
直接用风格特征 c 的统计量调制内容特征 x。
适用:条件 GAN、StyleGAN、条件扩散模型早期版本。
adaLN-Zero(2022,现代扩散模型标配)
在 adaLN 基础上额外引入残差缩放 α(c),且 α 零初始化:
为什么有效:
- 训练初期 α=0,整个模块输出 0,残差块退化为恒等映射,深层稳定
- 模型按需学习”何时应该改变特征”
- 极简但极有效,已被 SD3 / Flux / Sora 等 SOTA 全面采用
选型速查
| 场景 | 推荐 |
|---|---|
| CNN,大 batch | BN |
| CNN,小 batch | GN |
| Transformer / RNN / NLP | LN |
| 风格迁移 | IN / AdaIN |
| 现代扩散模型 / DiT | adaLN-Zero |
常见误区
-
位置:归一化放在激活之前
x = nn.Linear(128, 256)(x) x = nn.LayerNorm(256)(x) x = nn.GELU()(x) # 正确 -
不是越多越好:网络输出层不要加归一化
-
BN 的滑动平均:训练/推理差距大 90% 出在这里。验证集上不要让 BN 进入训练模式(会污染滑动平均)
-
优先 LN:除非有强理由,现代项目优先 LN,配合 AdamW 表现极佳
一句话本质
归一化的全部价值是稳定每层的输入分布,让深层网络的训练成为可能。所有方法的差别只在于”沿哪个维度做”和”是否引入条件”。