一、Attention 原理
在Encoder-Decoder结构中,Encoder把所有的输入序列都编码成一个统一的语义特征c再解码,因此, c中必须包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈。如机器翻译问题,当要翻译的句子较长时,一个c可能存不下那么多信息,就会造成翻译精度的下降。
相比于原始的Seq2Seq模型的Decoder中只通过同一个向量c去计算隐状态,Attention在Decoder部分的每个时间输入不同的c来解决这个问题,这就是它最核心的创新。下图是带有Attention机制的Decoder:
看一下最开始的Attention模型架构如下:
- 输入:序列是待翻译的句子。
- Encoder:双向的RNN或LSTM,计算得到每个位置的隐状态,下面用表示。
- Decoder:对当前输出位置 t,使用Decoder中上一个隐状态 与Encoder的结果(也就是向量 )计算t位置的对应的。
- 输出:序列是翻译之后的句子。
来详细看一下每一个位置的输出 是怎么计算得到的:
(1)先来看看当前t位置的上下文向量 是怎么计算得到的,其实是由Encoder部分所有的隐状态和对应的权重加权求和得到的:
这里这个权重 是用来衡量Encoder中位置m的 对Decoder中当前t位置的状态的影响,也就是 和 的相关性。那么这些权重是怎么得到的呢?事实上, 和Decoder的第 t-1 阶段的隐状态 (也有一些模型中直接使用当前状态:下面的Global Attention)、Encoder第m个阶段的隐状态 有关。可以表示为:
其实这个 就是我们上面提到的 和 的相关性(对齐程度),而后面的则对进行softmax将其normalization得到attention权重分布,概率值的和为1。
对齐模型 的计算方式(也就是上面那个函数)有很多种,不同的计算方式,代表不同的Attention模型,最简单且最常用的的对齐模型是dot product乘积矩阵,即把target端的输出隐状态与source端的输出隐状态进行矩阵乘。常见的对齐计算方式如下:
- 点乘形式:
- 加权点乘:
- concat映射:
(3)然后,使用上一个隐状态、上一个输出、当前位置的上下文向量更新当前隐状态:
(4)根据当前隐状态、上一个输出、当前位置的上下文向量计算当前输出:
通过为每个输出位置计算一个context vector,使得每个位置的输出可以关注到输入中最相关的部分,也就是所说的“注意力”,因此效果比传统模型更好。
二、Attention 分类
2.1 Soft Attention 和 Hard Attention
Kelvin Xu等人2015年发表的论文《Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》中,同时引入了Soft Attention和Hard Attention。我们之前所描述的传统的Attention Mechanism就是Soft Attention。
Soft Attention计算得到的对齐向量是一个概率分布,总和为1。Soft Attention是参数化的(Parameterization),因此可导,可以被嵌入到模型中去,直接训练。梯度可以经过Attention Mechanism模块,反向传播到模型其他部分。原始的Attention就是Soft Attention。
相反,Hard Attention是一个随机的过程。Hard Attention不会选择整个encoder的输出做为其输入,Hard Attention会依概率Si来采样输入端的隐状态一部分来进行计算,而不是整个encoder的隐状态。为了实现梯度的反向传播,需要采用蒙特卡洛采样的方法来估计模块的梯度。Hard Attention对每个位置计算对齐概率,但只将最高的一个置为1,其余置为0。
两种Attention Mechanism都有各自的优势,但目前更多的研究和应用还是更倾向于使用Soft Attention,因为其可以直接求导,进行梯度反向传播。
2.2 Global Attention 和 Local Attention
Global Attention:和原始的Attention模型一样。所有的hidden state都被用于计算Context vector 的权重,即变长的对齐向量 ,其长度等于encoder端输入句子的长度。但是原始的Attention模型中的对齐向量和Decoder的第 t-1 阶段的隐状态 、Encoder第m个阶段的隐状态 有关,而Global Attention的对齐向量和Decoder的当前t位置状态、Encoder第m个阶段的隐状态 有关。
Local Attention:Global Attention有一个明显的缺点就是,每一次,encoder端的所有hidden state都要参与计算向量c,这样做计算开销会比较大,特别是当encoder的句子偏长,比如,一段话或者一篇文章,效率偏低。因此,为了提高效率,Local Attention应运而生。
Local Attention是一种介于Kelvin Xu所提出的Soft Attention和Hard Attention之间的一种Attention方式,即把两种方式结合起来。其结构如下图所示:
Local Attention首先会为decoder端当前的词,预测一个source端对齐位置(aligned position),然后基于选择一个窗口,也就是只关注一部分encoder hidden states,用于计算上下文向量。的计算公式如下:
其中,S是encoder端句子长度, 和 是模型参数。此时,对齐向量 的计算公式如下:
总之,Global Attention和Local Attention各有优劣,在实际应用中,Global Attention应用更普遍,因为local Attention需要预测一个位置向量p,这就带来两个问题:
- 当encoder句子不是很长时,相对Global Attention,计算量并没有明显减小。
- 位置向量pt的预测并不非常准确,这就直接计算的到的local Attention的准确率。
2.3 Self Attention
《Attention is all you nedd》中提出的一种Attention模型,详见:Transformer 模型详解。它反应的是输入或者输出的序列内部的单词和单词之间的相互影响。
2.4 Hierarchical Attention
Zichao Yang等人在论文《Hierarchical Attention Networks for Document Classification》提出了Hierarchical Attention用于文档分类。Hierarchical Attention构建了两个层次的Attention Mechanism,第一个层次是对句子中每个词的attention,即word attention;第二个层次是针对文档中每个句子的attention,即sentence attention。结构图如下:
整个网络结构由四个部分组成:一个由双向RNN(GRU)构成的word sequenceencoder,然后是一个关于词的word-level的attention layer;基于word attention layar之上,是一个由双向RNN构成的sentence encoder,最后的输出层是一个sentence-level的attention layer。
2.5 Attention over Attention
科大讯飞和哈工大在2017ACL会议上的论文《Attention-over-Attention Neural Networks for Reading Comprehension》中提出了Attention Over Attention的Attention机制,计算的是问题(Query)中的每个单词对文档(Document)中某个单词的重要程度(即注意力)。结构如下图所示:
两个输入,一个Document和一个Query,分别用一个双向的RNN进行特征抽取,得到各自的隐状态h(doc)和h(query),然后基于query和doc的隐状态进行dot product,得到query和doc的attention关联矩阵。
- 按列进行计算,得到
文档中每个单词对问题中的某个单词的重要程度(即注意力),最后形成一个文档级别的注意力分布 。问题中有多少个单词就有多少个这样的分布。然后对所有的进行汇总(求和、平均值或者最大值):
,P是文档中单词的个数
,Q是问题中单词个数 - 按行进行计算,得到
问题中的每个单词对文档中某个单词的重要程度(即注意力),形成一个问题级别的注意力分布 。文档中有多少个单词就有多少个这样的分布。然后对这些分布进行累加并求平均得到 :
,Q是问题中单词个数
,P是文档中单词的个数
2.6 Multi-step Attention
2017年,FaceBook 人工智能实验室的Jonas Gehring等人在论文《Convolutional Sequence to Sequence Learning》提出了完全基于CNN来构建Seq2Seq模型,除了这一最大的特色之外,论文中还采用了多层Attention Mechanism,来获取encoder和decoder中输入句子之间的关系,结构如下图所示:
完全基于CNN的Seq2Seq模型需要通过层叠多层来获取输入句子中词与词之间的依赖关系,特别是当句子非常长的时候,我曾经实验证明,层叠的层数往往达到10层以上才能取得比较理想的结果。针对每一个卷积的step(输入一个词)都对encoder的hidden state和decoder的hidden state进行dot product计算得到最终的Attention 矩阵,并且基于最终的attention矩阵去指导decoder的解码操作。
2.7 Multi-dimensional Attention
传统的Attention往往是一维的。《Coupled Multi-Layer Attentions for Co-Extraction of Aspect and Opinion Terms》提出了Multi-dimensional attention把一维的Attention扩展到多维,多维Attention可以捕捉输入多个维度重要性,具有更强的描述能力。
2.8 Memory-based Attention
Memory机制在NLP中应用也比较广泛,比如对话系统中。Memory-based Attention借用了这一思想,假设输入为q,Memory中以(k,v)形式存储着我们需要的上下文。Memory-based Attention可以通过不停地迭代地更新Memory来将注意力转移到答案所在的位置。
参考:
【1】 模型汇总24 - 深度学习中Attention Mechanism详细介绍:原理、分类及应用
【2】干货|全面了解attention机制
【3】干货 | Attention注意力机制超全综述
【4】 Seq2Seq – Attention – Transformer