论文地址: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 模型架构
3.1 编码器和解码器堆叠
编码器
编码器由N=6个相同的层堆叠而成。每个层有2个子层,第一个是multi-head self-attention,第二个是简单的,position-wise的全连接前馈网络。在两个子层之间用残差连接,并接上layer normalization,即,embedding层及所有子层的输出维度为
解码器
编码器也是由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
query和key的维度为,value的维度为,计算query和所有key的点积,之后除,通过softmax函数的应用来得到value的权重。公式如下:
加法attention和点积(乘法)attention是最常见的两种attention函数,本文在点积attention的基础上使用了缩放因子。
虽然对于值较小的,两种机制的表现类似,但是对于值较大的,加法attention优于没有缩放的点积attention。本文怀疑对于大的,点积大幅增加,将softmax函数推向具有极小梯度的区域,因此通过来缩放点积。
3.2.2 Multi-Head Attention
如图2-右所示。
Multi-head attention可以让模型共同关注来自不同位置的不同表示子空间的信息。
本文用h=8作为并行attention层,对于每一个使用。
3.2.3 Attention在Transformer中的应用
Transformer用三种不同的方式来使用multi-head attention
- 在编解码attention层,query来自前一个解码层,记忆key和value是来自编码层的输出。这可以使解码器的每个位置都参与输入序列中的所有位置。
- 编码器包含self-attention层。其中所有key,value和query都是来自相同的空间,在这种情况下,也就是上一层的输出。编码器中的每个位置都可以处理编码器前一层中的所有位置。
- 类似的,解码器中的self-attention也可以使每个位置处理解码器前一层的所有位置。需要防止解码器中的信息向左流动以保持自回归属性,可以通过mask来实现(设置为)
3.3 Position-wise前馈网络
输入和输出的维度为,层内部的维度为
3.4 Embedding和Softmax
常规操作,但是给embedding层的权重乘了一个
3.5 位置编码
因为本文模型既没有rnn也没有cnn,为了让模型利用到序列的顺序,必须注入一些关于序列相对或绝对位置的信息。所以使用和embedding相同维度的位置编码,两者融合相加。本文使用sin和cos函数:
其中是位置,是维度。
本文发现用这个函数和用学习到的位置embedding效果差不多。
4 Why Self-Attention
使用self-attention基于三个需求。
- 每层总的计算复杂度
- 可以并行化的计算量,通过所需的最小顺序操作数来衡量
- 网络中长距离依赖之间的路径长度
如表1所示,self-attention层用常数级序列运算连接所有的位置。而递归层需要的序列运算。除此之外,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,,,,学习率变化公式如下:
其中
5.4 正则化
用了3种类型的正则化???
Residual Dropout
在每一个子层输出后加dropout,以及embedding后加。用
Label Smoothing
用,效果有提升
6 结果
6.1 机器翻译
注意这里为了达到更好的效果,用了融合最后几个checkpoint的trick。
6.2 模型变种
第A行说明head太少,太多都不行。
第B行说明减少效果变差。
第C行和第D行说明模型越大越好,同时dropout可以抑制过拟合。
第E行说明用正弦positional embedding和学习得到的positional embedding效果差不多。
6.3 英语成分句法分析
这一节是证明Transformer在其他任务上的泛化能力。
七 小结
非常有影响力的一篇paper,后续与NLP,时间序列有关的问题都绕不开本文了,据说BERT也重度依赖了本文提出的模型结构。另外文章的名字也非常霸气,这个对传播也是很有帮助滴。
素质四连
要解决什么问题
进一步提升机器翻译的效果,突破RNN的限制
用了什么方法解决
完全用Attention机制,没有用RNN和CNN。并提出self-attention和multi-head attention
效果如何
17年的各种刷榜,当年的SOTA。
还存在什么问题
总感觉位置编码embedding那里有点可以,后续会有改进
算法背后的模式和原理
multi-head attention有点类似CNN的一些玩法(分分合合)。self-attention的提法非常好,充分利用了全局信息。
八 补充
The Illustrated Transformer 这篇必看
《Attention is All You Need》浅读(简介+代码) 苏神的大作,同样值得一看