Heng's Blog
02 02

Batch Normalization(BN)和 Layer Normalization(LN)都通过标准化激活值来改善神经网络的优化过程,但二者计算统计量的维度不同,因此适用场景也不同。

本文整理自 hengproject/ML_recall 中的 basics/Normalizations.ipynb。延伸讲解可参考 Deep Learning Basics: Batch Normalization

Batch Normalization#

设一个 mini-batch 为 B={x1,,xm}\mathcal{B} = \{x_1, \ldots, x_m\},BN 首先按 batch 维度计算每个特征的均值与方差:

μB=1mi=1mxi,σB2=1mi=1m(xiμB)2,x^i=xiμBσB2+ϵ,yi=γx^i+β.\begin{aligned} \mu_{\mathcal{B}} &= \frac{1}{m}\sum_{i=1}^{m}x_i, \\ \sigma_{\mathcal{B}}^2 &= \frac{1}{m}\sum_{i=1}^{m}(x_i - \mu_{\mathcal{B}})^2, \\ \hat{x}_i &= \frac{x_i - \mu_{\mathcal{B}}}{\sqrt{\sigma_{\mathcal{B}}^2 + \epsilon}}, \\ y_i &= \gamma\hat{x}_i + \beta. \end{aligned}

γ\gammaβ\beta 是可学习参数,使网络能够恢复或重新调整每个特征的尺度和偏移。

下面是一个二维输入的 NumPy 实现,其中形状为 (batch_size, features)

这里的 axis=0 表示:对 batch 中所有样本的同一个特征计算统计量。

训练与推理#

训练时,BN 使用当前 mini-batch 的统计量,并维护均值和方差的移动估计。

推理时通常使用训练期间累计的移动统计量,而不是依赖当前输入 batch。

BN 往往能够:

  • 改善优化过程中的梯度传播;
  • 允许使用更高的学习率;
  • 降低网络对参数初始化的敏感度;
  • 引入依赖 mini-batch 的随机性,产生一定正则化效果。

“减少 internal covariate shift”是 BN 原论文提出的解释,但后续研究表明,这并不足以完整解释 BN 的效果。实践中,更稳妥的理解是 BN 改变并平滑了优化问题的几何性质。

Layer Normalization#

LN 不在不同样本之间聚合统计量,而是对单个样本的特征维度进行归一化。对一个包含 HH 个特征的样本 H={x1,,xH}\mathcal{H} = \{x_1, \ldots, x_H\}

μH=1Hi=1Hxi,σH2=1Hi=1H(xiμH)2,x^i=xiμHσH2+ϵ,yi=γx^i+β.\begin{aligned} \mu_{\mathcal{H}} &= \frac{1}{H}\sum_{i=1}^{H}x_i, \\ \sigma_{\mathcal{H}}^2 &= \frac{1}{H}\sum_{i=1}^{H}(x_i - \mu_{\mathcal{H}})^2, \\ \hat{x}_i &= \frac{x_i - \mu_{\mathcal{H}}}{\sqrt{\sigma_{\mathcal{H}}^2 + \epsilon}}, \\ y_i &= \gamma\hat{x}_i + \beta. \end{aligned}

对应的 NumPy 实现只需改变统计维度:

这里的 axis=1 表示:分别对每个样本内部的所有特征计算统计量。LN 不依赖同一 batch 中的其他样本,因此训练与推理时的计算方式一致。

BN 与 LN 的选择#

对比项Batch NormalizationLayer Normalization
统计范围同一特征跨 batch 中的样本单个样本内部的特征
对 batch 大小的依赖有,小 batch 下统计量可能不稳定
训练与推理行为使用不同来源的统计量一致
常见场景CNN、较大且稳定的 batchTransformer、RNN、变长序列、小 batch

需要注意,真实张量往往不止两个维度。例如卷积网络中的 BatchNorm2d 会按通道统计 batch 与空间位置,而 Transformer 的 LayerNorm 通常只作用于最后的隐藏维度。判断归一化行为时,应先明确张量形状和被归约的轴。

Batch Normalization 与 Layer Normalization
https://heng-blog.pages.dev/blog/batch-norm-vs-layer-norm
Author 杨苏恒
Published at April 17, 2025