论文笔记 | NIPS2017 | Attention Is A

2019-06-21  本文已影响0人  ktulu7
transformer-title.png

论文地址:https://arxiv.org/abs/1706.03762

官方代码:https://github.com/tensorflow/tensor2tensor

第三方代码:https://github.com/Kyubyong/transformer

一 为什么读这篇

本文名字起的十分霸气,又称作变形金刚(transformer),其实这篇文章早就收入zotero了,光看名字就知道要做attention相关的东西本文是绕不开的,正好最近的工作有用到self-attention,其实就是基于本文的工作,初看项目代码时一脸懵逼,恶补了下相关知识,各种各样的解读,现在通过阅读原作来进一步加深理解,提高炼丹效率。。

二 截止阅读时这篇论文的引用次数

2019.6.20 2136次。当然比不过CV,不过也相当高了,自从看推荐相关的论文,就没见过引用上千的,这篇引用高可能也跟NLP有关。

三 相关背景介绍

中了17年的NIPS,同年6月挂到arXiv上。本篇出来后最先开始在机器翻译领域炸了,后来被各种花式引入解决其他领域的问题。

又是google出品,总共8个作者,有Google Brain的,也有Google Research的。文中特意注明,8个作者贡献是一样的。。排名是随机排的。。这也行,神操作。其中随机排列的一作Ashish Vaswani小哥来自印度,在南加州大学硕博总共读了10年。。还算高产,发了不少paper。

四 关键词

transformer

self-attention

multi-head attention

五 论文的主要贡献

1 提出Transformer架构,只用Attention,而不用CNN和RNN来解决时间序列问题

2 提出Self-Attention,Multi-head Attention

六 详细解读

0 摘要

一上来先批判一下CNN和RNN,称其复杂。提出的新架构Transformer仅基于attention机制,完全避免了递归和卷积。在效果很好的同时还能做到并行化,并且训练时间更少。在WMT2014的各个数据集上取得了SOTA。

1 介绍

基于RNN的模型已经在序列问题上取得了SOTA的效果,不过因为其固有的递归属性,其阻止了并行训练,并且长序列也是受限的。Attention机制已成为各种任务中序列建模和转换模型的重要组成部分,它可以在不考虑输入或输出序列中的距离时对依赖关系进行建模。但是几乎所有的attention都是用来连接RNN的。

Transformer在8卡的P100上训练12个小时。

2 背景

基于CNN的模型可以并行化,不过使得学习远距离位置之间的依赖性变得更加困难。Transformer将这个运算减少到常数级。另外由于平均注意力加权位置导致有效分辨率降低,3.2节提出的Multi-Head Attention来解决这个问题。

Self-attention,有时也称为intra-attention,其关联单个序列的不同位置以计算序列的表示。

端到端记忆网络基于递归注意机制,而不是序列对齐递归,在简单的问答模型中表现良好。

Transformer是第一个只依赖self-attention,而不依赖序列对齐RNN或卷积来计算输入输出序列表示。

3 模型架构

transformer-fig1.jpg

3.1 编码器和解码器堆叠

编码器

编码器由N=6个相同的层堆叠而成。每个层有2个子层,第一个是multi-head self-attention,第二个是简单的,position-wise的全连接前馈网络。在两个子层之间用残差连接,并接上layer normalization,即\text { LayerNorm }(x+\text { Sublayer }(x)),embedding层及所有子层的输出维度为d_{\text { model }}=512

解码器

编码器也是由N=6个相同的层堆叠而成。此外解码器还插入第三个子层,用于在编码器上的输出上执行multi-head attention。注意这里的是Masked Multi-head Attention,主要是避免偷看到未来信息。

3.2 Attention

attention函数可以认为是一个query和一组key-value对到输出的映射,其中,query,keys,values和输出都是vectors。输出为values的加权和,其中分配给每个value的权重由query与对应key通过函数计算得到。

3.2.1 Scaled Dot-Product Attention
transformer-fig2.jpg

query和key的维度为d_{k},value的维度为d_{v},计算query和所有key的点积,之后除\sqrt{d_{k}},通过softmax函数的应用来得到value的权重。公式如下:
\text { Attention }(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V
加法attention和点积(乘法)attention是最常见的两种attention函数,本文在点积attention的基础上使用了缩放因子\frac{1}{\sqrt{d_{k}}}

虽然对于值较小的d_{k},两种机制的表现类似,但是对于值较大的d_{k},加法attention优于没有缩放的点积attention。本文怀疑对于大的d_{k},点积大幅增加,将softmax函数推向具有极小梯度的区域,因此通过\frac{1}{\sqrt{d_{k}}}来缩放点积。

3.2.2 Multi-Head Attention

如图2-右所示。

Multi-head attention可以让模型共同关注来自不同位置的不同表示子空间的信息。
\text { MultiHead }(Q, K, V)=\text { Concat }\left(\text { head }_{1}, \ldots, \text { head }_{\mathrm{h}}\right) W^{O} \\ \text { where }\text head_{i} = { Attention }\left(Q W_{i}^{Q}, K W_{i}^{K}, V W_{i}^{V}\right)
本文用h=8作为并行attention层,对于每一个使用d_{k}=d_{v}=d_{\text { model }} / h=64

3.2.3 Attention在Transformer中的应用

Transformer用三种不同的方式来使用multi-head attention

  1. 在编解码attention层,query来自前一个解码层,记忆key和value是来自编码层的输出。这可以使解码器的每个位置都参与输入序列中的所有位置。
  2. 编码器包含self-attention层。其中所有key,value和query都是来自相同的空间,在这种情况下,也就是上一层的输出。编码器中的每个位置都可以处理编码器前一层中的所有位置。
  3. 类似的,解码器中的self-attention也可以使每个位置处理解码器前一层的所有位置。需要防止解码器中的信息向左流动以保持自回归属性,可以通过mask来实现(设置为-\infty)

3.3 Position-wise前馈网络

\operatorname{FFN}(x)=\max \left(0, x W_{1}+b_{1}\right) W_{2}+b_{2}

输入和输出的维度为d_{\text { model }}=512,层内部的维度为d_{f f}=2048

3.4 Embedding和Softmax

常规操作,但是给embedding层的权重乘了一个\sqrt{d_{\text { model }}}

3.5 位置编码

因为本文模型既没有rnn也没有cnn,为了让模型利用到序列的顺序,必须注入一些关于序列相对或绝对位置的信息。所以使用和embedding相同维度的位置编码,两者融合相加。本文使用sin和cos函数:
P E_{(p o s, 2 i)}=\sin \left(p o s / 10000^{2 i / d_{\text { model }}}\right) \\ P E_{(\text {pos}, 2 i+1)}=\cos \left(\operatorname{pos} / 10000^{2 i / d_{\text { model }}}\right)
其中pos是位置,i是维度。

本文发现用这个函数和用学习到的位置embedding效果差不多。

4 Why Self-Attention

使用self-attention基于三个需求。

  1. 每层总的计算复杂度
  2. 可以并行化的计算量,通过所需的最小顺序操作数来衡量
  3. 网络中长距离依赖之间的路径长度
transformer-table1.jpg

如表1所示,self-attention层用常数级序列运算连接所有的位置。而递归层需要O(n)的序列运算。除此之外,self-attention得到的模型有更好的解释性。

5 训练

5.1 训练数据和批次

在有450w句子对的WMT 2014英语-德语数据集上训练,大约有37000个token。对于英语-法语数据集,有3600w句子对,划分为32000个token。

5.2 硬件和进度

8卡的P100。没一步大约0.4秒。base模型大约10w步,耗时12小时。大模型每步1秒,训练30w步,耗时3.5天。

5.3 优化器

用Adam,\beta_{1}=0.9\beta_{2}=0.98\epsilon=10^{-9},学习率变化公式如下:
\text {lrate}=d_{\text { model }}^{-0.5} \cdot \min \left(\text {step}_{-} n u m^{-0.5}, \text { step_num } \cdot \text { warmup_steps }^{-1.5}\right)
其中\text {warmup}_{-} \text {steps}=4000

5.4 正则化

用了3种类型的正则化???

Residual Dropout

在每一个子层输出后加dropout,以及embedding后加。用P_{d r o p}=0.1

Label Smoothing

\epsilon_{l s}=0.1,效果有提升

6 结果

6.1 机器翻译

transformer-table2.png

注意这里为了达到更好的效果,用了融合最后几个checkpoint的trick。

6.2 模型变种

transformer-table3.png

第A行说明head太少,太多都不行。

第B行说明d_{k}减少效果变差。

第C行和第D行说明模型越大越好,同时dropout可以抑制过拟合。

第E行说明用正弦positional embedding和学习得到的positional embedding效果差不多。

6.3 英语成分句法分析

这一节是证明Transformer在其他任务上的泛化能力。

transformer-table4.png

七 小结

非常有影响力的一篇paper,后续与NLP,时间序列有关的问题都绕不开本文了,据说BERT也重度依赖了本文提出的模型结构。另外文章的名字也非常霸气,这个对传播也是很有帮助滴。

素质四连

要解决什么问题

进一步提升机器翻译的效果,突破RNN的限制

用了什么方法解决

完全用Attention机制,没有用RNN和CNN。并提出self-attention和multi-head attention

效果如何

17年的各种刷榜,当年的SOTA。

还存在什么问题

总感觉位置编码embedding那里有点可以,后续会有改进

算法背后的模式和原理

multi-head attention有点类似CNN的一些玩法(分分合合)。self-attention的提法非常好,充分利用了全局信息。

八 补充

google官方翻译版?

The Illustrated Transformer 这篇必看

《Attention is All You Need》浅读(简介+代码) 苏神的大作,同样值得一看

一步步解析Attention is All You Need!

上一篇下一篇

猜你喜欢

热点阅读