关键词解释:LN(Layer Normalization,层归一化)和 BN(Batch Normalization,批归一化)
LN(Layer Normalization,层归一化)和 BN(Batch Normalization,批归一化)是深度学习中两种非常重要的归一化技术,用于加速训练、提升稳定性、缓解梯度消失/爆炸等问题。它们的核心思想都是对神经网络中间层的输出进行标准化,但归一化的维度和适用场景截然不同。
下面从原理、公式、对比、优缺点和使用建议五个方面详细讲解。
一、Batch Normalization(BN,批归一化)
📌 提出时间
2015 年,由 Sergey Ioffe 和 Christian Szegedy 在论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》中提出。
🔧 核心思想
对一个 batch 中所有样本在同一个特征维度上进行归一化,使得每层输入分布更稳定。
📐 公式(训练阶段)
对于某一层的输出张量 (以 CNN 为例):
对每个通道
,在 batch 维度 + 空间维度 上计算均值和方差:
归一化:
缩放和平移(可学习参数):
其中:
是可学习的仿射变换参数;
是数值稳定小常数(如
)。
💡 关键:归一化沿 batch 维度进行 → 要求 batch size 不能太小(通常 ≥ 8)。
✅ 优点
- 显著加速收敛;
- 允许使用更高的学习率;
- 有一定正则化效果(因依赖 batch 内统计量)。
❌ 缺点
- 依赖 batch size:小 batch(如 1、2)时统计量不准,性能下降;
- 不适用于序列模型(如 RNN、Transformer)中变长输入;
- 推理时需用滑动平均的全局均值/方差,训练/推理不一致。
🎯 适用场景
- CNN 图像任务(如 ResNet、VGG);
- 固定 batch size 且较大(≥ 16)的场景。
二、Layer Normalization(LN,层归一化)
📌 提出时间
2016 年,由 Jimmy Lei Ba 等人在《Layer Normalization》中提出,专为 RNN 和小 batch 场景设计。
🔧 核心思想
对单个样本的所有特征维度进行归一化,与 batch 无关。
📐 公式
对于一个样本的输出向量 (或张量),计算其自身所有元素的均值和方差:
💡 关键:归一化沿特征维度进行,每个样本独立计算 → 完全不依赖 batch。
✅ 优点
- 不受 batch size 影响:batch=1 也能用;
- 适用于变长序列(如 NLP 中的句子);
- 训练/推理行为一致。
❌ 缺点
- 在 CNN 中效果通常不如 BN(因破坏了通道间的语义一致性);
- 对特征维度的“语义同质性”有要求(假设各维度可比)。
🎯 适用场景
- Transformer(如 BERT、GPT、ViT);
- RNN / LSTM;
- 强化学习、小 batch 训练、在线学习。
三、BN vs LN 核心对比
| 特性 | Batch Norm (BN) | Layer Norm (LN) |
|---|---|---|
| 归一化维度 | 沿 batch 维度(跨样本) | 沿特征维度(单样本内) |
| 依赖 batch size | 是(小 batch 效果差) | 否(batch=1 也可用) |
| 训练/推理一致性 | 否(需滑动平均) | 是(完全一致) |
| 适合 CNN | ✅ 非常适合 | ❌ 通常效果较差 |
| 适合 Transformer/RNN | ❌ 不适合(变长序列) | ✅ 标准选择 |
| 可学习参数 | per-channel ( | per-feature ( |
| 正则化效果 | 有(因 batch 随机性) | 无 |
四、其他归一化方法(补充)
| 方法 | 全称 | 特点 | 适用场景 |
|---|---|---|---|
| IN | Instance Norm | 对单样本单通道归一化( | 风格迁移(如 AdaIN) |
| GN | Group Norm | 将通道分组后归一化(介于 BN 和 LN 之间) | 小 batch CNN(如 Detectron2 默认) |
| SyncBN | Synchronized BN | 多卡训练时同步 batch 统计量 | 分布式训练大模型 |
📌 Group Norm 公式:将
个通道分为
组,每组在
上归一化。当
时退化为 LN,
时退化为 IN。
五、PyTorch 代码示例
import torch
import torch.nn as nn# 假设输入: [batch_size, channels, height, width]
x = torch.randn(4, 64, 32, 32)# BatchNorm2d: 归一化沿 (N, H, W) 维度,每通道独立
bn = nn.BatchNorm2d(64)
out_bn = bn(x)# LayerNorm: 归一化沿最后几个维度(需指定 normalized_shape)
ln = nn.LayerNorm([64, 32, 32]) # 对每个样本的 [64,32,32] 归一化
out_ln = ln(x)# 或对特征维度归一化(如 Transformer 中)
x_seq = torch.randn(4, 100, 512) # [batch, seq_len, d_model]
ln_seq = nn.LayerNorm(512) # normalized_shape = 512
out_seq = ln_seq(x_seq)
六、如何选择?
| 场景 | 推荐归一化 |
|---|---|
| 图像分类(ResNet等) | BN(batch size ≥ 16) |
| 目标检测 / 小 batch CNN | GN 或 SyncBN |
| Transformer(BERT/GPT/ViT) | LN |
| RNN / LSTM | LN |
| 风格迁移 | IN 或 AdaIN |
| 强化学习 / batch=1 | LN |
总结
- BN:跨样本归一化,适合大 batch 的 CNN;
- LN:单样本内归一化,适合序列模型和小 batch 场景;
- 二者不是谁替代谁,而是针对不同架构的设计选择。
🌟 记住一句话:
“CNN 用 BN,Transformer 用 LN” —— 这是现代深度学习的默认实践。
