0%

论文阅读-language-model-Attention Is All You Need

动机

  • 在序列建模与转换任务中,主流的模型是基于复杂的RNN的递归模型,其通常沿输入和输出序列的符号位置进行因子计算(即生成一系列隐藏状态 h_t ,t位置的 h_t 由前向状态 h_{t-1} 和当前输入生成),这种内部的固有顺序阻碍了训练样本的并行化(在序列较长时,由于内存限制会限制样本间的批处理)。
  • 注意力机制允许对依赖关系建模,而不考虑它们在输入或输出序列中的距离,但目前注意力机制通常与递归网络相结合使用。

贡献

  • 提出了一种新的简单的网络架构Transformer,完全避免循环和卷积网络,只基于Attention机制来建模输入和输出之间的全局依赖关系。
  • 在两个翻译任务上,模型质量更好、且具有更高的并行性,且训练所需要的时间更少。

模型结构

如上图所示,使用encoder-decoder架构,其中encoder将符号表示的输入序列 (x_1,…,x_n) 映射成一个连续表示序列 z=(z_1,…,z_n) ;给定 z decoder以一次生成一个字符的方式生成输出序列 (y_1,…,y_m) 。模型的每一步都是自回归,即在生成下一个字符时,将先前生成的符号作为输入。

Encoder:由 N=6 个相同的网络层堆叠而成,每个网络层包含两个子层。第一层是multi-head self-attention mechanism,第二层是positionwise fc feed-forward network,并在每层后使用residual connectionlayer normalization。因此,每个子层的输出为:

\text{LayerNorm}(x + \text{Sublayer}(x))

其中, \text{Sublayer}(x)) 是每个子层自身的输出值,文中设置所有子层及embedding层的输出维度为 d_{model}=512

Decoder:由 N=6 个相同的网络层堆叠而成,每个网络层包含三个子层。中间子层对编码器堆栈的输出执行multi-head attention,并且在每个子层后同样使用residual connectionlayer normalization。其中第一个子层增加mask操作,以防止在当前位置信息中添加进后续位置的信息,这个mask与偏移一个位置的输出embedding相结合,确保位置 i 的预测只依赖小于 i 的已知输出。

Attention Mechanism

attention mechanism可以描述为将一个query和一组key-value对映射到一个输出,其中querykeyvalue和输出均为向量,输出为value的加权和,其中每个value的权重由querykey计算。

  • Scaled Dot-Product Attention

    由图可知,其输出矩阵为:

    Attention(Q,K,V) = softmax(\frac{QK^t}{\sqrt{d_k}})V

    其中, Q\in\mathbb{R}^{n\times d_k}, K\in\mathbb{R}^{m\times d_k},V\in\mathbb{R}^{m\times d_v} ,使用 d_k 缩放是为了使得梯度更稳定。

  • Multi-head Attention

    相比于使用 d_{model} 维度的querykeyvalue执行单次attentionmulti-head attention是通过 h 个不同的线性变换对querykeyvalue并行映射,得到 h d_v 维的输出值,再拼接起来进行映射得到最终值。作者认为Multi-head能把不同位置子序列的表示都整合到一个信息中,而如果只有一个attention head,其平均值会削弱信息。其公式如下:

    MultiHead(Q,K,V) = Concat(head_1,...,head_h)W^o, \\ head_i = Attention(QW_i^Q,KW_i^K,VW_i^V)

    其中, W_i^Q\in\mathbb{R}^{d_{model}\times d_k}, W_i^K\in\mathbb{R}^{d_{model}\times d_k},W_i^V\in\mathbb{R}^{d_{model}\times d_v},W^O\in \mathbb{R}^{hd_v\times d_{model}} ,本文设置 h=4 , d_k=d_v=d_{model}/h=64​ ,总的计算成本与具有全部维度的单个head attention相似。

文中所用的attention有三部分:

  • encoder中的self-attention:所有的query = key = value均来自前一个网络层的输出,即每个位置都能关注到上一层的所有位置,其目的是学习句子内部的词依赖关系,捕获句子的内部结构。
  • decoder中的masked self-attention:允许每个位置都关注当前位置及之前的所有位置,即采用mask消除右侧单词对当前单词的影响,目的是为了保持decoder的自回归特性,防止信息向左流动,在softmax步骤前将后面位置设置为 -inf (即通过一个 0-1 矩阵来表示mask,其中上三角为0。)
  • decoder中的encoder-decoder attention:其中,query来自前面的decoder层,keyvalue来自encoder的输出,使得每个位置都能关注到输入序列中的所有位置。

