1.论文介绍
Attention Is All You Need
2017年 NIPS
transformer 开山之作 回顾一下经典,学不明白了
Paper Code
2. 摘要
显性序列转导模型基于包括编码器和解码器的复杂递归或卷积神经网络。性能最好的模型还通过注意力机制连接编码器和解码器。我们提出了一个新的简单的网络架构,Transformer,完全基于注意力机制,完全免除了递归和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上是上级的,同时具有更好的并行性,并且需要更少的训练时间。我们的模型在WMT 2014英语到德语翻译任务中达到了28.4 BLEU,比现有的最佳结果(包括集成)提高了2 BLEU以上。在WMT 2014英语到法语的翻译任务中,我们的模型在8个GPU上训练了3.5天后,建立了一个新的单模型最先进的BLEU得分为41.0,这是文献中最佳模型训练成本的一小部分。
Keywords:transformer,纯注意力机制
3.Introduction
递归模型通常沿输入和输出序列的符号位置沿着因子计算。将位置与计算时间中的步骤对齐,它们生成隐藏状态ht的序列,作为前一个隐藏状态ht-1和位置t的输入的函数。这种固有的顺序性质排除了训练示例中的并行化,这在较长的序列长度下变得至关重要,因为内存约束限制了示例之间的并行化。最近的工作通过因式分解技巧和条件计算实现了计算效率的显着提高,同时还提高了后者的模型性能。然而,顺序计算的基本约束仍然存在。注意力机制已经成为各种任务中引人注目的序列建模和转导模型的组成部分,允许在不考虑它们在输入或输出序列中的距离的情况下对依赖关系进行建模。然而,除了少数情况外,在所有情况下,这种注意力机制都与循环网络结合使用。在这项工作中,我们提出了Transformer,一个模型架构避免复发,而是完全依赖于注意力机制,以绘制输入和输出之间的全局依赖关系。Transformer支持更高的并行化,在8个P100 GPU上训练12小时后,翻译质量就能达到最新水平。
减少顺序计算的目标也构成了扩展神经GPU,ByteNet 和ConvS 2S 的基础,所有这些都使用卷积神经网络作为基本构建块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,将来自两个任意输入或输出位置的信号关联起来所需的操作数量随着位置之间的距离而增长,对于ConvS 2S是线性的,而对于ByteNet是线性的。这使得学习远距离位置之间的依赖关系变得更加困难。在Transformer中,这被减少到恒定数量的操作,尽管由于平均注意力加权位置而降低了有效分辨率。自我注意力(英语:Self-attention),有时也被称为内部注意力(intra-attention),是一种将单个序列的不同位置联系起来以计算该序列的表示的注意力机制。自我注意已成功用于各种任务,包括阅读理解,抽象概括,文本蕴涵和学习任务独立的句子表征。端到端记忆网络基于循环注意机制而不是序列对齐的循环,并且已被证明在简单语言问题回答和语言建模任务中表现良好。然而,据我们所知,Transformer是第一个完全依靠自我注意力来计算其输入和输出的表示而不使用序列对齐的RNN或卷积的转换模型。
传统的递归模型通常沿着输入和输出序列的符号位置进行计算,这意味着它们需要依次处理每个符号的位置,这在处理长序列时会导致效率低下。
最近的一些研究工作尝试通过不同的技术来改善计算效率,但是仍然受到顺序计算的基本限制。注意力机制是一种常见的用于处理序列数据的方法,它允许模型在不考虑符号在输入或输出序列中的距离的情况下对它们之间的依赖关系进行建模。然而,传统的注意力机制通常与循环神经网络(RNN)结合使用,而且仍然受到顺序计算的限制。
为了克服这些限制,作者提出了一种名为Transformer的新型模型架构,它完全依赖于自我注意力机制来处理序列数据,而不使用循环神经网络或卷积。这使得Transformer能够更有效地处理长序列,并且支持更高的并行计算,因此能够更快地训练模型并获得更好的性能。Transformer已经在机器翻译等任务中取得了很好的表现。
4. 网络结构详解
大多数竞争性神经序列转导模型具有编码器-解码器结构。这里,编码器将符号表示的输入序列(x1,,xn)转换为连续表示序列z =(z1,…,Zn)。给定z,解码器然后生成输出序列(y1,…,ym)中的每一个。在每一步,模型都是自回归的,在生成下一个符号时,模型会使用先前生成的符号作为额外的输入。Transformer遵循这种整体架构,编码器和解码器均使用堆叠的自注意和逐点全连接层,结构如下图所示。
编码器和解码器堆栈
编码器:编码器由N = 6个相同层的堆栈组成。每层有两个子层。第一个是多头自注意机制,第二个是一个简单的,位置明智的全连接前馈网络。两个子层的每一个周围使用残差连接,然后进行层归一化。也就是说,每个子层的输出是
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)),其中Sublayer(x)是子层本身实现的函数。为了促进这些残差连接,模型中的所有子层以及嵌入层产生维度dmodel = 512的输出。
解码器:解码器也是由一个堆栈的N = 6相同的层。除了每个编码器层中的两个子层之外,解码器还插入第三子层,该第三子层对编码器堆栈的输出执行多头注意。与编码器类似,我们在每个子层周围使用残差连接,然后进行层归一化。我们还修改了解码器堆栈中的自关注子层,以防止关注后续位置。这种掩蔽,结合输出嵌入偏移一个位置的事实,确保了位置i的预测只能依赖于小于i的位置处的已知输出。
注意力
注意力函数可以被描述为将查询和一组键值对映射到输出,其中查询、键、值和输出都是向量。输出被计算为值的加权和,其中分配给每个值的权重由查询与对应键的兼容性函数计算。
标度点积注意力:如下图所示,输入包含查询、键(维度dk)以及维度dv的值组成。计算查询与所有键的点积,将每个键除以
√
d
k
√dk
√dk,并应用softmax函数来获得值的权重。这些查询被打包到一个矩阵Q中。键和值也被打包到矩阵K和V中。我们计算输出矩阵为:
两种最常用的注意力函数是加法注意力和点积(乘法)注意力。点积注意力(计算相似度)与我们的算法相同,除了比例因子为
1
d
k
\frac{1}{\sqrt{d_k}}
dk1。加法注意力使用具有单个隐藏层的前馈网络计算兼容性函数。虽然两者在理论复杂度上相似,但点积注意力在实践中要快得多,空间效率更高,因为它可以使用高度优化的矩阵乘法代码来实现。虽然对于较小的dk值,这两种机制的表现相似,但在dk值较大的情况下,加法注意力优于点积注意力。我们怀疑,对于较大的dk值,点积的大小会变大,从而将softmax函数推到梯度非常小的区域。为了抵消这种影响,我们将点积缩放
1
d
k
\frac{1}{\sqrt{d_k}}
dk1。
多头注意:我们发现,与使用
d
m
o
d
e
l
d_{model}
dmodel维的键、值和查询来执行单个注意力函数。不同的是,使用不同的学习线性投影将查询、键和值分别线性投影h次到dk、dk和dv维是有益的。在这些查询、键和值的每个投影版本上,并行执行注意力函数,产生dv-dimensional输出值。这些数据被连接起来并再次投影,从而得到最终值,如下图所示。多头注意允许模型在不同的位置联合注意来自不同表示子空间的信息。对于一个单一的注意力头,平均化抑制了这一点。
其中投影是参数矩阵
W
i
Q
∈
R
d
m
o
d
e
l
×
d
k
W^Q_i ∈ R^{d_{model}×d_k}
WiQ∈Rdmodel×dk,
W
i
K
∈
R
d
m
o
d
e
l
×
d
k
W^K_i ∈ R^{d_{model}×d_k}
WiK∈Rdmodel×dk,
W
i
V
∈
R
d
m
o
d
e
l
×
d
v
W^V_i ∈ R^{d_{model}×d_v}
WiV∈Rdmodel×dv和
W
O
∈
R
d
v
×
d
m
o
d
e
l
W^O ∈ R^{dv ×dmodel}
WO∈Rdv×dmodel。在这项工作中,采用h = 8平行注意层,或头。对于每一个,我们使用dk = dv = dmodel/h = 64。由于每个头的维数降低,总的计算成本是类似的单头注意与全维。
在“编码器-解码器注意”层中,查询Q来自先前的解码器层,并且存储器键K和值V来自编码器的输出。这使得解码器中的每个位置都可以覆盖输入序列中的所有位置。这模仿了序列到序列模型中典型的编码器-解码器注意力机制。编码器包含自注意层。在自关注层中,所有的键、值和查询都来自同一个地方,在这种情况下,是编码器中前一层的输出。编码器中的每个位置可以涉及编码器的前一层中的所有位置。类似地,解码器中的自关注层允许解码器中的每个位置关注解码器中的所有位置,直到并包括该位置。我们需要防止解码器中的冗余信息流,以保持自回归特性。我们通过屏蔽(设置为−∞)softmax输入中对应于非法连接的所有值来实现这一点。
位置前馈网络:除了注意力子层之外,编码器和解码器中的每一层都包含一个完全连接的前馈网络,该网络单独且相同地应用于每个位置。这包括两个线性变换,中间有一个ReLU激活。
虽然线性变换在不同位置是相同的,但它们在层与层之间使用不同的参数。另一种描述这种情况的方式是两个卷积,内核大小为1。输入和输出的维度为dmodel = 512,内层的维度为dff = 2048。
嵌入式和Softmax:与其他序列转换模型类似,使用学习的嵌入将输入令牌和输出令牌转换为维度dmodel的向量。还使用常用的学习线性变换和softmax函数将解码器输出转换为预测的下一个令牌概率。在我们的模型中,我们在两个嵌入层和pre-softmax线性变换之间共享相同的权重矩阵。在嵌入层中,我们将这些权重乘以嵌入模型。
位置编码:
由于transformer不包含递归和卷积,为了让模型利用序列的顺序,必须注入一些关于序列中token的相对或绝对位置的信息。为此,在编码器和解码器堆栈的底部向输入嵌入添加“位置编码”。位置编码与嵌入具有相同的维度dmodel,因此两者可以相加。有许多位置编码的选择,学习和固定。在这项工作中,我们使用不同频率的正弦和余弦函数,
其中pos是位置,i是尺寸。即,位置编码的每个维度对应于正弦曲线。波长形成从2π到10000 · 2π的几何级数。之所以选择这个函数,是因为我们假设它可以让模型很容易地学会通过相对位置来参与,因为对于任何固定的偏移量k,PEpos+k都可以表示为PEpos的线性函数。我们还尝试使用学习的位置嵌入,发现两个版本产生了几乎相同的结果。我们选择正弦版本,因为它可以允许模型外推到比训练期间遇到的更长的序列长度。
为什么用自注意力
一个是每层的总计算复杂度。另一个是可以并行化的计算量,这是通过所需的最小顺序操作数来衡量的。第三个是网络中长距离依赖之间的路径长度。学习长程依赖性是许多序列转导任务中的关键挑战。影响学习这种依赖关系的能力的一个关键因素是前向和后向信号必须在网络中穿过的路径的长度。输入和输出序列中任意位置组合之间的路径越短,就越容易学习长程依赖性。
5.总结
它没有用递归和卷积,只用注意力机制。包含一个编码器一个解码器,每个都有N层,在最开始有位置编码实现序列结构信息。编码器的每层包含一个多头自注意力和一个前馈神经网络层。
解码器包含一个多头自注意力、一个前馈神经网络外加一层对输出进行多头自注意力。