ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

attention is all you need笔记

2021-02-19 23:59:10  阅读:199  来源: 互联网

标签:head 位置 attention 编码器 笔记 解码器 need model


Attention is all you need

Abstract

主流的序列转换模型基于复杂的递归或卷积神经网络,其中包括一个编码器和一个解码器。表现最好的模型还通过注意力机制连接编码器和解码器。我们提出了一个新的简单的网络框架,即——Transformer,它完全基于注意力机制,丢弃了recurrence和卷convolutions。在两个机器翻译任务上的实验表明,这些模型有着更好的表现,同时具有更高的可并行性,并且所需的训练时间大大减少。我们的模型在WMT 2014 English-to-German翻译任务中达到28.4 BLEU,比包括ensemble在内的现有最佳结果提高了2 BLEU。在WMT 2014 English-to-French翻译任务中,我们的模型在八个GPU上进行了3.5天的训练后,建立了新的单模型最新的BLEU分数41.0,训练成本只占了现有的最好模型中的一小部分。

1 Introduction

尤其是RNN,LSTM[12],和GRU[7],已经作为sequence modeling和transduction problems(如语言模型和机器翻译)的最先进的方法而被坚定地建立起来[29,2,5]。此后,人们一直在努力扩大recurrent language models和encoder-decoder体系结构的界限[31、21、13]。


Recurrent models通常沿输入和输出序列的符号位置考虑计算。将位置与计算时间中的步骤对齐,它们会根据先前的隐藏状态 h t − 1 h_{t-1} ht−1​和位置 t t t的输入生成一系列隐藏状态 h t h_t ht​。这种固有的顺序性质阻碍了training examples的并行化,这在较长的序列长度上变得至关重要,因为内存限制限制了示例之间的批处理。最近的工作已经通过factorization tricks[18]和conditional computation[26]在计算效率上取得了显着提高,同时在后者的情况下还提高了模型性能。 但是,顺序计算的基本约束仍然存在。


注意机制已经成为各种任务中compelling sequence modeling和transduction models不可或缺的一部分,允许不考虑其在输入或输出序列中的距离的相关性建模[2,16]。然而,在[22]之外的所有案例中,这种注意机制都与循环网络结合使用。

2 Background

减少顺序计算的目标也构成了Extended Neural GPU [20]、ByteNet[15]和ConvS2S[8]的基础,它们都使用卷积神经网络作为基本构建块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,从两个任意输入或输出位置关联信号所需的operations随着位置之间的距离增加而增加,ConvS2S为线性,ByteNet为对数。这使得学习远距离位置[11]之间的依赖关系变得更加困难。在Transformer中,这种情况被减少为一个恒定的operations,尽管代价是由于平均注意力加权位置而降低了有效分辨率,正如第3.2节所述,我们用多头注意力抵消了这种影响。


Self-attention(有时称为intra-attention)是一种与单个序列的不同位置相关的注意力机制,目的是计算序列的表示形式。Self-attention已经成功地应用于阅读理解、抽象摘要、文本蕴涵和学习任务无关的句子表征等多种任务中[4,22,23,19]。


端到端的memory networks基于recurrent attention mechanism,而不是sequence-aligned recurrence,并且已被证明在simple-language question answering和language modeling tasks中表现良好[28]。


据我们所知,Transformer是第一个完全依靠self-attention来计算其输入和输出表示的transduction model,而无需使用sequence-aligned RNNs或convolution。在下面的章节中,我们将描述Transformer,motivate self-attention,并讨论它相对于[14,15]和[8]等模型的优势。

3 Model Architecture

大多数具有竞争力的neural sequence transduction models都具有encoder-decoder结构[5,2,29]。编码器将一个符号表示的输入序列 ( x 1 , ⋯ , x n ) (x_1,\cdots,x_n) (x1​,⋯,xn​)映射到一个连续表示的序列 z = ( z 1 , ⋯ , z n ) z = (z_1,\cdots,z_n) z=(z1​,⋯,zn​)。给定z,则解码器一次生成一个元素的符号的输出序列 ( y 1 , ⋯ , y m ) (y_1,\cdots,y_m) (y1​,⋯,ym​)。模型的每一步都是auto-regressive[9],在生成下一个时,会将先前生成的符号作为附加输入。


