Heloowird

NLP论文阅读- Transformer

论文题目

Attention Is All You Need (Transformer)

背景介绍

RNN,特别是LSTM、GRU 在诸如语言模型和机器翻译等序列建模和转换问题上已经达到SOTA。然而RNN 天然地对并行计算不友好。 在RNN序列中,当前时刻隐层状态h(t) 依赖前一个隐层状态h(t-1) 和当前输入x(t) 。这种结构性问题导致RNN 训练时难以并行。

另一方面,注意力机制已经成了序列建模和转换模型的必备部分,可以不受距离限制地建模输入和输出之间的依赖关系。现在绝大部分的注意力机制和RNN 捆绑一起使用。

考虑到以上两点,Transformer 避开了RNN 结构,并且完全使用依赖注意力机制来捕捉输入和输出之间的全局依赖信息。Transformer 在8块P100上12个小时内就可以达到新的SOTA。

模型结构

Transformer 模型架构图

模型分成三部分,输入层,编/解码层,预测输出层。编/解码层具有相似结构,区别在于解码层的基础构件多了一个多头自注意力子层。网络基础构件分为有两个,一个为多头自注意力子层,另一个为前向全连接子层。两层之间使用残差连接和层归一化,即:$LayerNorm(x + Sublayer(x))$,其中$Sublayer$为自注意力子层或者前向全连接层。编码层使用了6 个(多头自注意力子层+ 前向连接子层),解码层使用了6 个(2 个多头自注意力子层+ 前向连接子层)。下面详细介绍各个部分。

自注意力
多头注意力

注意力函数将输入向量映射成查询向量(query vector),一系列键(key vector)、值对向量(value vector),然后转化成输出向量。输出向量是一系列值向量的加权和,是与查询向量对应的隐层表示。每个值向量的权重由查询向量和对应键向量的相关性决定。

每个输入通过3个转换矩阵,分别映射成查询向量、键值对向量。之后它们的运作方式如上图左边所示。查询向量和键向量做点积,然后除以一个常数进行缩放,经过Softmax 函数得到查询向量和键向量的权重,最后乘以与键向量对应的值向量并累加起来作为查询向量的表示。

对于输出层,当前输出只和前面的输出有关。需要使用掩盖的方式来屏蔽后面输入的影响,通常会把Softmax 的输入设置成负无穷,权重接近为0,即忽略相应输入的值向量对当前输出的影响。所以就有了$Mask(opt.)$。

缩放的目的是降低输出值的方差,避免大部分梯度落在微小梯度区域。假设查询向量和键向量都是相互独立的均值为0,方差为1的等同分布,那么,查询向量和键向量的内积就是均值为0,方差为$d_k$分布。为了减弱方差的影响,计算Softmax概率前除以$\sqrt{d_k}$。

以上就是单头自注意力机制。对于同一个输入,使用不同转换矩阵,可以并行计算多个注意力表示,拼接起来作为注意力子层的输出值。多头注意力可以捕捉不同维度的语义特征,类似卷积神经网络的卷积核可以捕捉不同维度的图像特征。文章采用的是8个并行自注意力构成的注意力子层。

前向全连接

注意力层之后接两层全连接,全连接中间使用Relu激活函数。
\begin{equation}
\begin{aligned}
FNN(x) = max(0, xW_1 + b_1)W_2 + b_2
\end{aligned}
\end{equation}

不同全连接层使用不同参数。其中$x$为512维,$W_1$为2048维,$W_2$为512维。

词向量和Softmax

词向量和Softmax 均使用学习好的参数。使用固定的词向量将输入词和预测词转化成维度为$d_{model}$ 的向量。同样地,使用预训练好的线性转换和Softmax函数将解码层的输出转换成下一个词的概率。输入和输出序列词的Embedding层和Softmax的线性转换层共享参数。为了弥补缩放,Embedding层参数需乘以一个$\sqrt{d_k}$。

位置编码

目前为止,并没有使用到位置信息。本文使用固定位置编码— 正余弦函数来表示不同位置信息,和Embedding层相加作为编码层和解码层的输入。

模型训练

  1. 8块NVIDIA P100 GPU训练基础版模型大约使用12小时或者迭代10万步,每步花费0.4秒;
  2. 使用Adam优化器,$\beta_1 = 0.9, \beta_2 = 0.98 and \epsilon = 10^{−9}$;
  3. 使用残差Dropout,即任意子层(前向全连接和自注意力)的输出应用Dropout。Embedding层和位置编码相加之后也应用Dropout;
  4. 使用注意力Dropout,即使用Softmax计算完权重后,应用Dropout,然后再乘以值向量。

为什么使用自注意力

对比RNN和CNN可从3个指标进行考虑:每层的总计算量,并行计算量(最小串行操作数),输入输出序列任意位置的最大路径长度。前面两个指标好理解,第三个指标可以理解为输入和输出的连结复杂度。输入输出序列任意两个位置连结起来越短,越容易捕捉到长距离依赖关系。自注意力层任意位置是直接相连的,所以最大路径长度为$O(1)$。3个指标的对比如下图所示。
不同网络结构的3个指标比较

其中n为输入或输出长度,d为隐层向量维度。可以看出,相比于RNN,自注意力结构的每层总计算量更小,因为n通常比d小。另外,自注意力结构的串行操作数和最路径长度更小。相比于CNN,CNN的每层总计算量比RNN更大,多了卷积核大小的倍数。最大路径长度仍然比自注意力结构更大,意味着捕获长距离依赖关系能力更差。

总的来说,自注意力结构计算量更小,并行度好,且捕捉长距离依赖关系能力更强。还有一个好处是,模型解释能力更好,利用自注意力权重,方便可视化输入和输出的依赖关系的强度。

参考资料:

  1. Attention Is All You Need