目标:系统掌握深度学习中核心归一化技术的设计动机、数学公式、计算流程与适用场景,建立"归一化工具箱"的完整认知。
前置要求:了解基本的神经网络概念(前向传播、反向传播)和线性代数基础(均值、方差、矩阵运算)。
归一化是深度学习中最成功的训练技巧之一——它加速收敛、稳定训练、允许使用更大的学习率。如果说激活函数为网络引入非线性,归一化则为网络的训练过程引入稳定性。本文按演进脉络系统梳理各类归一化技术,给出公式、计算流程、优缺点和记忆小贴士。
1. 归一化的动机(Why Normalization?)
在深入具体技术之前,先理解"为什么需要归一化"。
1.1 Internal Covariate Shift 问题
原始定义(Ioffe & Szegedy, 2015):在训练过程中,由于前层参数的不断更新,每一层的输入分布不断发生变化——这种现象称为内部协变量偏移(Internal Covariate Shift, ICS)。
直觉:想象你在射箭,靶心每秒都在移动——即使你的技术在进步,命中率也很难提升。归一化的作用就是"固定靶心"——让每一层看到的输入分布保持相对稳定。
数值示例:假设一个隐藏层的输入 $x$ 在训练初期均值为 5、标准差为 3。经过几轮更新后,均值漂移到 20、标准差变为 10。这一层的权重需要不断"追赶"输入分布的变化,导致:
- 学习率不能太大(否则追不上分布变化会发散)
- 收敛速度变慢(大量梯度被浪费在适应分布漂移上)
1.2 归一化的核心思想
对每一层的激活值做标准化(减均值、除标准差),使其分布稳定在均值为 0、方差为 1 附近,再通过可学习的缩放参数 $\gamma$ 和偏移参数 $\beta$ 恢复表达能力:
$$ \hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}}, \quad y_i = \gamma \hat{x}_i + \beta $$- $\mu$:均值
- $\sigma^2$:方差
- $\epsilon$:防止除零的小常数(通常 $10^{-5}$)
- $\gamma, \beta$:可学习参数,当 $\gamma = \sigma$、$\beta = \mu$ 时,归一化可以"撤销"自己——保留了网络的表达能力
类比:标准化考试。不同科目的原始分数不可比(数学满分 150,英语满分 120)。归一化相当于把所有科目换算成标准分(均值 0,标准差 1),使得分数可比——但最终排名($\gamma, \beta$)仍然保留了科目的差异。
1.3 归一化的统一框架
所有归一化技术都遵循同一个框架:在特定维度上计算均值和方差,对激活值做标准化。区别仅在于在哪些维度上计算统计量。
假设激活张量形状为 $(N, C, H, W)$:
| 维度 | 含义 |
|---|---|
| $N$ | batch size(样本数) |
| $C$ | channel(通道数/特征数) |
| $H, W$ | 空间尺寸(高、宽) |
对于 Transformer,激活张量形状通常为 $(N, T, D)$:
| 维度 | 含义 |
|---|---|
| $N$ | batch size |
| $T$ | sequence length(序列长度) |
| $D$ | hidden dimension(隐藏维度) |
flowchart LR
Input["输入张量<br/>(N, C, H, W)"] --> Compute["沿特定维度<br/>计算 μ, σ²"]
Compute --> Normalize["标准化<br/>x̂ = (x-μ)/√(σ²+ε)"]
Normalize --> Scale["缩放平移<br/>y = γx̂ + β"]
Scale --> Output["输出张量"]
2. Batch Normalization(BN)
2.1 核心思想
简介:沿 batch 维度计算统计量——对每个通道,跨所有样本和空间位置计算均值和方差。2015 年由 Ioffe & Szegedy 提出,是第一个被广泛采用的归一化技术,直接推动了深度学习的爆发式发展。
$$ \mu_c = \frac{1}{N \cdot H \cdot W}\sum_{i=1}^{N}\sum_{h,w} x_{i,c,h,w} $$$$ \sigma_c^2 = \frac{1}{N \cdot H \cdot W}\sum_{i=1}^{N}\sum_{h,w} (x_{i,c,h,w} - \mu_c)^2 $$$$ \hat{x}_{i,c,h,w} = \frac{x_{i,c,h,w} - \mu_c}{\sqrt{\sigma_c^2 + \epsilon}}, \quad y_{i,c,h,w} = \gamma_c \hat{x}_{i,c,h,w} + \beta_c $$数值示例:假设 batch size = 2,通道数 = 1,空间尺寸 = 2×2:
样本 1: [[1, 2], [3, 4]] 样本 2: [[5, 6], [7, 8]]
沿 N、H、W 维度计算(共 8 个值):
$$ \mu = \frac{1+2+3+4+5+6+7+8}{8} = 4.5 $$$$ \sigma^2 = \frac{(1-4.5)^2 + (2-4.5)^2 + \cdots + (8-4.5)^2}{8} = 5.25 $$$$ \hat{x}_{1,1,1,1} = \frac{1 - 4.5}{\sqrt{5.25}} = \frac{-3.5}{2.291} = -1.528 $$2.2 训练与推理的差异
BatchNorm 在训练和推理时行为不同——这是它最独特也最容易出错的地方。
训练时:使用当前 mini-batch 的统计量($\mu_{\text{batch}}$, $\sigma^2_{\text{batch}}$),同时用指数移动平均(EMA)更新全局统计量:
$$ \mu_{\text{running}} \leftarrow (1 - \alpha) \cdot \mu_{\text{running}} + \alpha \cdot \mu_{\text{batch}} $$其中动量 $\alpha$ 通常取 0.1。
推理时:使用训练期间积累的全局统计量($\mu_{\text{running}}$, $\sigma^2_{\text{running}}$),不再依赖 batch——推理时 batch size 可能为 1。
代码示例(PyTorch):
import torch.nn as nn
# 训练时:model.train(),使用 batch 统计量
# 推理时:model.eval(),使用 running 统计量
bn = nn.BatchNorm2d(num_features=64) # 64 个通道
# 前向传播
output = bn(input_tensor) # 自动根据 train/eval 模式切换
类比:班级考试。训练时用每次小测验(mini-batch)的平均分来标准化分数;推理时用整个学期的累积平均分(running statistics)来标准化——因为考试时只有你一个人(batch size = 1),没法算"班级平均"。
记忆小贴士:BN = “Batch Normalization”——沿 batch 维度归一化。训练用 batch 统计量,推理用全局统计量。
2.3 优势
- 加速收敛:允许使用更大的学习率(通常 10 倍以上)
- 稳定训练:减少梯度爆炸/消失
- 轻度正则化:每个样本的归一化受同一 batch 中其他样本影响,引入了随机性
2.4 致命缺陷
- 依赖 batch size:batch size 太小时(如 1~2),统计量噪声大,归一化效果退化甚至崩溃
- 训练/推理不一致:训练和推理使用不同的统计量,可能导致行为差异
- 不适合序列模型:RNN/Transformer 中不同序列长度的统计量不具可比性
- 不适合分布式训练:跨设备同步统计量带来通信开销
2.5 适用场景
CNN 的默认归一化(ResNet、VGG、EfficientNet 等)。batch size ≥ 16 时效果最好。
BatchNorm 依赖 batch size,在序列模型和小 batch 场景下失效。LayerNorm 的出现解决了这一问题——它对每个样本独立归一化,不依赖 batch 中的其他样本。
3. Layer Normalization(LN)
3.1 核心思想
简介:沿 特征维度计算统计量——对每个样本,跨所有特征计算均值和方差。2016 年由 Ba et al. 提出,专为 RNN 设计,后来成为 Transformer 的标配。
对于形状为 $(N, D)$ 的激活张量($D$ 为特征维度):
$$ \mu_i = \frac{1}{D}\sum_{d=1}^{D} x_{i,d}, \quad \sigma_i^2 = \frac{1}{D}\sum_{d=1}^{D} (x_{i,d} - \mu_i)^2 $$$$ \hat{x}_{i,d} = \frac{x_{i,d} - \mu_i}{\sqrt{\sigma_i^2 + \epsilon}}, \quad y_{i,d} = \gamma_d \hat{x}_{i,d} + \beta_d $$数值示例:假设一个样本的特征向量为 $[1, 2, 3, 4]$:
$$ \mu = \frac{1+2+3+4}{4} = 2.5, \quad \sigma^2 = \frac{(1-2.5)^2 + (2-2.5)^2 + (3-2.5)^2 + (4-2.5)^2}{4} = 1.25 $$$$ \hat{x} = \left[\frac{1-2.5}{\sqrt{1.25}}, \frac{2-2.5}{\sqrt{1.25}}, \frac{3-2.5}{\sqrt{1.25}}, \frac{4-2.5}{\sqrt{1.25}}\right] = [-1.342, -0.447, 0.447, 1.342] $$3.2 与 BatchNorm 的关键区别
| 特性 | BatchNorm | LayerNorm |
|---|---|---|
| 统计量维度 | 跨 batch(N, H, W) | 跨特征(D) |
| 依赖 batch size | 是(batch 小则退化) | 否(每个样本独立计算) |
| 训练/推理一致性 | 不一致(需 running stats) | 一致(训练推理相同) |
| 适合序列模型 | 不适合 | 适合 |
类比:个人标准化 vs 班级标准化。BatchNorm 用班级平均分标准化你的成绩(依赖班级);LayerNorm 用你自己的各科平均分标准化你的成绩(只依赖自己)。
记忆小贴士:LN = “Layer Normalization”——沿 layer(特征层)维度归一化。每个样本自己算均值方差,不依赖 batch。
3.3 为什么 Transformer 选择 LayerNorm
- 不依赖 batch size:Transformer 推理时 batch size 可能为 1
- 序列长度可变:LayerNorm 对每个 token 独立归一化,不受序列长度影响
- 训练推理一致:不需要维护 running statistics
3.4 Pre-Norm vs Post-Norm
LayerNorm 在 Transformer 中的位置有两种设计:
Post-Norm(原始 Transformer):$\text{LN}(x + \text{Sublayer}(x))$
Pre-Norm(GPT-2、现代 LLM):$x + \text{Sublayer}(\text{LN}(x))$
Pre-Norm 训练更稳定(梯度流更顺畅),但最终性能上限可能略低于精心调参的 Post-Norm。现代大语言模型几乎都采用 Pre-Norm。
import torch.nn as nn
# Post-Norm(原始 Transformer)
# output = LayerNorm(x + Attention(x))
# Pre-Norm(GPT-2、LLaMA 等)
# output = x + Attention(LayerNorm(x))
ln = nn.LayerNorm(normalized_shape=768) # 隐藏维度 768
output = ln(input_tensor)
适用场景:Transformer 架构的默认归一化(BERT、GPT、LLaMA 等)、RNN/LSTM。
LayerNorm 对所有特征做统一归一化,但在图像生成任务中,我们需要更细粒度的控制——每个通道独立归一化,以去除图像的风格信息。
4. Instance Normalization(IN)
4.1 核心思想
简介:沿 空间维度计算统计量——对每个样本的每个通道,独立计算均值和方差。2016 年由 Ulyanov et al. 提出,专为风格迁移设计。
对于形状为 $(N, C, H, W)$ 的激活张量:
$$ \mu_{i,c} = \frac{1}{H \cdot W}\sum_{h,w} x_{i,c,h,w}, \quad \sigma_{i,c}^2 = \frac{1}{H \cdot W}\sum_{h,w} (x_{i,c,h,w} - \mu_{i,c})^2 $$$$ \hat{x}_{i,c,h,w} = \frac{x_{i,c,h,w} - \mu_{i,c}}{\sqrt{\sigma_{i,c}^2 + \epsilon}} $$直觉:InstanceNorm 相当于 batch size = 1 的 BatchNorm(但每个通道独立)。它去除了每个样本每个通道的风格信息(均值和方差代表了图像的对比度和亮度),只保留内容信息。
类比:照片调色。每张照片的每个颜色通道(R、G、B)独立做亮度和对比度归一化——相当于把所有照片的"色调"统一,只保留"内容"差异。
记忆小贴士:IN = “Instance Normalization”——每个 instance(样本 × 通道)独立归一化。风格迁移的标配。
4.2 与 BatchNorm 的区别
BatchNorm 跨所有样本计算统计量(同一通道的所有样本共享均值方差);InstanceNorm 每个样本独立计算(同一个样本的同一个通道,单独算均值方差)。
BatchNorm: 所有样本的通道 c → 一个 μ, σ²
InstanceNorm: 每个样本的通道 c → 各自独立的 μ, σ²
4.3 适用场景
图像风格迁移(AdaIN、CycleGAN 等)。在风格迁移任务中,InstanceNorm 的效果显著优于 BatchNorm——因为它能有效去除图像的风格信息(均值和方差),只保留内容结构。
InstanceNorm 每个通道独立归一化,完全不利用通道间的关系。在目标检测等任务中,batch size 受限且通道间存在语义关联——GroupNorm 在两者之间找到了平衡。
5. Group Normalization(GN)
5.1 核心思想
简介:将通道分成若干组,在每组内沿通道和空间维度计算统计量。2018 年由 Wu & He 提出,作为 BatchNorm 在小 batch 场景下的替代方案。
将 $C$ 个通道分成 $G$ 组,每组 $C/G$ 个通道:
$$ \mu_{i,g} = \frac{1}{(C/G) \cdot H \cdot W}\sum_{c \in \text{group}_g}\sum_{h,w} x_{i,c,h,w} $$$$ \sigma_{i,g}^2 = \frac{1}{(C/G) \cdot H \cdot W}\sum_{c \in \text{group}_g}\sum_{h,w} (x_{i,c,h,w} - \mu_{i,g})^2 $$直觉:GroupNorm 是 InstanceNorm 和 LayerNorm 的"插值"——
- 当 $G = C$(每组 1 个通道)时,退化为 InstanceNorm
- 当 $G = 1$(所有通道一组)时,退化为 LayerNorm(CNN 版)
数值示例:假设通道数 $C = 4$,分组数 $G = 2$:
组 0: 通道 0, 通道 1 → 共享 μ₀, σ₀²
组 1: 通道 2, 通道 3 → 共享 μ₁, σ₁²
类比:小组讨论。BatchNorm 是全班一起算平均分;LayerNorm 是每个人自己算各科平均分;GroupNorm 是分成小组,组内算平均分。
记忆小贴士:GN = “Group Normalization”——把通道分成 group,组内归一化。$G = 1$ 是 LayerNorm,$G = C$ 是 InstanceNorm。
5.2 与 BatchNorm 的关键优势
| 特性 | BatchNorm | GroupNorm |
|---|---|---|
| 依赖 batch size | 是 | 否 |
| batch size = 1 时 | 崩溃 | 正常工作 |
| 检测任务 | 需要大 batch | 小 batch 也稳定 |
| 训练/推理一致性 | 不一致 | 一致 |
5.3 适用场景
目标检测(Detectron2 默认)、实例分割等 batch size 受限的视觉任务。Facebook 的 Mask R-CNN、FAIR 等模型使用 GroupNorm 替代 BatchNorm。
以上归一化技术都包含"减均值"步骤。RMSNorm 质疑了这一步的必要性——实验证明,缩放不变性才是归一化成功的关键。
6. RMSNorm(Root Mean Square Normalization)
6.1 核心思想
简介:LayerNorm 的简化版本——去掉均值中心化,只用均方根(RMS)做归一化。2019 年由 Zhang & Sennrich 提出,成为现代大语言模型(LLaMA、Gemma、Qwen 等)的标配。
$$ \text{RMS}(x) = \sqrt{\frac{1}{D}\sum_{i=1}^{D} x_i^2} $$$$ \hat{x}_i = \frac{x_i}{\text{RMS}(x)} \cdot \gamma_i $$注意:RMSNorm 没有减均值,也没有偏移参数 $\beta$。
与 LayerNorm 的对比:
| 步骤 | LayerNorm | RMSNorm |
|---|---|---|
| 减均值 | $x_i - \mu$ | 无 |
| 除标准差/RMS | $\div \sqrt{\sigma^2 + \epsilon}$ | $\div \text{RMS}(x)$ |
| 缩放参数$\gamma$ | 有 | 有 |
| 偏移参数$\beta$ | 有 | 无 |
数值示例:假设特征向量为 $[1, 2, 3, 4]$:
$$ \text{RMS} = \sqrt{\frac{1^2 + 2^2 + 3^2 + 4^2}{4}} = \sqrt{\frac{30}{4}} = \sqrt{7.5} = 2.739 $$$$ \hat{x} = \left[\frac{1}{2.739}, \frac{2}{2.739}, \frac{3}{2.739}, \frac{4}{2.739}\right] = [0.365, 0.730, 1.095, 1.461] $$对比 LayerNorm 的结果 $[-1.342, -0.447, 0.447, 1.342]$——RMSNorm 不中心化,保留了原始的相对大小关系。
6.2 为什么去掉均值中心化
Zhang & Sennrich 的实验发现:LayerNorm 的成功主要归功于缩放不变性(除以 RMS),而非平移不变性(减均值)。去掉均值中心化后:
- 计算更快:省去一次均值计算和减法操作
- 效果相当:在多数任务上与 LayerNorm 持平
- 更适合大规模:在 LLM 中节省的计算量累积起来非常可观
类比:简化版标准化考试。LayerNorm 先把所有分数减去平均分再除以标准差;RMSNorm 直接除以"均方根分数"——省去了减均值的步骤,效果几乎一样。
记忆小贴士:RMSNorm = “Root Mean Square Normalization”——只用 RMS 做归一化,不减均值。现代 LLM 的标配。
6.3 代码实现
import torch
class RMSNorm(torch.nn.Module):
def __init__(self, dim, eps=1e-6):
super().__init__()
self.eps = eps
self.weight = torch.nn.Parameter(torch.ones(dim))
def forward(self, x):
rms = torch.sqrt(torch.mean(x ** 2, dim=-1, keepdim=True) + self.eps)
return x / rms * self.weight
6.4 适用场景
现代大语言模型的默认归一化(LLaMA、Gemma、Qwen、Mistral 等)。在参数量达到数十亿的模型中,RMSNorm 节省的计算开销不可忽视。
以上归一化技术都作用于激活值。还有一些技术选择归一化权重本身——从不同角度约束网络的表达能力。
7. 其他归一化技术
7.1 Weight Normalization(WeightNorm)
简介:不归一化激活值,而是归一化权重向量。将权重分解为方向和幅度两部分:
$$ w = g \cdot \frac{v}{\|v\|} $$其中 $v$ 是权重方向(可学习),$g$ 是标量幅度(可学习)。
记忆小贴士:WeightNorm = 对 weight 做归一化——把权重拆成"方向"和"大小"分开学习。
适用场景:强化学习、生成模型等对训练稳定性要求高的任务。效果通常不如 BatchNorm/LayerNorm,但实现简单。
7.2 Spectral Normalization(SpectralNorm)
简介:通过限制权重矩阵的谱范数(最大奇异值)来控制 Lipschitz 常数。核心公式:
$$ W_{\text{SN}} = \frac{W}{\sigma(W)} $$其中 $\sigma(W)$ 是 $W$ 的最大奇异值(通过幂迭代法近似计算)。
类比:限制放大倍数。SpectralNorm 相当于给每一层装了一个"音量限制器"——不管输入信号多大,输出的放大倍数(Lipschitz 常数)不超过 1。
记忆小贴士:SpectralNorm = 归一化权重的谱范数(最大奇异值)——限制每一层的"放大能力"。
适用场景:GAN 的判别器(WGAN-GP、SN-GAN),确保判别器是 1-Lipschitz 函数。
7.3 Switchable Normalization(SN)
简介:自动学习 BatchNorm、InstanceNorm、LayerNorm 的加权组合。网络自己决定每层该用哪种归一化。
$$ y = \hat{w}_{\text{IN}} \cdot \text{IN}(x) + \hat{w}_{\text{LN}} \cdot \text{LN}(x) + \hat{w}_{\text{BN}} \cdot \text{BN}(x) $$其中 $\hat{w}$ 是归一化后的权重(softmax)。
适用场景:不确定该用哪种归一化时的"自动选择"方案。
8. 归一化技术选择指南
| 场景 | 推荐归一化 | 核心原因 | 记忆关键词 |
|---|---|---|---|
| CNN(大 batch) | BatchNorm | 经验验证最充分 | 跨 batch 统计 |
| CNN(小 batch / 检测) | GroupNorm | 不依赖 batch size | 组内统计 |
| Transformer / LLM | RMSNorm | 计算高效,现代标配 | 只用 RMS |
| Transformer(通用) | LayerNorm | 经典方案,兼容性好 | 跨特征统计 |
| 风格迁移 | InstanceNorm | 去除风格信息 | 单样本单通道 |
| GAN 判别器 | SpectralNorm | 控制 Lipschitz 常数 | 最大奇异值 |
| 强化学习 | LayerNorm / WeightNorm | 训练稳定性 | 跨特征 / 权重分解 |
| 不确定时 | GroupNorm | 无超参数依赖(除 G) | 万金油 |
9. 归一化技术演进脉络
flowchart TD
BN["BatchNorm<br/>2015"] --> LN["LayerNorm<br/>2016"]
BN --> IN["InstanceNorm<br/>2016"]
LN --> GN["GroupNorm<br/>2018"]
IN --> GN
LN --> RMSNorm["RMSNorm<br/>2019"]
BN --> WN["WeightNorm<br/>2016"]
SN["SpectralNorm<br/>2018"]
从上图可以看出,归一化技术的发展遵循一条清晰的脉络:
- BatchNorm 开创期(2015):第一个被广泛采用的归一化技术,解决了深层网络训练难的问题
- 任务特化期(2016):LayerNorm 为序列模型设计,InstanceNorm 为风格迁移设计
- 通用化期(2018):GroupNorm 统一了 InstanceNorm 和 LayerNorm,消除 batch size 依赖
- 效率优化期(2019 至今):RMSNorm 去掉冗余的均值中心化,成为 LLM 标配
理解了这条演进脉络,就掌握了归一化技术设计的核心哲学:在统计量计算的粒度(跨 batch vs 跨特征 vs 跨通道)和计算效率之间寻找最佳平衡点。
延伸阅读:关于 Pre-Norm vs Post-Norm 对 Transformer 训练稳定性影响的详细分析,可参考 大语言模型训练机制全解·第一篇 的相关章节。