Transformer遵循此总体架构,对编码器和解码器使用stacked self-attention和point-wise,全连接层,分别如图1的左半部分和右半部分所示。

image-20210211184736805
3.1 Encoder and Decoder Stacks

Encoder: 编码器由N = 6个相同的层堆叠组成。 每层有两个子层。第一个子层是multi-head self-attention mechanism,第二个子层是简单的position-wise fully connected feed-forward network。我们在两个子层周围使用一个残差连接,后面进行层归一化[1],也就是说,每个子层的输出都是LayerNorm(x + Sublayer(x)),其中Sublayer(x)是子层自身实现的函数。为了促进这些残差连接,模型中的所有子层以及嵌入层均产生尺寸为 d m o d e l d_{model} dmodel​ = 512的输出。

Decoder: 解码器也由N = 6个相同的层堆叠组成。除了每个编码器层的两个子层之外,解码器插入第三个子层,它对编码器堆栈的输出执行multi-head attention。与编码器类似,我们在每个子层周围使用残差连接,然后进行层归一化。我们还修改了解码器堆栈中的self-attention子层,以防止位置注意到后续位置。这个掩码(masking),结合输出嵌入偏移一个位置的事实,确保位置i的预测只能依赖于小于i位置的已知输出。


3.2 Attention

An attention function可以描述为将a query和一组key-value对映射到输出,其中query,keys和values都是向量。输出是values的加权和,其中分配给每个value的权重通过query的compatibility function和相应的query计算。

3.2.1 Scaled Dot-Product Attention
image-20210212141323646

我们把特别的attention叫作"Scaled Dot-Product Attention" (Figure 2)。输入由 d k d_k dk​维的queries和keys, d v d_v dv​维的values组成。我们使用所有keys计算query的点积,除以 d k \sqrt{d_k} dk​ ​,然后用softmax函数获得values的权重(如公式一所描述的)。


