1.2.3 标准化和残差连接
1.标准化
Transformer模型的编码器和解码器都是6层的神经网络,而网络层级越多则越可能出现梯度消失和梯度爆炸的问题。对于此类问题,一般可以通过标准化等方式解决,使得模型最终能够收敛。
神经网络中的标准化(或称归一化)是一种重要的预处理步骤,它的目的是将输入数据在传递至神经元之前进行平移和伸缩变换,使得数据规范化分布到一个固定的区间范围内,通常呈标准正态分布。标准化的过程可以通过下述公式来描述:
其中,x代表输入数据,μ和σ分别代表数据的平移参数和缩放参数,b和g是再平移和再缩放的参数。经过这种变换后,得到的数据将符合均值为b、方差为g2的分布。
深度神经网络中的每一层都可以看作相对独立的分类器,它们对上一层的输出数据进行分类。然而,由于每一层输出的数据分布都可能不同,这可能会导致内部协变量偏移(Internal Covariate Shift,ICS)的问题。随着网络层数的增加,这种偏移的误差也会逐渐累积,最终可能会导致网络的性能下降。此外,由于神经网络的主要运算都是矩阵运算,一个向量的值经过矩阵运算后容易变得越来越大。为了防止这种情况发生,我们需要及时将数据拉回到正态分布。标准化的主要目的是保持神经网络的稳定性。
根据标准化操作的维度不同,我们可以将其分为批标准化(Batch Normalization)和层标准化(Layer Normalization),当然也有其他标准化方式,如实例标准化(Instance Normalization)、组标准化(Group Normalization)等。无论在哪个维度上进行标准化,其本质都是让数据在该维度上进行缩放。例如,批标准化是通过对批量大小(batch size)这个维度的标准化来稳定数据的分布,而层标准化则是通过对隐藏层大小(hidden size)这个维度的标准化来稳定某一层的数据分布,如图1-23所示。
图1-23 批标准化和层标准化示意
做NLP领域的任务时,每个样本通常都是一个句子,并且句子不一定等长,有可能出现在一个小批量数据里某一个句子特别长而其他句子都很短的情况,因此用批标准化是不合理的,将直接导致最终模型的效果不理想。在Transformer模型中使用了层标准化,即在特征通道上对C、H、W(C张量为通道数,H张量为高度,W张量为宽度)进行标准化。也就是说,层标准化计算的是每一个样本的均值和方差,这种情况下,不同的输入样本就有不同的均值和方差。层标准化不依赖批量的大小和输入序列的长度,因此比较适合处理NLP领域的任务中大量文本不等长的情况。
在层标准化中,对于给定的样本,其中N是批量大小,D是特征维度,首先可以计算每个样本的均值和方差。
接下来可以用均值和方差对输入进行标准化
其中ε是一个很小的正数,用来防止分母为0。最后可以得到重新缩放和偏移后的输出
其中γ和β是可学习的参数。
层标准化的位置也有讲究,分为Pre-LN、Post-LN和Sandwich-LN,其结构如图1-24所示。顾名思义,Pre-LN就是将层标准化放在残差连接之前,能够让模型的训练更加稳定,但是模型效果略差。Post-LN则是将层标准化放在残差连接之后,参数正则化的效果更强,虽然模型效果更好,但是可能会导致模型训练不稳定,这是由网络深层的梯度范式逐渐增大导致的。那么,自然而然地,我们可以想到将两者结合起来,于是就有了Sandwich-LN,即在残差连接之前和之后都加入层标准化。Cogview(清华大学与阿里巴巴共同研究的文生图模型)就使用了Sandwich-LN来防止出现值爆炸的问题,但是仍然会出现训练不稳定的问题,可能会导致训练崩溃。
图1-24 Pre-LN、Post-LN和Sandwich-LN的结构示意
在NLP领域发展的早期阶段,例如BERT模型,由于其神经网络层数相对较少,通常会采用Post-LN。而随着模型的发展,Transformer结构模型开始增加更多的层数,例如GPT模型,这给训练稳定性带来了挑战。因此,研究人员开始使用Pre-LN,以提高深层Transformer模型的训练稳定性。
为了解决模型训练不稳定的问题,论文“DeepNet: Scaling Transformers to 1000 Layers”(https://arxiv.org/abs/2203.00555)中提出了DeepNorm的方法。从论文名字就可以看出,研究者将Transformer模型扩展到了1000层,这是一个非常深的网络。Pre-LN之所以会让模型训练更稳定,是因为标准化的输出可以缓解子层(注意力机制和前馈神经网络)中梯度消失和梯度爆炸的问题。DeepNorm其实是一种Post-LN的方案,但是在执行层标准化之前对残差连接执行了up-scale操作,即
其中α>1,也就是说,DeepNorm会在层标准化之前以参数扩大残差连接。DeepNorm能够防止模型在训练过程中出现过大范围的参数更新,将参数的更新范围限制在一定的常数值内,以此来让模型的训练过程更加稳定。
RMSNorm是一种改进的层标准化技术,在我们后续介绍的Llama 2模型中会用到,它旨在优化神经网络的训练稳定性和模型收敛性。该技术在论文“Root Mean Square Layer Normalization”(https://arxiv.org/abs/1910.07467)中首次提出。层标准化有助于处理输入和权重矩阵的重新居中及重新缩放,从而提高模型的性能。然而,RMSNorm假设重新居中的性质(即减去均值的部分)并不是必要的,只需要保留重新缩放的不变性属性即可。因此,RMSNorm摒弃了原有的层标准化中的均值项,只采用了均方根(RMS)进行标准化。
具体来说,RMSNorm的计算公式是
其中
这里的ai与原本层标准化中的输入值x是等价的。通过这种方式,RMSNorm可以赋予模型以重新缩放的不变性和隐式学习率自适应能力,同时可以降低噪声的影响。此外,由于RMSNorm在计算上更为简单,因此相比于原来的层标准化技术,它能够大大提高计算效率,减少了7%~64%的计算时间。
2.残差连接
标准化能够在一定程度上解决梯度消失和梯度爆炸的问题,让模型更好地收敛,但是网络越深,模型准确率可能越低,也有可能达到峰值之后迅速下降,这种情况被称为网络退化。ResNet的提出就是为了解决网络退化的问题,也就是深层网络的效果反而比浅层网络的效果差的问题。它的核心思想是跳跃连接,或称为残差连接。如图1-25所示,其原理是将某一层的输入x加上它的输出f(x)作为这一层的最后输出,这样至少可以保证深层网络的效果不差于浅层网络。
图1-25 ResNet中的残差连接示意
Transformer模型的编码器和解码器层都使用了“层标准化+残差连接”的组合,如图1-26所示。编码器分为两个部分,在通过自注意力层和前向传播层之后,都会分别通过层标准化和残差连接。解码器分为三个部分,在通过自注意力层、注意力层和前向传播层之后,也都会分别通过层标准化和残差连接。
图1-26 Transformer模型中的编码器和解码器结构示意