《Attention Is All You Need 》阅读笔记

Attention Is All You Need 阅读笔记

Introduction

  本文是谷歌发表的文章,针对nlp里的机器翻译问题,提出了一种被称为”Transformer”的网络结构,基于注意力机制。文章提出,以往nlp里大量使用RNN结构和encoder-decoder结构,RNN及其衍生网络的缺点就是慢,问题在于前后隐藏状态的依赖性,无法实现并行,而文章提出的”Transformer”完全摒弃了递归结构,依赖注意力机制,挖掘输入和输出之间的关系,这样做最大的好处是能够并行计算了。

Background

  在此之前,针对机器翻译这个领域,为了应对RNN无法并行问题,已经有过一些使用CNN的解决方案了,例如谷歌的ByteNet,Facebook的FairSeq等等。
  自注意力机制(Self-attention)能够把输入序列上不同位置的信息联系起来,然后计算出整条序列的某种表达,目前自注意力机制主要应用于阅读理解、提取摘要、文本推论等领域。

模型结构

  大多数自然语言转换模型都包含一个encoder-decoder结构,模型的输入是一个离散符号序列(symbol)x=(x1,x2,,xn),encoder负责将它映射成连续值序列z=(z1,z2,,zn)。而给定z,decoder负责生成一个输出符号序列y=(y1,y2,,ym)。模型是自回归的,即之前生成的输出会作为额外的输入,用于生成下一个输出。

Encoder与Decoder堆叠

Encoder

  Transformer模型的Encoder由6个基本层堆叠起来,每个基本层包含两个子层,第一个子层是一个注意力机制,第二个是一个全连接前向神经网络。对两个子层都引入了残差边以及layer normalization。

Decoder

  Transformer模型的Decoder也由6个基本层堆叠起来,每个基本层除了Encoder里面的那两个以外,还增加了一层注意力机制,同样引入残差边以及layer normalization。


《Attention Is All You Need 》阅读笔记

注意力机制

  注意力机制(Attention)简单来说就是给定一个查找(query)和一个键值表(key-value pairs),将query映射到正确的输入的过程。此处的query、key、value和最终的输出都是向量。输出往往是一个加权求和的形式,而权重则由query、key和value决定。

Additive Attention

Scaled Dot-Product Attention

  输入包含dk维的query和key,以及dv维的value。通过计算query和各个key的点积,除以dk归一化,然后经过softmax**变成权重,最后再乘value。点积注意力机制的优点是速度快、占用空间小。

Attention(Q,K,V)=softmax(QKTdk)V


《Attention Is All You Need 》阅读笔记

Multi-Head Attention

  用h(本文取8)个不同的线性变换分别将dmodelkey、value和query映射成dk维、dk维和dv维,然后再代入注意力机制,产生总共h×dv维输出,然后拼起来,再用一个线性变换得到最终的输出。

headi=Attention(QWiQ,KWiK,VWiV)MultiHead(Q,K,V)=Concat(head1,,headh)WO


《Attention Is All You Need 》阅读笔记

本文使用的注意力机制

  本文使用的是Multi-Head Attention,具体体现在三个方面。

  • 在“encoder-decoder attention”层中,query来自前一个decoder层,而key和value是encoder的输出。这允许decoder的每个位置都去关注输入序列的所有位置。
  • encoder包含self-attention层,在self-attention层中所有的key、value和query都来自前一层的encoder。这样encoder的每个位置都能去关注前一层encoder输出的所有位置。
  • decoder包含self-attention层

前向神经网络

  这是一个 Position-wise 前向神经网络,encoder和decoder的每一层都包含一个前向神经网络,**函数顺序是线性、RELU、线性。

FFN(x)=max(0,xW1+b1)W2+b2

位置编码

  由于本文的模型结构没有使用任何递归结构或卷积结构,为了让模型能利用输入序列的顺序信息,必须引入某种能表达输入序列每个部分的绝对或相对位置的信息才行。文章采取的方法是位置编码(positional encoding),在送入encoder和decoder之前,先对输入进行编码,编码后的向量维度是dmodel。具体来说,采用正弦和余弦函数进行编码。

PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)

为什么使用self-attention

  从三个方面去对比self-attention和递归结构、卷积结构的优劣性,首先是每一层的计算复杂度,其次是能够被并行的计算量,最后是网络中长期依赖的路径长度。对比显示,self-attention表现最好。

《Attention Is All You Need 》阅读笔记

训练

  训练数据使用WMT English-German数据集,包含450w对语句。句子都被编码过了,使用了一个大小约37000个token的字典。样本被分为若干个batch,每个batch大概25000个token,每个batch中的句子长度保持基本一致。硬件上使用了8块GPU。Optimizer使用了Adam。过拟合方面使用了dropout和Label Smoothing。

结果

  不论是英语-德语还是英语-法语的翻译任务,对比之前的一些模型,本文提出的模型都达到更好的BELU值,同时Training Cost也最低。

《Attention Is All You Need 》阅读笔记

本文开源代码

https://github.com/tensorflow/tensor2tensor

参考资料

Attention Is All You Need
一文读懂「Attention is All You Need」| 附代码实现
attention实现keras版
attention实现tensorflow版
对Attention is all you need 的理解