在实践中,我们同时计算一组queries的attention function,并将其打包成一个矩阵Q。keys和values也被打包成矩阵K和V。输出矩阵由如下的式子计算:
Attention ⁡ ( Q , K , V ) = softmax ⁡ ( Q K T d k ) V (1) \operatorname{Attention}(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V \tag{1} Attention(Q,K,V)=softmax(dk​ ​QKT​)V(1)
两种最常用的attention function是additive attention [2],和dot-product (multi-plicative) attention。dot-product attention和我们的算法是类似的,只不过我们的算法多除了一个 d k \sqrt{d_k} dk​ ​。Additive attention使用一个带有单一隐含层的feed-forward network来计算compatibility function。虽然这两种方法在理论复杂度上相似,但dot-product attention在实践中速度更快,空间效率更高,因为它可以使用高度优化的矩阵乘法代码实现。当 d k d_k dk​值较小时,两种机制的注意表现相似,但当 d k d_k dk​[3]值较大时,additive attention优于dot product attention without scaling。我们猜想,当 d k d_k dk​的值较大时,点积的大小变大,将softmax函数推入了梯度极小的区域,为了抵消这种影响,我们将点积除以 d k \sqrt{d_k} dk​ ​。

3.2.2 Multi-Head Attention

与使用 d m o d e l d_{model} dmodel​维的keys、values和queries执行单个attention function相比,我们发现将query、key和value分别用不同的、学到的线性映射h倍到 d k d_k dk​、 d k d_k dk​和 d v d_v dv​维效果更好。基于每个映射版本的query、key和value,我们并行执行attention function,产生 d v d_v dv​ 维输出值。将它们连接并再次映射,产生最终值,如图2所示。


Multi-head attention允许模型共同注意来自不同位置的不同表示子空间的信息。用一个单一的attention head,平均抑制这个。
MultiHead ⁡ ( Q , K , V ) =  Concat  (  head  1 , … ,  head  h ) W O  where head  i =  Attention  ( Q W i Q , K W i K , V W i V ) \begin{aligned} \operatorname{MultiHead}(Q, K, V) &=\text { Concat }\left(\text { head }_{1}, \ldots, \text { head }_{\mathrm{h}}\right) W^{O} \\ \text { where head }_{\mathrm{i}} &=\text { Attention }\left(Q W_{i}^{Q}, K W_{i}^{K}, V W_{i}^{V}\right) \end{aligned} MultiHead(Q,K,V) where head i​​= Concat ( head 1​,…, head h​)WO= Attention (QWiQ​,KWiK​,VWiV​)​
其中的参数矩阵 W i Q ∈ R d model  × d k , W i K ∈ R d model  × d k , W i V ∈ R d model  × d v W_{i}^{Q} \in \mathbb{R}^{d_{\text {model }} \times d_{k}}, W_{i}^{K} \in \mathbb{R}^{d_{\text {model }} \times d_{k}}, W_{i}^{V} \in \mathbb{R}^{d_{\text {model }} \times d_{v}} WiQ​∈Rdmodel ​×dk​,WiK​∈Rdmodel ​×dk​,WiV​∈Rdmodel ​×dv​ and W O ∈ R h d v × d model  W^{O} \in \mathbb{R}^{h d_{v} \times d_{\text {model }}} WO∈Rhdv​×dmodel ​.

在这项工作中,我们采用h = 8 个并行attention层或head。 对每个head,我们使用 d k d_k dk​= d v d_v dv​= d m o d e l d_{model} dmodel​/ h = 64。 由于每个head的大小减小,总的计算成本与具有全部维度的单个head attention相似。

3.2.3 Applications of Attention in our Model

Transformer 在三个不同的地方使用了multi-head attention:

  • 在"encoder-decoder attention"层中,query来自前一个解码器层,key和value来自编码器的输出。这允许解码器中的每个位置能关注(attend)到输入序列中的所有位置。这模仿sequence to sequence模型中典型的encoder-decoder的attention机制,例如[38,2,9]。
  • 编码器包含self-attention层。 在self-attention层中,所有的key、value和query来自同一个地方,在这里是编码器中前一层的输出。编码器中的每个位置都可以关注(attend)编码器上一层的所有位置。
  • 类似地,解码器中的self-attention层允许解码器中的每个位置都关注解码器中直到并包括该位置的所有位置。为了保持解码器的自回归属性,我们需要防止解码器中的向左信息流。通过屏蔽softmax的输入中所有不合法连接的值(设置为-∞),我们在scaled dot-product attention中实现。如图2所示。
3.3 Position-wise Feed-Forward Networks

除了attention子层之外,我们的编码器和解码器中的每个层都包含一个fully connected feed-forward network,该前馈网络单独且相同地应用于每个位置。它由两个线性变换组成,之间有一个ReLU激活。
FFN ⁡ ( x ) = max ⁡ ( 0 , x W 1 + b 1 ) W 2 + b 2 (2) \operatorname{FFN}(x)=\max \left(0, x W_{1}+b_{1}\right) W_{2}+b_{2}\tag{2} FFN(x)=max(0,xW1​+b1​)W2​+b2​(2)
尽管线性变换在不同位置上是相同的,但它们每层之间的参数是不同的(不共享参数)。 它的另一种描述方式是两个kernel大小为1的卷积。输入和输出的维度为 d m o d e l = 512 d_{model} = 512 dmodel​=512,内部层的维度为 d f f = 2048 d_{ff} = 2048 dff​=2048。

3.4 Embeddings and Softmax

与其他sequence transduction模型类似,我们使用学习到的embedding将输入词符和输出词符转换为维度为 d m o d e l d_{model} dmodel​的向量。我们还使用普通的线性变换和softmax函数将解码器输出转换为预测的下一个词符的概率。在我们的模型中,两个embedding层之间和pre-softmax线性变换共享相同的权重矩阵,类似于[30]。在Embedding层中,我们将这些权重乘以 d m o d e l \sqrt{d_{model}} dmodel​ ​。

3.5 Positional Encoding

由于我们的模型不包含recurrence和convolution,为了让模型充分利用序列的顺序,我们必须注入序列中关于词符相对或者绝对位置的一些信息。 为此,我们将“位置编码(positional encodings)”添加到编码器和解码器堆栈底部的输入Embedding中。positional encoding和Embedding的维度 d m o d e l d_{model} dmodel​相同,所以它们俩可以相加。有多种位置编码可以选择,例如通过学习得到的位置编码和固定的位置编码[8]。

在这项工作中,我们使用不同频率的正弦和余弦函数:
P E ( p o s , 2 i ) = sin ⁡ ( pos ⁡ / 1000 0 2 i / d model  ) P E ( pos  , 2 i + 1 ) = cos ⁡ (  pos  / 1000 0 2 i / d model  ) \begin{aligned} P E_{(p o s, 2 i)} &=\sin \left(\operatorname{pos} / 10000^{2 i / d_{\text {model }}}\right) \\ P E_{(\text {pos }, 2 i+1)} &=\cos \left(\text { pos } / 10000^{2 i / d_{\text {model }}}\right) \end{aligned} PE(pos,2i)​PE(pos ,2i+1)​​=sin(pos/100002i/dmodel ​)=cos( pos /100002i/dmodel ​)​
其中pos是位置,i是纬度。也就是说,位置编码的每个维度对应于一个正弦曲线。 这些波长形成一个几何级数,从2π 到10000 ⋅ 2π。我们选择这个函数是因为我们假设它允许模型很容易学习对相对位置的关注,因为对任意确定的偏移k, P E p o s + k PE_{pos+k} PEpos+k​可以表示为 P E p o s PE_{pos} PEpos​的线性函数。

我们还使用学习到的位置嵌入[8]进行了试验,发现这两个版本产生几乎相同的结果(参见表3行(E))。 我们选择了正弦曲线,因为它可以允许模型推断比训练期间遇到的更长的序列。


4 Why Self-Attention

在本节中,我们比较self-attention与recurrent层和convolutional层的各个方面,它们通常用于映射变长的符号序列表示 ( x 1 , ⋯   , x n ) (x_1,\cdots,x_n) (x1​,⋯,xn​)到另一个等长的序列 ( z 1 , ⋯   , z n ) (z_1,\cdots,z_n) (z1​,⋯,zn​),其中 x i , z i ∈ R d x_i,z_i \in R^d xi​,zi​∈Rd,例如一个典型的sequence transduction编码器或解码器中的隐藏层。我们使用self-attention是考虑到解决三个问题。


一个是每层计算的总复杂度。 另一个是可以并行的计算量,以所需的最小顺序操作(sequential operation)的数量来衡量。


第三个是网络中长距离依赖之间的路径长度。学习长距离依赖性是许多sequence transduction任务中的关键挑战。 影响学习这种依赖性能力的一个关键因素是前向和后向信号必须在网络中传播的路径长度。输入和输出序列中任意位置组合之间的这些路径越短,学习远距离依赖性就越容易[11]。因此,我们还比较了由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。

image-20210219233159797

如表1所示,self-attention层将所有的位置连接只需要常数数量(O(1))的顺序执行的操作,而recurrent层需要O(n) 顺序操作。在计算复杂性方面,当序列长度n 小于表示维度d 时,self-attention层比recurrent层快,这是机器翻译中最先进的模型中非常常见的情况,例如word-piece[31],byte-pair[25]表示法。为了提高涉及很长序列的任务的计算性能,可以将self-attention限制在仅考虑大小为r 的邻域内。这会将最大路径长度增加到O(n ∕ r)。 我们计划在未来的工作中进一步调查这种方法。我们计划在未来的工作中进一步调查这种方法。


kernel宽度为k < n的单层卷积不会连接每一对输入和输出的位置。如果要这么做,在邻近核的情况下需要O(n∕k) 个卷积层,在扩展卷积的情况下需要O(logk(n)) 个层[15],它们增加了网络中任意两个位置之间的最长路径的长度。卷积层通常比循环层花费更大,与因子k有关。然而,可分卷积[6]大幅减少复杂度到O(knd + n⋅ d 2 d^2 d2)。 然而,即使k = n,一个可分卷积的复杂度等同于self-attention层和point-wise前向层的组合,即我们的模型采用的方法。


间接的好处是self-attention可以产生更加可解释的模型。我们从我们的模型中研究attention的分布,并在附录中展示和讨论示例。 每个attention head不仅清楚地学习到执行不同的任务,许多似乎展现与句子的句法和语义结构的行为。


自此,本篇论文就翻译到这里了,后面部分不打算翻译了。

论文的下载地址为:https://arxiv.org/pdf/1706.03762.pdf

标签:head,位置,attention,编码器,笔记,解码器,need,model
来源: https://blog.csdn.net/weixin_43869610/article/details/113874150

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有