站长提示:本文是前文《Transformer 为什么用 LayerNorm 而不用 BatchNorm?两者在训练和推理阶段的行为差异是什么?》的补充资料。
训练时,BN 对一个 batch 的数据做归一化:
均值 μ_batch = batch 内该特征的平均值
方差 σ²_batch = batch 内该特征的方差
归一化: x_norm = (x - μ_batch) / √(σ²_batch + ε)
再缩放平移: y = γ · x_norm + β
其中 γ 和 β 是可学习参数。
关键点:训练时用的 μ 和 σ² 是当前 batch 现算的。
但问题来了:
所以 BN 需要一套推理时用的固定统计量。
训练过程中,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。
直观理解:
注意:这两个变量不是通过反向传播学的,而是训练过程中顺带统计出来的。
推理时,BN 不再看当前 batch,而是直接用训练阶段累积的:
y = γ · (x - running_mean) / √(running_var + ε) + β
也就是说:
这样推理结果就只依赖当前样本本身,和 batch 里其他样本无关,行为稳定可复现。
因为两个阶段用的统计量来源不同:
| 阶段 | 均值/方差来源 |
|---|---|
| 训练 | 当前 batch 现算 |
| 推理 | 训练累积的 running 统计量 |
这带来几个问题:
而 LayerNorm:
这就是之前说“BN 训练和推理不一致,LN 一致”的具体含义。
running mean / running var 是 BatchNorm 在训练过程中累积的全局均值和方差,推理时用它替代 batch 统计量,以保证推理结果不依赖 batch。代价是训练和推理行为不一致,且统计量质量受 batch 大小和分布影响。LayerNorm 没有这个问题,因为它对每个样本独立归一化,训练和推理一致。
评论专区
评论加载中...登录后即可发表评论