作者dav1a1223 (Lai_can)
看板DataScience
标题[徵文] Attention is all you need
时间Tue Jul 31 10:42:25 2018
1) 论文介绍
arXiv 连结:
https://arxiv.org/abs/1706.03762
这篇是 Google 发表在 NIPS2017 上的 paper,其最大的亮点是提出一个新的
encoder-decoder 架构完全依赖於 Attention 机制而完全没用到 CNN 以及 RNN,这样
的好处是提高了训练时可平行化处理的部分 (RNN 依赖於序列处理,而 Attention 可以
是矩阵乘法运算) 并且让 input, output sequences 中的文字彼此之间跨越距离的障碍
能够找到有关联的字词。
在这篇论文之前,为了减少序列的计算量,被提出的方法有 ByteNet, ConvS2S 等网路架
构,都是用到了 CNN 来做 downsampling,但这样的方法仍然会遇到距离障碍的问题: 相
距越远的字词会越难找到彼此的资讯,其解决方法就是使用 self-attention 取代
encode, decode 阶段,让每一个词都去计算整个 sequence 的表示,此外其也能解决过
长的 RNN 架构可能会造成的梯度消失问题。
这篇提出的架构 Transformer 如下图:
https://imgur.com/e5JWQNg
也是 encoder-decoder 的形式,只不过都换成了使用 attention + fully connected
layers 来实现。
对於 input, output 序列每个字词过 Embedding 之後须加上 Positional Encoding 主
要是因为这个架构不像 RNN 是有序的,但是为了捕捉到字词前後的关系所以须加上基於
位置的 Embedding。
Encoder:
在 Encoder 中堆叠了六个相同的 layer,每个 layer 都包含两个 sublayer,分别是
multi-head self-attention 和 position-wise fully connected network,并且都是
以残差连接的方式,好处是能够加深网路,并且都过 layer normalization 加速收敛,
因此每一层 sublayer 都可以以 LayerNorm(x + SubLayer(x)) 来表示。
Decoder:
Decoder 同样堆叠六层,但每一层包含了三个 sublayer,其同样有目标序列的
self-attention,再加上了 decoder 向 encoder 的 attention 机制,最後同样过全连
接层输出,多的 sublayer 就是在负责从 encoder 藉由 attention 抓取重要资讯来作为
输出参考,其中比较需要注意的是 decoder 的 self-attention 需要加上遮罩机制,也
就是让位置 t 的字词只能 attend 到自己以前的字词,不能向後偷看。
其用到的 Attention 计算公式为 Scaled Dot-Product Attention 流程如下图:
https://imgur.com/15WtVKI
其中 Q 是 query (发起 attention 的 matrix)
K, V 分别是 key, value (被 attention 的 matrix),在这篇论文中使用的 K, V 是相
同的,都是某时间点的 hidden state
写成公式如下:
https://imgur.com/ju9EjgP
其实与 dot product attention 的计算方式几乎一样,使用 Q, K 进行点积得到
attention weight(知道对每个时间点的该注意的程度),再和 value 相乘得到加权结果
。
只差在 Q, K 进行点积之後除以一个 hidden dimension (d_k) 的根号,是为了避免点积
的结果太大影响训练稳定程度 ( 除以根号 d_k 之後可以让方差变成 1 )
https://imgur.com/QTzusmn
Multi-Head Attention
其使用的 attention 计算公式为上述的 scaled dot-product attention,而其使用的机
制为 multi-head attention,概念是分别将 Q, K, V 经过线性转换(learnable的)成 h
个,再 h 个各自平行地去做 attention,最後再将 h 个结果 concatenate 在一起得到
最终的结果,通常会希望 concatenate 之後的维度与原来相同(d_k),因此在做线性转换
时通常会把 h 个转换出来的结果维度为 d_k / h
写成公式如下:
https://imgur.com/Jqs3CYV
Position-wise Feed Forward Networks
其实就是两层的 fully connected layers 搭配 Relu
总体架构来说,就是让源句子做 self-attention 以残差连接和 layer normalization,
接着丢去 feed forward 也以残差连接以及 layer normalization,这个动作重复 6 层
後当作 Encoder 输出,Decoder 阶段目标句子同样先做 self-attention (不过带有
mask) 後,对 Encoder 的输出做 attention 再丢进 feed forward,这三个步骤也都是
残差连接以及 layer normalization,并也做 6 层後经过一个线性转换以及 softmax 输
出预测句子。
Why Self-Attention?
作者们认为主要有三大好处:
1. 降低了每一层的计算复杂度:只要 sequence length 小於 hidden dimension 就会比
RNN 复杂度低
2. 增加了可平行化处理的程度:加快训练速度
3. 解决long-dependency的问题:字词相距很远难以关注到彼此的问题
Training
在训练过程中他们也使用了 learning rate 递减、dropout、label smoothing 等等
tips,在此不赘述。
Result
https://imgur.com/2JJ5m4Z
当时在机器翻译资料集 WMT2014 取得了 state-of-the-art 的结果,值得注意的是
Transformer 的 Training Cost 是比其他模型少许多的。
这篇并没有详细提到 Positional Encoding 怎麽 init,因为本篇重点应该比较注重在
Attention,并且 Google 也在今年(2018)提出了一种新的将位置加入 Transformer 的
方法,详细可以参考
https://arxiv.org/abs/1803.02155
2) 个人心得
这篇应该算是 NLP 近年来最多人关注的 paper 之一,Google 也还在针对这个架构进行
研究发展新的 paper 来改善增进 Transformer 的问题与能力。举例来说目前
Transformer 的其中一个问题是无法像 RNN-based model 做 schedule sampling 的训
练,让模型在训练阶段都只能看 ground truth 而在测试阶段就要看自己前一个时间点的
输出结果。
底下附上我自己实作 Transformer 应用在 PTT Gossiping QA Dataset
(
https://github.com/zake7749/Gossiping-Chinese-Corpus ) 的一些结果:
https://imgur.com/l0AsUa5
第一次写这类型的文章,若有理解错误或是表达的不精确请各位大大指正~谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.218.53.138
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/DataScience/M.1533004952.A.244.html
※ 编辑: dav1a1223 (114.136.163.75), 07/31/2018 10:43:56
1F:推 yiefaung: 加快训练大概能加快多少? 07/31 10:52
2F:推 yiefaung: 另外这个QA有什麽衡量performance的方式吗 跟其他方法 07/31 10:55
3F:→ yiefaung: 比有没有明显差别 07/31 10:55
4F:→ dav1a1223: 以和rnn每一层的复杂度来比较的话,rnn是O(n*d^2)而se 07/31 10:57
5F:→ dav1a1223: lf-attn是O(n^2*d)其中n是序列长d是hidden dim 07/31 10:57
6F:→ dav1a1223: QA的部分我只是做好玩的并没有特别去算bleu之类的指标 07/31 11:04
7F:→ dav1a1223: ,肉眼看的话,我同时也实作gru encoder decoder with 07/31 11:04
8F:→ dav1a1223: attn,结果句子相较是不通顺许多 07/31 11:04
9F:推 sma1033: 在做inference的时候还是要照顺序生,所以还是有点慢 07/31 11:43
10F:推 daniel0523: 感谢分享! 12/17 03:35