论文笔记《Attention Is All You Need》

余生颓废 提交于 2019-12-05 22:23:50

原文链接
本文发表于人工智能顶级会议 NIPS 2017
代码实现

摘要

现在主流的sequence2sequence的模型都是基于复杂的CNN或RNN结构,目前效果最好的几个模型都采用了attention机制,本文提出了一种新的简单的网络结构,能够完全抛弃CNN和RNN,只需要使用attention就能够让效果变得非常好。

模型

本文模型如下图所示:
主模型

图中左侧灰色区域为encoder子结构,encoder总共包含N=6个这样的相同的结构。该结构包含两个子层,分别为一个称为“multi-head attention”的子层,和一个全连接的神经网络。这两个子层都采用了残差连接的方式,在加上了残差之后还做了一个归一化,公式表示为:Norm(x+Sublayer(x))其中Sublayer(x)代表每个特定的子层,为了保证残差的计算能够正常进行,每个子层的输出维度都规定为dmodel=512维。


图中右侧灰色区域为decoder子结构,decoder总共包含N=6个这样的相同的结构。该结构包含三个子层,分别为一个称为“multi-head attention”的子层用于连接encoder的输出,一个称为“Masked multi-head attention”的子层,该层在“multi-head attention”的基础上进行了调整(为使位置 i 处的预测仅依赖于 i 之前的输出, 在 multi-head attention 内使用了 mask),最后一个子层是一个全连接的神经网络。与encoder相同,我们每一个子层都应用了残差连接并且进行了归一化。


multi-head attention的结构如下图所示:
multi head attention
从图中可以看出,该结构中不止算了一次 Scaled Dot-Product Attention,而是对 Q, K, V 做了 h 次线性变换,得到 h 个平行的 Q, K, V,计算了 h 次 Scaled Dot-Product Attention,然后对所有的 Scaled Dot-Product Attention 输出做一次 concat之后再做一次线性变换. 公式: MultiHead(Q,K,V)=Concat(head1,,headh)WO, 其中 headi=Attention(QWiQ,KWiK,VWiV)


Scaled Dot-Product Attention的结构如下图所示:
Scaled Dot-Product Attention

图中结构用公式可表示为: Attention(Q,K,V)=softmax(QKTdk)V. 其中 Q 表示 query 的矩阵, K 表示 key 的矩阵, V 表示 value 的矩阵. 这个式子与 Dot-Product Attention 的区别在于多了一个分母 dk. (根据文章脚注的说法: 点积会随 dk 的增大而增大, 从而使得 softmax 的梯度饱和. 假设 query 和 key 的值是均值为 0, 方差为 1 的独立变量, qk=Σi=1dkqiki 的结果的方差将是 dk)其中dk是Q和K的维度

总结

1.模型全程使用 Attention, 在 encoder 和 decoder 中使用 self-attention 来学习序列表示, 即 Q=K=V; 使用 encoder-decoder attention 将 encoder 与 decoder 连接起来. 注意, encoder-decoder attention 不是 self-attention, 因为 keys, values 来自 encoder, queries 来自 decoder。
2.不使用 RNN 与 CNN 带来了位置信息丢失的问题. 为此, 模型将 Input Embedding 与 Positional Encoding 相结合. 文中使用了 sincos 函数来编码位置信息. PE(pos,2i)=sin(pos/100002i/dmodel); PE(pos,2i+1)=cos(pos/100002i/dmodel). 对此, 文中的解释是: 该方法可以将相对位置注入模型, 因为对于任意固定的偏移量 k, PEpos+k 都是 PEpos 的线型函数; 此外, 该方法还能应付序列长度超出所有训练样本的情况。
3.使用 self-attention 学习序列表示的 3 个优点:

  1. 每层的计算复杂度降低了; (RNN 真的是很复杂很复杂啊)
  2. 计算可并行;
  3. 缓解了长期依赖 long-range dependencies问题. (使用 self-attention, 所有位置间的距离是一个常数. 带来的问题是, 每次 query 都得遍历整个输入序列, 对于超长序列, 计算开销极大。)

4.学习率的更新很有意思: lr=dmodel0.5min(step0.5,stepwarmupstep1.5) 效果是, 在 wampup 阶段, 学习率增大, 之后再减小。
5.Regularization 技巧:

  1. Residual Dropout: 在每一个子层之后进行 dropout. 对 embedding 与 positional encoding 的和应用 dropout。
  2. Label Smoothing: 训练时使用该操作。 降低了 perplexity, 但提高了 accuracy 和 BLEU。

6.训练时, batch 应该是不固定的. 根据句子近似序列长度来组织 batch, 使得每一个 batch 包含约 25000 个 source token 和 25000 个 target token.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!