层归一化是针对某一样本的所有特征,批归一化是针对所有样本的某一特征。
计算公式:(当前值 - 均值)/ 标准差。
作用:缓解梯度消失和梯度爆炸的问题,并提高网络的泛化性能。
为什么Transform和BERT中使用层归一化而不使用批归一化?
对序列长度的适应性
层归一化:层归一化是对单个样本的所有特征维度进行归一化,不受序列长度的影响。在处理变长的序列数据时,如自然语言文本,无论句子长度如何变化,层归一化都能稳定地对每个样本进行归一化操作,使得模型能够更好地处理不同长度的输入序列。
批归一化:批归一化是对一批样本的同一特征维度进行归一化,当处理变长序列数据时,由于不同样本的序列长度可能不同,会导致在计算均值和方差时出现问题。比如,对于较短的序列,可能需要在末尾进行填充以达到与其他样本相同的长度,这会引入额外的噪声,影响归一化的效果。
模型训练的稳定性
层归一化:层归一化在计算归一化统计量时仅依赖于当前层的输入,不依赖于其他批次的样本,因此在训练过程中受批次大小变化的影响较小,能够更稳定地进行训练,有助于模型更快地收敛。
批归一化:批归一化的效果依赖于批次内样本的统计特性,如果批次大小较小,计算得到的均值和方差可能不准确,导致归一化效果不佳,进而影响模型的训练稳定性。而在 Transformer 和 BERT 等模型的训练中,由于数据的复杂性和硬件限制,有时可能无法使用较大的批次大小。
对并行计算的友好性
层归一化:层归一化在计算归一化时只需要对单个样本进行操作,不需要像批归一化那样等待整个批次的样本都准备好才能进行计算,因此更容易实现并行计算,能够更好地利用现代硬件的并行计算能力,提高训练和推理的效率。
批归一化:批归一化需要在批次维度上进行统计量的计算和归一化操作,这在一定程度上限制了并行计算的程度,尤其是在处理变长序列数据时,需要对不同长度的序列进行对齐和填充等操作,进一步增加了计算的复杂性和并行计算的难度。
与模型架构的契合度
层归一化:Transformer 和 BERT 等模型的架构主要是基于自注意力机制和多层感知机等组件构建的,这些组件的输入和输出都是单个样本的特征表示。层归一化能够直接对这些特征进行归一化,与模型的架构和计算流程更加契合,能够更好地融入到模型的整体结构中,有助于提高模型的性能。
批归一化:批归一化的设计初衷是针对卷积神经网络等模型,其主要目的是加速模型的训练和减少过拟合。在 Transformer 和 BERT 等模型中,批归一化的效果并不如在卷积神经网络中那么显著,而且可能会引入一些不必要的复杂性和计算开销。
位置信息编码
层归一化:在Transform中位置编码采用的是相对的位置编码,层归一化是对某个样本做线性变化,不会破坏其中的位置信息。