本文主要讨论大语言模型的模型架构选择,主要围绕Transformers模型、详细配置、主流架构、长上下文模型与创新型模型开始讨论。下表列举了一些典型的大语言模型的详细配置,L表示层数、N表示注意力头数、H表示隐藏状态的大小。
一、Transformer模型
当前主流的大模型都是基于Transformer模型架构设计的,Transformer的主要架构主要由多层多头注意力模块堆叠而成。原始的Transformer由编码器和解码器两个模块构成,而这两个模块也可以单独拿来使用。例如基于编码器的BERT模型和基于解码器的GPT模型。与早期的BERT模型相比,大语言模型拥有更长的向量维度、更深的模型层数,进而包含大量的模型参数,并主要使用解码器的架构,而对于Transformers本身的结构预配置改变并不大。本节主要介绍Transformer的基本构成以及编码器和解码器模块。
1.输入编码
在Transformer模块中,输入的词元首先经过一个嵌入模块转化成词向量序列。具体来说,为了捕获词汇本身的语义信息,每个词元在输入嵌入模块被映射成为一个可学习的,具有固定维度的词向量(词元分割在上一节讲过)。由于Transformer编码器无法识别序列的位置信息,因此引入位置编码来提供位置信息,然后每个词元的嵌入与位置编码直接相加,生成了最终的嵌入序列,并被传入到后续层中。通过这种建模方法,Transformer模型可以利用位置编码建模不同词元的位置信息,但是这种位置编码仅有位置唯一决定,因此称为绝对位置编码,公式如下:
这种方法只能局限于建模训练样本中出现的位置,无法建模训练数据中未出现的位置。因此限制了他们处理长文本的能力。主要原因在于其固定编码的方式和模型参数的限制。首先,Transformer使用的正弦和余弦位置编码是基于固定的数学函数生成的,这些函数只能在一定范围内提供有效的位置信息。一旦文本长度超出了训练时的范围,新的位置编码虽然可以继续生成,但这些编码在训练过程中并未见过,因此模型无法有效地学习和理解这些位置。
此外,训练时为了控制计算复杂度和内存使用,输入序列的最大长度是有限的。模型在这种长度下进行训练时,只能学到这个范围内的位置信息,对于超过这个长度的文本,模型没有见过相应的位置编码,因此无法处理得当。位置编码被直接加到词嵌入上,模型参数的训练依赖于这些位置编码。如果在训练数据中没有出现过的长位置,其对应的编码没有参与过训练,导致模型对这些位置的处理能力较差。
另外,正弦和余弦位置编码具有周期性,随着位置数值的增加,不同位置之间的编码可能变得越来越相似,导致模型在处理非常长的文本时难以区分不同位置的信息。这种限制在文本长度远超训练时的最大长度情况下尤为明显。
后续会讨论不同位置编码方式以及长文本的建模能力的改进。
2.多头注意力机制
多头注意力机制是Transformer模型中的核心组件,相比于循环神经网络与卷积神经网络,多头注意力机制可以完成任意词元之间的交互关系的建模。作为对比,循环神经网络迭代的利用前一个时刻的状态更新当前时刻的状态,因此在序列长度很长的时候,常常会出现梯度爆炸与消失的问题。而在卷积神经网络中,只有位于同一个卷积核下的次元可以进行直接交互,通过堆叠层数来完成远距离的词元交互。
多头注意力机制由多个自注意力机制构成。每个字注意力模块中,对于每个输入序列,首先经过词嵌入矩阵将词元转化为固定维度的向量表示(在训练早期这些向量是随机初始化的),其后,将其映射为相应的的查询(Query, 𝑸)、键(Key, 𝑲)和值(Value, 𝑽)三个矩阵。对于每个查询,将和所有没有被掩盖的键之间进行点积,这些指点积值再进一步除以进行缩放。d代表向量维度。为什么要除以
呢,具体来说,首先,点积操作会将查询和键的向量元素逐一相乘并求和。当向量的维度 d较大时,点积的结果可能会非常大。这是因为向量的每个元素都是独立随机分布的,维度越大,点积结果的期望值和方差也越大。若不进行缩放,这些较大的点积值经softmax 函数时,可能会导致数值范围过于集中,使得梯度消失或者梯度爆炸,从而影响模型的训练效果。再除以根号d后,送入到softmax进行进一步计算。最后与值相乘得到最终输出。数学公式表示为:
与单头注意力不同的是,多头注意力机制主要区别在于它使用了H组结构相同但映射参数不同的自注意力机制模块。输入序列首先通过不同的权重矩阵被映射为一组查询、键和值,每组构成一个头,并独立的计算注意力输出麻醉后不同头 的输出拼接在一起通过一个权重矩阵进行映射并产生最终的输出。如下公式所示:
由上述内容可知,自注意力机制能过直接建模序列中任意两个位置之间的关系,进而有效捕获长程依赖的关系,拥有更强的序列建模能力。另一个主要有试试这个自注意力计算过程对于基于硬件的并行优化非常友好,因此能够支持大规模参数的高效优化。
3.前馈网络层
为了学习复杂的函数关系与特征,Transformer模型引入了一个前馈网络层(FFN),对于每个位置的隐藏状态进行非线性变换和特征提取。具体来说,给定输入(为多头注意力机制处理后的输出),Transformer中的前馈神经网络由两个线性变换和一个非线性激活函数组成:
其中和
分别是第一层和第二层的线性变换权重矩阵,b为两层的偏置项,
为激活函数(在原始Transformer中,采用ReLu为激活函数)。前馈网络层通过激活函数引入了非线性映射变换,提升了模型的表达能力。Tranformer整体架构图如下图所示:
4.编码器
在Transformer中,编码器的作用是将输入的每个词元都编码成一个上下文语义相关的向量。编码器由多个相同的层堆叠而成,其中每个层都包含多头注意力机制和前馈神经网络层。在注意力和前馈神经网络后,模型使用层归一化和残差连接来加强模型的训练稳定度。其中,残差连接将输入与该层的输出相加。实现了信息在不同层的跳跃传递,从而环节梯度爆炸和消失的问题。二层归一化则对数据进行重新缩放,提升训练稳定性(具体将在下一届详细配置中讲解)。编码器接受经过经过位置编码层的词嵌入序列作为输入,通过多个堆叠的编码器层来建模上下文信息,进而对于正个输入序列进行编码表示。由于输入数据是完全可见的,所以编码器中的自注意力通常采用双向注意力机制,每个位置的词元能够有效融合上下文语义关系。在编码器-解码器的架构中,编码器的输出将作为解码器的输入。进行后续计算。形式化来说,第l层的编码器的数据处理过程如下所示:
其中,和
分别是该Transformer层的输入和输出,
是该层中输入经过多头注意力模块后的中间表示,LayerNorm表示层归一化。
5.解码器
Transformer架构中的解码器基于来自编码器编码后的最后一层的输出表示以及已经由模型生成的词元序列,执行后续的序列生成任务。与编码器不同。解码器需要引入掩码自注意力模块,用来计算注意力分数的时候掩盖当前位置之后的词,以保证生成目标序列不依赖于未来的信息。除了建模目标序列的内部关系,解码器还引入了与编码器相关联的多头注意力层,从而关注编码器输出的上下文信息。同编码器相似,解码器在每个模块后也采用了层归一化和残差链接。至于说为什么Transformer要选择层归一化,我给出如下解释:
层归一化可以稳定模型的训练过程。在训练深度学习模型时,梯度消失和梯度爆炸是常见问题。层归一化通过对每一层的激活值进行归一化,确保它们在一个稳定的范围内,有助于稳定和加速模型的训练。
层归一化适合并行计算。Transformer摒弃了传统的递归神经网络(RNN)结构,改为并行处理的自注意力机制。在这种机制下,批归一化(Batch Normalization)不再适用,因为批归一化依赖于整个批次的数据,而层归一化则是对每个样本独立进行归一化处理,更适合并行处理的需求。这点与您在处理英汉翻译任务时需高效处理大量数据的需求相似,通过并行计算提高了处理效率。
层归一化有助于处理序列数据中的不同位置的特征。由于Transformer在处理序列数据时,每个位置的特征是独立处理的,层归一化能够确保每个位置的特征在经过归一化后,都能以一致的方式被处理
言归正传,在经过解码器后,模型会通过一个全连接层将输出映射到大小为V的目标词汇表的概率分布中,并基于某种解码策略生成对应的词元。在训练过程中,解码器可以通过一次前向传播,让每个词元的输出用于预测下一个词元。而在解码过程,解码器需要经过一个逐步的生成过程,将自回归地生成完整的目标序列(后续详细讲)。数据流程如下所示: