参考链接:http://jalammar.github.io/illustrated-transformer/
论文链接:https://arxiv.org/abs/1706.03762
 

一、Transform的整体框架:

  • 在机器翻译中的Tansform可以像下图一样看作一个黑盒:
  • Transform由三部分组成:编码器部分,解码器部分,以及它们之间的连接;
  • 编码器部分(encoding component)由6个编码器(encoder)堆叠而成,同样解码器部分(decoding component)由6个解码器(decoder)堆叠而成;
  • 6个编码器在结构上都是相同的(但它们不共享参数);每一个解码器都分为两个子层:self-attention和feed forward neural network

       self-attention是用来:帮助编码器在编码句子中的某个单词时查看输入句子中其他单词

       feed forward neural network是一个全连接的前馈神经网络,它的计算公式如下:

  • 解码器也由这两部分,但是在这两层之间有一个attention层用来帮助解码器关注输入句子的相关部分,这样decoder由三部分构成:self-attention、encoder-decoder attention和feed forward neural network,如下图所示:

 

二、self-attention层

1、self-attention在向量级上的计算过程:

  • 第一步:需要从输入的每个词向量中创建三个向量分别是:Query、Key和Value向量,这三个向量是由词向量分别乘以三个矩阵产生的。这三个新生的向量一般比源词向量更小,过程如下:
  • 我们最终在输入句子中创建每个单词的"query",  "key", 和"value"的投影

 

  • 第二步:是计算self-attention的评分;当我们在为位置i的词进行编码时我们需要计算词i对输入句子中所有词的评分,评分越高说明词i更关注该词。每个得分的计算方式是:用当前正在编码的词的query向量乘以句子中的每个词的"key"向量可以得到当前词对句子中所有词的评分,如下图所示:
  • 图中第一个词的对自己的评分为112对第二个词的评分是98.

 

  • 第三步:正则化每个词的评分(score)向量;先将每个分数除以key向量维度的评分跟即 ,论文中key向量的维度是64所有 ;再将每个词的得分向量输入到softmax层进行标准化。
  • 该softmax分数确定每个单词在该位置表达的程度。一般情况下,这个位置上的单词将具有最高的softmax分数,但有时候注意与当前单词相关的另一个单词是有用的。

 

  • 第四步:对每个位置用它的得分向量对value向量列表进行加权并求和得到当前位置的self-attention的输出 ,计算过程如下:

 

2、self-attention在矩阵级上的计算过程:

  • 过程如下图:
  • 其中X是句子的词向量矩阵, 是产生"query", "key", 和"value"向量的线性变换矩阵。

 

三、Multi-Head self-Attention

  • 论文中通过增加一种称为Multi-Head self-Attention机制,进一步完善了self-Attention层。
  • 如上图所示我们为每个head分别保存一组线性映射矩阵 ,这样可以再每个head里面分别产生Q/K/V向量,独立的进行上面的self-attention;论文中使用8个head,这样就会产生8个Z矩阵。
  • 然后将8个Z拼接,并通过一个线性映射矩阵 将拼接的矩阵映射为与X一样大的矩阵Z。如下图所示:
  • Multi-Head self-Attention的整体过程如下
  • 下面假设我们要翻译这样一句话:The animal didn't cross the street because it was too tired我们可以看到it的各个head的attention,如下图所示:

三、位置向量(Positional Encoding)

  • transform为每个词向量(embedding)添加了一个位置向量(Positional Encoding), 这些向量遵循模型学习的特定模式,这有助于确定每个单词的位置,或者序列中不同单词之间的距离。
  • 如果我们假设词embedding的维度为4,那么实际的位置编码(Positional Encoding)将如下所示:
  • 在下图是位置向量的颜色编码,每行对应一个词的位置编码。因此第一行将是我们添加到输入序列中第一个词的嵌入的向量。每行包含512个值每个值的值介于1和-1之间。
  • 上图中嵌入大小为512(列)的20个字(行)的位置编码的真实示例。您可以看到它在中心位置分成两半。这是因为左半部分的值由一个函数(使用正弦)生成,而右半部分由另一个函数(使用余弦)生成。然后将它们连接起来以形成每个位置编码矢量
  • 位置向量的计算公式如下:

四、残差连接(residual connection)

  • 在编码器的两个子层(self-attention和ffn)后都跟着一个残差连接层,然后再是正则化层(normalization layer),如下图所示,其中虚线和Add操作就是残差连接。
  • 将self-attention子层后面的residual connection和normalization层可视化如下:
  • 当然在解码器的上面的self-attention和ffn子层后也有残差连接,下图是2层的transform的示意图:

五、前馈神经网络层(Feed-Forward Networks)

  • 这里说的前馈神经网络层其实质上是论文中所说的Position-wise Feed-Forward Networks层。除了self-attention子层之外,我们的每个编码器和解码器中都还包含一个全连接的前馈神经网络子层叫Position-wise Feed-Forward Networks。该子层包括两个线性变换,并且两个线性变换中间还有ReLU激活函数。Position-wise Feed-Forward Networks层的公式如下:

六、解码器中的特有子层encoder-decoder attention层

  • 在解码器的结构中有一个独有的子层叫encoder-decoder attention子层,这个子层是在编码器中没有的,它的内部结构和self-attention子层是一样的,但是输入来源和self-attention是不一样的。Self-attention的输入是来自上一层输出R或者是词向量X的经过 三次映射得到的Q,K和V向量。而encoder-decoder attention的输入中K和V向量是来自编码器最后一层输出R经过 两次线性映射得到,Q向量是由上一层解码器中的self-attention层输出R经过 一次线性映射得到的,这有助于解码器在翻译过程中关注输入序列中的相应位置。过程图如下:
  • 编码阶段:该过程一次性完成,将输入词向量序列矩阵X经过所有的编码器转化为有self-attention的词向量序列矩阵R(R是最后一个编码去的输出),X和R大小一样只是R中的每个词向量加入了整个句子的上下文信息。
  • 解码阶段:是一个循环过程,每次翻译出一个目标词,然后将其该词送到解码器的底部输入以生成下一个词,这个循环过程直到编码器生成一个特殊的词才结束,这个词就是句子结束符。每轮翻译循环中,每个编码器将R通过线性映射成为encode-decode attention的K和V向量,而将上一层的self-attention的输出Z经过线性影响成为encode-decode attention的Q向量,然后将K,V和Q向量一起输入encode-decode attention。


七、解码器的self-attention子层

  • 解码器的self-attention与编码器中self-attention(也就是上面讲的self-attention)有所不同。在解码器中,在self-attention层中仅允许每个词关注目标语言序列中的前序位置。这是通过在self-attention层中屏蔽后面的位置来完成即通过设置后面词的mask为-inf。mask的在self-attention的位置如下图:
  • 在解码器中Encoder-Decoder Attention其工作原理和self-attention是一样的(即也需要屏蔽词后驱的attention)只不过它的Q矩阵来自它的下一层的输出,而K和V是来自编码器的最上面的输出;
  • 在我的理解中,attention其实质就是一个矩阵Q和矩阵K的点积即矩阵V的分数(权值)矩阵W,W可以用下面的图来直观的表示。图中的每一行对应一个词,该行中存的就是整个句子中每个词对该次的attention度即分数。
  • 而在decoder中的self-attention中需要屏蔽每个词对其后驱词的attention就是将上图矩阵W中对角线以上的值设置为-inf。如下图所示:


八、最后的线性映射和sofmax层

  • 编码器最后面的Linear和sofmax层负责将编码器最后输出的向量转化为目标词,Linear层是一个简单的全连接层负责把编码器的输出向量转化为logits向量该向量和词汇一样长,logits向量中每个元素代表输出该位置对应词汇表中词的分数,再通过sofmax层将分数转化为概率,再取最大概率对应的词为当前的预测词
  • 因为不论是encoder还是decoder输入矩阵的大小和输出矩阵大小是一样的,我们在翻译某个词时使用该词前一个位置的decoder的输出给Linear和sofmax层得到该词的预测。
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