图文并茂解释Transformer--The Illustrated Transformer翻译精简

原文链接https://jalammar.github.io/illustrated-transformer/

所需知识储备: RNN, Seq2Seq序列模型,Residual残差计算...

自从Attention is All you need 这篇文章发布后,Transformer火的一塌糊涂,热度不低于Bert。接下来让我们一起领略这个号称可以取代RNN,CNN的结构究竟是什么。

概览:

图文并茂解释Transformer--The Illustrated Transformer翻译精简_第1张图片

以机器翻译任务来示例,Transformer有着上述的黑盒结构,里面是多层的encoder和decoder:

图文并茂解释Transformer--The Illustrated Transformer翻译精简_第2张图片

其中每一个encoder单元有着完全相同的结构(但是并不互相共享权重),每个encoder单元可以分为两层:

图文并茂解释Transformer--The Illustrated Transformer翻译精简_第3张图片

encoder的输入首先流入Self-Attention单元,然后进入feed forward network(FFNN),之后完全相同的FFNN被应用在相同位置。

Decoder 的结构与上面的类似,但是中间又多了一个attention层,这使得解码时能够集中在输入句子的最相关部分(与seq2seq模型中使用attention的方法类似):

图文并茂解释Transformer--The Illustrated Transformer翻译精简_第4张图片

在上述模型中加入Tensor:

这一部分看图就行,先是词嵌入的表示,然后词嵌入输入encoder:

图文并茂解释Transformer--The Illustrated Transformer翻译精简_第5张图片

在这里,我们开需要注意Transformer的一个关键属性,即每个位置的单词在编码器中流向属于自己的路径。Self attention层中的这些路径之间存在依赖关系, FFNN层则不具有这些依赖。因此各种路径可以在流过FFNN层时并行执行。各个encoder之间的数据流如下图所示:

图文并茂解释Transformer--The Illustrated Transformer翻译精简_第6张图片

概述Self-Attention:

在阅读Attention is All You Need论文之前,我个人从未遇到过这个概念。 让我们提炼它是如何工作的:

如果我们想要翻译下面的英文句子:

The animal didn't cross the street because it was too tired

‘it’在句子中指的是什么?是''street"还是‘animal’?对人而言这是简单的问题,但对于算法而言却不是。当算法模型在处理'it'这一个词的时候,Self-attention的作用就是将他与‘animal’相关联。当模型处理每个单词(输入序列中的每个位置)时,Self-attention允许它查看输入序列中的其他位置从而优化当前词汇的编码。

如果你很熟悉RNN,想象一下如何使得RNN中的hidden state能够融合之前处理过的词汇与当前正在处理的词汇的语义信息?在Transformer中,Self-attention就是起到了这样的作用。它能够将其他相关单词的“语义理解”融入我们当前正在处理的单词中。比如上面的示例中,encoder堆栈的最上层的encoder #5 在编码'it'时,部分注意力集中在The animal上,并在it的语义表示上与这些词进行了融合。

图文并茂解释Transformer--The Illustrated Transformer翻译精简_第7张图片

请务必查看Tensor2Tensor Notebook https://colab.research.google.com/github/tensorflow/tensor2tensor/blob/master/tensor2tensor/notebooks/hello_t2t.ipynb,您可以在其中加载Transformer模型,并使用此交互式可视化对其进行检查。

详解Self-attention

计算Self-attention的第一步--从每个编码器的输入向量创建三个向量(在这种情况下就是词嵌入)。 因此,对于每个单词,我们创建一个Query向量,一个Key向量和一个Value向量(简称Q,K,V)。 这些向量是通过将词嵌入乘以我们在训练过程中训练的三个矩阵而创建的。(这些向量帮助attention理解与计算,是语义的抽象)

请注意,这些新向量的尺寸小于嵌入向量。 它们的维数为64,而嵌入和encoder输入/输出向量的维数为512。当然这里并不是必须这样设置,而是一种可以使multihead attention计算大致固定结构的选择,。

第二步--计算一个数值score。假设我们正在计算这个例子中第一个单词“Thinking”的self attention。 我们需要根据这个词对输入句子的每个单词进行评分。 当我们在某个位置编码单词时,分数决定了对输入句子的其他部分放置多少焦点。

该数值score的计算方式是q与k向量的点积,k向量随着关注词汇的变化而变化。如上例图示,如果我们在计算#1单词(thinking)的attention时,我们应该先计算q1*k1,再计算q1*k2

第三步第四步--将score除以8(论文中使用的k向量维数64的平方根,这使得模型具有更稳定的梯度。这里可能存在其他合理的值,但默认值是这么计算的),然后将结果传入softmax操作。 Softmax将分数标准化,因此从而使得它们都是正数并且加起来为1。(Softamx score决定了在当前位置某个词的语义被表达出来多少,明显的是当前位置的词具有较大的score,但是关注其他位置的与当前位置有关的词也非常有用 ps:上下文语义)

