【2017NIPS】
论文:https://arxiv.org/pdf/1706.03762v5.pdf
代码:https://github.com/tensorflow/tensor2tensor
本文提出了新的网络结构Transformer,仅仅依靠注意力机制而不再使用循环和卷积结构
训练可以采用并行化,从而大大缩短训练时间
介绍
现有的循环模型每个时间步依次计算,这种序列化的方法大大阻碍了训练的并行
尽管有工作采用一些技巧提高了计算效率,但是这种序列化的本质问题仍然存在
注意力机制越来越多的被采用,因为可以建模与元素之间距离无关的相关性,但是目前还没有与循环网络想结合
本文提出了Transformer,避开了循环,而是完全依赖注意力机制来建模输入和输出之间的全局相关性,大大提高了模型的并行性,在8卡P100上训练12小时就可以达到翻译的SOTA
模型结构
现有的模型通常采用encoder-decoder结构,encoder将输入序列𝑥1, ⋯, 𝑥𝑛映射到连续的特征表示𝑧=𝑧1, ⋯, 𝑧𝑛,再基于z使用decoder生成输出序列𝑦1, ⋯, 𝑦𝑚
每一时间步都可以看做是一个自回归模型,将前面生成的输出作为当前步额外的输入
Transformer沿用这个整体框架,由堆叠的self-attention和point-wise、FC层构成encoder、decoder(分别对应下图左右部分)
Encoder and Decoder Stacks
encoder:由6个相同的layer组成,每个layer有两个sub-layer
第一个是multi-head self-attention 机制
第二个是position-wise fully connected feed-forward网络
在每个sub-layer中同时使用了残差结构,后面再接上LayerNormalization
即每个sublayer可以表示为LayerNorm(x+Sublayer(x))
网络中所有sub-layer,包括embedding layer输出的维度都为512
Decoder:也由6个相同的layer组成,每个layer除了和encoder相同的两个sub-layer,还有第三个sub-layer
第三个sub-layer为对encoder stack的输出进行multi-head attention
在每个sub-layer中同时使用了残差结构,后面再接上LayerNormalization
同时对decoder stack的self-attention(第一个sub-layer)使用了masking,使得在当前的decoder的output输入中,不能获知后面时间步的输出,同时对于decoder的输入,是将gt的句子整体右移了一个时间步
例如输入为11 12 13,对应输出为21 22 23,在decoder中第二时间步时,decoder的输入为21(不能让它见到22 23),第三时间步decoder的输入为21 22(不能让它见到23)
具体解释见下面链接:
Attention
attention函数可以看是做将query和一组(key,value)对映射到output(query、keys、value和output都是向量)
output是value的加权求和,而每个value的权重系数是通过其对应的key以及query之间的函数计算得到的
Scaled Dot-Product Attention
输入有𝑑𝑘维的query和key向量组成,计算query和各个key之间的点乘,再除以,再使用softmax函数得到每个value对应的权重系数
在实际计算时,使用矩阵将一组query同时计算
现有的有些attention比较类似,但是没有除以,但是当𝑑𝑘比较大时,向量点乘的结果也会比较大,softmax会倾向于到达梯度较小的区域(更靠近0或1)
Multi-Head Attention
作者发现将query、key和value使用h个不同的线性映射,从而学习到不同的特征,最后再将它们output的结果进行concat会十分有效,而且这h组attention操作可以并行进行
multi-head attention可以让模型在不同的位置学习到不同的特征表示子空间信息
在实际计算时,h=8,𝑑𝑘=𝑑𝑣=𝑑𝑚𝑜𝑑𝑒𝑙/ h = 64
Applications of Attention in our Model
Transformer的multi-head attention有三个特点
1、在decoder的第三个sub-layer中,query来自前一层的decoder,而key和value则来自encoder的输出,这样在decoder的每个位置,都可以感知到来自输入序列的所有位置
2、在encoder中的self-attention层中,key、value和query都来自上一层encoder的输出,因此encoder的每个位置也都可以感知到前面encoder层的所有位置
3、在decoder中的self-attention(第一个sub-layer),decoder的每个位置可以感知到前面时间步的位置(包括当前位置),而剩下的位置为非法位置
Position-wise Feed-Forward Networks
在每个layer中,除了attention结构,还有一个Position-wise的Feed-Forward网络
每个位置都进行独立的进行FC,但是不同位置共享同一组参数
Embeddings and Softmax
Encoder部分的embedding、Decoder部分的embedding和最后输出前的线性变换,共享同一个参数
Positional Encoding
间隔地使用sin和cos函数获得位置编码
其中pos为当前位置(步数),i为特征维度
为什么采用self-attention
1、每层的计算量减少
2、在训练时,可以并行计算
3、网络中长范围的相关性,当两个位置的输入输出之前的路径更短时,更容易学习到两者之间的相关性
比较不同方法的复杂度、最大的两个位置之间的路径长度
此外,self-attention可以得到更具有解释性的模型
训练
训练数据
WMT2014 英语-德语数据集,有450万个句子对
句子使用byte-pair encoding进行编码,可以解决在测试的OOV问题(out of vocabulary)
BPE编码详见:https://blog.csdn.net/foneone/article/details/103811328
大致过程为先按照字母拆开,词汇表为字母级,然后将连续出现高频的字母组合加入词汇表,直到词汇表到达预定大小
源语言和目标语言使用共同的词汇表,共有37000个tokens
WMT201 4英语-法语数据集有360万个句子对,拆分为32000个单词级的词汇表
训练时每个batch大约有25000个源tokens和25000个目标tokens
硬件
8块P100 base模型训练12hours big模型训练3.5天
优化器
Adam β1=0.9 β2=0.98
学习率现在warmup步内线性增加,再按照逆平方根下降
正则化
残差dropout:在每个sub-layer的输出与residual直连相加前使用dropout,对于encoder和decoder中的embedding之和(input+position)以及position embedding使用dropout,比例为0.1
标签平滑:以0.1的比例进行标签平滑
结果
机器翻译
对于base模型,使用最后5个checkpoint的均值,对于big模型,使用最后20个checkpoint的均值
beam search是beam size为4
模型变种
A组改变了attention head数量以及key和value的维度,以保证总的计算量相同,发现head数太多或太少都不好
B组减少了attention key的维度,发现性能损失
C和D组发现更大的模型性能更好,同时dropout可以有效避免过拟合
E组将正弦式的位置编码换成可学习式的参数,结果基于一样
英文成分句法分析
这个任务很难:输出受到很强的结构限制,同时输出比输入长很多