“
本篇文章内容基于Shusen Wang老师的《RNN模型与NLP应用》系列课程。
课程视频链接:https://www.youtube.com/playlist?list=PLvOO0btloRnuTUGN4XqO85eKPeFSZsEqK
课件:https://github.com/wangshusen/DeepLearning
”
目录
-
1. 早期Seq2Seq缺点
-
2. 注意力机制
-
2.1 注意力机制
-
2.2 注意力计算
-
2.3 注意力应用
-
2.4 Attention计算复杂度
-
在介绍注意力机制之前,我们首先回顾一下Seq2Seq模型并思考一下它有哪些缺点。
可以看到Decoder做预测非常依赖于Encoder传入,所以encoder对句子的编码能力是至关重要的。
不过有实验结果表明,当句子长度很长之后,Encoder的编码能力会明显下降,导致最终的模型性能变差,如下图示。可以看到未加入attention机制时,当句子长度超过20个单词且不断增加的时候,模型性能指标BLEU也会不断下降,这是因为句子过长,Encoder最后的输出状态会忘记前面的句子内容,而加入了attention后,效果得到明显改善。
2.1 注意力机制
Attention机制最早是在[1]中提出的。通过该算法Seq2Seq不会忘记原始输入句子信息,而且Decoder也能够知道句子中哪些词比较重要。只不过,attention机制也会引入额外很多计算,下面进行详细介绍。
之前的Seq2Seq输出的其实就是,而前面所有的隐状态信息都被丢掉了,所以attention做的事情就是把前面信息都利用起来。
具体来说就是将和前面的做运算得到对应的权重,计算符号表示为
2.2 注意力计算
注意力计算可以有不同的实现方法,比如论文[1]中的方法如下:
上图中的计算方法简单理解就是矩阵乘法操作。
- 1.我们先看上图最右边,首先将和拼接成一个向量
- 2.然后对拼接得到的向量左乘一个矩阵,该矩阵是一个可学习的参数矩阵。另外可以看到矩阵也有不同颜色的矩阵组成,其实也可以理解成是由两个不同的参数矩阵拼凑而成的,左右分别是和的参数矩阵
- 3.和的相乘结构取tanh后,会再左乘一个向量,这样就得到了。
- 4.计算出所有后会再使用softmax做处理。
写到这我突然发现,上述过程其实和卷积网络中的Separable Depthwise Convolution操作很像,比如上面的第二步的其实就可以理解成两个不同的通道,的作用就是对每一层做特征提取。第二步完了之后,我们只是得到了每一层通道的特征而已,但是通道之间的关系还没有得到,所以还需要通过一个向量来将通道之间的信息关联起来,这和卷积网络中的1*1的卷积作用非常类似。
另一种更常用的计算注意力的方式是类似于Transformer的那种方式,如下图示,可以看到计算思路比较类似,主要三个步骤:
- 线性映射
- 对每个都有一个对应的参数可学习的矩阵,计算得到个矩阵
- 对也会做线性计算得到
- 的特征计算后,再用内积计算就求得了注意力权重
- 使用softmax对前面计算得到的α归一化处理
2.3 注意力应用
下图给出了Attention整体的计算方法
可以看到在使用Attention之前,Decoder的第一个输出为
计算出各个隐状态对应的权重后,会进一步计算出,即
之后Decoder的会将也考虑进去,此时的计算公式为:
计算出第一个预测值后,之后的预测值怎么计算呢?如下图示,其实和第一个预测值的计算方法是类似的,差别就在于输入数据状态变成了和。这个的计算和是类似的,差别就在于的基于和计算得到的,而是基于和计算得到的。
2.4 Attention计算复杂度
下图给出了基于Attention的Seq2Seq完整流程图,可以看到Decoder每个输出都会对应一个,它记录着上一个输出和Encoder中所有隐状态之间的关系。为了计算,我们每次都需要计算得到个权重,即。因为Decoder总共有个状态,所以总共需要额外计算个权重。
- [1] Bahdanau D, Cho K, Bengio Y. Neural machine translation by jointly learning to align and translate[J]. arXiv preprint arXiv:1409.0473, 2014.