Batch Normalization
批归一化会对小批次中的每个通道进行标准化,再用学习得到的参数重新缩放。本文介绍相关数学原理、推理时的行为和局限。
批归一化(BatchNorm)是一种神经网络层,它使用当前小批次的均值和方差对输入的每个通道进行归一化,然后用两个可学习参数重新缩放结果。Sergey Ioffe 和 Christian Szegedy 于2015 年提出了它,让他们的 Inception 图像分类器仅用原来十四分之一的训练步数就达到相同的准确率。BatchNorm 支持使用更高的学习率,降低训练对权重初始化的敏感性,并成为卷积神经网络(CNNs)(如 ResNet)等模型的标准组件。
批归一化的工作原理#
对于卷积层,BatchNorm 会为每个通道计算一个均值 μ 和一个方差 σ²,统计范围涵盖批次中的每张图像和每个空间位置。每个激活值 x 随后经过两个步骤:
- 归一化:x̂ = (x − μ) / √(σ² + ε),其中较小的 ε(在 PyTorch 中默认为 1e-5)可避免除以零。
- 缩放与平移:y = γ·x̂ + β,其中 γ 和 β 是按通道学习的参数。它们让网络能够恢复适合下一层的均值和离散程度,包括完全撤销归一化。
BatchNorm 通常位于卷积层和激活函数之间。由于 β 已经添加了按通道的偏移量,前一卷积层的偏置是多余的,通常会禁用。
训练与推理#
训练期间,每次前向传播都会将批次统计量的指数移动平均值更新到运行均值和运行方差中。PyTorch 的 BatchNorm2d 默认会朝每个新批次的统计量移动 10%(momentum=0.1)。推理时,该层会改用这些运行平均值进行归一化,因此单张图像的预测结果不再取决于同一批次中的其他图像。model.train() 和 model.eval() 可以在这两种行为之间切换:
import torch
torch.manual_seed(0)
bn = torch.nn.BatchNorm2d(num_features=3)
# A batch of 8 three-channel feature maps with mean 5 and standard deviation 2
x = 5 + 2 * torch.randn(8, 3, 16, 16)
# Training mode normalizes with this batch's per-channel mean and variance
out = bn(x)
print(f"train mode: output mean {out.mean():.3f}, std {out.std():.3f}")
# The same call nudges the running averages 10% of the way toward the batch statistics
print(f"running mean {bn.running_mean[0]:.3f}, running var {bn.running_var[0]:.3f}")
# Eval mode normalizes with the running averages instead of the batch statistics
bn.eval()
out = bn(x)
print(f"eval mode: output mean {out.mean():.3f}, std {out.std():.3f}")在训练模式下,尽管输入均值为 5,输出均值仍为 0.000,标准差为 1.000。处理一个批次后,运行均值仅从 0 移至 0.496,运行方差从 1 移至 1.294,因此评估模式下的输出均值为 3.920。运行平均值需要几十个批次才能收敛;如果模型处于错误模式,或统计量尚未稳定就进行评估,其得分会远低于真实准确率。
推理时,BatchNorm 是固定的按通道线性变换,因此可以折叠到前面的卷积层中:卷积权重乘以 γ/√(σ² + ε),偏置变为 β − γμ/√(σ² + ε)。YOLO26中的标准卷积模块由无偏置卷积、BatchNorm 和 SiLU 激活组成;Ultralytics 会在预测和导出之前,将每个 BatchNorm 层融合到对应的卷积层中,从而移除该层,同时保持输出不变。
批归一化为何有效#
原论文认为,BatchNorm 的优势来自减少内部协变量偏移,即前面各层更新时每层输入分布发生的变化。后来的实验在 BatchNorm 层后注入随机分布偏移,发现训练几乎不受影响,并将其优势归因于更平滑的损失曲面和更可预测的梯度;这让优化器能够采取更大、更稳定的步长。让激活前的值保持接近零均值和单位方差,也能避免饱和激活函数落入平坦区域,从而有助于缓解梯度消失。
由于每个样本都使用随机抽取批次的统计量进行归一化,BatchNorm 还会引入噪声,起到温和的正则化作用;原论文报告称,在某些情况下,它可以免去使用 dropout。
局限性#
- 小批次:每个设备上的图像数量较少时,批次统计量会变得嘈杂。每个 GPU 处理 2 张图像时,组归一化(在每张图像内部按通道组计算统计量)在 ResNet-50 上的 ImageNet 错误率比 BatchNorm 低 10.6%。
- 多 GPU 训练:除非将层转换为 SyncBatchNorm,否则每个 GPU 都会使用批次中分配给自己的部分进行归一化。SyncBatchNorm 会跨设备汇总统计量,但需要额外的通信开销。
- 序列模型:可变长度序列与依赖批次的统计量不太匹配,因此 Transformer 使用层归一化。










