【论文笔记】Attention is all you need

今年的NLP界被BERT整的明明白白,其中的基本结构 Transformer 一定要了解一下。

Abstract:

一般来说,重要的sequence transduction模型都是基于包含encoder,decoder的复杂的rnn和cnn的。最好的模型是通过一个attention机制来连接encoder,decoder。比较普通!我们提出一个只靠attention的。叫Transformer,跟cnn,rnn完全没关系,很炫酷。

在两个翻译任务实验证明:我们的模型又快又好!!!

  1. 高了2个BLEU;
  2. 用8个gpu训练3.5天,结果直接超过了当前的SOTA。

我们还证明,Transformer泛化性能贼好,在parsing上大小数据都比别的好 。

划重点:只靠Attention

1. Introduction

RNN,LSTM,GRU在翻译和 LM(language model)领域搞了很多SOTA,很多研究花了很多心思在push Encoder-Decoder和Recurrent Language Model的边界。

可是,RNN的天性决定了训练的时候并行性差。尤其对长的sequence,内存限制影响batch examples了。很烦!有一些通过分解tricks和条件计算来提高efficiency的related work,后者也提高performance。但是问题依然存在。

Attention机制现在几乎干啥都必须了,可以不顾输入输出的distance地去model依赖。但是,除了极少cases,attention基本都和rnn绑定在了一起,很不机智!

So,咱提出一种不靠rnn,只靠attention的!!!并行性刚刚的,8个p100花了12 hours就达到翻译的new sota。

2. Background

一些相关的研究都用了cnn来减少sequence计算。

这些模型里operations的数量随着输入输出距离的线性(convS2S)或是指数级(ByteNet)地增长。使得很难学习到较远的dependency。

在Transformer里,这是一个常数级的操作,虽然是以牺牲一定精度为代价,但是我们用Multi-Head Attention来抵消了,效果很好!

Self-attention,通过relate一个single sequence的不同位置来计算seq的表征。成功用在阅读理解,summarization等等。

基于attention的end2end的memory网络在很多简单QA和LM问题上比seq-aligned rnn(就是s2s吧)要好。但是啊,Transformer是第一个只靠self-attention来计算表征的。下面介绍一波Transformer!

3. Model Architecture

其实,老瓦看到这个模型的一瞬间,心情是复杂,看着好简单,可是咋和以前那种有个序列,清清楚楚写着$(x_1, x_2, …, x_n)$什么的模型不太一样?不慌,老瓦来盘一盘。

3.1 Encoder and Decoder Stacks

Encoder:Encoder是由N=6相同的层组成的栈,每层都有两个子层。第一子层是一个multi-head self-attention mechanism(多头自注意力机制),第二子层是一个position-wise的全连接前馈层。每个子层后面都加了一个residual connection(冗余连接)+layer normalization(层正则),也就是说每个子层的输出都是 $\text{LayerNorm}(x+\text{Sublayer}(x))$ 。为了方便做加运算,所有子层的输出维度都是$d_{model}=512$。

Decoder:Decoder也是N=6层的。主要两个区别:

  1. 增加了一个子层,将encoder的输出当做输入。
  2. 修改了decoder栈的自注意力自层,来防止位置们去关注后续的位置。masking结合output的embedding都右移了一位这个事实,保证了位置i的预测只依赖于比i小的已知位置。

3.2 Attention

既然文章名字叫Attention is all you need,attention的结构当然是其中的重中之重,理解了Attention就几乎理解了文章的一大半。

3.2.1 Basic Attention

首先,得知道啥是attention。14年Sutskever大神祭出seq2seq之后,紧跟着Bahdanau和Luong就发了两篇attention用在seq2seq的论文,名字也好记,一个叫Bahdanau attention,一个叫Luong attention。这里以Bahdanau Attention为例,讲一讲计算attention的基本套路。

其实,attention机制和普通seq2seq的不同就是,要计算出一个包含上下文信息的context vector作为decoder每个位置的输入。计算attention时,一般有Query(Q),Key(K),Value(V) 三个输入。在上面这张图上,Q就是 $(s_0, s_1, … s_m)$ ,K和V就是$(h_0, h_1, …, h_n)$。attention机制一般的套路就是,用Q和K先算出一个权重的向量,再用这个权重的向量去element-wise地乘上V,就能得到Context Vector:

3.2.2 Scaled Dot-Product Attention

明白了attention的套路,我们来看看论文里的attention是什么来头,先看看原文中这张无比清晰(但是看起来有点唬人)的图。

这又是Scaled Dot-Product又是Multi-Head的,一开始着实让老瓦感到有点慌,后来仔细一看,其实挺简单。

看过Luong那篇attention的文章的人都知道,score一般有三种算法:

其实文章里用的就是第一种,因为性价比高(效果还不错速度快),但是有个缺点当Q,K的维度比较大的时候,容易进到softmax的饱和区,作者就scale了一下(除以$\sqrt{d_k}$),解决了这个问题,这个就是所谓的Scaled Dot-Product Attention。粗暴有效。

基本上就完事了。

老瓦在看论文的时候一直不明白mask(只有在Decoder的input用到了)到底是具体怎么操作的,其实作者在后面有解释,就是把所有的非法连接的score都设置成负无穷,这样的softmax之后得到的权重向量就是零了($e^{-\infty}$)。完事。

3.2.3 Multi-Head Attention

这下就讲到精髓了:多头注意力(不知道这样翻译会不会被打。。。)。可以这么理解,有好多人对attention权重的看法不太一样,所以我们就把这个任务给很多人一起做,最后取大家的共同意见,有点像CNN里好多个kernel的味道。

文章表示,比起直接用$d_{model}$的Q, K, V来说,将Q, K, V用不同的h个线性投影得到的h个$d_v$的context vector,再concat起来,过一个线性层的结果更好,可以综合不同位置的不同表征子空间的信息。

其中,$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个平行注意层(也就是头(head)2333)。对于每个层的$d_k=d_v=d_{\text{model}}/h=64$。因为每个头都减少了dimension,所以整体的computational cost和single-head full dimension的注意力机制是差不多的。

3.2.4 Applications of Attention in our model

  • encoder-decoder attention: 模仿seq2seq模型的注意力机制
  • encoder 的 self-attention layer
  • decoder 的self-attention layer:和上面的区别就是加了masking

3.3 Position-wise Feed-Forward Networks

每个FFN包括两次线性变换,中间是ReLu的激活函数。

不同position的FFN是一样的,但是不同层是不同的。输入输出维度都是$d_{model}=512$,中间层的维度是$d_{ff}=2048$。

3.4 Embeddings and Softmax

和其他seq transduction模型一样,也得用learned embeddings,learned 线性变换,softmax这些东西。两个embedding的权重是share的。embedding层,会把权重乘$\sqrt{d_{model}}$。

3.5 Positional Encoding

因为模型没有rnn或者cnn,为了用到sequence的顺序,作者引入了positional encoding($dim=d_{model}$,便于相加)来inject一些相对位置的信息。

作者测试用学习的方法来得到PE,最终发现效果差不多,所以最后用的是fixed的,而且sinusoidal的可以处理更长的sequence的情况。

用sinusoidal函数的另一个好处是可以用前面位置的值线性表示后面的位置。

4. Why Self-Attention

之所以选择self-attention,主要因为三点:

  • 每层的computational complexity;
  • 可以被parallelize的计算量;
  • 网络中long-range dependencies直接的path length(越短越能方便学到 long-range dependencies)。

5. Conclusion

优点

  1. 抛弃了RNN和CNN,提出了Transformer,算法的并行性非常好;
  2. Transformer的设计最大的带来性能提升的关键是将任意两个单词的距离是1,有效地解决了long dependency的问题。

缺点

  1. Transformer不像CNN那样可以抽取局部特征,RNN + CNN + Transformer的结合可能会带来更好的效果;
  2. 位置信息其实在NLP中非常重要,Transformer中用的Position Embedding也不是一个最终的解决方案。