Attention is all you need

题目: Attention is all you need
作者: Ashish Vaswani et al.
单位: Google Brain, Google Research, University of Toronto
出版: NIPS 2017

Attention

Attention函数可以视作从一个query和一系列键值对到一个输出的映射,其中query,键,值和输出都是向量。输出由值的加权和计算得到,每个值的加权则是由query和相应的键的compatibility函数计算得到。

Scaled Dot-Product Attention

Attention的一种,首先计算query和所有键的点积,除以 d k \sqrt{d_k} dk ,再通过一个softmax函数得到值的权重。
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dk QKT)V
其中Q,K和V是打包起来的query,键和值。
上式是由点积attention改进而来。

Multi-Head Attention

我们认为首先将qurey,键和值做h次线性投影,投影到 d k , d k , d V d_k, d_k, d_V dk,dk,dV维会有好处。将query,键和值投影h次后,分别进行attention,将结果拼接在一起与输出层连接就得到了Multi-Head Attention。

Attention在我们模型中的应用

transformer在下面3个地方用到multi-head attention:

  • 编解码层,query来自前一个解码层,memory键值来自编码层的输出。这使得解码层的每个位置达到输入序列的每个位置。这模仿了sequence-to-sequence模型中传统编解码的attention机制。
  • 编码器本身包含self-attention层。self-attention层中所有键值和query来自同一个地方,这里就是前一个编码器层的输出。编码器的每个位置都能够到达前一层的所有位置。
  • 类似于编码层,解码层的self-attention层也能允许解码器的每个位置到达包括本身的前面的所有位置。我们需要防止leftward信息泄漏来保护auto-regression property(?)。我们在scaled dot-product attention实现了这一功能,通过过滤掉(设为负无穷)softmax层输入的所有与非法连接相关的值。

编解码栈(Encoder and Decoder Stacks)

Encoder

由6个完全相同的层组成的一个栈。每一层又分为两个子层,第一个子层是multi-head self-attention机制,第二层是一个简单的位置(position-wise)全连接前馈网络。我们在两个子层周围设置了残差网络,以及层正则。也就是说每个子层的输出都经过 L a y e r N o r m ( x + S u b l a y e r ( x ) ) LayerNorm(x+Sublayer(x)) LayerNorm(x+Sublayer(x))的正则化,其中 S u b l a y e r ( x ) Sublayer(x) Sublayer(x)是子层自己实现的函数。为了这些残差网络,模型的所有子层以及embedding层都产生512维的输出。

Decoder

解码器也是由6个完全相同的层组成。除了编码器中的两个子层外,解码器每层中还有第三个子层,是对编码栈的输出加multi-head attention的一层。与编码器相同,我们在子层周围设置了残差网络和正则,我们还修改了解码器中的self-attention子层,以防止位置注意到子序列的位置(?)。这种masking,以及输出embedding是一个位置的offset,保证了对位置i的预测仅仅依赖于i前的位置。

position-wise前馈网络

我们编解码层中包含的全连接前馈网络,独立并完全相同地应用到每个位置上。它由两个带着ReLU激活函数的线性变换组成。
F F N ( x ) = m a x ( 0 , x W 1 + b 1 ) W 2 + b 2 FFN(x) = max(0, xW_1 + b_1)W_2+b_2 FFN(x)=max(0,xW1+b1)W2+b2
不同位置的线性变换是相同的,不同层的参数不同,也可以理解为两个核为1的卷积。
输入和输出层的维度为512,内部层的维度是2048。

embedding和softmax

embedding和softmax用的是普通的embedding和softmax。我们的模型中两个embedding层间和softmax前的线性变换共享一个权重矩阵。在embedding层,我们将这些权重乘以 d m o d e l \sqrt{d_{model}} dmodel

positional encoding

我们的网络中没有递归也没有卷积,为了利用到序列中的顺序信息,我们需要在模型中加入一些token在序列中绝对或相对位置的信息。我们在编解码器的输入embedding处栈底添加了positional encoding。它们的维度与输入相同,所以能够加和。positional encoding有很多成熟的选择,我们选择了不同频率的sine和cosine函数:
P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) PE_{(pos, 2i)} = sin(pos/10000^{2i/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel)
P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) PE_{(pos,2i+1)} = cos(pos/10000^{2i/d_{model}}) PE(pos,2i+1)=cos(pos/100002i/dmodel)
其中pos是位置,i是维度。也就是说每一维与一个正弦波相关,波长组成了一个从 2 π 2\pi 2π 10000 ⋅ 2 π 10000\cdot 2 \pi 100002π的等比级数。我们选择这个函数,因为我们假设它会让模型中相关位置更容易到达当前位置,因为对任意固定偏置 k k k P E p o s + k PE_{pos+k} PEpos+k都能够被表示为 P E p o s PE_{pos} PEpos的一个线性函数。
我们也用learned positional embedding做了实验,发现两者的结果很接近。我们选择了上述方法,因为它可能能够处理更长的序列。

为什么要用self-attention

我们比较了self-attention和递归和卷积在变长序列符号表示映射到另一个等长序列的方方面面效果。我们比较三个重要之处。
首先是每层的计算复杂度,然后是可并行化的计算量,最后是网络中长期依赖的路径长度。学习长期依赖的一个关键障碍就是信号要在网络中向前或向后传递的路径长度。信号传递的长度越短,学习长期依赖就越容易。
上表是三种方法的对比。

训练阶段

我们的数据集利用WMT2014英语-德语数据集,其中包含约4500个句子对。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值