提到大模型,“大力出奇迹”是我们经常挂在嘴边的一句话,“力大砖飞”隐藏的含义是大模型并未在技术路线上取得革命性的突破,其底层技术基础依旧是Transformer。换言之,当下的绝大部分大语言模型依旧是Transformer模型,只不过模型全部由Transformer的Decoder层构成,具体分为以下几个部分:1、Position Embedding,即位置编码。在Transformer中所有token都被同样的对待,没有前后顺序之分,因此需要加入一个Position Embedding用于表征词之间的位置关系。目前的位置编码有绝对位置编码和相对位置编码两种形式:绝对位置编码指的是直接将位置信息通过向量的形式融合到模型输入中。常用的两种绝对位置编码方法主要是在Transformers中使用的Sinusoidal Positional Encoding以及Convolutional Sequence-to-Sequence模型中使用的Learned Position Embeddings。其中,Sinusoidal Positional Encoding在原始的Transformer模型(Vaswani等人,2017)中,引入了一种预定义的正弦函数作为位置编码。这种方法会为每个位置生成一个固定向量,该向量的维度跟词嵌入向量相同。其优点在于,它可以处理任意长度的序列,不需要额外的学习过程,并且对于相对位置关系有一定的编码能力。Learned Position Embeddings由Gehring等人于2017年在Convolutional Sequence-to-Sequence模型中首次提出。对于每个位置,模型都有一个对应的嵌入向量,这个向量会在模型训练的过程中学习和优化。该方法的优点在于,它可以根据具体的任务和数据集学习位置信息。然而,它的一大缺点是,由于位置嵌入数量固定,因此模型可能无法处理超过预先设定数量位置的序列。相对位置编码指的是在自注意力机制中引入两个Token的相对位置信息。目前,相对位置编码主要有两种常用方法:ROPE(Rotary Positional Embedding)和ALiBi(Attention with Linear Biases)。ROPE可以不受固定长度限制处理任意长度的序列。其工作原理是,通过一个基于位置的旋转矩阵将每个位置的嵌入旋转到一个新的位置。这种方法的优点是,可以保持相对位置信息的一致性,在旋转后,相邻的位置仍然会有相似的嵌入。ALiBi能够让Transformer语言模型在推理时可以处理比训练时更长的序列。它在处理文本序列时不使用实际的位置嵌入,而是在计算某个键和查询之间的注意力时,根据键和查询之间的距离对查询可以分配给键的注意力值进行惩罚。当键和查询靠近时,惩罚非常低,当它们远离时,惩罚非常高。这种方法的动机是,靠近的词比远离的词更重要。2、Attention Layer,即注意力层。其原理是通过加入注意力层使得不同Token之间能够交互信息,进而获得整句话的表征。目前大模型使用的Attention Layer分为多头自注意力(Multi-Head Self-Attention)和稀疏自注意力(Sparse Self-Attention)两种。Multi-Head Self-Attention机制最早出现在”Attention is All You Need”(Vaswani et al., 2017)论文中,是Transformer模型的核心组成部分。在多头自注意力中,模型首先将输入的嵌入向量分割成多个“头”,每个头都会独立地进行自注意力计算,最后所有头的输出会被连接起来并通过一个线性变换,形成最终的输出。其优点是,每个头都可以学习并关注输入的不同方面,模型能够同时关注来自不同位置的信息,从而捕获更丰富的上下文信息。Sparse Self-Attention是一种改进的自注意力机制,它只关注输入中的一部分元素。这种方法的优点是,可以显著减少计算复杂性,使得模型能够处理更长的序列。3、FFN Layer,即前馈神经网络。其主要任务是处理来自Attention层的信息。Attention机制能够处理词语之间的相互关系,但是它无法进行更为复杂的、非线性的数据处理。而FFN层可以在每个Transformer模块中增加非线性处理能力,增强模型的整体表达能力。在原始的Transformer模型中,FFN层通常由两个线性变换和一个非线性激活函数(如ReLU或GELU)组成。以下是一些FFN层的变种:
标准的FFN层:在”Attention is All You Need”(Vaswani et al., 2017)中,FFN层由两个线性变换和一个非线性激活函数组成。具体来说,给定输入x,FFN层的计算过程为:FFN(x) = max(0, xW1)W2,其中W1,b1,W2,b2是模型参数,max(0, *)表示ReLU激活函数。
Gated Linear Units(GLU)变种:在”Language Modeling with Gated Convolutional Networks”(Dauphin et al., 2017)中提出,GLU是一种特殊的激活函数,它通过引入一个门控机制来控制信息的流动。在FFN层中使用GLU可以帮助模型更好地捕捉输入数据的复杂模式。GLU的计算公式为:GLU(x) = (xV + c) ⊗ sigmoid(xW + b),其中⊗表示元素级别的乘法,sigmoid是sigmoid激活函数。
Swish变种:在“Searching for Activation Functions”(Ramachandran et al., 2017)中提出,Swish是一种自门控的激活函数,它的计算公式为:Swish(x) = Swish1(xW1)W2。在FFN层中使用Swish可以帮助模型更好地捕捉输入数据的复杂模式。