BN 在训练阶段和测试阶段
训练阶段
在训练时,BN 的工作原理如下:
- 对每个 Batch 进行归一化:在每个 mini-batch 的训练数据上,计算该 batch 数据的均值和方差,然后用这些统计量对数据进行归一化。具体来说,对于输入的每一层激活值 $x$,BN 会计算该 batch 的均值 $\mu_B$ 和方差 $\sigma_B^2$,然后进行如下变换:$$\hat{x} = \frac{x - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}$$
- 其中 $\epsilon$ 是为了防止除零的小常数。
- 引入可学习的参数:归一化后的数据 $\hat{x}$ 会通过可学习的缩放参数 $\gamma$ 和偏移参数 $\beta$ 进行线性变换,恢复数据的表达能力:$$y = \gamma \hat{x} + \beta$$
- 滑动平均统计量:在训练过程中,BN 会维护一个滑动平均的全局均值 $\mu_{global}$ 和全局方差 $\sigma_{global}^2$,这些值会在每个 batch 的训练中更新。
- Batch Size:BN 依赖于 batch 的统计量,因此 batch size 需要足够大,以确保计算出的均值和方差能够较好地代表整个训练集的分布。如果 batch size 过小,可能导致统计量不稳定,影响模型性能。
- 数据打乱:为了确保每个 batch 的数据分布尽可能接近全量数据的分布,通常需要在训练前对数据完全打乱(shuffle)。
- 滑动平均的动量参数:在计算全局统计量时,滑动平均的动量参数需要谨慎选择,以平衡当前 batch 统计量和历史统计量的权重。
测试阶段
在测试时,由于没有 batch 的概念,BN 的行为会有所不同:
- 使用全局统计量:BN 会使用训练过程中通过滑动平均得到的全局均值 $\mu_{global}$ 和全局方差 $\sigma_{global}^2$ 进行归一化,而不是依赖于当前 batch 的统计量。
- 公式不变:归一化的公式与训练时相同: $$ \hat{x} = \frac{x - \mu_{global}}{\sqrt{\sigma_{global}^2 + \epsilon}} $$
- 然后同样使用训练好的 $\gamma$ 和 $\beta$ 进行线性变换$$y = \gamma \hat{x} + \beta$$
BN中的移动平均
在 Batch Normalization(BN)中,移动平均(Moving Average) 用于在训练过程中累积全局的均值和方差,这些值在测试阶段用于归一化数据。以下是关于 BN 中移动平均的详细总结:
移动平均的计算方法
在训练过程中,每个 batch 的均值和方差会被用来更新全局的移动平均值:
更新公式
$$mean_{moving} = mean_{moving} \times momentum + mean_{batch} \times (1 - momentum)$$
$$ var_{moving} = var_{moving} \times momentum + var_{batch} \times (1 - momentum) $$
其中,momentum
是动量参数,控制历史值和新值的权重。
优化实现
$$mean_{moving} -= (mean_{moving} - mean_{batch}) \times (1 - momentum)$$
$$var_{moving} -= (var_{moving} - var_{batch}) \times (1 - momentum)$$
初始值
moving_mean
初始为 0。moving_var
初始为 1(对应标准正态分布)。
Momentum 参数的作用
Momentum 控制了移动平均的更新幅度,对训练和预测阶段的影响如下:
- 较小的 momentum(如 0.9):
- 更新步长较大,移动平均更快接近真实分布。
- 但波动性更大,可能导致预测阶段的归一化不够稳定。
- 较大的 momentum(如 0.99):
- 更新步长较小,移动平均的变化更平缓。
- 最终值更接近真实分布,但需要更长的训练步数才能收敛。
- 训练步数的影响:
- 如果训练步数较少,较大的 momentum 可能导致移动平均未能充分接近真实分布,导致欠拟合。
- 如果训练步数足够,较大的 momentum 可以使移动平均更精确。
- Batch Size 的影响:
- 当 batch size 较小时,单个 batch 的均值和方差与真实分布差异较大,此时适合使用较大的 momentum,以减少波动。
- 当 batch size 较大时,适合使用较小的 momentum,以更快收敛。
移动平均的作用
- 训练阶段:移动平均不会影响训练过程,训练时使用的是当前 batch 的均值和方差。
- 测试阶段:使用移动平均累积的全局均值和方差进行归一化,确保模型在不同输入下的稳定性。
Norm 中的标准化、平移和缩放的作用
神经网络的训练过程中存在三个核心挑战:
- 参数适应性问题:上层的参数需要不断适应新的输入数据分布,这种持续的适应性需求会显著降低学习速度。
- 梯度饱和现象:下层的输入变化可能呈现持续放大或缩小的趋势,导致上层神经元的激活值落入饱和区,从而造成梯度消失,使学习过早停滞。
- 参数更新耦合:每一层的参数更新都会对其它层产生影响,这种高度耦合性使得参数更新策略需要格外谨慎。
归一化技术通过标准化 + 平移和缩放这两个核心操作,有效地缓解了这些问题:
- 标准化操作在保持数据原有排序关系的同时,消除了因量纲和数量级带来的数据差异。这种线性变换将每层神经网络的输出转换为均值为0、方差为1的标准分布,使得数据分布不再受下层神经网络的直接影响(注意:具体数值仍依赖于下层输出,但分布形式独立)。
- 平移和缩放操作的加入是为了确保模型的表达能力不会因标准化而降低。这里的核心在于引入了两个可学习参数 γ(缩放参数)和 β(平移参数),它们具有以下优势:
- 独立性:与传统的参数相比,新参数使得x的均值和方差仅由γ和β决定,摆脱了与下层计算的强耦合关系。
- 灵活性:新参数可以通过梯度下降更容易地学习,简化了神经网络的训练过程。
- 兼容性:在特殊情况下,当γ等于batch的标准差,β等于batch的均值时,Norm操作将被完全抵消,恢复到原始输入状态,这种特性确保了模型的兼容性。
神经网络能够在保持标准化优势的同时,完全保留学习到的特征表示。每层神经元的数据分布可以独立地进行调整,摆脱对下层输出的依赖,从而显著改善训练稳定性、加速收敛速度,并提高模型的泛化能力。
不同Norm方法中都有哪些参数要保存
- BN的参数包括
- 每个神经元在训练过程中得到的均值和方差,通过移动平均得到
- 每个神经元上的缩放参数 γ 和平移参数 β
- LN 只包括上面的第2部分参数,因为它和batch无关,无需记录第1部分参数
为什么Transformer/BERT使用LN,而不使用BN
最直白的原因,还是因为用LN的效果更好,这个在Transformer论文中作者有说到。但背后更深层次的原因,这个在知乎上有广泛的讨论,不过并没有一个统一的结论,这里我摘录两个我相对认可的回答:
观点一:Embedding的分布
图像数据是自然界客观存在的,像素的组织形式已经包含了“信息”,而NLP数据不一样,网络对NLP数据学习的真正开端是从’embedding’开始的,而这个‘embedding’并不是客观存在,它也是通过网络学习出来的。
下面只从直观理解上从两个方面说说个人看法:
- layer normalization 有助于得到一个球体空间中符合0均值1方差高斯分布的 embedding, batch normalization不具备这个功能。
- layer normalization可以对transformer学习过程中由于多词条embedding累加可能带来的“尺度”问题施加约束,相当于对表达每个词一词多义的空间施加了约束,有效降低模型方差。batch normalization也不具备这个功能。
emmbedding并不存在一个客观的分布,那我们需要考虑的是:我们希望得到一个符合什么样分布的embedding?
很好理解,通过layer normalization得到的embedding是 以坐标原点为中心,1为标准差,越往外越稀疏的球体空间中。
观点二:损失哪部分的信息
说简单点,其实深度学习里的正则化方法就是"通过把一部分不重要的复杂信息损失掉,以此来降低拟合难度以及过拟合的风险,从而加速了模型的收敛"。Normalization目的就是让分布稳定下来(降低各维度数据的方差)。
不同正则化方法的区别只是操作的信息维度不同,即选择损失信息的维度不同。
在CV中常常使用BN,它是在NHW维度进行了归一化,而Channel维度的信息原封不动,因为可以认为在CV应用场景中,数据在不同channel中的信息很重要,如果对其进行归一化将会损失不同 channel的差异信息。
而NLP中不同batch样本的信息关联性不大,而且由于不同的句子长度不同,强行归一化会损失不同样本间的差异信息,所以就没在batch维度进行归一化,而是选择LN,只考虑的句子内部维度的归一化。可以认为NLP应用场景中一个样本内部维度间是有关联的,所以在信息归一化时,对样本内部差异信息进行一些损失,反而能降低方差。
总结一下:选择什么样的归一化方式,取决于你关注数据的哪部分信息。如果某个维度信息的差异性很重要,需要被拟合,那就别在那个维度进行归一化。