第五步—将v向量与对应的softmax值相乘(为最后的相加做准备),该做法的缘由是保持我们关注的单词不变的情况下,过滤掉不相关词汇(比如将他们乘以非常小的数值)

第六步—将上一步v*softmax后的矩阵加总求和,即为此位置(本例为第一个单词)self-attetion层的输出,总流程为下图所示:

图文并茂解释Transformer--The Illustrated Transformer翻译精简_第8张图片

上述过程阐述了self attention的总体计算流程,但在实际使用过程中,为了加速计算等需求,常常以词级别矩阵来计算Self attention.

Self attention 的矩阵计算方式:

将我们上一节的输入变为矩阵X(由word embedding拼接而成),乘以对应的权重矩阵WQ,WK,WV,得到Q,K,V矩阵:

图文并茂解释Transformer--The Illustrated Transformer翻译精简_第9张图片

其他流程与上一节相同,因为我们正在处理矩阵,所以我们可以在一个公式中浓缩步骤2到6来计算self attention层的输出:

图文并茂解释Transformer--The Illustrated Transformer翻译精简_第10张图片

‘多头巨兽’—attention with multi heads

Attention is all you need论文中提出了multi-head attention来精炼改进self attention,这样做带来的改进是:

  1. 扩展了模型关注不同位置的能力。在上见面的示例中,self attention最后输出的z1仅包含了其他位置的一点点语义,其值还是极有可能由本位制单词支配。
  2. 它为注意层提供了多个“表示子空间”。 正如我们接下来将看到的,我们不仅有一个,而且还有多组Query / Key / Value权重矩阵(Transformer使用8个注意头,因此我们最终为每个编码器/解码器设置了8组矩阵)。 每组矩阵都是随机初始化的。 然后,在训练之后,每组矩阵用于将输入矩阵(或来自较低编码器/解码器的矢量)投影到不同的表示子空间中。

使用上一节的self attention计算方式计算,会出现8次不同的矩阵乘法(8组不同的权重矩阵),得到8个不同的z值(矩阵),称为attention head。

         前馈网络FFNN并不能接收8个矩阵作为输入,所以必须将这8个矩阵进行整合,得到一个矩阵。做法是将8个z矩阵先拼接再乘以一个附加权重矩阵WO.这样得到的矩阵Z就可以作为FFNN的输入了。

Multi-head attention总计算流程如下:

图文并茂解释Transformer--The Illustrated Transformer翻译精简_第11张图片

使用位置编码表示序列的顺序

到目前为止,上述模型还缺少一种记录输入序列中词顺序的方法。

为了解决这个问题,transformer为每个输入嵌入添加了一个向量(positional encoding)。 这些向量遵循模型学习的特定模式,这有助于确定每个单词的位置,或者序列中不同单词之间的距离。这种方法的意义是将这些值添加在embedding中,当它们被映射到Q / K / V向量中且在点积计算期间,能够提供embedding vector之间的距离表示。图示该过程如下:

图文并茂解释Transformer--The Illustrated Transformer翻译精简_第12张图片

残差的使用

encoder架构中还有一个细节是每个编码器中的每个子层(Self-attetion,ffnn)在其周围都具有残差(Residual)连接,然后是层规范化步骤(layer norm)。同样,在decoder 中也是这样的结构,用2个encoder 、2个decoder构成的seq2seq网络结构为:

图文并茂解释Transformer--The Illustrated Transformer翻译精简_第13张图片

Decoder

PS:该部分动图在原链接中看更直观。

用两张图表示decoder的解码过程:

第一步--通过encoder得到K,V矩阵,依次输入各个decoder解码出第一个step的结果。

图文并茂解释Transformer--The Illustrated Transformer翻译精简_第14张图片

第二步到最后一步—通过上一步解码出的结果作为decoder输入,经过decoder解码器解码出当前step的结果:

图文并茂解释Transformer--The Illustrated Transformer翻译精简_第15张图片

在decoder中,self attention层与其在encoder中不尽相同,区别在:

在解码器中,仅允许self attention关注输出序列中的较早位置。 这是通过在self attention计算中的softmax步骤之前屏蔽未来位置(将它们设置为-inf)来完成的。

Encoder-Decoder Attention层与multi head attention类似,不同的是它从它下面的层建立Q矩阵,并从编码器堆栈的输出中获取K,V矩阵。

Linear + Softmax

Deep Learning必备基础知识,不赘述。

训练过程的重点

与seq2seq一致,不赘述

你可能感兴趣的:(图文并茂解释Transformer--The Illustrated Transformer翻译精简)