论文阅读:Attention is all you need
https://www.zhihu.com/question/337886108/answer/770243956
https://yiyibooks.cn/yiyibooks/Attention_Is_All_You_Need/index.html
Abstract
-
模型在质量上更优越,并行性更好, 需要训练的时间显著减少。
-
英语-德语翻译任务上达到28.4 BLEU,超过现有最佳结果(包括ensembles)2个BLEU
1 Introduction
-
RNN这些固有的顺序特性,阻碍了样本训练的并行化,这在更长的序列长度上变得至关重要,因为有限的内存限制样本的批次大小。
-
在这项工作中我们提出Transformer,这种模型架构 避免循环并完全依赖于attention机制 来绘制输入和输出之间的全局依赖关系。
-
Transformer允许进行更多的并行化,并且可以在八个P100 GPU上接受少至十二小时的训练后达到翻译质量的新的最佳结果。
2 Background
-
在这些模型中,关联任意两个输入和输出位置的信号 所需的操作次数会 随着位置之间的距离而增加,ConvS2S是线性增加,而ByteNet是对数增加
-
在Transformer中,这种操作减少到固定的次数,尽管由于对 用attention权重化的位置取平均降低了效果,但是我使用Multi-Head Attention进行抵消,具体描述见 3.2。
-
Self-attention,有时称为 intra-attention,是一种attention机制,它 关联单个序列的不同位置 以计算序列的表示。
-
然而,就我们所知,Transformer是第一个 完全依靠self-attention来计算输入和输出表示 而不使用序列对齐RNN或卷积的转导模型
3 Model Architecture
![](https://img2020.cnblogs.com/blog/817161/202010/817161-20201016104515156-838815283.png)
3.1 Encoder and Decoder Stacks
Encoder:
-
编码器由 N = 6 个完全相同的层堆叠而成。
-
每一层都有两个子层:
-
第一个子层:一个 multi-head self-attention 机制
-
第二个子层:一个 简单的,position-wise fully connected feed-forward network
-
我们对每个子层再 采用一个 residual connection,接着进行 层归一化(LayerNorm)
-
每个子层的输出:LayerNorm(x + Sublayer(x)), Sublayer是由子层本身实现的函数
-
-
为了方便这些残差连接(residual connections),模型中的所有子层以及嵌入层产生的 输出维度都为 dmodel = 512。
Decoder:
-
由 N = 6 个完全相同的层堆叠而成。
-
除了每个编码器层中的两个子层之外,解码器还插入第三个子层,该层对 编码器堆栈的输出 执行multi-head attention
-
与编码器类似,我们在每个子层再采用残差连接,然后进行层标准化。
-
修改解码器堆栈中的 self-attention子层,以防止位置关注到后面的位置。
- 这种masking 结合 将output embedding偏移一个位置,确保对 位置i 的预测 只能依赖小于 位置i 的已知输出。
3.2 Attention
-
Attention函数可以描述为将query和一组key-value对映射到输出,其中query、key、value和输出都是向量。
-
输出为value的加权和,其中分配给每个value的权重 通过 query 与 相应key 的兼容函数(compatibility function)来计算。
3.2.1 Scaled Dot-Product Attention
- 输入由query、\(d_k\) 维的key 和 \(d_v\) 维的value组成
-
两个最常用的attention函数是加法attention 和 点积(乘法)attention。
-
实践中点积attention的速度更快、更节省空间,因为它可以使用高度优化的矩阵乘法代码来实现。
-
当 \(d_k\) 的值比较小的时候,这两个机制的性能相差相近;
-
当 \(d_k\) 比较大时,加法attention 比 不带缩放的点积attention性能好
-
我们怀疑,对于很大的 \(d_k\) 值,点积大幅度增长,将softmax函数推向具有极小梯度的区域。 为了抵消这种影响,我们缩小点积 \(\frac{1}{\sqrt{d_k}}\) 倍。
-
3.2.2 Multi-Head Attention
-
queries,keys,和value分别用不同的,学到的线性映射 h 倍到 \(d_k\) 和 \(d_v\) 维效果更好,而不是用 dmodel维 query、key和value执行单个attention函数。
-
基于每个映射版本的 query,key和value,并行执行 attention函数,产生 \(d_v\) 维输出值。将他们连接(concatenate)并再次映射,产生最终值。
-
Multi-head attention 使模型可以共同关注来自 不同位置的不同表示子空间 的信息。如果只有一个attention head,它的平均值会削弱这个信息。
其中,映射为参数矩阵 \(W_{i}^{Q} \in \mathbb{R}^{\text {dmodel } \times d_{k}}, W_{i}^{K} \in \mathbb{R}^{\text {dmodel } \times d_{k}}, W_{i}^{V} \in \mathbb{R}^{\text {dmodel } \times d_{V}}\),及 \(W^O \in \mathbb{R}^{h d_{\nu} \times \text { dmodel }}\)
-
我们采用 h = 8 个并行attention层或head。 对每个head,我们使用 \(d_k = d_v = dmodel ∕ h = 64\)。
- 由于每个head的大小减小,总的计算成本与具有全部维度的单个head attention相似。
3.2.3 Applications of Attention in our Model
-
Transformer使用以3种方式使用multi-head attention:
-
"encoder-decoder attention" layers: query来自上面的解码器层,key和value来自编码器的输出。这允许解码器中的每个位置能关注到输入序列中的所有位置。
- 这模仿 seq2seq 模型中典型的 Encoder-Decoder attention 机制
-
编码器包含self-attention层:
-
在self-attention层中,所有的key、value和query来自同一个地方,在这里是编码器中前一层的输出。
-
编码器中的每个位置都可以关注编码器上一层的所有位置。
-
-
解码器中的self-attention层:允许解码器中的每个位置都关注解码器中直到并包括该位置的所有位置
-
需要防止 解码器中的 向左信息流 来保持自回归属性(auto-regressive property)
- ps:自回归模型:根据概率分布生成第一个词,然后根据第一个词生成第二个词,然后根据前两个词生成第三个词了,以此类推,直到生成整个句子。(单向)
-
通过 mask softmax的输入中所有不合法连接的值(设置为 -∞),在 Scaled dot-product attention中实现。
-
-
3.3 Position-wise Feed-Forward Networks
- 我们的编码器和解码器中的每个层都包含一个fully connected feed-forward network,该前馈网络单独且相同地应用于每个位置。 它由两个线性变换组成,之间有一个ReLU激活。
- 尽管线性变换在不同位置上是相同的,但它们层与层之间使用不同的参数。 它的另一种描述方式是两个内核大小为1的卷积。 输入和输出的维度为dmodel = 512,内部层的维度为 \(d_{ff}\) = 2048。
3.4 Embeddings and Softmax
3.5 Positional Encoding
-
由于我们的模型不包含循环和卷积,为了让模型利用序列的顺序,我们必须注入序列中关于词符相对或者绝对位置的一些信息。
- 为此,我们将“positional encodings”添加到编码器和解码器堆栈底部的输入嵌入中。 位置编码和嵌入的维度dmodel相同,所以它们俩可以相加。
-
有多种位置编码可以选择,例如通过学习得到的位置编码和固定的位置编码:
-
其中pos 是位置,i 是维度。 也就是说,位置编码的每个维度对应于一个正弦曲线。这些波长形成一个几何级数,从 2π 到10000 ⋅ 2π。
- 选择这个函数是因为我们假设:它允许模型很容易学习对相对位置的关注,因为对任意确定的偏移k, \(PE_{pos+k}\) 可以表示为 \(PE_{pos}\) 的线性函数。
4 Why Self-Attention
-
一个是每层计算的总复杂度。
-
另一个是可以并行的计算量,以所需的最小顺序操作的数量来衡量。
-
第三个是网络中长距离依赖之间的路径长度。
-
影响学习这种依赖性能力的一个关键因素是:前向和后向信号必须在网络中传播的 路径长度。
-
输入和输出序列中任意位置组合之间的这些路径越短,学习远距离依赖性就越容易
-