transformer模型简介 (2)

计算自注意力的第一步就是从每个编码器的输入向量(每个单词的词向量)中生成三个向量。也就是说对于每个单词,我们创造一个查询向量、一个键向量和一个值向量。这三个向量是通过词嵌入与三个权重矩阵后相乘创建的。在论文中这三个向量的维度比词嵌入向量要低,实际中维度更低不是必须的,只是架构上的选择,可以使多头注意力的大部分计算保持不变。

计算自注意力的第二步是计算得分。假设我们需要对第一个词’Thinking’计算自注意力向量那么需要拿输入句子中的每个单词对“Thinking”打分。这些分数决定了在编码单词“Thinking”的过程中有多重视句子的其它部分。

这些分数是通过打分单词(所有输入句子的单词)的键向量与“Thinking”的查询向量相点积来计算的。所以如果我们是处理位置最靠前的词的自注意力的话,第一个分数是q1和k1的点积,第二个分数是q1和k2的点积。

transformer模型简介

第三步和第四步是将分数除以8(8是论文中使用的键向量的维数64的平方根,这会让梯度更稳定。这里也可以使用其它值,8只是默认值),然后通过softmax传递结果。softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1。

transformer模型简介

这个softmax分数决定了每个单词对编码当下位置(“Thinking”)的贡献。显然,已经在这个位置上的单词将获得最高的softmax分数,但有时关注另一个与当前单词相关的单词也会有帮助。

第五步是将每个值向量乘以softmax分数(这是为了准备之后将它们求和)。这里的直觉是希望关注语义上相关的单词,并弱化不相关的单词。

第六步是对加权值向量求和,然后即得到自注意力层在该位置的输出。

transformer模型简介

这样自注意力的计算就完成了。得到的向量就可以传给前馈神经网络。

在现实中自注意力机制是通过矩阵来实现的,与上面思路一样:

第一步是计算查询矩阵、键矩阵和值矩阵,如下图所示:

transformer模型简介

将前面的计算步骤可以合并成:

transformer模型简介

介绍完自注意力机制后,介绍在论文中使用的多头自注意力机制“multi-headed” attention。

transformer模型简介

每个头都是独立的查询/键/值权重矩阵,从而产生不同的查询/键/值矩阵。在论文中采用的是8头,那么经过8次不同权重矩阵运算,我们会得到8个不同的Z矩阵。

transformer模型简介

然后我们将这8个矩阵压缩成一个矩阵,实现原理是将这8个矩阵拼接在一起,然后再用一个权重矩阵与之相乘,得到一个融合所有注意力头信息的矩阵Z,再将其求和与归一化后传给前馈层。

transformer模型简介

Decoding(解码器):

解码器内部组件与编码器大同小异,需要注意的是,解码器的第一个注意力层被称作MaskedMulti-Head Attention,通过加入了MASK操作,使得我们只被允许处理输出序列中更靠前的那些位置,即我们只能attend到前面已经处理过的语句。第二个注意力层被称作encoder-decoder attention layer,由图二可知,它的query来自前一级的decoder层的输出,key、value来自encoder的输出,encoder的输出可以帮助解码器关注输入序列哪些位置合适。接下来送入前馈层,然后重复这些步骤,直到到达一个特殊的终止符号,它表示transformer的解码器已经完成了它的输出。每个步骤的输出在下一个时间步被提供给底端解码器,并且就像编码器之前做的那样,这些解码器会输出它们的解码结果 。另外,就像我们对编码器的输入所做的那样,我们会嵌入并添加位置编码给那些解码器,来表示每个单词的位置。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjgds.html