摘要
主流的序列转换模型都是基于复杂的循环或者卷积神经网络,需要进行解码器和编码器处理。表现最好的模型也是基于注意力机制,并连接编码器和解码器。本文提出一个新的简单网络结构:Transformer,同样基于注意力机制,不再依赖RNN或者CNN。基于两种机器翻译任务的实验显示这些模型质量更优同时并行度更高,需要更少的训练时间。本文模型在WMT 2014 英语德语翻译任务达到28.4BLEU,优于最好记录2 BLEU。在WMT 2014 英法翻译任务,模型获得单模型最好乘积 41.0 BLEU。模型在8块GPU上训练了3.5天。
介绍
RNN,LSTM,GRNN(门控循环神经网络)这些模型牢固建立了序列模型和诸如语言模型和机器翻译的转导问题的良好表现。循环模型内在的顺序性阻碍了训练过程中的平行度,当序列长度更长时这种问题会更加严重,内存约束限制了样本间的批处理。近期的工作通过因子分解和条件计算改进了计算效率和模型表现,但是序列计算的基础限制仍然存在。
背景
减少顺序计算的目标也形成了扩展神经GPU,ByteNet和ConvS2S的基础,她们使用卷积神经网络作为基础构建块,对所有输入和输出位置并行计算隐藏表征。在这些模型中,需要从两个任意输入或者输出位置的相关信号操作数随着位置之间的距离增加而增加。ConvS2S是线性增加,ByteNet是对数增长。在Transformer中,这些被减少到常数个操作数。尽管由于平均注意力加权位置降低有效分辨率为代价,我们使用多头注意力来抵消这种影响。
自注意力也被叫做内部注意力,是一种关系到单个序列的不同位置,去计算序列的标表征的注意力方法。自注意力方法已经被成功用到阅读理解,抽象概括,文本内涵和学习任务无关的句子表征。
端到端内存网络基于循环注意力机制而不是序列对齐循环。它已经被证明在简单语言问答和语言模型任务上表现良好。
Transformer是第一个完全依赖于自注意力去计算输入输出表征而不用序列对齐RNN或者卷积的转导模型。
本文主要描述Transformer和激励自注意力,并讨论他们对比其他模型的优势。
模型结构
大多数神经序列转换模型都是encoder-decoder结构的,encoder将输入序列的符号表征\((x_1,…,x_n)\) 映射到连续表征序列\(z=(z_1,…,z_n)\) ,decoder生成符号的输出序列\((y_1,…,y_m)\),每次一个元素。在每一步,模型都是自动回归的,不断将前一个生成符号作为额外输入来生成下一个输出。
Transformer大体上也使用这种结构,并使用了堆叠的自注意力和点式,encoder和decoder都是全连接层。
Encoder and Decoder Stacks
Encoder: encoder有六个相等层堆叠组成,每一层有两个子层。第一个是多头自注意力机制,第二个是简单的位置相关的全连接前馈网络。模型在每两个子层后使用残差连接,接着是层标准化。也就是说,每个子层的输出是\(LayerNorm(x+Sublayer(x))\) , \(Sublayer(x)\)子层自身实现的函数,为了便于这些残差连接,模型中所有子层及嵌入层都会产生维数为512的输出。
Decoder:decoder也是由六个相同层的堆叠组成。除了两个endoer层的子层,decoder插入了第三个子层,在encoder堆栈的输出上进行多头注意力方法。和encoder类似,模型使用残差连接在每个子层上,然后是层标准化。论文修改了decoder堆栈的自注意力子层,防止位置进入后续位置。这种mask方法结合输出embedding被一个位置偏离,保证位置i的预测只依赖于比i小的位置的已知输出。
Attention
Attention函数可以被描述为查询和一组键值对到输出的映射,查询、键值和输出都是向量。输出是由值的加权和计算而来,分配给每个值的权重是由查询和对应键的兼容函数计算得来。
Scaled Dot-Product Attention
本文中的这种注意力机制称为缩放点乘注意力。输入包含了query和\(d_k\)维度的key以及\(d_v\) 维度的value。模型计算query和所有key的点乘,各自除以\(\sqrt{d_k}\) ,然后施加一个softmax函数去获得value的权重。
在实践中,模型在一组查询上同时计算注意力,打包成矩阵\(Q\) 。key和value也被一起打包成矩阵\(K\) 和 \(V\) 。输出公式如下:
\(Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V\)
两个最常用的注意力函数是加性注意力和点乘注意力。点乘注意力和本文算法相同,除了缩放因子\(\frac{1}{\sqrt{d_k}}\) 。加性注意力使用前馈网络和一个单独的隐藏层计算兼容函数。虽然这两种注意力在理论复杂度上是相似的,但是点乘注意力是更快且空间效率更高,因为它可以使用高度优化的矩阵乘法代码实现。
Multi-Head Attention
不使用\(d_{model}\) 维key、value和query实现单注意力函数,本文发现线性投影query、key和value h次,通过不同学习到的\(d_k\) 和 \(d_v\) 各自的线性投影。在query、key和value各个版本投影上并行实施注意力函数,生成 \(d_v\) 维度的输出值。这些被合并然后再次投影一次,生成最终之的结果。
多头注意力允许模型在不同位置共同处理来自不同子空间的信息。单头注意力则抑制了这种共享。
\(MultiHead(Q,K,V)=Concat(head_1,…,head_h)W^O\\ where\; head_i=Attention(QW^Q_i,KW_i^K,VW_i^V)\)
投影是参数矩阵 \(W_i^Q\in \mathbb{R}^{d_{model} \times d_k},W_i^K \in \mathbb{R}^{d_{model} \times d_k},W_i^V \in \mathbb{R}^{d_{model} \times d_v}\)\(W^O \in \mathbb{R}^{hd_v \times d_{model}}\) 本文中使用了 \(h=8\) 并行注意力层或者说注意力头。对每个层维度为\(d_k=d_v=d_{model}/h=64\) 。由于每个头维度的减少,总的计算开销是和全维度的单头注意力相似的。
模型中的注意力应用
Transformer使用的多头注意力有三种不同的方式:
- 在encoder-decoder注意力层,query来自前面的decoder层,存储器key和value来自编码器的输出。这允许解码器的每个位置参与输入序列的所有位置。这模仿了sequence to sequence模型中典型的编码-解码注意力机制。
- encoder编码器包含自注意力层。在自注意力层所有key,value和query来自相同的地方,即encoder中前一层的输出。encoder中的每个位置都接受编码器前一层的所有位置。
- 相同地,解码器的自注意力层允许解码器中的每个位置参与解码上的每个位置。需要阻止解码器中的左向信息流并保护自动回归属性。我们实现这种机制而不是缩放点乘注意力,通过屏蔽(设置为负无穷)和非法连接相关的softmax层输入的所有值。
Position-wise前馈网络
除了注意力子层,编码器和解码器的每一层都包含一个全连接前馈网络,它对每个位置单独且同等地施加。这包含两个线性转换,在这之间是ReLU激活函数。
\(FFN(x)=max(0,xW_1+b_1)W_2+b_2\)
虽然线性转换也同样跨过不同位置,他们在层和层之间使用不同的参数。另一种描述方式是和两个核大小为1的卷积层一样。输入输出的维度\(d_{model}=512\) ,内层维度\(d_{ff}=2048\) 。
Embedding 和 Softmax
和其他序列转换模型相似,本文也使用学习后的embedding去转换输入符号和输出符号为\(d_{model}\) 维向量,以及学习后的转换和softmax函数去将解码器输出转换维预测下个字符的可能性。在模型中,相同的权重矩阵在两个embedding层和pre-softmax线性转换间共享。在embedding层,权重被乘以\(\sqrt{d_{model}}\) 。
位置编码
因为模型不包含任何循环和卷积,为了模型利用号序列顺序,我们必须注入一些关于序列中符号的绝对位置的信息。模型在编码器和解码器堆栈底部添加位置编码到embedding中。这些位置编码有相同的维度\(d_{model}\) ,和embedding相同,所以这两个可以被加和。位置编码有多种选择,学习到的和固定的。
本文使用不同频率的sine和cosine函数:
\(PE_{(pos,2i)}=sin(pos/10000^{2i/d_{model}}) \\ PE_{(pos,2i+1)}=cos(pos/10000^{2i/d_{model}})\)
pos是位置,i为维度,位置编码的每个维度都和sin正弦曲线相关。波长从\(2\pi\) 到 \(10000 \cdot 2\pi\) 形成几何级数。 之所以选择这个函数是因为我们猜测它会允许模型更容易学习相关位置。因为任何固定的偏移\(k\) ,\(PE_{pos+k}\) 可以被线性函数\(PE_{pos}\) 表示。
作者使用学习后的位置嵌入进行实现,发现这两种版本有近乎相同的结果。之所以选择正弦曲线版本,是因为它允许模型去推断比在训练中遇到的更长的序列长度。
Why Self-Attention
在本节作者将自注意力层的各个方面与循环和卷积层进行比较,他们通常用于映射一个变量长度符号表征序列\((x_1,…,x_n)\) 到另一个相同长度的序列\((z_1,…,z_n)\),在典型的序列转换编码器或者解码器中的这样一个隐藏层。为了激发对自注意力的使用,作者考虑了三个需要。
一个是每层总计计算复杂度。另一个是可并行的计算量,通过序列操作需要的最小数量进行度量。第三个是网络中长范围依赖间的路径长度。学习长范围依赖是许多序列转换任务的关键挑战。一个影响着学习这种依赖的关键因子是前向和反向信号需要在网络中穿越的路径长度。在输入和输出序列中任意位置的结合路径越短,越容易去学习这种长范围依赖。因此我们也比较了由不同层类型组成的网络中,任意两个输入和输出位置的最大路径长度。
如表一所示,一个自注意力层连接着所有位置和常数个顺序执行操作。一个循环层需要\(O(n)\) 个顺序操作。在计算复杂度方面,当序列长度\(n\) 比表征维度\(d\) 更小时,自注意力层比循环层更快。这是被机器翻译中最先进的模型所使用的句子表征中最通常的例子,比如词片和字节对表征。为了改进包括非常长的序列任务的计算表现,自注意力应该被限制到只考虑输入序列中以各自输出位置周围最近的\(r\) 个大小的邻居。这应该减少最大路径长度到\(O(n/r)\) 。
一个核宽度\(k<n\) 的单卷积层不会连接到所有输入输出位置对。要达到这样需要\(O(n/k)\) 个连续卷积核的卷积层堆栈,或者\(O(logk(n))\) 个加宽的卷积,这会增加网络中任意两个位置的最长路径长度。卷积层通常比循环层复杂\(k\) 倍。分离的卷积层减少相当多的复杂度至\(O(k \cdot n \cdot d +n \cdot d^2)\) 。甚至当\(k=n\) 时,分离卷积的复杂度,和本文模型中采用的一个自注意力层与一个point-wise前馈层结合方法的复杂度相等。
至于侧面的收益,自注意力应该生成更多可解释的模型。作者观察模型中注意力的分布,在附录中提出并讨论了几个样例。不仅单个注意力头清楚地学习不同任务,许多注意头还表现出与句子的句法和语义结构相关的行为。
训练
训练数据和批数据
在包含450万句子对的WMT 2014 英-德数据集训练,句子使用字节对编码,用一个有37000符号的源到目标的字典。英译法任务使用明显更大的WMT 2014 英译法数据集,包含了3600万句子,并且划分符号到32000词片的字典。句子对被以一个估计的序列长度进行批处理。每个训练批包含一组含有大概25000个源符号和25000个目标符号的句子对。
硬件和规划
模型使用8块NVIDIA P100 GPU在一台机器上训练。基础模型训练每一步耗时0.4秒,总共训练了10万步或者12个小时。大模型的每一步时间为1秒,训练了30万步,耗时3.5天。
优化器
使用Adam优化器,\(\beta_1=0.9,\beta_2=0.98,\epsilon=10^{-9}\) ,学习率是动态变化的,参考公式如下:
\(lrate=d_{model}^{-0.5}\cdot min(step\_num^{-0.5},step\_num \cdot warmup_steps^{-1.5})\) 这对应于线性增加初始的warmup训练步骤的学习率,然后按比例地减少学习率到步数的负平方根。文章里使用的\(warmu\_steps=4000\) 。
正则化
Residual Dropout: 作者对每个子层的输出施加dropout,在它被加到子层的输入并且标准化之前。此外,作者也对编码器和解码器栈中的embeddings的总和与位置编码应用dropout。对于基础模型,使用dropout率为\(P_{drop}=0.1\) 。
标签平滑: 在训练中,应用了值\(\epsilon_{ls}=0.1\) 的标签平滑。它破坏了困惑度,因为模型学习变得更加不确定,但是改进了准确度和BLEU成绩。
结果
机器翻译
在英德翻译任务中,Transformer(big)模型好过此前所有模型超过2.0 BLEU,达到了28.4 BLEU。基础模型Transformer也超过此前发布的模型与集合。
在英法翻译任务中,大模型Transformer(big)达到了41.0的BLEU分数。
对于基础模型,我们使用单个模型,从间隔10分钟写入的最后5个检查点平均得到。对于大模型,平均了最后20个检查点。
模型使用beam大小为4,长度惩罚\(\alpha =0.6\) 的beam search。这些超参数是在对开发数据集进行试验后选择的。模型在预测时设置最大输出长度为输入长度加50,有可能提前终止。
表2也展示了与其他模型进行对比的训练开销,使用训练时间乘以GPU数量和估计的单个GPU的持续单精度浮点运算能力来估计训练一个模型所需要的浮点操作数。
K80,K40,M40和P100 GPU的算力分别为2.8 ,3.7,6.0和9.5 TFLOPS 。
模型变化
为了评估Transformer不同组件的重要性,作者将基础模型在不同方面进行变化,测量模型在newstest 2013 开发集的英德翻译任务上表现的变化。使用上节提到的beam search,但是不进行checkpoint平均化。
通过改变注意头的数量和注意力key和value的维度,保持计算量不变。单头注意力模型比最好的配置低0.9 BLEU,太多头的话质量也会下降。
在B行,作者观察到注意力key的尺寸\(d_k\) 减少会损害模型质量。这表明明确兼容性并不容易,而且比点乘更复杂的兼容性函数可能是有益的。
作者也观察了C行和D行,和预期一致,更大的模型表现更好,dropout有助于避免过拟合。在E行,把正弦曲线位置编码替换成学习后的位置嵌入,观察到与基础模型非常相近的结果
结论
在本文中,作者提出Transformer:第一个完全基于注意力的序列转换模型,在编码器-解码器结构中用多头自注意力取代最常用的循环层。
对于翻译任务,Transformer可以被训练地比基于循环或者卷积层的架构显著地更快。在WMT 2014 英-德 英-法翻译任务上,取得了新的成绩,比之前报道的任何模型都要表现出色。
作者对基于注意力的模型的未来很期待,计划把他们应用到其他任务。作者计划扩展Transformer到其他涉及文本以外的输入输出模型的问题,并研究本地受限制的注意力机制,以有效处理图像、音频和视频等大型输入和输出。使生成的序列更少也是另一个研究目标。
本文模型及代码见:https://github.com/tensorflow/tensor2tensor
标签:输出,Transformer,位置,模型,Attention,笔记,序列,need,注意力 From: https://www.cnblogs.com/d42z/p/16857316.html