✨ 复制成功!

以文会友,打造好学人设!

📋 已复制到剪贴板:

【补充资料】BatchNorm 在训练阶段和推理阶段行为不同的核心点

创建时间:2026-09-15 更新时间:2026-09-16 阅读次数:1492 次 分类:模型架构与Transformer

站长提示:本文是前文《Transformer 为什么用 LayerNorm 而不用 BatchNorm?两者在训练和推理阶段的行为差异是什么?》的补充资料。

一、BatchNorm 在训练时做什么

训练时,BN 对一个 batch 的数据做归一化:

均值 μ_batch = batch 内该特征的平均值
方差 σ²_batch = batch 内该特征的方差
归一化: x_norm = (x - μ_batch) / √(σ²_batch + ε)
再缩放平移: y = γ · x_norm + β

其中 γ 和 β 是可学习参数。

关键点:训练时用的 μ 和 σ² 是当前 batch 现算的。

但问题来了:

  • 推理时可能只来一个样本,没有 batch,算不出 batch 统计量。
  • 即使有 batch,推理时也不希望输出依赖“同 batch 其他样本”,否则同一句话在不同 batch 里结果不一样。

所以 BN 需要一套推理时用的固定统计量。

二、running mean / running var 是什么

训练过程中,BN 会额外维护两个全局变量:

  • running_mean:滑动平均的均值

  • running_var:滑动平均的方差

每训练一个 batch,就用当前 batch 的统计量去更新它们:

running_mean = (1 - momentum) · running_mean + momentum · μ_batch
running_var  = (1 - momentum) · running_var  + momentum · σ²_batch

其中 momentum 是超参,PyTorch 默认 0.1。

直观理解:

  • 每来一个 batch,就把它的均值和方差按比例“揉”进全局统计量。
  • 训练越久,running_mean / running_var 越接近整个训练集的真实均值和方差。
  • 它们相当于对训练数据分布的一个累积估计。

注意:这两个变量不是通过反向传播学的,而是训练过程中顺带统计出来的。

三、推理时怎么用

推理时,BN 不再看当前 batch,而是直接用训练阶段累积的:

y = γ · (x - running_mean) / √(running_var + ε) + β

也就是说:

  • 训练时:用当前 batch 的 μ_batch、σ²_batch
  • 推理时:用训练累积的 running_mean、running_var

这样推理结果就只依赖当前样本本身,和 batch 里其他样本无关,行为稳定可复现。

四、为什么这会造成“训练和推理不一致”

因为两个阶段用的统计量来源不同:

阶段均值/方差来源
训练当前 batch 现算
推理训练累积的 running 统计量

这带来几个问题:

  • 训练和推理行为不一致:同一份输入,训练时和推理时的归一化结果可能不同。
  • 依赖 running 统计量的质量:如果训练不充分、batch 分布偏差大,running 统计量不准,推理效果就差。
  • 小 batch 更严重:batch 小,μ_batch 噪声大,running 统计量也波动大。
  • 变长序列更麻烦:NLP 里 batch 内长度不一,padding 影响统计量,running 统计量也被污染。

而 LayerNorm:

  • 训练和推理都只用当前样本自己的均值和方差
  • 不需要维护 running 统计量
  • 训练和推理完全一致

这就是之前说“BN 训练和推理不一致,LN 一致”的具体含义。

五、一句话总结

running mean / running var 是 BatchNorm 在训练过程中累积的全局均值和方差,推理时用它替代 batch 统计量,以保证推理结果不依赖 batch。代价是训练和推理行为不一致,且统计量质量受 batch 大小和分布影响。LayerNorm 没有这个问题,因为它对每个样本独立归一化,训练和推理一致。


📌 面试天下网:一款服务于大一新生的口袋书,让大家在无聊的公共课上可以学习大模型技术!
📌 网站公告:【悬赏 200 元/篇】寻找“大模型面试战场”的一手回忆录
📌 网站公告:【大模型/Agent面试陪练1V1指导】正式启动......

评论专区

评论加载中...