Batch Normalization vs Layer Normalization 对比详解
归一化是深度学习训练中的关键技巧,它通过稳定中间层的输入分布来加速训练。但 Batch Normalization 和 Layer Normalization 的归一化方向完全不同,适用场景也截然不同。
为什么需要归一化?
深度神经网络训练中有一个经典问题:内部协变量偏移(Internal Covariate Shift)。随着训练进行,每一层的输入分布不断变化,导致:
- 训练速度变慢
- 需要更小的学习率
- 梯度消失或爆炸
- 模型难以收敛
归一化的核心目标:让每一层的输入保持稳定的分布(均值接近 0,方差接近 1)。
归一化前:
Layer 1 输出:均值=50,方差=100 ← 分布偏移大
Layer 2 输入:均值=50,方差=100 ← 下一层要适应
Layer 2 输出:均值=200,方差=500 ← 分布又变了
归一化后:
Layer 1 输出:归一化 → 均值=0,方差=1
Layer 2 输入:均值=0,方差=1 ← 稳定分布
Layer 2 输出:归一化 → 均值=0,方差=1 ← 依然稳定
Batch Normalization (BN)
BN 沿 batch 维度进行归一化,对每个特征独立处理。
计算方式
假设一个 batch 有 m 个样本,每个样本有 d 个特征。BN 对每个特征 j 独立计算:
# 对每个特征 j(j = 1 到 d)
# 1. 计算 batch 均值
μ_j = (1/m) * Σ(x_ij) # 对 batch 中所有样本取均值
# 2. 计算 batch 方差
σ²_j = (1/m) * Σ(x_ij - μ_j)²
# 3. 归一化
x̂_ij = (x_ij - μ_j) / √(σ²_j + ε)
# 4. 缩放和平移(可学习参数)
y_ij = γ_j * x̂_ij + β_j
直觉理解
Batch: [样本1, 样本2, 样本3, 样本4]
对于特征 "身高":
样本1 身高=170, 样本2 身高=165, 样本3 身高=180, 样本4 身高=175
batch 均值=172.5, batch 标准差=5.59
归一化后:[-0.45, -1.34, 1.34, 0.45]
对于特征 "体重":
样本1 体重=65, 样本2 体重=70, 样本3 体重=80, 样本4 体重=75
batch 均值=72.5, batch 标准差=5.59
归一化后:[-1.34, -0.45, 1.34, 0.45]
关键:每个特征独立归一化,但使用相同的 γ 和 β
Layer Normalization (LN)
LN 沿 特征维度进行归一化,对每个样本独立处理。
计算方式
# 对每个样本 i(i = 1 到 m)
# 1. 计算该样本所有特征的均值
μ_i = (1/d) * Σ(x_ij) # 对样本的所有特征取均值
# 2. 计算该样本所有特征的方差
σ²_i = (1/d) * Σ(x_ij - μ_i)²
# 3. 归一化
x̂_ij = (x_ij - μ_i) / √(σ²_i + ε)
# 4. 缩放和平移
y_ij = γ_j * x̂_ij + β_j
直觉理解
样本1 的特征向量: [身高=170, 体重=65, 年龄=25]
样本均值 = (170+65+25)/3 = 86.67
样本标准差 = 62.36
归一化后: [1.34, -0.35, -0.99]
样本2 的特征向量: [身高=165, 体重=70, 年龄=30]
样本均值 = (165+70+30)/3 = 88.33
样本标准差 = 55.27
归一化后: [1.39, -0.33, -1.06]
关键:每个样本独立归一化,与 batch 无关
BN vs LN 核心区别
| 特性 | Batch Normalization | Layer Normalization |
|---|---|---|
| 归一化方向 | 跨 batch(每个特征) | 跨特征(每个样本) |
| 依赖 batch size | 是 | 否 |
| 训练与推理一致 | 否(需 running stats) | 是 |
| 适合的架构 | CNN | Transformer、RNN |
| 小 batch 效果 | 不稳定 | 稳定 |
| 序列数据 | 不合适 | 非常适合 |
为什么 Transformer 用 LN 而不用 BN?
三个核心原因:
1. 序列长度不一致
Transformer 处理的序列长度不同。BN 需要对每个位置独立计算统计量,但不同位置的统计量不具可比性。LN 对每个 token 独立归一化,天然适配变长序列。
2. 自回归生成时 batch=1
GPT 等模型在推理时逐 token 生成,batch size=1。BN 在 batch=1 时退化为仅做缩放,失去归一化效果。LN 不受影响。
3. 训练推理一致性
BN 需要维护 running mean 和 running variance,在训练和推理时行为不同。LN 训练和推理时计算方式完全一致,更简洁可靠。
Pre-Norm vs Post-Norm
在 Transformer 中,LN 的放置位置也有讲究:
Post-Norm(原始 Transformer):
output = LayerNorm(x + Sublayer(x))
问题:深层网络训练不稳定,需要 warmup
Pre-Norm(GPT-2 及之后的主流选择):
output = x + Sublayer(LayerNorm(x))
优势:训练更稳定,无需 warmup,收敛更快
实际使用建议
- CNN(ResNet、VGG 等):使用 Batch Normalization
- Transformer(BERT、GPT 等):使用 Layer Normalization
- RNN/LSTM:使用 Layer Normalization(或不用)
- 小 batch 场景:优先选择 Layer Normalization
- 序列数据:优先选择 Layer Normalization
总结
BN 和 LN 的本质区别在于归一化的"方向"不同。理解这个差异,就能明白为什么 Transformer 选择了 LN:它不依赖 batch,天然适配变长序列和自回归生成。在实际项目中,根据模型架构选择合适的归一化方法,是训练优化的基本功。