self-attention自注意力
自我注意已经成功地用于各种任务,包括阅读理解、抽象总结、文本蕴涵和学习任务独立的句子表征。
原文地址:https://semanticscholar.org/paper/204e3073870fae3d05bcbc2f6a8e263d9b72e776
代码地址:
https://github.com/tensorflow/tensor2tensor
本文贡献:
1)不同于以往主流机器翻译使用基于RNN的seq2seq模型框架,该论文用attention机制代替了RNN搭建了整个模型框架。
2)提出了多头注意力(Multi-headed attention)机制方法,在编码器和解码器中大量的使用了多头自注意力机制(Multi-headed self-attention)。
3)Transformer,它完全基于注意机制,完全免除了重复和卷积。
自我注意(Self-attention),有时也称为内部注意(intra-attention),是一种将单个序列的不同位置联系起来,以计算该序列的表示的注意机制。Transformer是第一个完全依靠自我注意来计算其输入和输出表示的转导模型,而不使用序列对齐的rnn或卷积。
模型框架:
1.编码器将符号表示的输入序列(x1,…,xn)映射为连续表示的序列z = (z1,…,zn)。给定z,解码器然后生成一个输出序列(y1,…(, ym)每次一个元素的符号。在每个步骤中,模型都是自动回归的,在生成下一个步骤时,将之前生成的符号作为额外的输入使用。Transformer遵循这种总体架构,编码器和解码器都使用了堆叠的自注意层和点式的、完全连接的层。
编码器:编码器由N = 6个相同的层组成。每一层有两个子层。
(1)第一层是多头自注意机构,通过self-attention层帮助Endcoder在编码单词的过程中查看输入序列中的其他单词。
(2)第二层是简单的位置全连接前馈网络。我们在两个子层周围使用残差连接,然后是层归一化。也就是说,每个子层的输出是LayerNorm(x +子层(x)),其中子层(x)是子层本身实现的函数。为了方便这些剩余连接,模型中的所有子层以及嵌入层都会产生dimension dmodel = 512的输出。
解码器:解码器也由N = 6个相同的层组成。除每个编码器层中的两个子层外,解码器还插入第三个子层,该子层对编码器堆栈的输出执行多头注意。与编码器类似,我们在每个子层周围使用残差连接,然后进行层归一化。我们还修改了解码器堆栈中的自注意子层,以防止位置注意到后续位置。这种掩蔽,加上输出嵌入被一个位置偏移的事实,确保了位置i的预测只能依赖于位置小于i的已知输出。
2注意
注意函数可以描述为将查询和一组键-值对映射到输出,其中查询、键、值和输出都是向量。输出是作为值的加权和计算的,其中分配给每个值的权重是通过查询与相应键的兼容性函数计算的。
缩放点积注意
加性注意和点积注意。
3.Multi-Head Attention
不同于使用dmodel维度的键、值和查询来执行单一的注意功能,我们发现将查询、键和值分别以不同的线性投影h次线性投影到dk、dk和dv维度是有益的。对于这些查询、键和值的每个投影版本,我们然后并行地执行注意功能,产生dv维输出值。将它们连接起来并再次进行投影,得到最终的值。
多头注意使得模型能够在不同位置共同关注来自不同表示子空间的信息。用一个注意力集中的头,平均就能抑制这种情况。
在这项工作中,我们使用h = 8个平行的注意层,或头部。对于每一个,我们用dk = dv = dmodel/h = 64。由于每个头的尺寸减小,总计算成本类似于单头注意全维。
4注意在我们模型中的应用
Transformer以三种不同的方式使用多头注意力:
在encoder-decoder关注;层,查询来自前面的解码器层,而内存键和值来自编码器的输出。这使得译码器中的每个位置都可以参加输入序列中的所有位置。
编码器包含自我注意层。在自我注意层中,所有的键、值和查询都来自同一个地方,在本例中,是编码器中前一层的输出。编码器中的每个位置都可以对应上一层的所有位置。
类似地,解码器中的自我注意层允许解码器中的每个位置关注解码器中直到并包括该位置的所有位置。我们需要防止解码器中的信息流向左,以保持自回归特性。我们通过屏蔽(设置为)softmax输入中对应非法连接的所有值来实现缩放点积注意。参见图2。
3.3位置前馈网络
除了注意子层,编码器和解码器中的每一层都包含一个完全连接的前馈网络,它分别和相同地应用于每个位置。这包括两个线性变换,中间有一个ReLU激活。
FFN(x) = max(0, xW1 + b1)W2+b2
虽然在不同位置上的线性转换是相同的,但它们在不同层之间使用不同的参数。另一种描述方法是两个卷积,内核大小为1。输入输出维数为dmodel = 512,内层维数为dff =2048。
3.4Embeddings和Softmax
类似于其他序列转换模型,我们使用学习嵌入将输入标记和输出标记转换为维数dmodel的向量。我们还使用通常学到的线性变换和softmax函数将解码器输出转换为预测的下一个令牌概率。在我们的模型中,我们在两个嵌入层之间共享相同的权矩阵和前softmax线性变换,类似于[30]。在嵌入层中,我们将这些权重乘以√dmodel。
3.5位置编码
由于我们的模型不包含递归和卷积,为了使模型利用序列的顺序,我们必须注入一些关于标记在序列中的相对或绝对位置的信息。为此,我们在编码器和解码器堆栈底部的输入嵌入中添加了“位置编码”。位置编码具有与嵌入相同的维数dmodel,因此两者可以相加。有许多位置编码的选择,学习和固定。