2017年谷歌大脑在《注意力是你所需要的一切》一文中解释了Transformer 。本文是随着自然语言处理领域的发展而来的。许多最先进的NLP模型都是以Transformer 为基础建立的。
Transformers是人们认为最复杂和无法理解的话题之一。在这篇文章中,我将给出关于Transformer理论知识,我希望在这篇文章的结尾,你将能够了解关于变压器实际工作原理。
注:以下部份中为了方便将Transformer翻译为变压器
Attention Is All You Need
变压器基本上是一种机器学习模型,它是一种神经网络的体系结构,变压器模型体系结构的变体,如BERT, GPT-2, GPT3等,用于建立在变压器模型之上的几个任务。
在论文Attention Is All You Need中,使用一个编码器-解码器的机器翻译结构对变压器进行了介绍和解释与。
首先,让我们从高级角度看一下我们的机器翻译模型,该模型将输入作为法语句子并将其转换为英语。然后一步一步,我们会更深入。
翻译模型由一个编码器-解码器转换器块组成,其中编码器块接受输入,并且解码器块生成输出翻译语句。
在论文中,研究人员在编码块中使用了6个编码器,并且在解码器块中使用了相同数量的解码器,其中所有编码器和解码器块都相同。
我们的输入是一个文本句子,但是计算机只理解数字。因此,首先,我们对输入句子进行标记化,然后将其转换为标记序列。然后将序列中的每个标记嵌入到大小为512(根据原始论文)的向量中,并将预训练的Word2Vec嵌入用于词汇表。
嵌入向量的序列将作为第一个编码器的输入。
位置编码:与RNN的其单词令牌一次输入一个到模型中不同,在注意力模型中,所有单词都同时输入,即所有单词被并行输入到编码器模型中
单词的位置和顺序是任何语言的基本组成部分。它们根据定义的语法,从而定义句子的实际语义。因此,我们需要做一些事情来维持序列的顺序,因此,为了维持序列中单词的顺序,我们需要在嵌入矩阵中添加位置编码。
对于序列中的每个单词,一个包含512个值的向量——每个值的值都在1到-1之间——被添加到单词嵌入向量中,以保持序列的顺序
编码器块
到目前为止,我们已经讨论了注意力机器翻译模型的基本体系结构。现在,我们将更深入地研究每个编码器和解码器模块,并了解这些模块内部发生了什么,从而使该模型如此精确。
一个简单的编码器由两部分组成:
- 自我注意力:这种自我注意来自原论文,而这实际上在变压器中起着非常重要的作用。
- 前馈神经网络:就像一个简单的人工神经网络。自我注意的输出作为输入传递到前馈网络。
现在,我们将详细了解变压器的最重要组件。
Self-Attention(自注意力)
自注意力用于将句子中的每个单词与句子中的每个其他单词相关联,以便每个单词可以与其他每个单词相关联,并且将为句子中的每个单词产生512个维度的输出,该输出将关联一句话中的每个单词 。
要计算自我注意力,首先,我们需要根据其嵌入向量为输入句子中的每个单词创建3个向量,分别称为查询,键和值。这些向量通常较小。在变换器模型中,这三个向量是64维向量。
每个单词的查询、键和值向量计算如下:
我们初始化3个权重矩阵(随机),将其命名为大小(512,64)的Wq,Wk和Wv,其值将在训练时更新。
通过在各个权重矩阵和嵌入矢量之间进行矩阵乘法来计算查询,键和值矢量。
请注意,这些新向量的维数小于嵌入向量的维数。它们的维数为64,而嵌入和编码器输入/输出矢量的维数为512。
您可能会想到与查询,键和值有关的问题,以及这些向量实际上是什么,以及为什么要初始化它们。到本文章结尾,您将获得所有答案。
我们获得了序列中每个单词的查询,键和值,现在我们将使用查询,键和值来计算每个单词与句子中的每个其他单词有多少关联的分数。
我们将通过在一个单词中进行所有操作来进一步理解这一点,并且对句子中的所有单词都将执行相同的操作。
计算自注意力的第一步是计算句子中所有单词的分数。我们通过单词查询(q1)与句子中每个单词的关键字(k)之间的点积来计算得分(一个单词与每个单词在顺序上有多少关系)。
第二步是将分数除以8(关键向量维数的平方根)。这导致具有更稳定的梯度。
第三步,计算得分的softmax,并根据softmax的定义将所有值加起来为1。
这个softmax分数决定了每个单词在这个位置的表达量。
第四步和第五步是将softmax的值与每个单词的值向量(v)相乘,相加得到一个64维的向量。
z1 = 0.86*v1 + 012*v2 + 0.06*v3
对单个单词的这种自我关注已从句子中所有单词中获取了所有相关信息。
我之前解释的所有步骤都是为了单个单词的自注意,将重复相同的步骤来计算句子中所有单词的自注意。
为了使计算更快,计算效率更高,所有计算都在矩阵中执行。
Z矩阵形状=(句子长度,V的维数)
多头注意力
上面,我们讨论了单头注意,即,仅对一个权重矩阵(Wq,Wk和Wv)进行随机初始化,以生成用于查询,键和值的单个矩阵,而在转换器模型中,则使用多头注意 即,随机初始化多个权重矩阵以生成多个查询,键和值矩阵来代替一个权重矩阵(Wq,Wk和Wv)。现在,对于多个查询,键和值矩阵,上面相同的操作将重复多次以产生多个最终Z矩阵。
在变压器模型中,使用8多头注意。
对于每个查询,键和值矩阵,将获得一个Z矩阵(注意力头),最后总共将获得8个注意头。
然后将所有的注意力矩阵连接起来,并与另一个权重矩阵相乘,得到最终的Z矩阵。
现在将自我注意的输出即Z矩阵反馈给前馈神经网络。
前馈神经网络输出形状=(句子长度,512)
前馈神经网络的输出作为输入传递给另一个编码器。
因此,所有的编码器和解码器都是相同的,它们的工作原理也是相同的。
残差连接
我们需要提到的编码器架构中的一个细节是,每个编码器中的每个子层(自我注意、前馈神经网络)周围都有一个残差连接(这个残差连接与Resnet残差连接相同),然后是标准化步骤。
到目前为止,我们已经了解了变压器的注意机制是如何工作的。我希望你们能理解这些关注背后的含义。
许多SOTA模型如BERT和BERT的变体都是建立在编码器变压器的基础上,用于预测各种各样的任务。
解码器
最后,在将句子传递到编码器转换器时,我们将得到每个单词的向量(形状矩阵(句子长度512)),现在这个矩阵将作为解码器端编码器-解码器块的输入。
解码器的输入将向右移一个位置,并将单词令牌的开头用作第一个字符<EOS>令牌,并将以嵌入方式编码的单词的目标序列与位置编码一起传递。
解码器的自注意力模块会生成目标序列的关注向量,以找出目标序列中每个单词与序列中其他单词的相关程度。在解码器中,自注意层只允许关注输出序列中较早的位置。这是通过在自注意力计算中的softmax步骤之前屏蔽将来的位置(将它们设置为-inf)来完成的。这确保了在生成目标序列的注意力向量时,我们可以使用输入序列中的所有单词,但只能使用目标序列中的前一个单词。
解码器具有一个如下所示的附加多头注意块,该块从输入序列和目标序列中获取嵌入信息,以确定输入序列中的每个单词与目标序列中的每个单词如何相关。
第二个注意层的输出被发送到FFN层,FFN层与编码器块的FFN层类似,功能类似。
最后,我们有一个线性层,也就是另一个FFN和一个softmax函数,来得到所有下一个单词的概率分布,也就是下一个预测的单词概率得分最高。
此过程将执行多次,直到为序列生成句子标记的结尾。
我希望你能对变压器的工作原理有个直观的了解。如果你有不明白的地方,那就再读一遍以下的文章,我建议你试着把矩阵的形状形象化。
http://jalammar.github.io/illustrated-transformer/
作者:Luv Bansal
deephub翻译组