查看原文
其他

【源头活水】Attention Is All You Need (Transformer模型)

“问渠那得清如许,为有源头活水来”,通过前沿领域知识的学习,从其他研究领域得到启发,对研究问题的本质有更清晰的认识和理解,是自我提高的不竭源泉。为此,我们特别精选论文阅读笔记,开辟“源头活水”专栏,帮助你广泛而深入的阅读科研文献,敬请关注。

作者:知乎—liadrinz

地址:https://www.zhihu.com/people/liadrinz

论文地址:https://arxiv.org/abs/1706.03762

01

前序知识
  • CNN, RNN, LSTM
  • Sequence-to-sequence (seq2seq), Encoder-decoder
  • 注意力机制

02

简介
主流的seq2seq模型通常包含一个encoder和一个decoder,它们可能是递归神经网络(RNN)或者是卷积神经网络(CNN)。通过引入注意力机制(Attention Mechanism),将encoder和decoder的各个位置建立连接(通常是全连接)可以提高seq2seq模型的性能。而本文提出了一种更简单的seq2seq模型,它仅仅基于注意力机制,不再用RNN或CNN来提取序列的上下文特征。

注意力机制

seq2seq任务一般是将一个源序列(source sequence)转换为一个目标序列(target sequence)。序列中每个时刻可能是一个词向量,也可能是一个句子向量,也有可能是其他的特征,这里统称为token. 注意力机制给与了seq2seq模型一种能力,就是对源序列中的每个token和目标序列中的每个token之间的依赖关系进行建模,不管它们之间相隔多远。这样一来,上下文特征的提取不会因为RNN记忆力的衰减或CNN kernel size的限制而被局限在一定范围内。

自注意力 (Self-attention)

注意力机制可以建立一个序列与自身的依赖关系,即一个时刻出现的token与其他时刻的token之间的依赖关系,即可以理解为  对  的出现分别有多大的贡献,其中  是序列的最大长度,  因此,一个序列  出现的log似然可以表示为
本文中使用self-attention取代原来LSTM提取源序列和目标序列上下文特征的工作。可以看出,这个log似然与双向LSTM类似,每个token都依赖于包括自身的所有token. 因此不难理解,这种取代是有一定依据的。


03

Transformer模型结构
与传统的seq2seq模型一样,Transformer模型的结构分为encoder和decoder两部分

Encoder

  • Input Embedding: 将原始的输入转换为语义向量
  • Positional Encoding: 位置编码。由于不存在递归机制,作者在每个语义向量中还加入了位置信息,以让模型能知道token的绝对和相对位置
  • Multi-Head Attention: 注意力模块。这里计算的是源序列的自注意力。Multi-Head是一种emsemble的方法,在后文有介绍。模块有三个输入和一个输出,输入和输出的具体意义在后文介绍。
  • Add&Norm: 残差模块。看到直接越过注意力模块指向该模块的箭头,直觉上就能想到这是残差机制,防止反向传播时的梯度消失。
  • Feed Forward: (普通)前馈网络。这里使用的是稀疏连接的前馈网络,每个token(语义向量)都单独连接了一个全连接的神经网络,但token与token之间没有连接。

Decoder

Decoder中自注意力模块与encoder相似,但是decoder的多了一个mask. 一般的mask的作用是将注意力机制中的某些依赖关系直接切断,即将这些注意力置为0. 这里使用的mask是将所有来自后文的依赖去除。这样一来,本来  都会对  的出现产生影响,现在只有  会对  产生影响,那么序列  出现的log似然就变成了
不难看出,加上mask后的self-attention的log似然与单向LSTM类似。这样做是因为虽然decoder在训练阶段有完整的目标序列作为输入数据,但是在测试阶段只能依据上文来对下文进行预测,因此如果在训练时引入对下文的依赖,不仅是没有意义的,也会影响模型的正确性。
注意到decoder中在自注意力模块之后还有一个注意力模块,它不是自注意力模块,而是encoder和decoder之间的注意力,也就是传统意义上的注意力。可以看到它的三个输入有两个是来自encoder的。


04

Transformer中的注意力

点积注意力

