本篇文章内容基于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计算复杂度

1. 早期Seq2Seq的缺点

在介绍注意力机制之前,我们首先回顾一下Seq2Seq模型并思考一下它有哪些缺点。

NLP系列笔记-注意力(Attention)机制_机器学习

可以看到Decoder做预测非常依赖于Encoder传入,所以encoder对句子的编码能力是至关重要的。

不过有实验结果表明,当句子长度很长之后,Encoder的编码能力会明显下降,导致最终的模型性能变差,如下图示。可以看到未加入attention机制时,当句子长度超过20个单词且不断增加的时候,模型性能指标BLEU也会不断下降,这是因为句子过长,Encoder最后的输出状态会忘记前面的句子内容,而加入了attention后,效果得到明显改善。

NLP系列笔记-注意力(Attention)机制_机器学习_02
2. Seq2Seq Model with Attention

2.1 注意力机制

Attention机制最早是在[1]中提出的。通过该算法Seq2Seq不会忘记原始输入句子信息,而且Decoder也能够知道句子中哪些词比较重要。只不过,attention机制也会引入额外很多计算,下面进行详细介绍。

之前的Seq2Seq输出的其实就是,而前面所有的隐状态信息都被丢掉了,所以attention做的事情就是把前面信息都利用起来。

NLP系列笔记-注意力(Attention)机制_机器学习_03

具体来说就是将和前面的做运算得到对应的权重,计算符号表示为

2.2 注意力计算

注意力计算可以有不同的实现方法,比如论文[1]中的方法如下:

NLP系列笔记-注意力(Attention)机制_机器学习_04

上图中的计算方法简单理解就是矩阵乘法操作。

  • 1.我们先看上图最右边,首先将和拼接成一个向量
  • 2.然后对拼接得到的向量左乘一个矩阵,该矩阵是一个可学习的参数矩阵。另外可以看到矩阵也有不同颜色的矩阵组成,其实也可以理解成是由两个不同的参数矩阵拼凑而成的,左右分别是和的参数矩阵
  • 3.和的相乘结构取tanh后,会再左乘一个向量,这样就得到了。
  • 4.计算出所有后会再使用softmax做处理。

写到这我突然发现,上述过程其实和卷积网络中的Separable Depthwise Convolution操作很像,比如上面的第二步的其实就可以理解成两个不同的通道,的作用就是对每一层做特征提取。第二步完了之后,我们只是得到了每一层通道的特征而已,但是通道之间的关系还没有得到,所以还需要通过一个向量来将通道之间的信息关联起来,这和卷积网络中的1*1的卷积作用非常类似。

另一种更常用的计算注意力的方式是类似于Transformer的那种方式,如下图示,可以看到计算思路比较类似,主要三个步骤:

  1. 线性映射
      • 对每个都有一个对应的参数可学习的矩阵,计算得到个矩阵
      • 对也会做线性计算得到
  1. 的特征计算后,再用内积计算就求得了注意力权重
  2. 使用softmax对前面计算得到的α归一化处理
NLP系列笔记-注意力(Attention)机制_机器学习_05

2.3 注意力应用

下图给出了Attention整体的计算方法

NLP系列笔记-注意力(Attention)机制_机器学习_06

可以看到在使用Attention之前,Decoder的第一个输出为

NLP系列笔记-注意力(Attention)机制_机器学习_07

计算出各个隐状态对应的权重后,会进一步计算出,即

NLP系列笔记-注意力(Attention)机制_机器学习_08

之后Decoder的会将也考虑进去,此时的计算公式为:

NLP系列笔记-注意力(Attention)机制_机器学习_09

计算出第一个预测值后,之后的预测值怎么计算呢?如下图示,其实和第一个预测值的计算方法是类似的,差别就在于输入数据状态变成了和。这个的计算和是类似的,差别就在于的基于和计算得到的,而是基于和计算得到的。

NLP系列笔记-注意力(Attention)机制_机器学习_10

2.4 Attention计算复杂度

下图给出了基于Attention的Seq2Seq完整流程图,可以看到Decoder每个输出都会对应一个,它记录着上一个输出和Encoder中所有隐状态之间的关系。为了计算,我们每次都需要计算得到个权重,即。因为Decoder总共有个状态,所以总共需要额外计算个权重。

NLP系列笔记-注意力(Attention)机制_机器学习_11

参考文献
  • [1] Bahdanau D, Cho K, Bengio Y. Neural machine translation by jointly learning to align and translate[J]. arXiv preprint arXiv:1409.0473, 2014.


NLP系列笔记-注意力(Attention)机制_机器学习_12