批量归一化:加速收敛

2015 年「Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift」提出在神经网络每层输入上做归一化,使分布保持稳定,从而可以使用更大的学习率、减少精心初始化与 Dropout 的依赖,显著加快收敛。

训练期怎么算

对某个特征通道,在一个 mini-batch 内计算均值与方差,用它们把激活标准化为均值 0、方差 1,再乘以可学习的缩放参数 gamma 与平移参数 beta。这两个参数让网络在需要时保留表达能力,而不是被强行归一化到固定分布。

import torch.nn as nn

bn = nn.BatchNorm2d(num_features=64, momentum=0.1, eps=1e-5)
x = torch.randn(32, 64, 28, 28)
y = bn(x)        # 按通道在 batch 维度标准化

推理期用滑动平均

训练时用的是当前 batch 的统计量,但推理时往往单样本或批量不一致,不能直接用 batch 均值。BatchNorm 在训练过程中维护全局的「滑动平均均值与方差」(running_mean、running_var),推理期改用这些全局统计量,保证输出确定性。

为什么能加速收敛

深层网络每层输入分布随前层参数更新而不断变化,称为内部协变量偏移。批量归一化把每层输入稳定在一个较固定的分布上,梯度更平稳,优化地形更友好,因此可以使用更大学习率而不易发散。

注意点

批量归一化依赖 batch 统计量,batch 太小(如 batch size 为 1 或 2)时估计噪声大、效果变差;此时可考虑 LayerNorm、GroupNorm 等不依赖 batch 的归一化。另外它会增加少量显存与计算开销。

小结

批量归一化通过对 mini-batch 标准化并配合可学习参数,稳定每层输入分布、加速并稳定训练,推理期改用滑动平均统计量。它是训练深层卷积网络时常用的基础组件,但在小批量场景需谨慎或在与归一化替代方案间权衡。

参考与延伸阅读

本文累计阅读