点积注意力的计算需要三个输入,分别是  ,分别代表Query, Key和Value. 下面通过介绍  以及点积注意力的具体计算方法来对其含义进行理解。
首先,  其实都是输入  的线性变换。由矩阵乘法的性质可知,经过线性变换后, 矩阵  的行数仍然等于  的行数,列数取决于  的列数。在self-attention中,  的形状均为.
上图中将  和  输入MatMul模块的输出是  ,易知其形状为  ,即输入序列的长度。需要注意的是,这里虽然在矩阵层面上做的是外积(叉积),但对于序列中每个时刻的语义向量(token)而言做的是内积(点积),最终输出矩阵中的第  行第  列是第  时刻的token与第 时刻的token这两个向量的点积,也代表第 时刻的token对第  时刻token的出现有多大影响,即注意力, 可以更形象地表述为下面的矩阵
其中,  表示  对  的注意力,  即第  时刻的语义向量。
 经过scaled, mask和softmax后与  相乘,为了便于表示,这里先直接解释  的意义
该过程使用注意力对输入中的语义向量进行加权,输出矩阵中的每一行是  的加权平均,权重则来自注意力矩阵中的每一行。这个输出矩阵便是经过注意力机制处理之后的序列,每一行代表每个时刻出现的语义向量。
注意到, 来自  和  对  的线性变换,  来自  对  的线性变换,因此最终输出可以表示为  ,Transformer学习的过程将会对这个函数进行极大似然估计。文中默认读者理解了点积注意力机制,使用  表示最终结果,即  ,其中  是scale操作,这里省略了mask操作。

Multi-Head注意力

Multi-Head可以理解为是一种ensemble机制。普通的ensemble简单地将多个同构网络的训练结果取平均,而Multi-Head机制则是对这些结果取加权平均,并且这个权重也是由神经网络学得的。
设有以下同构的注意力模块学得的结果
普通的ensemble会得到
Multi-Head则会得到
其中  是待学习的参数,负责对  进行加权。

Mask机制

 与  形状相同, 矩阵  在不需要注意力的位置为  ,在需要注意力的位置为 0,即  表示切断  和  之间的注意力依赖。经过softmax之后被置为  的位置会变为0.

Encoder-Decoder注意力

现在来看decoder中的第二个注意力模块,图1中显示,它有两个输入来自encoder,一个输入来自decoder. 文中指出,  来自encoder,  来自decoder,因此  表示encoder和decoder之间的注意力矩阵,然后使用该注意力对  中的token,即输入的token进行加权,得到输出的token. 这样一来,输出token就被表示成了输入token的加权平均,权重是注意力。


05

Transformer算法复杂度分析
假设输入序列的长度为  ,词汇表的大小(语义向量的长度)为  ,下面比较RNN, CNN, Transformer模型的复杂度[1]。

结构复杂度

  • 在有注意力机制的RNN中,RNN对结构复杂度的贡献为  . RNN像普通全连接网络一样,有一个  的全连接,共  条边,产生了  的复杂度,而这一连接需要被递归执行  次,因此复杂度为  . 注意力机制的贡献为  . 注意力机制是一个  的全连接,源和目标语义向量之间没有  的全连接,而是单纯地重复  次。由于通常情况下  ,因此取RNN的结构复杂度为  .
  • 在有注意力机制的CNN中,假设kernel的行数为  (列数固定为  ),则每个kernel有  个参数,并且由于kernel会沿着序列的时间方向进行移动,该方向的长度为  ,因此总的复杂度为 
  • 在Transformer中,只需要考虑注意力机制模块的复杂度。第一步  可以看作形状为  的矩阵与形状为  的矩阵相乘,复杂度为  ,第二步  可以看作  乘  ,复杂度仍为  . 在  的实际情况下,Transformer的复杂度低于RNN

串行复杂度

  • RNN在时间维度上不可并行化,每一时刻的运算需要等上一时刻计算完毕,因此串行复杂度为 
  • CNN和Transformer都可以在时间维度上并行化,因此相对的串行复杂度为 

传播路径复杂度

  • RNN
RNN中最长的传播路径是源序列的第一个token和目标序列的最后一个token,这条路径需要经过整个RNN的递归链才能进行反向传播,因此其复杂度为 
  • CNN
下图可以大致表示CNN的seq2seq模型的结构,凭直觉可以看出它是一种  叉树,其传播路径的长度取决于树的深度,而树的深度为  .
  • Transformer[1]
(PS: 本人第一次在知乎发论文阅读笔记,如有错误和问题请指出,虚心接受批评)

参考

1. abTransformer/CNN/RNN的对比(时间复杂度,序列操作数,最大路径长度) https://zhuanlan.zhihu.com/p/264749298

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“源头活水”历史文章


更多源头活水专栏文章,

请点击文章底部“阅读原文”查看



分享、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存