Transformer模型由Google于2017年提出,用于解决序列到序列(Sequence-to-Sequence,Seq2Seq)任务,该模型摒弃了传统的卷积神经网络(Convolutional Neural Network,CNN)和循环神经网络(Recurrent Neural Network,RNN)结构,采用注意力(Attention)机制,在减少计算量和提高并行效率的同时取得了更加优异的效果。
为了解决Seq2Seq任务,Transformer模型的结构由编码器(Encoder)和解码器(Decoder)两部分组成,如图1-1所示,左边为编码器部分,右边为解码器部分。编码器部分主要由6个(图1-1左边的数字 N 为6)相同的层堆叠而成,而每一层都包含两个子层,分别为多头注意力(Multi-Head Attention)层和前馈网络(Feed-Forward Network,FFN)层,并采用相加和层归一化(Layer Normalization,LayerNorm)操作连接两个子层。解码器部分也是由6个(图1-1右边的数字 N 为6)相同的层堆叠而成,除了编码器的两层之外,又插入一个掩码多头注意力层,用于将编码器的输出与解码器的输入相融合。Transformer模型在解码器部分的注意力机制上增加了上三角掩码矩阵,防止在模型训练过程中出现信息泄露情况,保证模型在计算当前位置信息时不受后面位置信息的影响。
图1-1 Transformer模型结构
多头注意力层由多个缩放点积注意力(Scaled Dot-Product Attention)的自注意力(Self-Attention)机制组成,如图1-2所示。
注意力机制一般可以看作将查询(Query)和一组键值对(Key Value Pair)映射到高维空间,即对Value进行加权求和计算,其中加权求和时的权重值是由Query与Key计算得出的。对于缩放点积注意力来说,将查询向量( Q )与键向量( K )进行相乘,再进行大小为 的缩放,经过归一化后,与值向量( V )进行相乘,获取最终输出,计算公式如下:
图1-2 多头注意力层结构
由于 Q 和 K 相乘得到向量时,向量中值之间的方差会变大,即向量中不同维度的取值波动变大,如果直接进行归一化,会导致较大的值更大,较小的值更小,因此进行参数缩放,使得参数之间的差距变小,训练效果更好。由于解码器部分的特殊性,注意力机制中 Q 与 K 相乘后,还需要额外乘上一个掩码矩阵。
多头注意力是将多个缩放点积注意力的输出结构进行拼接,再通过全连接层变换得到最终结构,计算公式如下:
MultiHead( Q , K , V )=Concat(head 1 ,…,head h ) W 0
在不同位置中, Q 、 K 和 V 的获取方式不同。编码器部分的多头注意力层和解码器部分的第一个多头注意力层的 Q 、 K 、 V 是由输入向量经过3种不同的全连接层变换得来的。解码器部分的第二个多头注意力层的 Q 是由第一个多头注意力层输出向量经过全连接变换得来的, K 、 V 则是编码器部分的输出向量。
Transformer中的FFN层则由两个全连接层加上ReLU激活函数组成,计算公式如下:
FFN( x )=max(0, xW 1 + b 1 ) W 2 + b 2
每一层采用层归一化的原因是层归一化不受训练批次大小的影响,并且可以很好地应用在时序数据中,不需要额外的存储空间。
由于注意力机制与CNN结构一样,无法表示文本的时序性,相比于LSTM结构等循环神经网络,在NLP领域效果要差一些,因此引入位置信息编码,相当于使模型具备解决时序性内容的能力,这也是Transformer成功的重要因素之一。Transformer采用了绝对位置编码策略,通过不同频率的正余弦函数组成每个时刻的位置信息,计算公式如下:
Transformer模型目前已经成为主流框架,不仅在NLP任务上大放异彩,并且在计算机视觉(Computer Vision,CV)任务上崭露头角,目前主流的大型语言模型基本上都采用了Transformer模型结构。相较于CNN来说,Transformer模型可以获取全局的信息。相较于RNN来说,Transformer模型拥有更快的计算速度,可以并行计算,并且注意力机制也有效地解决了长序列遗忘的问题,具有更强的长距离建模能力。
Transformer结构仍存在一些缺点,例如:组成Transformer的自注意力机制的计算复杂度为 O ( L 2 ),当输入长度 L 过大时,会导致计算量爆炸;Transformer获取内容位置信息的方式全部来源于位置信息编码等。因此,出现了很多Transformer结构的变种,例如Sparse Transformer、Longformer、BigBird、Routing Transformer、Reformer、Linformer、Performer、Synthesizer和Transformer-XL等,也涌现出了各种位置编码,如RoPE、ALiBi等,用于解决上述问题。本节主要介绍原始Transformer的结构,上述变体以及位置编码就不过多介绍了,若想了解更多可以阅读相关论文。