归一化层(Normalization Layer)是深度神经网络中不可或缺的组件,通过在层间对激活值进行标准化操作,有效缓解梯度消失/爆炸问题、加速收敛、提升模型泛化能力。自 2015 年 Batch Normalization 提出以来,先后发展出 Layer Normalization、Instance Normalization、Group Normalization 等多种变体,各自适用于不同的网络架构和应用场景。
在深入各种归一化方法之前,先理解深度网络中"内部协变量偏移"(Internal Covariate Shift)问题。
当深度网络前向传播时,每一层的输入分布都受前面所有层参数变化的影响。假设一个三层网络:
输入 x → 层1 (参数 W1) → h1 → 层2 (参数 W2) → h2 → 层3 (参数 W3) → 输出
训练过程中,W1 更新后,h1=W1x 的分布发生改变。层2原本假设 h1 服从某一分布进行参数更新,现在输入分布变了,层2不得不重新适应新的分布。这种现象逐层累积,导致:
- 收敛变慢:每层都需要不断适应前层分布变化,而非专注于学习有效特征
- 对初始化和学习率敏感:稍大的学习率就可能使分布剧烈变化,导致训练不稳定
- 梯度饱和:当激活函数(如 Sigmoid/Tanh)的输入绝对值过大时,落入饱和区,梯度接近 0
考虑一个简单的二层网络,使用 Sigmoid 激活函数。假设第一层参数初始化为 W1=[[1,0.5],[0.3,−0.2]],输入 x=[2,1]T:
第一次迭代(初始化时):
- h1=W1x=[2.5,0.4]T
- Sigmoid: σ(2.5)≈0.925, σ(0.4)≈0.599
- 梯度计算:σ′(2.5)=0.925×(1−0.925)≈0.069(梯度较小)
- σ′(0.4)=0.599×(1−0.599)≈0.240
经过几次迭代,W1 更新后,假设 h1=[5.0,−3.0]T:
- Sigmoid: σ(5.0)≈0.993, σ(−3.0)≈0.047
- 梯度计算:σ′(5.0)≈0.007(梯度极度饱和)
- σ′(−3.0)≈0.045
第二层几乎无法学习 — 梯度趋近于 0,这就是梯度消失的一种表现形式。
归一化后: 如果将 h1 归一化为均值为 0、标准差为 1 的分布,例如 h1norm≈[0.71,−0.71]T,则 Sigmoid 梯度约为 σ′(0.71)≈0.208 和 σ′(−0.71)≈0.208,梯度始终处于有效区域。
Batch Normalization(BN,批量归一化)由 Ioffe & Szegedy 于 2015 年提出,是首个被广泛采用的归一化方法,至今仍是 CNN 架构的标准组件。
BN 对每个 mini-batch 的每个特征通道进行归一化。给定一个 mini-batch 中某个特征的所有值 B={x1,x2,...,xm},BN 的计算过程如下:
训练阶段:
-
计算 batch 均值和方差:
μB=m1i=1∑mxi
σB2=m1i=1∑m(xi−μB)2
-
标准化:
x^i=σB2+ϵxi−μB
其中 ϵ 是一个很小的常数(通常为 10−5),防止分母为 0。
-
缩放和平移(可学习参数):
yi=γx^i+β
其中 γ(缩放因子)和 β(偏移量)是可学习的参数,维度与特征通道数相同。
假设一个 batch 中有 4 个样本,某个特征通道的值分别为:
B={1.5,−0.5,2.0,−1.0}
步骤 1:计算均值和方差
- μB=(1.5+(−0.5)+2.0+(−1.0))/4=0.5
- σB2=((1.5−0.5)2+(−0.5−0.5)2+(2.0−0.5)2+(−1.0−0.5)2)/4
- σB2=(1.0+1.0+2.25+2.25)/4=1.625
步骤 2:标准化(设 ϵ=10−5)
- x^1=(1.5−0.5)/1.625≈1.0/1.275≈0.784
- x^2=(−0.5−0.5)/1.275≈−0.784
- x^3=(2.0−0.5)/1.275≈1.176
- x^4=(−1.0−0.5)/1.275≈−1.176
步骤 3:假设学习到的 γ=0.5,β=0.2
- y1=0.5×0.784+0.2=0.592
- y2=0.5×(−0.784)+0.2=−0.192
- y3=0.5×1.176+0.2=0.788
- y4=0.5×(−1.176)+0.2=−0.388
可以看到,γ 和 β 让网络可以学习归一化后的分布应该是什么样的 — 如果标准正态分布不是最优的,网络可以自行调节。
推理时,BN 不使用当前 batch 的统计量(推理时 batch 可能只有 1 个样本,极不准确),而是使用训练期间累积的全局移动平均:
x^=σrunning2+ϵx−μrunning
y=γx^+β
其中运行均值和方差的更新方式为:
μrunning←αμrunning+(1−α)μB
σrunning2←ασrunning2+(1−α)σB2
动量 α 通常取 0.9 或 0.99。
BN 是可微的,因此梯度可以顺利地从输出传播到输入。设损失为 L,反向传播需要计算 ∂L/∂γ、∂L/∂β、∂L/∂xi:
∂γ∂L=i=1∑m∂yi∂L⋅x^i
∂β∂L=i=1∑m∂yi∂L
∂xi∂L=mσB2+ϵγ(m∂x^i∂L−j=1∑m∂x^j∂L−x^ij=1∑m∂x^j∂Lx^j)
其中 ∂L/∂x^i=(∂L/∂yi)⋅γ。
| 优势 |
说明 |
具体效果 |
| 加速收敛 |
缓解内部协变量偏移,使各层输入分布稳定 |
典型提速 2-10 倍(原论文报告) |
| 允许更大学习率 |
归一化后梯度不会爆炸或消失 |
学习率可从 0.01 提升至 0.1 |
| 轻微正则化效果 |
每个 batch 的均值和方差有随机性 |
等价于一种隐式 Dropout |
| 减少对初始化的依赖 |
归一化抹平了初始权重的影响 |
对 Xavier/He 初始化不那么敏感 |
| 可以使用饱和激活函数 |
输入被控制在有效梯度区域 |
Sigmoid/Tanh 重新可用 |
-
依赖 batch 大小:当 batch size ≤8 时,统计量估计方差过大,BN 性能显著下降。在 batch size = 2 时,BN 引入的噪声可能抵消其收益。
-
训练与推理行为不一致:训练时使用 batch 统计量,推理时使用运行均值/方差,这种差异在模型从训练切换到推理时可能导致精度偏移。
-
不适合 RNN/Transformer:RNN 的序列长度可变,无法在时间步维度上统计;BN 对序列数据的长期依赖关系缺乏建模能力。
-
分布式训练中的同步开销:多卡训练时 BN 需要同步所有卡的统计量,带来通信开销。
Layer Normalization(LN,层归一化)由 Ba et al. 于 2016 年提出,是对 BN 不适合 RNN 和变长序列问题的直接回应。
与 BN 沿着 batch 维度计算统计量不同,LN 沿着特征维度计算统计量。对于输入 x∈Rbatch×features,BN 对每个特征跨样本统计,LN 对每个样本跨特征统计。
给定一个样本的 H 维激活值 a=[a1,a2,...,aH]:
μ=H1i=1∑Hai
σ2=H1i=1∑H(ai−μ)2
a^i=σ2+ϵai−μ
yi=γa^i+β
以 ResNet-50 中的特征图为例,假设一个卷积层的输出形状为 [N,C,H,W]:
- N=32(batch size)
- C=256(通道数)
- H=W=14(空间尺寸)
| 特性 |
Batch Normalization |
Layer Normalization |
| 统计范围 |
跨 N×H×W 计算 |
跨 C×H×W 计算 |
| 每个样本的归一化 |
不同(由 batch 中其他样本决定) |
相同(独立于 batch) |
| 计算维度 |
[N,H,W] |
[C,H,W] |
| 可学习参数 |
C 组 γ,β |
C 组 γ,β |
| 训练/推理一致 |
❌ 不一致 |
✅ 完全一致 |
Layer Normalization 是 Transformer 架构成功的基石之一。在 Transformer 中,每个子层(Self-Attention 和 FFN)之后都接 LN:
输入 → Multi-Head Attention → Add & LayerNorm → FFN → Add & LayerNorm → 输出
为什么 Transformer 选择 LN 而非 BN?
- 序列变长:NLP 任务中每个 batch 的序列长度不同,BN 无法对变长序列进行有效统计
- 无 batch 依赖:LN 对每个 token 独立归一化,推理时行为完全一致
- 位置编码兼容:LN 对不同位置的 token 公平对待,不引入位置偏差
Transformer 的原始设计中(Post-LN),LN 放在残差连接之后。后续研究发现 Pre-LN(LN 放在子层之前)训练更稳定:
| 方案 |
结构 |
优势 |
典型应用 |
| Post-LN |
x → SubLayer → LN → Residual |
原始设计 |
原始 Transformer |
| Pre-LN |
x → LN → SubLayer → Residual |
训练更稳定,预热更快 |
GPT、BERT、LLaMA |
Pre-LN 的计算流程:
x → LN → Multi-Head Attention → + x (残差) → LN → FFN → + x (残差) → 输出
Instance Normalization(IN,实例归一化)由 Ulyanov et al. 于 2016 年提出,主要应用于图像风格迁移任务。
IN 在每个样本的每个通道内独立计算统计量。对于形状为 [N,C,H,W] 的输入,IN 对每个 (n,c) 组合独立归一化。
对于第 n 个样本的第 c 个通道:
μnc=HW1h=1∑Hw=1∑Wxnchw
σnc2=HW1h=1∑Hw=1∑W(xnchw−μnc)2
x^nchw=σnc2+ϵxnchw−μnc
ynchw=γcx^nchw+βc
在图像风格迁移中,IN 的核心优势在于去除了图像的具体风格信息(对比度、色彩分布),保留内容结构。风格迁移网络(如 AdaIN)正是通过操作 IN 的 γ 和 β 参数来实现风格控制:
内容图像 → Encoder → IN → AdaIN (γ_style, β_style) → Decoder → 风格化图像
为什么风格迁移需要 IN?
假设内容图像是"一个站在海滩上的人",风格图像是梵高的《星月夜》。网络需要做的核心操作是:保持人的轮廓(内容),改变颜色的分布和纹理(风格)。IN 恰好能将图像特征归一化为标准分布,然后风格图像的 γ 和 β 将标准分布"拉伸"为风格图像的色彩分布。
考虑一张 2×2 的灰度图像,某个通道值为:
[[0.8, 0.2],
[0.5, 0.1]]
- μ=(0.8+0.2+0.5+0.1)/4=0.4
- σ2=((0.16+0.04+0.01+0.09))/4=0.075
- σ≈0.274
- 归一化后:[[1.46,−0.73],[0.36,−1.09]]
这独立于 batch 中的其他图像进行 — 这正是 IN 的关键特性。
Group Normalization(GN,组归一化)由 Wu & He 于 2018 年(Facebook AI Research)提出,旨在解决 BN 在小 batch 场景下的失效问题。
GN 将通道分为若干组,在每组内对空间维度进行归一化。当分组数 G=1 时退化为 LN,当 G=C(通道数)时退化为 IN。
对于输入 x∈RN×C×H×W,将 C 个通道分为 G 组,每组 C/G 个通道。对每个 (n,g) 组合:
μng=(C/G)HW1c∈group g∑h=1∑Hw=1∑Wxnchw
σng2=(C/G)HW1c∈group g∑h=1∑Hw=1∑W(xnchw−μng)2
GN 和 LN 一样,训练和推理行为一致,且不依赖 batch 大小。
Wu & He 在 ImageNet 上的实验数据(ResNet-50,batch size = 2):
| 归一化方法 |
Top-1 准确率 |
Top-5 准确率 |
对 batch size 的敏感度 |
| GN (G=32) |
76.3% |
93.0% |
不敏感 |
| BN |
74.2% (batch=2) / 76.5% (batch=32) |
91.9% / 93.2% |
高度敏感 |
| LN |
74.5% |
92.1% |
不敏感 |
| IN |
73.8% |
91.5% |
不敏感 |
在 batch size = 2 的极端情况下,GN 比 BN 高出约 2 个百分点。当 batch size 足够大时(32+),BN 性能最佳。
实验表明 G=32(或 G=16)通常是最优选择。不同 G 在 ImageNet 上的表现(ResNet-50, batch size = 32):
| G 值 |
Top-1 准确率 |
备注 |
| G=1(LN) |
75.8% |
全通道一组 |
| G=2 |
76.0% |
|
| G=8 |
76.2% |
|
| G=16 |
76.3% |
|
| G=32 |
76.3% |
推荐值 |
| G=C(IN) |
75.5% |
逐通道归一化 |
四种方法的统计范围差异可用以下方式理解。假设 4D 张量 (N,C,H,W):
| 方法 |
统计维度 |
归一化范围 |
训练/推理一致 |
对 batch size 敏感 |
| BN |
(N,H,W) |
跨样本+空间 |
❌ |
❌ 敏感 |
| LN |
(C,H,W) |
跨通道+空间 |
✅ |
✅ 不敏感 |
| IN |
(H,W) |
仅空间 |
✅ |
✅ 不敏感 |
| GN |
(C/G,H,W) |
组内通道+空间 |
✅ |
✅ 不敏感 |
| 场景 |
推荐方法 |
原因 |
| 大规模图像分类(batch ≥ 32) |
BN |
充分利用 batch 统计量,性能最优 |
| 小 batch 训练(GPU 显存受限) |
GN |
不依赖 batch 大小,性能稳定 |
| 序列模型(NLP/RNN) |
LN |
变长序列优化,Transformer 标配 |
| 图像风格迁移 |
IN |
去除风格信息的最佳方法 |
| 视频处理(3D CNN) |
GN 或 BN |
GN 更稳定(视频 batch 通常很小) |
| GAN 训练 |
GN 或 SN |
生成器通常 batch 小,GN 更合适 |
| 强化学习 |
LN |
序列决策 + 小 batch |
| 目标检测(如 Mask R-CNN) |
SyncBN |
跨卡同步 BN,恢复大 batch 统计 |
以 ResNet-50 为例(总参数约 25.6M):
| 归一化方法 |
额外参数 |
相对于模型大小的增加 |
训练 FLOPS 增加 |
| BN |
2 × 通道数 |
约 0.01%(忽略不计) |
约 5-10% |
| LN |
2 × 通道数 |
约 0.01% |
约 5-8% |
| IN |
2 × 通道数 |
约 0.01% |
约 5-8% |
| GN |
2 × 通道数 |
约 0.01% |
约 5-8% |
四种方法增加的参数量完全相同(γ 和 β 各一组,大小等于通道数),差异主要在于统计量计算的维度不同,计算量相近。
所有归一化方法都可以统一为以下流程:
x^nchw=σnchw2+ϵxnchw−μnchw
差异在于 μ 和 σ2 的计算范围。定义划分函数 S 表示统计范围:
| 方法 |
S |
含义 |
| BN |
{n′ ∣ n′=n,∀c′,h′,w′} |
同通道所有样本 |
| LN |
{c′ ∣ ∀c′,h′,w′,n′=n} |
同样本所有通道 |
| IN |
{h′,w′ ∣ ∀h′,w′,n′=n,c′=c} |
同样本同通道 |
| GN |
{c′,h′,w′ ∣ c′∈组,∀h′,w′,n′=n} |
同样本同组 |
从信息论角度看,BN 利用了最多的信息(共享统计量),但也引入了最大的依赖性(batch 内样本耦合)。GN 和 LN 则在独立性和统计量质量之间取得了更好的平衡。
- 最小 batch size 建议 ≥ 16,低于 8 时考虑 GN
- 学习率:使用 BN 后可以增大初始学习率(相比无 BN 增大 2-5 倍)
- 权重衰减:通常不衰减 γ 和 β,或使用很低的衰减系数
- 推理模式切换:务必在 eval() 模式下使用运行均值/方差,而非 batch 统计量
在 Mask R-CNN 中,检测头中的 BN 可以使用 GN 替代:
Backbone (ResNet) → BN
RPN → GN
RoI Head → GN
这解决了检测任务中 batch size 小的分支的问题(RPN 和 RoI Head 的 batch size 通常 ≤ 2)。
- Pre-LN 优先:训练更稳定,无需 warmup 阶段
- 位置编码后 LN:LayerNorm 应在位置编码和词嵌入相加之后
- FFN 内部的 LN:某些实现还在 FFN 的两个线性层之间添加 LN
多卡训练时,标准 BN 各卡独立计算,导致有效 batch size 缩水。SyncBN(同步 BN)的解决方案:
卡1: [样本0-7] → 计算 μ1, σ²1
卡2: [样本8-15] → 计算 μ2, σ²2
卡3: [样本16-23] → 计算 μ3, σ²3
卡4: [样本24-31] → 计算 μ4, σ²4
↓ (all-reduce 通信)
全局 μ = (μ1 + μ2 + μ3 + μ4) / 4
全局 σ² = (σ²1 + σ²2 + σ²3 + σ²4) / 4
SyncBN 的通信开销约为每次前向传播增加一次 all-reduce 操作,在 ResNet-50 中带来约 15-20% 的训练时间增加,但在大 batch 场景下收益远超成本。
| 年份 |
方法 |
提出者 |
主要贡献 |
| 2015 |
Batch Normalization |
Ioffe & Szegedy (Google) |
首次系统化解决内部协变量偏移 |
| 2016 |
Layer Normalization |
Ba et al. (Toronto) |
解决 RNN 序列归一化问题 |
| 2016 |
Instance Normalization |
Ulyanov et al. (Skoltech) |
在风格迁移中有效去除风格信息 |
| 2017 |
Weight Normalization |
Salimans & Kingma (OpenAI) |
对权重矩阵进行归一化 |
| 2018 |
Group Normalization |
Wu & He (Facebook AI) |
解决小 batch 场景下 BN 失效问题 |
| 2018 |
Switchable Normalization |
Luo et al. (Megvii) |
可学习的 BN/LN/IN 组合 |
| 2019 |
Filter Response Normalization |
Singh & Krishnan (Apple) |
在 MobileNets 上表现更优 |
| 2020 |
Normalizer Free ResNets |
Brock et al. (DeepMind) |
探索无归一化的深层网络训练 |
| 2021 |
Adaptive Normalization |
Park & Kim (KAIST) |
输入自适应的归一化策略 |
- BN(2015):因其在加速训练方面的突破性效果,成为深度学习框架的标准组件,被引用超过 5 万次
- LN(2016):虽然没有 BN 的广泛承认,但凭借在 Transformer 中的核心地位,其影响力持续攀升
- GN(2018):针对性解决了目标检测、视频理解等小 batch 场景的实际工程痛点
考虑一个简单全连接层 z=Wx,带 BN 后 y=BN(z)=γz^+β。BN 使 z^ 的方差恒为 1,因此:
∂W∂L=∂z∂L⋅xT
由于 Var(z)=Var(Wx) 被约束为 1,z 的尺度不再随 W 范数增长而增长。这避免了梯度爆炸问题,同时也约束了权重矩阵的范数增长。
从贝叶斯角度看,BN 可以理解为对隐藏特征的先验约束:
p(features∣batch)∝p(batch∣features)⋅p(features)
其中 p(features) 是一个均值为 μB、方差为 σB2 的隐式先验。训练过程中,γ 和 β 可以看作对后验分布进行调节的超参数。
BN 引入的随机性(不同 batch 统计量不同)等价于对特征分布进行了变分推断(Variational Inference),这也解释了为什么 BN 具有正则化效果。
- Ioffe, S., & Szegedy, C. (2015). Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. ICML 2015.
- Ba, J. L., Kiros, J. R., & Hinton, G. E. (2016). Layer Normalization. arXiv:1607.06450.
- Ulyanov, D., Vedaldi, A., & Lempitsky, V. (2016). Instance Normalization: The Missing Ingredient for Fast Stylization. arXiv:1607.08022.
- Wu, Y., & He, K. (2018). Group Normalization. ECCV 2018.
- Vaswani, A., et al. (2017). Attention Is All You Need. NeurIPS 2017.
- Luo, P., et al. (2018). Switchable Normalization for Learning-to-Normalize Deep Representation. IEEE TPAMI.
- Xiong, R., et al. (2020). On Layer Normalization in the Transformer Architecture. ICML 2020.
- Brock, A., De, S., & Smith, S. L. (2021). Characterizing signal propagation to close the performance gap in unnormalized ResNets. ICLR 2021.