Attention Is All You Need 是一篇来自 google Brain 和 google Research 的论文。该论文最初被提出作为自然语言处理中 RNN 网络的替代品,是注意力机制使用方面的一大进步,是对 Transformer 模型的主要改进。当前 NLP 任务中涌现出的著名大模型都是由Transformer 或其一些变体组成。
Word2Vec
Word2vec 将单词转换为向量,以便可以在神经网络中对其进行处理。这些向量具有单词的语义。
举一个例子,假设小王已经完成了大学的第一学期,并且小王在以下课程中的成绩如下:数学:95/100,生物:50/100,物理:90/100。如果想将小王表示为向量,它可以是 [0.95, 0.5, 0.9]。现在假设小王计划在假期期间完成一个项目,但由于某种原因小王无法完成该项目,并且小王必须寻找替代者。如果小王知道班上所有学生的向量表示,小王就可以找到与他的向量表示最相似的人。
将上述例子进行延伸,特征向量中的每个值都代表了关于自身的一些东西,就像 word2vec 从某个长度的单词创建向量一样(取决于实现,但通常在 256 到 512 之间)。特征向量的每个值代表有关该单词的某些属性。这就是为什么当你得到“国王(King)”和“男性(Men)”的特征向量差异时,计算差异之间的相似度,其他词“王后(Queen)”将是最相似的。
从现在的视角来看,Word2Vec 已经过时了,目前有更好的标记器可用。不过只要从单词中获取向量表示来理解 Transformer,具体实现的技术选型是次要的。
RNN 架构
RNN 架构用于顺序数据,例如时间序列和文本数据。在传统的神经网络中,输入和输出是独立的,但在预测下一个单词的顺序数据中,需要理解之前的单词。
RNN 有一个隐藏状态,它会记住输入序列的特征。当获得顺序数据时,取出该序列的第一个单词,从中创建单词向量。然后将该向量传递给编码器以获取单词的隐藏状态。对于第二个单词执行相同的过程,但这次将单词向量与最后一个单词的隐藏状态一起传递以获取隐藏状态。这个过程一直持续到生成了所有单词的隐藏状态。
Word2vec 将单词转换为向量,可以轻松处理信息。
最后的隐藏状态包含有关序列中的单词以及它们之间的关系的信息。将最后一个隐藏状态传递给解码器以获取预测词并获得新的隐藏状态。然后,新的隐藏状态再次传递给解码器以获取下一个单词,依此类推。
现在,在上述架构中,为了预测最后一个单词,它仅从倒数第二个解码器隐藏状态获取信息。因此,从最后一个单词的编码器获得的隐藏状态必须在通过解码器时保留所有单词的知识。
一种明显的技巧是在解码器中使用编码器输出的隐藏状态,因为“应该”的隐藏状态显然比解码器的隐藏状态有更多关于该单词的信息。
但这有一个问题,我们必须知道在哪个解码器中使用哪个编码器的隐藏状态,因为单词的位置可能会改变。例如,在上图中,相同颜色的单词代表英语和汉语中的相同单词(“Now”是英语句子中的最后一个单词,但将其翻译为汉语时,它是句子中的第二个单词,两者都是绿色),但如果我们只是将第一个编码器输出映射到第一个解码器输出就是错误的。
RNN 的另一个问题是由于其处理数据的顺序性质,它阻止了训练示例中的并行化,这在较长的序列长度上变得至关重要,因为内存限制限制了示例之间的批处理。
Transformer 架构
Transformer 由两个组件组成:编码器和解码器。
Transformer 编码器
首先,使用 word2vec(其他分词器也是同样的原理)从输入句子创建特征向量。
接下来,添加(不是串联)一条额外的信息,让模型知道单词的相对位置。这称为位置编码。在位置编码的帮助下,变压器在考虑句子的顺序性质的情况下部分处理句子的一部分。计算出位置编码后,将其添加到 word2vec 提取的特征中。
然后,将这些向量传递给第一个编码器块。在图像中,编码器块旁边有一个N*
。这是因为使用了多个编码器块(Attention Is All You Need 中使用了6块)。
每个编码器块主要有两个组成部分:注意力部分和前馈部分。在注意力和前馈部分之后,有跳过连接(类似于 ResNet 中的跳过连接/残差连接)和归一化(图像中的 Add & Norm
残差和标准化部分),前馈网络只是多层感知器。
对于归一化,使用层归一化而不是批量归一化。通常在自然语言处理中使用层归一化,Attention Is All You Need 仅展示了 NLP 的用例,它使用了层归一化。
批量归一化不太适合 NLP 任务的原因是句子长度通常会因数据点而异。因此,如果使用批量归一化,将不确定哪个应该是要除以的元素数量的适当值。如果将相同长度的句子分批在一起,不同的批次可以有不同的归一化常数。
Transformer 解码器
现在变压器编码器部分同时处理所有文本。但解码器部分是自回归的。它根据序列中的前一个值来预测序列中的下一个值。换句话说,它是一个使用自己的预测作为未来预测的输入的模型。它允许模型生成与输入长度不同的输出句子。
如果仔细观察解码器图像,会发现有很多与编码器类似的组件(Multi-Head Attention
多头注意力、Add & Norm
残差和标准化、Feed Forward
前馈)。唯一不同的组件是Masked Multi-Head attention
(掩码多头注意力机制)。
Masked Single-Head attention (掩码单头注意力机制)
Masked Multi-Head Attention
和 Multi-Head Attention
之间的唯一区别在于 Masked Multi-Head Attention
具有因果屏蔽。因果屏蔽是机器学习中使用的一种技术,用于防止模型在训练过程中关注未来的标记,从而只能依赖过去标记的信息来预测下一个标记。如果没有因果屏蔽,模型可能能够从未来的标记中访问信息,这可能会在训练期间带来更好的性能,但在以后的推理过程中将不起作用。
编码器解码器注意力
解码器内部的多头注意力是编码器解码器注意力。与普通注意力类似,它也有查询、键和值矩阵。通过将查询矩阵乘以解码器表示来计算查询向量(在屏蔽多头注意力之后计算出 512 维向量,然后添加和层范数)。但是通过带有编码器表示的键矩阵(编码器的最终输出)和带有编码器表示的值矩阵来计算键和值向量。
这基本上是使用到目前为止所拥有的表示进行查询(在解码器块中屏蔽注意力)以获得下一个单词的特征向量(编码器结果的键和值)。
一旦计算出查询、键和值向量,其余计算与之前相同,即计算分数、稳定性和归一化,最后归一化输出值向量以获得最终表示。
与编码器类似,在解码器内有 6 个解码器块。如果考虑屏蔽注意力逻辑,就会想到一个问题:是否需要从第二个解码器块及以后使用屏蔽注意力。对于第一个解码器块,如果应用屏蔽注意力,则第一个块的输出(第二个块的输入)没有关于后续单词的任何信息(与第一个块的输入不同)。那么从第二个区块开始,可以只使用屏蔽注意力吗?
答案是需要在所有解码器块上使用屏蔽注意力。编码器输出包含有关所有令牌(先前、当前和未来令牌)的信息。现在,在屏蔽注意力之后的第一个解码器块中,有编码器解码器注意力,它间接在第一个块的输出上添加有关未来标记的信息。在第二个块中,当使用屏蔽注意力时,它确保过去的标记不会关注未来的标记(间接),这确保遵循自回归性质。
现在 Transformer 解码器的输出将具有与输入相同数量的标记特征,但最终通过线性层获取最后的标记特征。该线性层将特征向量从嵌入尺寸 ( d_model
) 缩放到输出语言词汇量大小。
对于每个单词预测,该单词可以单独关注输入语言的所有单词,这是在 RNN 中无法做到的。此外训练可以与 Transformer 并行。