Attention-Is-All-You-Need论文笔记
原文链接: http://chenhao.space/post/2a42add6.html
Transformer
以机器翻译为例:
其中 Add & Norm 层的意思是:将input到Multi-Head Attention中的,与Multi-Head Attention output的进行Add操作,得到,再将进行Layer Normalization。
Encoder:
Encoder总共包含这样的相同的结构。该结构包含两个子层,分别为一个称为“Multi-Head Attention”的子层,和一个全连接的神经网络。这两个子层都采用了残差连接的方式,在加上了残差之后还做了一个归一化,公式表示为:其中代表每个特定的子层,为了保证残差的计算能够正常进行,每个子层的输出维度都规定为。
Decoder:
Decoder总共包含这样的相同的结构。该结构包含三个子层,分别为一个称为“Multi-Head Attention”的子层用于连接Encoder的输出,一个称为“Masked Multi-Head Attention”的子层,该层在“Multi-Head Attention”的基础上进行了调整(为使位置 处的预测仅依赖于 之前的输出, 在 Multi-Head Attention 内使用了mask),最后一个子层是一个全连接的神经网络。与Encoder相同,我们每一个子层都应用了残差连接并且进行了归一化。
Attention
引出Self-Attention
基于RNN模型的Sequence架构的缺点:Hard to parallel,很难进行并行计算。
于是有人提出用CNN替换RNN的想法。
上图这个模型中的CNN只能考虑非常有限的内容(只考虑了三个vector),但是CNN也可以考虑到更长的信息,通过叠加CNN:
CNN可以进行并行计算,但是它有个缺点就是需要叠加很多层才能看到长距离的信息。并⾏计算任意两个 位置相关性的操作随着距离的增加⽽增加,使得远距离位置之间的依赖学习变得更加困难。
所以提出了Self-Attention机制。
其中用 Self-Attention Layer 取代了 RNN Layer。
is obtained based on the whole input sequence.
can be parallelly computed.
Self-Attention的计算过程
关于 Q、K、V最直观简单的解释可以看这里: 对于Attention机制中Q,K,V的一些理解
: query (to match others)
: key (to be matched)
: information to be extracted
接下来,拿每个 query 去对每个 key 做 attention。
是输入的词序列, 是 word embedding。
先将 对 做 attention,得到 ,将 对 做 attention,得到 ,将 对 做 attention,得到 ,将 对 做 attention,得到 。
然后将 经过一个Softmax层进行归一化,得到(它们都是一个数值)。
然后再将 与 分别相乘,再求和,得到一个vector
我们注意到,产生的 是考虑吧到了整个句子的信息。
类似的,我们可以并行计算得到
Self-attention的并行化
Multi-head self-attention
- 所谓“多头”(Multi-Head),就是指多做几次同样的事情(参数不共享),然后把结果拼接
- 好处是可以允许模型在不同的表示子空间里学习到相关的信息
- 类似于CNN中多个卷积核的思想
2 heads as example
还可以将 进行concate,如果concate完之后这个dimension你不喜欢的话,可以乘一个参数矩阵进行降维,得到(也就是Multi-head self-attention最终的输出)。
细节补充
Residual connection
假设网络中某个层对输入作用后的输出,那么增加residual connection之后,就变成了:
这里的+x
操作就是一个shortcut。
那么残差结构有什么好处?因为增加了一项,那么该层网络对求偏导的时候,多了一个常数项1,所以在反向传播过程中,梯度连乘,也不会造成梯度消失的问题。
LayerNorm
为什么要进行Normalization?learning rate 是不变的,但是在梯度大的时候我们希望lr更小,梯度小的时候lr大一些,所以通过数据归一化,使得梯度更加圆滑,可以使lr固定为一个值。
假设我们的输入是一个minibatch的数据,我们再假设每一个数据都是一个向量,则输入是一个矩阵,每一列是一个训练数据,每一行都是一个特征。BatchNorm是对每个特征进行Normalization,而LayerNorm是对每个样本的不同特征进行Normalization,因此LayerNorm的输入可以是一列(一个样本)。
Batch Normalization在CNN等地方用得很多。因为LayerNorm的每个样本都是独立计算的,因此minibatch可以很小甚至可以是1。LayerNorm多用于RNN的结构。
Mask
Transformer中涉及了两种mask,一种是padding mask,一种是sequence masking(也就是Masked Multi-Head Attention 中的mask)。后者是我们要重点讨论的。
Padding mask
因为在每个batch中的输入序列长度不一样,所以要闷要对输入序列进行对齐,具体来说,就是给较短的序列后面填充0
。因为这些填充的位置,其实是没什么意义的,所以我们的attention机制不应该把注意力放在这些位置上,所以我们需要进行一些处理。
具体的做法是,把这些位置的值加上一个非常大的负数(可以是负无穷),这样的话,经过softmax,这些位置的概率就会接近0。
Sequence mask
Masked Multi-Head Attention层中的Masked是什么作用?
Sequence mask是为了使得decoder不能看见未来的信息。也就是对于一个序列,在time_step为t的时刻,我们的解码输出应该只能依赖于t时刻之前的输出,而不能依赖t之后的输出。因此我们需要想一个办法,把t之后的信息给隐藏起来。
具体的做法:
Masked Multi-Head Attention是Self-Attention,因此,我们假设句子是这样的(其中都是词向量,并假设两个句子的长度都是4 )
接下来进行计算
mask矩阵作用于上,可以得到
这里省略掉除以,进行softmax可以得到
然后和相乘
那么使用 来预测第二个词的概率分布的时候,已经没有了第三个词、第四个词的信息,这就是让训练在生成当前词的时候不会注意到之后的词的原因。
Positional Encoding
截止目前为止,我们介绍的Transformer模型并没有捕捉顺序序列的能力,也就是说无论句子的结构怎么打乱,Transformer都会得到类似的结果。换句话说,Transformer只是一个功能更强大的词袋模型而已。为了解决这个问题,论文中在编码词向量时引入了位置编码(Position Embedding)的特征。具体地说,位置编码会在词向量中加入了单词的位置信息,这样Transformer就能区分不同位置的单词了。
- No position information in self-attention. 句子中的顺序信息没有被考虑到。
- Original paper : each position has a unique positional vector (not learned from data)
其实也可以理解成下面这种计算形式:
- In other words : each appends a one-hot vector
论文中给出的编码公式是:
其中**代表的是第几个词,表示偶数位置,使用正弦编码;表示奇数位置,使用余弦编码**。
这个编码公式的意思就是:给定词语的位置,我们可以把它编码成维的向量。
上面公式计算的是绝对位置,同时它也能体现出词之间的相对位置,主要数学依据是以下公式:
两个位置 和 的位置编码是固定间距k的线性变化:
Scaled Dot-Product Attention
Scaled Dot-Product Attention:
其中 和 做的操作是 dot product (点乘), 是 和 的 dimension。
为什么除以
Q={},K={},其中和都是标准正态分布的,所以 服从均值为0,方差为的正态分布。下面给出证明:
当越大,维度越大,方差也越大,也就意味着的分布离散,我们除以相当于把它标准化了,不然的话经过softmax,反向传播时会出现梯度消失的情况。
Why Self-Attention
- 时间复杂度较小
- 可以很好并行计算
- 可以捕获长距离依赖关系,一步到位捕捉全局关系
Attention Visualization
在上图中,每个word两两之间都进行了attention,所以也可以看作一个matrix。线条颜色越深代表attention的weight越大。
Isolated attentions from just the word ‘its’ for attention heads 5 and 6
很好的解决指代消歧问题。
在上图的两个句子中,it分别指代的对象不同,第一个句子的it指代的是animal,第二个句子指代的是street。
Multi-head Attention 中不同head的效果展示:
在上图中,红线图的query和key要找的明显是local部分的信息,每一个word都要attend到它之前的几个word。而在绿线图中,每个word要attend到很长时间点之后的word。
注:每个Head的参数不共享,所以它们attention到的效果也不一样。
总结
优点:
(1)虽然Transformer最终也没有逃脱传统学习的套路,Transformer也只是一个全连接(或者是一维卷积)加Attention的结合体。但是其设计已经足够有创新,因为其抛弃了在NLP中最根本的RNN或者CNN并且取得了非常不错的效果,算法的设计非常精彩,值得每个深度学习的相关人员仔细研究和品位。
(2)Transformer的设计最大的带来性能提升的关键是将任意两个单词的距离是1,这对解决NLP中棘手的长期依赖问题是非常有效的。
(3)Transformer不仅仅可以应用在NLP的机器翻译领域,甚至可以不局限于NLP领域,是非常有科研潜力的一个方向。
(4)算法的并行性非常好,符合目前的硬件(主要指GPU)环境。
缺点:
(1)粗暴的抛弃RNN和CNN虽然非常炫技,但是它也使模型丧失了捕捉局部特征的能力,RNN + CNN + Transformer的结合可能会带来更好的效果。
(2)Transformer失去的位置信息其实在NLP中非常重要,而论文中在特征向量中加入Position Encoding也只是一个权宜之计,并没有改变Transformer结构上的固有缺陷。
参考资料
- Attention Is All You Need
- Transformer 模型的 PyTorch 实现
- 李宏毅Transformer视频
- The Annotated Transformer
- 详解Transformer
- Transformer图解
- 归一化
- Transformer的矩阵维度分析和Mask详解
- 对于Attention机制中Q,K,V的一些理解
致谢
感谢赵公子这一周陪我研究讨论Transformer内部的一些细节。