您的位置:首页 > 其它

attention is all you need(Transformer)

2019-04-04 11:17 471 查看

attention is all you need

来源

2017 NIPS
Transformer 模型
谷歌

研究动机

RNN 是一个广泛使用的神经网络模型用来处理序列数据,但是RNN模型存在训练数据慢、对于长距离依赖关系学习能力不足的缺陷,针对这些特点,本文提出Transformer模型,完全依赖于self-attention 机制,在训练速度以及解决长距离依赖关系学习上优于RNN模型,在机器翻译任务上取得了非常好的性能提升。

模型结构

总体上包括两部分,一个encoders 和一个decoders,一个encoders 包含了6个encoder,decoders的结构和encoders 类似
首先介绍encoders的结构

encoder主要包括两个层,第一个是self-attention层,第二个是一个前馈网络,二者之间通过参差连接,每个子层输出需要进行规范化。本文中Transformer中的每个Encoder接收一个512维度的向量的列表作为输入,然后将这些向量传递到‘self-attention层,self-attention层产生一个等量512维向量列表,然后进入前馈神经网络,前馈神经网络的输出也为一个512维度的列表,然后将输出向上传递到下一个encoder。


下面深入了解self-attention机制
self-attention 是一个函数,将一个查询和一系列的键值对映射到一个输出,查询、键、值都是向量,输出是值的加权组合。分配给每个值的权重的计算是通过查询和键计算出来的,也就是说权重是和查询以及键是相关的。
Transformer注意力机制有效的解释:Transformer所使用的注意力机制的核心思想是去计算一句话中的每个词对于这句话中所有词的相互关系,然后认为这些词与词之间的相互关系在一定程度上反应了这句话中不同词之间的关联性以及重要程度。因此再利用这些相互关系来调整每个词的重要性(权重)就可以获得每个词新的表达。这个新的表征不但蕴含了该词本身,还蕴含了其他词与这个词的关系,因此和单纯的词向量相比是一个更加全局的表达。使用了Attention机制,将序列中的任意两个位置之间的距离缩小为一个常量。
结构图:

下面介绍self-attention是如何计算的

计算Q、K、V, WQ、WK、WVW^Q、W^K、W^VWQ、WK、WV是随机初始化的矩阵:

矩阵形式计算self-attention:

dk\sqrt{d_k}dk​ 1eedf ​设置的目的: 对于较大的dkd_kdk​,点积会变的较大,softmax函数映射到梯度很小的区域,因此使用1dk\frac{1}{d_k}dk​1​进行放缩。

多头attention
结构图:


使用多头attention的好处:

  1. 它扩展了模型专注于不同位置的能力。在上面的例子中,虽然每个编码都在z1中有或多或少的体现,但是它可能被实际的单词本身所支配。如果我们翻译一个句子,比如“The animal didn’t cross the street because it was too tired”,我们会想知道“it”指的是哪个词,这时模型的“多头”注意机制会起到作用。
  2. 它给出了注意力层的多个“表示子空间”(representation subspaces)。对于“多头”注意机制,我们有多个查询/键/值权重矩阵集(Transformer使用八个注意力头,因此我们对于每个编码器/解码器有八个矩阵集合)。这些集合中的每一个都是随机初始化的,在训练之后,每个集合都被用来将输入词嵌入(或来自较低编码器/解码器的向量)投影到不同的表示子空间中。

前馈网络:
FFN(x)=max(0,xW1+b1)W2+b2FFN(x)=max(0,xW_1+b_1)W_2+b_2FFN(x)=max(0,xW1​+b1​)W2​+b2​
dmodel=512,dff=2018d_{model} = 512, d_{ff} = 2018dmodel​=512,dff​=2018

位置编码
上面的attention 机制虽然考虑了所有位置的词和当前词的联系,但是忽略了词的位置信息,因此transformer为每个输入的词嵌入一个向量。
具体的计算位置编码的方式:
PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=sin(pos/100002i+1/dmodel)PE(pos, 2i)=sin(pos/10000^{2i/d_{model}}) \\ PE(pos, 2i+1)=sin(pos/10000^{2i+1/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel​)PE(pos,2i+1)=sin(pos/100002i+1/dmodel​)
使用三角函数进行位置编码的原因是可以处理一些序列,长度大于训练时遇到的序列的长度。

下面简单介绍一下decoder:
decoder与encoder稍微有一些区别
每个decoder包含三个子层,除了self-attention 层和前馈网络,还有一个encoder-decoder-attention
Decoder和Encoder的结构差不多,但是多了一个attention的sub-layer。

对应上图先明确一下decoder的输入输出和解码过程:
输出:对应i位置的输出词的概率分布。
输入:encoder的输出 & 对应i-1位置decoder的输出(所以最开始的attention是self-attention (QKV全是decoder隐层);中间的attention不是self-attention,K,V来自encoder,Q来自上一位置decoder的输出)。
解码:编码可以并行计算,一次性全部encoding出来,但解码不是一次把所有序列解出来的,而是像rnn一样一个一个解出来的,因为要用上一个位置的输入当作attention的query。

decoder中间的Multi-head attention(Encoder-Decnoder Attention)和Position-wise feed-forward networks同encoder。不同的是decoder第一个多头注意力子层(Self-Attention)。其中Self-Attention:当前翻译和已经翻译的前文之间的关系;Encoder-Decnoder Attention:当前翻译和编码的特征向量之间的关系。

Masked multi-head attention:对于decoder中的第一个多头注意力子层,需要添加masking,确保预测位置i的时候仅仅依赖于位置小于i的输出,确保预测第i个位置时不会接触到未来的信息。在机器翻译中,解码过程是一个顺序操作的过程,也就是当解码第i个特征向量时,我们只能看到第i-1及其之前的解码结果。而我们要计算的attention是根据当前词i和前面的词来的,不能是后面的。

Transformer 好处

  1. 计算效率提升,编码阶段完全可以并行处理
  2. 可以更好的捕捉词和其他相关词的关系,改善了RNN不能很好处理长距离依赖的问题
  3. self-attention模型可解释性更好,attention结果的分布表明了该模型学习到了一些语法和语义信息

缺点:
实践上:有些rnn轻易可以解决的问题transformer没做到,比如复制string,尤其是碰到比训练时的sequence更长的时。
理论上:transformers非computationally universal(图灵完备),这种非RNN式的模型是非图灵完备的,无法单独完成NLP中推理、决策等计算问题(包括使用transformer的bert模型等等)。

code

代码

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: