主流的序列转换模型主要基于复杂的循环神经网络或者卷积神经网络, 这些结构往往包含编码器和解码器架构. 表现最好的模型使用注意力机制将编码器和加码器连接起来. 作者提出一种新的简单的网络, transformer, 仅仅使用注意力机制, 完全抛弃了循环结构和卷积结构. 在两个机器翻译任务上的实验表明, 作者提出的这些网络(为什么是s?)质量更好, 同时并行化程度更高, 训练时间更短. 作者提出的模型在WMT 2014 English-to-German 翻译任务中取得了28.4BLEU, 超过了现有的最佳结果2个点. 在这项任务中, 作者的模型建立了一个新的单模型, 仅仅用8GPU训练3.5天解达到了最高的41.8的BLEU分数, 是当时最优模型的很小一部分花费. 作者证明了transformer能够在其他任务上同样取得很好的成果, 例如在大量和有限数据上训练的English constituency parsing任务上都获得了成功.
ensembles: 与 single-model相对, 表示模型融合(Ensemble Learning) .通过对多个单模型融合以提升整体性能。如投票法, boost,stack等集成学习的方法. 参考
English constituency parsing : 英语句法分析
循环神经网络(RNN), 长短期记忆网络(LSTM)和门控RNN, 已经在序列模型和转换问题比如语言模型和机器翻译上建立了最前沿有效的方法地位.很多努力在不断地推动循环神经网络语言模型和编码-解码结构的边界前进.
循环模型通常是沿着输入和输出序列符号进行计算的. 将位置映射到计算的时间步的过程中, 循环模型产生了一系列的中间隐藏过程 h t h_t ht, h t h_t ht是前面状态 h t − 1 h_{t-1} ht−1和当前输入 t t t的函数. 这种序列固有的性质在训练时限制了并行化, 并行化对于长序列是很重要的, 这种限制是因为内存局限了不同序列之间的批处理. 最近的工作在计算效率上取得了显著的提升, 采用的方法为 f a c t o r i z a t i o n t r i c k s factorization\ tricks factorization tricks和 c o n d i t i o n a l c o m p u t a t i o n conditional \ computation conditional computation, 并且在 c o n d i t i o n a l c o m p u t a t i o n conditional \ computation conditional computation,中也获得了模型效果的提升. 但序列计算的根本限制仍然存在, 没有被解决.
注意力机制已经在很多任务的复杂序列模型和转换模型中成为重要的一部分, 能够让模型在输入序列和输出序列中建立各个部分的依赖, 而忽略位置距离影响. 在很多情况下, 然而这种注意力机制往往是和一个循环网络一起使用.
在这项工作中, 作者提出了transformer, 是一种完全避免了 r e c u r r e n c e recurrence recurrence(循环)而是仅仅依赖注意力机制, 在输入和输出之间建立全局依赖的模型框架. T r a n s f o r m e r Transformer Transformer 允许高度并行化, 并在翻译质量通过仅仅在8个P100 GPU上训练12个小时就达到了最高水平.
原来的rnn上添加trick和rnn的本质区别是什么–> 高度并行化??
为了减少序列计算, E x t e n d e d N e u r a l G P U Extended\ Neural\ GPU Extended Neural GPU B y t e N e t ByteNet ByteNet $ ConvS2S $ 使用了卷积神经网络作为基本的模块,对所有的输入输出位置并行化计算中间表示(hidden representations). 在这些模型中, 用于连接两个输出输出的任意位置的操作随着距离的增加而增加, 在ConvS2S中线性增长, 在ByteNet中成log函数增长. 这使得计算两个相距远的位置依赖的难度上升. 在transformer中, 这被减少为常数操作数中, 尽管由于使用平均注意力加权位置带来了效率下降的代价, 我们使用多头注意力机制来抵消.(??)
自注意力机制, 有时被叫做intra-attention是与单个句子不同位置相关的注意力机制, 目的在于计算一个句子的表示. 自注意力机制已经被成功应用在很多任务中, 比如阅读理解, 概要生成, 学习与任务相关的句子表示.
端到端记忆网络是主要基于循环注意力机制而不是序列依赖循环, 并且在简单语言的问答和语言模型任务上取得了很好的效果.
在作者调研, transformer是第一个仅仅依靠自注意力机制来计算输入输出表示的转换模型, 不使用序列对齐的RNN或者卷积神经网络. 在接下来的战绩, 详细介绍transformer中的自主力机制和相比于其他模型的优点.
transduction model: 序列推导模型
大多数前沿的神经序列推导模型用encoder-decoder架构.这里, encoder将输入序列的符号表示 ( x 1 , x 2 , . . . x n ) (x_1,x_2,...x_n) (x1,x2,...xn) 映射到一个连续的序列表示 z = ( z 1 , z 2 , . . . z n ) z=(z_1,z_2,...z_n) z=(z1,z2,...zn). 给出z, 解码器生成逐个元素的生成输出序列 y 1 , y 2 , . . . y m y_1, y_2,...y_m y1,y2,...ym. 在每一步中, 模型都是自回归的, 使用前面已经生成的符号作为额外输出来产生下一个元素.
transformer遵循这种编码器解码器架构, 使用堆叠自注意力机制和point-wise, 在encoder和decoder中都使用全连接层.
Encoder: encoder由N=6个独立的层堆叠而成.每一个层大都有两个子层. 第一子层为多头注意力机制, 第二个子层为简单的position-wise的全连接网络. 作者在每个子层中使用残差连接和layer normalization.也就是对于每个子层输出为 L a y e r N o r m ( x + S u b l a y e r ( x ) ) LayerNorm(x+Sublayer(x)) LayerNorm(x+Sublayer(x)) , S u b l a y e r ( x ) Sublayer(x) Sublayer(x)是每个子层使用的函数. 为了利用残差连接, 模型中的所有子层, 包括embedding层的输出维度为512.
Decoder: Decoder同样由N=6个独立层堆叠而成. 相比于encoder的两个子层增加了一个子层, 在encoder的输出上使用多头注意力机制. 和encoder类似的, 作者在每个子层中使用残差连接并使用layer norm. 作者修改了decoder中的self-attention机制来防止每个位置参考后面的位置. 这种masking(遮掩), 是通过现实情况每个位置只由前面的信息得到推测来的(??), 确保每个位置的预测值只依赖该位置前面的信息得到.
注意力机制可以被描述为匹配查询query和一系列的键值对key-value到输出, 所有的query/keys/values为向量. 输出是values的加权平均和, 权值是通过与query和相应的键值相关的compatibility函数得到的.
weight的计算
缩放点积attention
输入包括维度为 d k d_k dk的查询queries和keys, 以及维度为 d v d_v dv的values. 作者计算一个query和所有keys的点积, 然后除以 d k \sqrt {d_k} dk, 并使用softmax函数来计算每一个value的权重.
在实践中, attention函数在大量queries上同时操作, 将queries构成矩阵Q,.keys和values也被打包成K,V.计算输出矩阵为
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQKT)V
最经常使用的注意力函数包括加性注意力机制和点积(乘性)注意力函数. 点乘注意力机制和出去scale的这部分模型完全相同.嘉兴注意力计算compatibility function通过一个含有一个隐藏层的前向网络得到. 尽管两个的理论复杂度近似, 实际中点乘注意力更快并且更节省空间, 因为点乘注意力可以使用高度优化的矩阵乘法代码来完成.
实际中发现, 对于较小的值 d k d_k dk 两种机制产生的效果类似, 加性注意力机制在 d k d_k dk值较大时取得比点乘注意力更好的效果. 我们猜想是由于 点乘导致数据增加更大, 使得softmax函数到达梯度很小的区域. 为了抵消这种影响, 我们将点乘使用 d k \sqrt{d_k} dk放缩.(??)
为什么在进行softmax之前需要对attention进行scaled(为什么除以dk的平方根),并使用公式推导进行讲解
假设Q,K的均值为0, 方差为1. 矩阵乘积有均值为0, 方差为dk, 使用dk的平方根被用于缩放, 因为Q/K的矩阵乘积本应该为均值为0, 方差为1, 这样可以获得更平缓的softmax.
当维度增大时, 会导致数值增大, 就会导致softmax梯度消失. 通过scale d k \sqrt{d_k} dk, 方差会scale dk.(可推导)
ref: 解释
不是使用单个注意力函数维度只有模型原本的维度 d m o d e l d_{model} dmodel --keys,values和queries的维度, 我们发现将queries, keys和values线性映射h次到不同的维度 d k , d k , d v d_k,d_k,d_v dk,dk,dv, 效果更好.在每次映射到不同queries,keys, values的这些版本中, 作者并行化运行注意力机制, 得到 d v d_v dv维度的输出. 这些输出被连接起来, 然后再被线性映射到一个维度作为最后的输出.
多头注意力机制允许模型联合关注到在不同表示空间中的不同位置.在用单头注意力机制的情况下, 相当于把这些做了一个平均.
Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions.
在作者的工作中, 取h=8并行化注意力层或者头.将每个按照h进行维度缩减, 然后最后再联合起来, 最终计算量和原来相似.
M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W O w h e r e h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) MultiHead(Q,K,V)=Concat(head_1,...,head_h)W^O \\ where\ head_i=Attention(QW^Q_i,KW^K_i,VW^V_i) MultiHead(Q,K,V)=Concat(head1,...,headh)WOwhere headi=Attention(QWiQ,KWiK,VWiV)
为什么要将原始输入都乘上一个不同的W?
将原始的embedding映射到不同的空间, 更加从不同的层面挖掘信息.另外, 如果都是一样的, 那么Q*V,将得到一个对称矩阵. 因为是同样的矩阵, 投影到了同样的空间, 泛化能力差, 对V进行提纯时效果不好.(为了打破对称).
ref: 解释
为什么使用多头?
让模型能关注到不同位置在不同表示空间中的信息.
模型中attention机制的应用; transformer用三种不同的方式使用了多头注意力机制.
autoregressive property: 定义了一个顺序(ordering),第 ii 个随机变量按照这个选定的顺序依赖在它量前面的所有随机变量 x1,x2,…,xi−1x1,x2,…,xi−1。
在encoder和decoder中每层除了注意力子层外, 还有完全连接的前馈网络, 在每个位置独立使用. 这包含两个线性转换和一个ReLU激活函数在两者之间.
F F N ( x ) = m a x ( 0 , x W 1 + b 1 ) W 2 + b 2 FFN(x)=max(0,xW_1+b_1)W_2+b_2 FFN(x)=max(0,xW1+b1)W2+b2
两个线性转换作用于相同的位置, 但是在他们用的参数不同. 另一种描述方式时比作两个knernel size=1的卷积核. 输入输出的维度为512, 中间维度为2048.
和其他的序列推导模型类似, 作者使用学习到的embedding来把输入符号和输出符号转化为维度为 d m o d e l d_model dmodel的向量. 作者同样使用通用的Linear层和softmax层来讲decoder输出转化为预测的下一个token的概率. 在作者的模型中, 共享输入和输出(??)的权重矩阵和pre-softmax linear transformation, 在编码层, 将权重乘 d m o d e l \sqrt{d_{model}} dmodel
因为我们的模型没有recurrence和convolution, 为了使模型利用序列信息, 作者添加了一些token位置相对或者绝对信息. 最终添加了 positional encoding位置编码在输入embedding中, 在encoder和decoder中都添加. 位置编码和embedding表示有相同的维度, 一遍两者能够加和. positional encoding有很多选择, 在这项工作中, 使用不同频率的sine和cosine函数.
P E p o s , 2 i = s i n ( p o s / 1000 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) PE_{pos,2i}=sin(pos/10000^{2i/dmodel})\\ PE_{(pos,2i+1)}=cos(pos/10000^{2i/d_{model}}) PEpos,2i=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)
pos为位置, i为维度.在每个位置的每个维度都对应到一个正弦值.波长形成了一个从2π到10000·2π的几何级数.作者使用这个函数是应为猜测它能够使模型表示位置相对信息, 因为对于任意的 P E p o s + k PE_{pos+k} PEpos+k可以被表示成 P E p o s PE_{pos} PEpos的线性函数.
作者同样尝试了两种版本的学习训练的位置embedding并几乎产生了类似的效果. 作者最终选择sinusoidal版本是因为这个可以使模型能够得出长度大于训练时长度的序列的编码.
Self-attention layers和recurrent 和 convolutional layer 通常被用作匹配一个变量长度的序列到另一个等长的序列表示, 比如用作序列预测任务的隐藏层. 作者从不同的方面比较了这三种模型. 从以下三个方面探究 self-attention的作用:
(表如何计算的? n 2 2 n^22 n22是由于两两之间计算相似度, d是维度相乘;RNN的 d 2 d^2 d2没有看—)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MVIF5u3i-1658149480364)(Attention%20Is%20All%20You%20Need.assets/image-20220710231632956.png)]
在表中指出, 自注意力层中联系计算所有位置只需要常数复杂度的操作, 而recurrent需要O(n)次操作. 关于计算复杂度上, self-attention比recurrent 层更快, 因为序列长度n比表示向量维度d更小, 比如在一些句子表上上最新的机器翻译模型(word-piece, byte-pair)表示中n比d小. 为了提高在一些长句子中的计算表现, 自主力机制可以被限制只考虑输出位置的周围相邻size=r的输入序列. 这将提升最大长度距离O(n/r).
缺点: 这里从复杂度来看, transformers的复杂度是 n 2 n^2 n2, 不适合长句子, 在训练时使用的句子长度为512;
计算相似度是计算两两之间的相似度, 对于某些任务是没有必要的,而且计算资源消耗大.
对于每一层都是两两计算相似度, 这种可视化出来是否还具有可解释性? 只有比较低的层表示两两之间的相似度, 当层数较高时, 相似度的可解释可视化出来就没有很强了.
另外自注意力机制也能产生更多可解释性的模型. 作者研究了模型中的注意力分布并附在附录中. 不仅在每个注意力头中学到了应对不同的任务, 并且很多头表现出与句法和句子情感结构相关的特性.
这部分说明了作者模型的训练规则.
使用standard WMT 2014 English-German dataset训练, 包含4.5million 句子对. 句子被 通过byte-pair编码, 由37000个tokens字典组成. 对于英法翻译任务, 使用WMT 2014 English-French dataset数据集, 包含36M句子, 并将tokens划分为32000个单词. 长度相似的句子对被划分为一个batch. 每个训练batch包含句子对集合包含约25000个原tokens和25000个目标语言tokens.
5.2 Hardware and Schedule
在8 P100GPU训练.使用罗列出的参数, 每个step要用0.4s.训练了base model用来100,000个step或者12h.对于big model, 每个step用时1s, 总计训练300,000steps(3.5days).
5.3 Optimizer
使用Adam optimizer.学习率在训练过程中根据公式变化.
5.4 Regularization
主要目的在于防止过拟合. 使用三种类型的正则化.
张俊林CNN/RNN/Transformer比较
参考文章引用: Transformer的可以参考以下三篇文章:一个是Jay Alammar可视化地介绍Transformer的博客文章The Illustrated Transformer ,非常容易理解整个机制,建议先从这篇看起, 这是中文翻译版本;第二篇是 Calvo的博客:Dissecting BERT Part 1: The Encoder ,尽管说是解析Bert,但是因为Bert的Encoder就是Transformer,所以其实它是在解析Transformer,里面举的例子很好;再然后可以进阶一下,参考哈佛大学NLP研究组写的“The Annotated Transformer. ”,代码原理双管齐下,讲得也很清楚。
代码详细实现
BERT大火却不懂Transformer?读这一篇就够了 - 数据汪的文章 - 知乎 https://zhuanlan.zhihu.com/p/54356280
Attention Mechanism and Softmax链接
神经网络训练trick - Anticoder的文章 - 知乎 https://zhuanlan.zhihu.com/p/59918821
神经网络训练
What should be the labels for subword tokens in BERT for NER task?
面试问题: 链接
CNN要实现长距离依赖需要间隔trick或者模型更深, 对比起来self-attention捕获长距离依赖更直接以及花费相对更少, 并且实验效果表示出self-attention为基础的transformer表现更好.