Attention is all you need【论文笔记】

一、摘要

  显性序列转导模型通常基于复杂的RNN或CNN模型,包括一个encoder和一个decoder。表现最好的模型通常也在encoder和decoder之间应用attention机制。我们提出一个新的简单的网络架构,单纯地基于attention机制,完全没用到RNN或CNN模型。两个机器翻译任务的实验表明,这些模型在质量上更优越,同时更易于并行化,并且需要更少的时间进行训练。

二、介绍

  RNN、LSTM、GRU等模型在序列建模任务上表现很好,比如语言建模,机器翻译。这类递归模型沿着输入单词顺序地生成一系列的隐藏层状态。这种固有的顺序特性无法实现训练示例中的并行化,计算资源消耗大。即使通过 factorization trickfactorization\ trickfactorization trick和 conditional computaionconditional\ computaionconditional computaion可以提升效率,但是问题仍然存在。
  本篇论文,作者提出了Transformer,一种模型结构不使用RNN,单纯依靠attention机制就可以捕捉到输入和输出之间的全局依赖关系。

三、背景

  self-attention 也叫做 intra-attention,计算一个句子的表示时关联该句子的不同位置的信息。self-attention已经被成功应用于各种任务,阅读理解、自动摘要、文本蕴含等。端到端的内存网络基于递归的attention机制,在问答和语言建模任务上表现优秀。据我们所知,Transformer是第一个transduction模型,只依靠self-attention计算输入和输出的表示。

四、模型架构

Attention is all you need【论文笔记】

4.1 Encoder and Decoder Stacks

  • Encoder: encoder由6层堆叠而成。每一层有两个子层,第一个子层是multi-head self-attention机制,第二层是position-wise全连接前向网络。我们在两个子层中的每一个周围使用残余连接,然后是层归一化。因此,每一个子层的输出就是 LayerNorm(x+Sublayer(x))LayerNorm(x+Sublayer(x))LayerNorm(x+Sublayer(x))。为了利用这些残余连接,模型的每个子层的输出维度都为512.
  • Decoder: decoder也是由6层堆叠而成。每一层中与encoder相比,多了一层,对encoder堆叠的输出做multi-head attention。与encoder相似,每个子层使用residual connection,然后是layer normalization。我们还修改了decoder堆叠中的self-attention层,防止当前位置关注了后序位置的信息。这种掩码与输出嵌入偏移一个位置的事实相结合,确保了位置i的预测仅依赖于小于i的位置处的已知输出。

4.2 Attention

  attention函数可以描述为将查询和一组键值对映射到输出的过程,其中查询,键,值,输出都是向量。输出计算为值的加权和,其中分配给每个值的权重由查询与相应键的兼容性函数计算。
Attention is all you need【论文笔记】

4.2.1 Scaled Dot-Product Attention

   输入由 dkd_kdk​维度的queries和keys组成,values的维度为 dvd_vdv​。计算query和所有keys的点积,除以 dk\sqrt{d_k}dk​​,然后通过softmax函数获得权重。
Attention(Q,K,V)=softmax(QKTdk)V Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})VAttention(Q,K,V)=softmax(dk​​QKT​)V
   最长使用的两种注意力函数:加性注意力和点积注意力。加性注意力使用具有单个隐藏层的前馈网络来计算compatibility function。虽然这两者在理论复杂性上相似,但实际上点积更快,更节省空间,因为它可以使用高度优化的矩阵乘法来实现。
   dkd_kdk​比较小时两种attention性能差不多,dkd_kdk​比较大时,加性注意力比没有缩放的点积注意力要好。我们怀疑,对于较大的 dkd_kdk​ 值,点积大幅增大,将softmax函数推进到具有极小梯度的区域。为了抵消这个影响,我们进行了 1dk\frac{1}{\sqrt{d_k}}dk​​1​缩放。

4.2.2 Multi-Head Attention

   对于 dmodeld_{model}dmodel​ 维度的keys,values,queries,我们发现线性映射keys,values,queries hhh次(不同的),学习线性映射到dk,dk,dvd_k,d_k,d_vdk​,dk​,dv​维度,这比单个attention是更有效的。每个keys,values,queries映射版本都会并行的经过attention,输出dvd_vdv​,然后经过concat,再一次的projected,输出最终的向量。
   multi-head attention允许模型共同关注来自不同位置的不同表示子空间的信息。只用一个attention,平均就会抑制这种情况。
MultiHead(Q,K,V)=Concat(head1,...,headh)WO MultiHead(Q,K,V)=Concat(head_1,...,head_h)W^O MultiHead(Q,K,V)=Concat(head1​,...,headh​)WOwhere headi=Attention(QWiQ,KWiK,VWiV)where\ head_i=Attention(QW^Q_i,KW^K_i,VW^V_i)where headi​=Attention(QWiQ​,KWiK​,VWiV​)
  其中,WiQRdmodel×dk,WiKRdmodel×dk,WiVRdmodel×dv,WORhdv×dmodelW^Q_i\in R^{d_{model}\times d_k},W^K_i\in R^{d_{model}\times d_k},W^V_i\in R^{d_{model}\times d_v},W^O\in R^{hd_v\times d_{model}}WiQ​∈Rdmodel​×dk​,WiK​∈Rdmodel​×dk​,WiV​∈Rdmodel​×dv​,WO∈Rhdv​×dmodel​。本篇论文中,采取 h=8,dk=dv=dmodel/h=64h=8,d_k=d_v=d_{model}/h=64h=8,dk​=dv​=dmodel​/h=64

4.2.3 Applications of Attention in our Model

  • 在‘encoder-decoder attention’层,queries来自之前decoder的输出,keys和values来自encoder的输出。这允许decoder中的每个位置参与输入序列中的所有位置。这模仿了sequence-sequence模型中典型的encoder-decoder attention机制。
  • encoder包含self-attention层。对于self-attention层的所有key,values,queries都来自同一位置,是encoder前一层的输出。encoder中的每个位置都可以处理前一层中的所有位置信息。
  • 类似地,decoder中的自注意层允许解码器中的每个位置参与解码器中的所有位置直到并包括该位置。我们需要防止解码器中的向左信息流以保持自回归属性。我们通过屏蔽(设置为-∞)softmax输入中与非法连接相对应的所有值来实现缩放点积注意。

4.3 Position-wise Feed-Forward Networks

  除了attention子层,在encoder和decoder的每一层中都包含一个全连接前向网络,分别和相同地应用于每个位置。
FFN(x)=max(0,xW1+b1)W2+b2 FFN(x)=max(0,xW_1+b_1)W_2+b_2FFN(x)=max(0,xW1​+b1​)W2​+b2​

5.why self-attention

  • 每一层的计算复杂度
  • 计算并行化
  • 长距离的依赖关系

6. Experiment

  这里实验不再介绍

7. Conclusion

  作者提出了Transformer,完全依赖于attention,没有用到RNN、CNN结构。训练速度快,并且结果是state-of-the-art的。

  解析实现这里的博主讲得不错:http://blog.stupidme.me/transformer-attention-is-all-you-need/

上一篇:Codewars:Duplicate Encoder


下一篇:AutoEncoder以及TensorFlow-2.0实现代码