Position-wise Feed-Forward Networks

该网络层在所有位置上共享参数,其由两个全连接层构成,中间为ReLU激活函数,也可以理解为两个核为 1 的卷积层。其输出为:

FFN(x) = max(0,\ \ xW_1 + b_1)W_2 + b_2

其中,输入和输出的维度为 d_{model}=512 ,隐藏层维度为 d_{ff}=2048

Embedding and Softmax

Embedding:使用学习到的嵌入词向量将输入字符和输出字符转换为维度 d_{model} 的向量。(由于输入序列长短不一,故使用padding mask进行补齐,对于短序列,在后面补-inf,对于长序列,则直接截断左侧。)

Softmax:将decoder的输出转换为预测的下一个词符的概率。

文中在两个embedding层和pre-softmax线性变化之间进行权重共享(三个权重的尺寸均为 \text{vocab_size}\times \text{embedding_dim} ,其中emebdding层将输入token转换为 维的词向量。在解码时经过softmax得到词的概率。)

Positional Encoding

作者使用位置编码,将编码后的数据与embedding数据相加。目的是加入相对位置信息,使得模型可利用序列的顺序信息。作者比较了两种方法:1)预训练位置embedding;2)使用不同频率的正弦和余弦函数。最后发现两者性能相似,但正弦函数可以允许模型拓展到未知的更长的序列。其公式如下:

PE(pos,2i) = sin(pos/10000^{2i/d_{model}})\\ PE(pos,2i+1) = cos(pos/10000^{2i/d_{model}})

其中, pos 是位置(tokensequence中的位置), i 是维度( i\in \{0,…,d_{model}/2\} ),即位置编码的每个维度对应一个正弦曲线。目的:1)每个位置有唯一的编码;2)由于三角函数的性质,这表明位置 p+k 的向量可以表示为位置 p 的向量的线性变换,这提供了表达相对位置信息的可能性。

self-attention的优点

上图是self-attentionrnncnn的比较,即将一个可变长度的序列 (x_1,…,x_n) 映射到一个等长序列 (z_1,…,z_n) ,其中 x_i,z_i\in \mathbb{R}^d

  • 每层的总计算复杂度
  • 可并行化的计算量:以所需的最小序列操作数衡量,如self-attention可以计算点积,而rnn必须按顺序计算
  • 网络中的长距离依赖的路径长度:指一个长度为 n 的序列要经过的最大路径长度,如cnn需要增加卷积层来扩大感受野,rnn需要按顺序进行计算,而self-attention可以一步矩阵计算(而当序列长度 n 远大于序列维度 d 时,可仅计算以输出位置为中心,半径为 r 的邻域内,以减少计算量,此时最大路径长度为 O(n/r) )。

且作者发现,self-attention可以产生更多可解释的模型,attention结果的分布表明每个attention head不仅可以学习到执行不同的任务,还表现出和句子句法与语义结构相关的行为。

训练过程

数据集:WMT 2014 English-German datasetWMT 2014 English-French dataset

优化器: Adam(\beta_1=0.9,\beta_2=0.98,\epsilon=1e-9)

学习率衰减:在warmup_steps前线性增加学习速率,随后按照与steps的平方根成比例地减小,作者设定 \text{warmup_steps}=4000​

lrate = d_{model}^{−0.5}\cdot \text{min}(\text{step_num}^{−0.5},\text{step_num}·\text{warmup_steps}^{−1.5})

正则化:

  • Residual Dropout:在add & LN之前,对每个子层的输出执行dropout操作;此外在encoderdecoder堆栈中,对embeddingpositional encoding之和进行dropout。对于base模型,设定 P_{drop}=0.1
  • Label Smoothing:在训练时采用 \epsilon_{ls}=0.1 的标签平滑,这会给模型带来不确定性,但会提高accuracyBLEU分数。

部分实验结果

机器翻译任务:

模型不同组件的作用:

英文选区分析: