1.Transformer-Attention is all your need论文详读-PartⅡ(模型架构)

⭐原文链接:https://arxiv.org/abs/1706.03762

*黑字——原文翻译

*绿字——主观分析(未对全部细节进行分析,仅针对本文内容补充)

3. Model Architecture

大多数具有竞争力的神经序列转换模型都有一个编码器-解码器(Encoder-Decoder)结构。在这里,编码器(Encoder)映射一个符号表示的输入序列到连续表示序列

根据z,解码器(Decoder)生成输出序列符号一次一个元素。在每个步骤中,模型都是自回归(Auto-regressive)的,在生成下一个步骤时使用先前生成的符号作为额外的输入。

* 符号一次一个元素:即decoder在解码时,只能一个一个生成。相反,Encoder一次性很可能看全整个句子。例如,在翻译时,看到整句英语。

* 自回归(Auto-regressive):先前的输出会作为当前的输入。

*即在生成y1后生成y2,在生成ym时,要得到先前的y1到ym-1。翻译时为一个个词翻译。

* m与n的长度可相同可不同。

Transformer遵循这种整体架构,编码器(Encoder)和解码器(Decoder)使用堆叠自注意(stacked self-attention)和逐点(point-wise),全连接层(Fully-connected layer),分别如图1的左半部分和右半部分

3.1 Encoder and Decoder Stacks

Encoder

(1) 编码器N=6,即6个相同的层堆叠。每个层有两个子层。第一个层是多头自注意机制(multi-head se-lf-attention mechanism),第二个子层是简单的,position-wise全连接前馈网络(positionwise fully connected feed-forward network)

(2) 我们在两个子层的每一个子层周围使用残差连接(residual connection),然后进行层归一化(layer normalization)。

(3) 每个子层的输出为:

Sublayer(x)是子层(sub-layer)自身实现的函数,为了方便(facilitate)残差连接(residual connection-s),模型中所有的子层和嵌入层(embedding layer),产生的输出维度

Decoder

(1) 解码器N=6,也是6个相同的层堆叠。除了每个编码器层中的两个子层外,解码器还插入了第三个子层,该子层对编码器堆叠的输出执行多头注意。与编码器类似,我们在每个子层周围使用残差连接,然后进行层归一化。我们还修改了解码器堆叠中的自注意子层,以防止位置与后续位置的联系(Masked Multi-Head Attention)。这种掩盖(masking),加上输出嵌入被一个位置偏移的事实,确保了位置i的预测只能依赖于小于i位置的已知输出。

3.2 Attention

注意函数可以描述为映射一个query和一组key-value对到一个输出。其中query、keys、value和输出都是向量。

*注意函数可以描述为映射一个query和一组key-value对到一个输出,即通过query和key-value对作为输入得到输出。

输出是通过值(values)的加权求和计算得到的。其中,分配给每个值的权重(weight)是由query和相应key的兼容性函数计算得到的。

*即说的是如何计算输出和权重。

3.2.1 Scaled Dot-Product Attention(缩放点积注意)

输入:维度的queries、keys、和dv维度的values

(1) 计算query与所有keys的点积,如下图所示(途中绿色方框为序列中的单位);

*将结果作为相似度,内积值越大,余弦值越大,两个向量的相似度越高。若两向量正交,则没有相似度。

(2) 分别除以

(3) 应用softmax函数获得values的权重。

实际上,同时计算一组queries的注意函数,将其打包成一个矩阵Q。keys和values也被打包为矩阵K和V。

输出(矩阵):矩阵V与其对应权重的乘积

计算公式如下:

*在这里是使用了Dot-product点积注意,解释了一下为什么用点积而不用加法注意,解释一下什么是加性注意,什么是点积注意。

最常用的两个注意函数是加性注意和点积(乘法)注意,如下图所示。

(1) 点积注意和我们的算法是一样的,除了比例因子

*即相对于常用的点积注意,添加了比例因子。

(2) 加性注意利用带有单个隐藏层的前馈网络计算相容性函数(compatibility function)。

尽管这两者在理论复杂度上相似,但点积注意在实际上要更快且空间效率更好,因为它可以使用高度优化的矩阵乘法代码来实现。

值较小时,两种机制表现相似;当值较大时,加性注意在没有缩放的情况下优于点积注意。

*点积注意与加性注意的比较。

我们猜想对于大的,点积在规模上增长很大,将softmax推入具有极小梯度的区域,为了抵消这种影响,我们将点积缩放为

*即为什么添加比例因子。

3.2.2 Multi-Head Attention

代替用维keys、values和queries执行单一的注意函数,我们发现用不同的(different),学习过(learned)的线性投影(linear projections)分别将queries,keys和values经h次投到,维度。在queries,keys和values的每个投影版本上,我们并行执行注意函数,生成维的输出值。这些输出被连接并再次投影,从而产生最终的值。

*即Multi-head attention进行h次不同投影,使得投影的空间能够匹配到不同模式需要的一些相似函数,然后把h个heads拼接起来,最后再做一次投影。

*类似于CNN的不同通道,不同的卷积核生成多个通道。

多头注意使模型能够共同关注来自不同位置(different positions)的不同表示子空间(representation subspaces)的信息。如果只有一个注意头,平均会抑制(averaging inhibits)这一点。

其中投影是参数矩阵:

*即通过与矩阵相乘进行投影,需要训练学习的4个参数,此处的表示矩阵维度。

在这项研究中,我们使用h=8平行注意层,即头部(heads)。对于每一个头部,我们使用:

由于减少了每个头部的维度,其总计算成本与全维度单头部注意的计算成本相近。

*即多个头,每个头的维度是缩小的。而单个头是全部的维度,未进行缩小。因此多个头的计算与单个头计算成本近似。

3.2.3 Applications of Attention in our Model

Transformer以三种不同的方式使用多头注意力:

(1) 在“编码器-解码器注意”层中,queries来自先前的解码器层,内存的keys和values来自编码器的输出。这使得解码器中的每个位置都能处理输入序列中的所有位置。这模仿了序列对序列模型中典型的编码器-解码器注意机制;

(2) 编码器包含自注意层。在自注意层中,所有的keys,values核queries来自相同空间,在这种情况下,前一层的输出在编码器中。编码器中的每一个位置都可以处理编码器前一层中的所有位置。

(3) 类似地,解码器中的自注意层允许解码器中的每个位置处理解码器中的所有位置,并包括该位置。我们需要在解码器中防止向左的信息流,以保持自回归特性(auto-regressive property)。我们通过屏蔽(masking-out)softmax输入中对应非法连接(correspond to illegal connections)的所有值,在缩放的点积注意中实现了这一点。

3.3 Position-wise Feed-Forward Networks

除了注意子层,编码器和解码器中的每一层都包含一个完全连接的前馈网络,该网络分别且相同地应用于每个位置。它包含两个线性转换,中间有一个ReLU激活。

虽然不同位置的线性变换是相同的,但它们每一层使用不同的参数。另一种描述方法是两个内核大小为1的卷积。输入输出维数,内层维数

3.4 Embeddings and Softmax

与其他序列转换模型类似,我们使用学习的嵌入(learned embeddings)将输入tokens和输出tokens转换为维度为的向量。我们还使用常用的线性转换和softmax函数来将解码器的输出转换为下一个token的概率。在我们的模型中,我们在两个嵌入层之间共享相同的权重矩阵和pre-softmax线性变换,与[参考文献]相似。在嵌入层中,我们将这些权重乘以

3.5 Positional Encoding

*主要解决了模型对于序列位置利用低的问题。而序列中组成部分的位置影响对信息的判断,因此需要在序列中添加位置信息——有多种添加位置编码的方法。

由于我们的模型不包含递归和卷积,为了让模型利用序列的顺序,我们必须注入一些关于tokens在序列中的相对或绝对位置的信息。为此,我们在编码器和解码器堆叠底部的输入嵌入中添加了“位置编码”

位置编码与嵌入具有相同的维数,因此两者可以相加。位置编码有许多选择,有习得的也有固定的

在这项工作中,我们使用不同频率的正弦和余弦函数:

其中pos是位置,i是维度。也就是说,位置编码的每个维度对应一个正弦信号。波长从2π到10000 ·2π的几何级数。我们选择这个函数是因为我们假设它会让模型很容易学会通过相对位置参加,因为对于任意固定的偏移(offset)k,可以表示为的线性函数。

我们还试验了使用习得的位置嵌入(learned positional embeddings),并发现两个版本产生了几乎相同的结果。我们选择了正弦版本(sinusoidal version),因为它可能允许模型外推到比训练中遇到的序列长度更长的序列。

猜你喜欢

转载自blog.csdn.net/qq_41958946/article/details/128647319