2017年Google发布的《Attention Is All You Need》论文让人工智能迈向了更广阔的发展空间,目前大模型基本都是基于该论文提出的Transformer模型,有基于编码器的BERT模型,主要用于文本分类、情感分析和文本理解,基于解码器的GPT模型,主要用于文本的生成,了解大模型可以就从这个论文出发,也更好的方便后面的应用开发和模型微调以及RAG等。
前置知识
序列转导模型
sequence transduction models:处理序列数据的模型,所谓的序列数据为具有顺序关系的数据,序列的顺序对于整体语义非常重要,典型的任务为文本翻译、文本生成、语音转文字。
前馈神经网络(Feedforward neutral network,FNN)
一种基础的人工神经网络结构,其核心特点是信息的单向流动,即数据从输入层经隐藏层逐层传递至输出层,无循环或反馈连接。
分析步骤一般包括分词、词向量化、合并。但是合并采用的方式是将词向量平均,或者是单纯的拼接,这样就会破坏句子的顺序,也影响句子意义的表达。另外FNN要求固定的输入维度,处理完整的句子,未考虑到句子的复杂度。
循环神经网络(RNN)
为了解决FNN的一系列问题,RNN在隐藏层添加了循环功能,实现了支持按照时序输入、添加对于前序的记忆功能、不限制输入的维度。
将t时刻输入的x与权重w点积,与上一时刻t-1的计算结果u·ht-1相加,使用激活函数sigmod计算出该时刻的ht,计算的ht与权重v点积,经sigmod激活函数或者softmax函数,得出该时刻的输出结果yt。激活函数用于引入非线性,增强表达能力;同时限制数值范围,避免梯度爆炸/消失。softmax函数主要用于分类结果处理。计算公式为:
但RNN存在一个问题,就是数据是按序处理的,后面的数据依赖前面的数据,这就造成处理的串行化,无法使用并发处理发挥GPU的最大性能。
编码器(encoder)和解码器(decoder)
编码器和解码器是将RNN的两次计算进行了拆分,编码器经过ht公式计算,最后输出的结果为C,涵盖了整个输入的语义,之后结果C作为解码器的输入,进行yt的计算。
如图所示,C=h3,说明最后一个计算的结果对于整体语义来说影响较大,但是当语义的重点在前半段时,此时的解码便会出现问题,有可能曲解了语义。
注意力机制
注意力的提出就是为了解决C的问题,提出使用概率的方式将每个时段的h根据概率值相加,但是概率值相加为1.
仍存在问题
但是串形化的计算仍然存在,无法高效处理。
摘要
The dominant sequence transduction models are based on complex recurrent or convolutional neural networks that include an encoder and a decoder. The best performing models also connect the encoder and decoder through an attention mechanism.
solely on attention mechanisms, dispensing with recurrence and convolutions entirely
摘要中提到目前使用的模型主要有三种,RNN(循环神经网络)/CNN(卷积神经网络);encoder and decoder(编码器和解码器);连接编码器和解码器表现最好的注意力机制。创新的提出摒弃RNN和CNN,仅仅依赖注意力机制的Transformer模型。
Introduction
当前主要使用的模型为循环神经网络模型(Recurrent neural networks,RNN), 长短期记忆网络模型(long short-term memory,LSTM) and 门控循环单元(gated recurrent neural networks,GRU),并且有很多研究和努力都在推动这个方向的问题的解决。这些RNN模型及变体拥有输入层和输出层,相较于前馈神经网络(FNN),添加了记忆功能,在输入计算时,也会加入隐藏层的计算,而隐藏层是有上一次计算得出的,就这样携带了前面时序数据的记忆,但也引出了无法并行计算的弊病。
具体的模型的特点可以参考前置知识介绍的几种模型,注意力的引入还是同RNN结合使用,给每个输入的计算增加了权重,解决了长期记忆丢失的问题,但是依赖RNN,还是无法解决串形化的问题。 Transformer首次提出了仅使用注意力机制,抛弃了RNN和CNN,依靠位置向量来标志词向量的位置,算是首次的突破。
Transformer重点的重点
根据模型进行讲解论文的内容,Transformer的核心机制为多层堆叠的自注意力机制和逐点的全连接层的编码器和解码器。
stacked self-attention and point-wise, fully connected layers for both the encoder and decoder
编码器
堆叠层数为6层,每一层有两个子层,一个为多头注意力机制,另一个为简单的逐点全连接前馈网络。两个子层的连接使用残差连接(为方便将模型和嵌入层的输出维度定位512)和层归一化处理。输入层x与子层计算的逻辑可以考虑为LayerNorm(x + Sublayer(x)),将输入经过位置编码后的向量与经过子层计算的结果简单向量相加,这样可以将一些训练较为失败的向量也保留着原始的输入信息。归一化则让向量趋于稳定。
Encoder: The encoder is composed of a stack of N = 6 identical layers. Each layer has two sub-layers. The first is a multi-head self-attention mechanism, and the second is a simple, position wise fully connected feed-forward network.
We employ a residual connection around each of the two sub-layers, followed by layer normalization.
解码器
每一层额外增加了第三个子层,用来执行编码器输出的多头注意力机制。第一子层添加了掩码的机制,确保每一个生成的词都依赖前面的词,而不是未来没生成的词。
the decoder inserts a third sub-layer, which performs multi-head attention over the output of the encoder stack.
This masking, combined with fact that the output embeddings are offset by one position, ensures that the predictions for position i can depend only on the known outputs at positions less than i.
注意力函数
一个查询(query)和一组键值对(key-value)映射成一个输出(output),计算过程大致为:查询、键点积之后使用兼容函数(保证权重和为1)得出权重,值与权重求出加权和,即得出结果。权重的计算使用兼容函数,类似于相似度算法(余弦相似、点积相似度)。
mapping a query and a set of key-value pairs to an output
The output is computed as a weighted sum of the values, where the weight assigned to each value is computed by a compatibility function of the query with the corresponding key.
缩放点积注意力
计算过程
-
- 输入为三个向量:query向量(维度dk)、键向量(维度dk)和值向量(维度dv)
-
- 计算点积矩阵:Q·K(转置矩阵)
-
- 缩放操作
-
- softmax函数计算权重
-
- 每个词向量的权重与value做加权和
The input consists of queries and keys of dimension dk, and values of dimension dv. We compute the dot products of the query with all keys, divide each by √dk, and apply a softmax function to obtain the weights on the values.
将每个词向量的查询、键、值分别合并,就变成整体的Q K V,计算公式就可以参考如下公式,与上述的计算过程一致。
选择缩放因子的原因
常用的注意力函数有加性注意力和点积注意力,这两个的理论逻辑的复杂性基本一致,加性注意力是基于一层隐藏层的前馈神经网络模型,但是比较起来点积注意力函数计算效率更高、更加节约内存。当dk即维度较小的时候,两个注意力函数表现相似。但当dk维度加大的时候,加性注意力是优于点积注意力的。 当dk过大的时候,点积的计算结果会过大,使用softmax函数时,数值会偏向0或者1,导致梯度极小。为了抵消这种影响才使用了缩放因子。
We suspect that for large values of dk, the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gradients.
多头注意力
单头注意力会一次性处理512维的数据 多头注意力将向量映射为8份,每个头的维度为64维,分别并行的进行注意力函数的计算。但是计算的耗时与单头的基本相似。
另一个更重要的原因:多头注意力可以让模型并行的在信息的不同的子空间的不同位置进行注意力计算,可以捕捉到词向量的更多的更丰富的特点和权重,而单头注意力反而抑制了这种丰富性。
Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.
注意力的应用
编码器-解码器注意力:将编码器的输出作为Query,解码器向量中使用Key、Value,这样让解码器加入到全部输入信息中。
In "encoder-decoder attention" layers, the queries come from the previous decoder layer,and the memory keys and values come from the output of the encoder.
编码器的自注意力:所有的输入输出都来自于同样的位置
解码器中的自注意力:需要遵循从左向右流动的过程,所以需要在点积缩放注意力中将该位置和之后的位置在矩阵中设置为负无穷。即起到掩码的作用。
We need to prevent leftward information flow in the decoder to preserve the auto-regressive property. We implement this inside of scaled dot-product attention by masking out (setting to −∞) all values in the input of the softmax which correspond to illegal connections.
全连接前馈神经网络
编码器和解码器中都有FNN的计算,通过对输入x进行线性变换,第一次线性变换,之后使用激活函数max将x升为高维(从512维->隐藏层2048维),再经过第二次线性变换转为低维。每一层采用的变换逻辑一致,但是参数有差别,可以通过非线性变换学习更复杂象征。
encoder and decoder contains a fully connected feed-forward network.
This consists of two linear transformations with a ReLU activation in between.
嵌入和softmax
针对tokens的输入:采用Emnedding将输入或输出的标记(tokens)转换为512维的向量。
针对解码器的输出:使用可学习的线性变换和softmax函数将解码器的输出转换为预测的下个标记的概率。liner层是将输出的编码器向量与英文词典的token进行匹配,为匹配的token进行打分,但是以什么分数为标准却没有明确。softmax层是将这些打分的数值统一转换成概率,根据概率选择预测token。
整个模型中,在embeddings和softmax计算前的线性变换都采用了同样的权重。并且在嵌入层乘以维度的开方,防止嵌入层数据过小。
we use learned embeddings to convert the input tokens and output tokens to vectors of dimension dmodel.
We also use the usual learned linear transformation and softmax function to convert the decoder output to predicted next-token probabilities.
位置编码
Transformer模型没有使用RNN和CNN,为了保证tokens的顺序性,加入了一些tokens的相对位置或者绝对位置的信息。并且位置编码的维度与嵌入Embedding的维度一致,均为512维,进行向量的相加,让转换后的向量有位置的信息。
位置编码采用正弦函数和余弦函数,根据token的位置pos和不同的维度i进行计算,让每个维度都形成一个正弦波。这样第K个pos也可以通过初始的pos计算得来。
Since our model contains no recurrence and no convolution, in order for the model to make use of the order of the sequence, we must inject some information about the relative or absolute position of the tokens in the sequence.
为什么是自注意力
与 RNN、CNN的网络结构进行比对,主要从三个方面来比对
- 每层的总计算复杂度; = 并行计算能力;
- 模型内部学习长 距离依赖的能力。 另外,因为自注意力机制可以进行维度的映射,分成多个小维度进行并行计算,因为位置提取的多样性,也提升了象征的丰富性。
学习资源:【《Attention is all you need》论文解读及Transformer架构详细介绍】www.bilibili.com/video/BV1xo…