论文笔记:Attention is all you need
今天做完深度学习的论文分享,将这篇论文记录下来,以便日后回顾查看。
PS:简书不支持 MathJax 编辑公式,简直悲伤的想哭泣,之后再上传到farbox上好啦😊
论文原文:Attention is all you need
这篇论文是Google于2017年6月发布在arxiv上的一篇文章,现在用attention处理序列问题的论文层出不穷,本文的创新点在于抛弃了之前传统的encoder-decoder模型必须结合cnn或者rnn的固有模式,只用attention,可谓大道至简。文章的主要目的是在减少计算量和提高并行效率的同时不损害最终的实验结果,创新之处在于提出了两个新的Attention机制,分别叫做 Scaled Dot-Product Attention 和 Multi-Head Attention.
六个作者都是一作,不愧是google大佬!!!
image.png接下来从以下几方面进行讲解。
•Background
•Attention
•Transformer
•Experiments
•Conclusions
1.BACKGROUND
image.png目前主流的处理序列问题像机器翻译,文档摘要,对话系统,QA等都是encoder和decoder框架,
编码器:从单词序列到句子表示
解码器:从句子表示转化为单词序列分布
传统的编码器解码器一般使用RNN,这也是在机器翻译中最经典的模型,但正如我们都知道的,RNN难以处理长序列的句子,无法实现并行,并且面临对齐问题。
image.png
之后这类模型的发展大多从三个方面着手:
input的方向性 - 单向或双向
深度 - 单层或多层
类型– RNN,LSTM或GRU
image.png
但是依旧收到一些潜在问题的制约,神经网络需要能够将源语句的所有必要信息压缩成固定长度的向量。这可能使得神经网络难以应付长时间的句子,特别是那些比训练语料库中的句子更长的句子;每个时间步的输出需要依赖于前面时间步的输出,这使得模型没有办法并行,效率低;仍然面临对齐问题。 image.png
再然后CNN由计算机视觉也被引入到deep NLP中,CNN不能直接用于处理变长的序列样本但可以实现并行计算。完全基于CNN的Seq2Seq模型虽然可以并行实现,但非常占内存,很多的trick,大数据量上参数调整并不容易。 image.png
以上这些缺点的话就是由于无论输入如何变化,encoder给出的都是一个固定维数的向量,存在信息损失;在生成文本时,生成每个词所用到的语义向量都是一样的,这显然有些过于简单。为了解决上面提到的问题,一种可行的方案是引入attentionmechanism。
深度学习里的Attentionmodel其实模拟的是人脑的注意力模型,举个例子来说,当我们观赏一幅画时,虽然我们可以看到整幅画的全貌,但是在我们深入仔细地观察时,其实眼睛聚焦的就只有很小的一块,这个时候人的大脑主要关注在这一小块图案上,也就是说这个时候人脑对整幅图的关注并不是均衡的,是有一定的权重区分的。这就是深度学习里的AttentionModel的核心思想。所谓注意力机制,就是说在生成每个词的时候,对不同的输入词给予不同的关注权重。我们可以看一下上面👆这幅图——通过注意力机制,我们将输入句子编码为一个向量序列,并自适应地选择这些向量的一个子集,同时对译文进行译码,例如where are you——>你在哪?现在我们在翻译“你”的时候给"you"更多的权重,那么就可以有效的解决对齐问题。
2. ATTENTION
image.pngNeural machine translation by jointly learning to align and translate
这篇论文首先将注意力机制运用在NLP上,提出了soft Attention Model,并将其应用到了机器翻译上面。其实,所谓Soft,意思是在求注意力分配概率分布的时候,对于输入句子X中任意一个单词都给出个概率,是个概率分布。加入注意力机制的模型表现确实更好,但也存在一定问题,例如:attention mechanism通常和RNN结合使用,我们都知道RNN依赖t-1的历史信息来计算t时刻的信息,因此不能并行实现,计算效率比较低,特别是训练样本量非常大的时候。
image.png
基于CNN的Seq2Seq+attention的优点:基于CNN的Seq2Seq模型具有基于RNN的Seq2Seq模型捕捉long distance dependency的能力,此外,最大的优点是可以并行化实现,效率比基于RNN的Seq2Seq模型高。缺点:计算量与观测序列X和输出序列Y的长度成正比。
image.png
3. Transformer
image.png谷歌的这篇论文里提出的transformer模型抛弃了cnn,rnn,初次看有点一头雾水,总结了一下迷惑的地方有三个:
- Positional embedding;(位置嵌入向量——其实类似word2vec,只不过处理的是位置信息罢了)。
- multi-head attention; (多头注意力机制——点乘注意力的升级版本)
- Position-wise Feed-Forward Networks(位置全链接前馈网络——MLP变形)
现在一一分析:
multi-head attention
image.png有两种常用的注意力函数,一种是加法注意力(additive attention),另外一种是点乘注意力(dot-productattention),论文所采用的就是点乘注意力,这种注意力机制对于加法注意力而言,更快,同时更节省空间。
输入q、k、v,分别代表query、key-valuepair。这里的 key,value, 和 query需要解释一下,这里把attention抽象为对 value() 的每个 token进行加权,而加权的weight就是 attentionweight,而 attention weight 就是根据 query和 key 计算得到,其意义为:为了用 value求出 query的结果, 根据 query和 key 来决定注意力应该放在value的哪部分。以前的 attention是用 LSTM 做 encoder,也就是用它来生成key 和 value,然后由 decoder来生成 query。
具体到 Bahdanau 的论文 Neural machine translation by jointly learning to align and translate,key 和 value是一样的,都是文中的h ,而 query是文中的 s。
为什么要乘以√1dk?是因为如果d_k太大,点乘的值太大,如果不做scaling,结果就没有加法注意力好。另外,点乘的结果过大,这使得经过softmax之后的梯度很小,不利于反向传播的进行,所以我们通过对点乘的结果进行尺度化。
这里有没有很像cnn的思想!!!
之前看的另一篇论文sentence embedding也有类似的用法。可以参见A Structured Self-attentive Sentence Embedding image.png
Transformer会在三个不同的方面使用multi-headattention:
1.encoder-decoder attention:使用multi-head attention,输入为encoder的输出和decoder的self-attention输出,其中encoder的self-attention作为 key and value,decoder的self-attention作为query
-
encoder self-attention:使用 multi-head attention,输入的Q、K、V都是一样的(input embedding and positional embedding)
3.decoder self-attention:在decoder的self-attention层中,deocder 都能够访问当前位置前面的位置
Position-wise feed forward network
image.png
用了两层Dense层,activation用的都是Relu。可以看成是两层的1*1的1d-convolution。hidden_size变化为:512->2048->512
Position-wise feed forward network,其实就是一个MLP 网络,1 的输出中,每个 d_model 维向量 x 在此先由 xW_1+b_1 变为 d_f $维的 x',再经过max(0,x')W_2+b_2 回归 d_model 维。之后再是一个residual connection。输出 size 仍是 $[sequence_length, d_model]$
image.png
Positional embedding
image.png
这样做的目的是因为正弦和余弦函数具有周期性,对于固定长度偏差k(类似于周期),post +k位置的PE可以表示成关于pos位置PE的一个线性变化(存在线性关系),这样可以方便模型学习词与词之间的一个相对位置关系。
模型整体
image.pngTransformer也会遵循这种结构,encoder和decoder都使用堆叠的self-attention和point-wise,fully connected layers。
Encoder: encoder由6个相同的层堆叠而成,每个层有两个子层。第一个子层是多头自我注意力机制(multi-head self-attention mechanism),第二层是简单的位置的全连接前馈网络(position-wise fully connected feed-forward network)。在两个子层中会使用一个残差连接,接着进行层标准化(layer normalization)。也就是说每一个子层的输出都是LayerNorm(x + sublayer(x))。网络输入是三个相同的向量q, k和v,是word embedding和position embedding相加得到的结果。为了方便进行残差连接,我们需要子层的输出和输入都是相同的维度。
Decoder: decoder也是由N(N=6)个完全相同的Layer组成,decoder中的Layer由encoder的Layer中插入一个Multi-Head Attention + Add&Norm组成。输出的embedding与输出的position embedding求和做为decoder的输入,经过一个Multi-HeadAttention + Add&Norm((MA-1)层,MA-1层的输出做为下一Multi-Head Attention + Add&Norm(MA-2)的query(Q)输入,MA-2层的Key和Value输入(从图中看,应该是encoder中第i(i = 1,2,3,4,5,6)层的输出对于decoder中第i(i = 1,2,3,4,5,6)层的输入)。MA-2层的输出输入到一个前馈层(FF),经过AN操作后,经过一个线性+softmax变换得到最后目标输出的概率。
对于decoder中的第一个多头注意力子层,需要添加masking,确保预测位置i的时候仅仅依赖于位置小于i的输出。
层与层之间使用的Position-wise feed forward network。
image.png
实验
image.pngimage.png
总结我们的结果,并将我们的翻译质量和培训成本与文献中的其他模型架构进行比较。
我们通过将训练时间,所使用的GPU数量以及每个GPU的持续单精度浮点容量相乘来估计用于训练模型的浮点运算的数量。
可以看出,transformer 用了最少的资源得到了state-of-art的输出回报。
值得注意的是
image.png
这是今年5月份facebook发布的用cnn做机器翻译,当时说他们取得了最好的结果,然而不到一个月就被google用一堆attention来了回击。
image.png
对模型自身的一些参数做了改变自变量的测试,看一下哪些参数对模型的影响比较大。
image.png
将task推广到其他任务上发现效果也很好,这里是英国选民分析任务。
image.png
Conclusion
image.png思考
1.将soft attention换成local attention效果如何?
2.将task 换成文本摘要效果如何?
- 处理中文翻译效果如何?