在 Attention 机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情是一样的。attention 的引入,在传统的seq2seq模型中,无法体现在一个序列句子中不同部分的关注度

 

传统的seq2seq,输出y对输入序列x1,x2,x3...没有区分,没有辨识度,下图二中我们引入了attention机制,每个输出的词y受输入X1,X2,X3...影响的权重不同,这个权重便是由Attention计算,因此可以把Attention机制看成注意力分配系数,计算输入每一项对输出权重影响大小

1.attention  三部曲

(1) 计算q与k的相似 (2)softmax 归一化 (3)加权求和

2.attention 优点

(1)与cnn rnn 相比参数少,复杂度更低。(2)与rnn 相比,可以并行运算,提高运行速度,(3) 与cnn相比能够很好的捕捉全局的信息。

3.attention  权重计算函数

在做attention的时候,我们需要计算query和某个key的分数(相似度),常用方法有:

1)串联方式:把q和k拼接起来,

attention 机制整理

2)用多层感知机也可以:

attention 机制整理对于大规模数据集会相对有效

3)s(q,k)=qT w k   速度快

4)点乘:最简单的方法,

attention 机制整理计算速度快,相比于3) 参数少

5 scaled-dot product :

减小数值,softmax 梯度更大一些,学习的更快。 

attention 机制整理

6)cos相似度:

attention 机制整理

4,Attention 的 N 种类型

attention 机制整理

 

1. 计算区域

根据Attention的计算区域,可以分成以下几种:

1)Soft Attention,这是比较常见的Attention方式,对所有key求权重概率,每个key都有一个对应的权重,是一种全局的计算方式(也可以叫Global Attention)。这种方式比较理性,参考了所有key的内容,再进行加权。但是计算量可能会比较大一些。Softatttention是参数化的,是可导的可嵌入到模型中直接训练,

2)Hard Attention,这种方式是直接精准定位到某个key,其余key就都不管了,相当于这个key的概率是1,其余key的概率全部是0。因此这种对齐方式要求很高,要求一步到位,如果没有正确对齐,会带来很大的影响。另一方面,因为不可导,一般需要用强化学习的方法进行训练。(或者使用gumbel softmax之类的)

hard attention是一个随机的过程,为了实现梯度的反向传播,需要采用蒙特卡洛采样的方法来估计模块的梯度,目前更多的研究和应用还是更倾向于使用Soft Attention,因为其可以直接求导,进行梯度反向传播,大致了解一下即可

  • 硬性注意力有两种实现方式:(1)一种是选取最高概率的输入信息;(2)另一种硬性注意力可以通过在注意力分布式上随机采样的方式实现。硬性注意力模型的缺点:
硬性注意力的一个缺点是基于最大采样或随机采样的方式来选择信息。因此最终的损失函数与注意力分布之间的函数关系不可导,因此无法使用在反向传播算法进行训练。为了使用反向传播算法,一般使用软性注意力来代替硬性注意力。硬性注意力需要通过强化学习来进行训练。——《神经网络与深度学习》

3)Local Attention,这种方式其实是以上两种方式的一个折中,对一个窗口区域进行计算。先用Hard方式定位到某个地方,以这个点为中心可以得到一个窗口区域,在这个小区域内用Soft方式来算Attention。

全局Attention和局部attention存在共同之处,例如在翻译模型的解码阶段都是将LSTM的顶层隐藏状态ht作为输入,目标是活得一个上下文向量ct来捕获源信息帮助预测当前单词,两种方式不同便在于对上下文向量ct的获取方式不同,但其后步骤是共享的,

全局Attention在计算上下文向量ct时考虑编码器所有的隐层状态,attention向量是通过比较当前目标隐藏状态ht和每个源隐藏状态hs得到:

全局Attention的缺点在于对每个目标单词必须关注源序列中的所有单词,消耗资源因此局部Attention的思想是对每个目标单词只选择一部分源单词进行预测上下文向量ct,具体来说,在时刻t 模型首先为每个目标单词生成一个对齐位置pt。上下文向量ct 通过窗口[pt -D,pt +D] 内的源隐藏状态集合加权平均计算得到;D 根据经验选择。8 与全局方法不同,局部对齐向量at 是固定维度的,即∈ℝ2D+1

2. 所用信息

假设我们要对一段原文计算Attention,这里原文指的是我们要做attention的文本,那么所用信息包括内部信息和外部信息,内部信息指的是原文本身的信息,而外部信息指的是除原文以外的额外信息。

1)General Attention,这种方式利用到了外部信息,常用于需要构建两段文本关系的任务,query一般包含了额外信息,根据外部query对原文进行对齐。

比如在阅读理解任务中,需要构建问题和文章的关联,假设现在baseline是,对问题计算出一个问题向量q,把这个q和所有的文章词向量拼接起来,输入到LSTM中进行建模。那么在这个模型中,文章所有词向量共享同一个问题向量,现在我们想让文章每一步的词向量都有一个不同的问题向量,也就是,在每一步使用文章在该步下的词向量对问题来算attention,这里问题属于原文,文章词向量就属于外部信息。

2)Local Attention,这种方式只使用内部信息,key和value以及query只和输入原文有关,在self attention中,key=value=query。既然没有外部信息,那么在原文中的每个词可以跟该句子中的所有词进行Attention计算,相当于寻找原文内部的关系。

还是举阅读理解任务的例子,上面的baseline中提到,对问题计算出一个向量q,那么这里也可以用上attention,只用问题自身的信息去做attention,而不引入文章信息。

3. 结构层次

结构方面根据是否划分层次关系,分为单层attention,多层attention和多头attention:

1)单层Attention,这是比较普遍的做法,用一个query对一段原文进行一次attention。

2)多层Attention,一般用于文本具有层次关系的模型,假设我们把一个document划分成多个句子,在第一层,我们分别对每个句子使用attention计算出一个句向量(也就是单层attention);在第二层,我们对所有句向量再做attention计算出一个文档向量(也是一个单层attention),最后再用这个文档向量去做任务。

3)多头Attention,这是Attention is All You Need中提到的multi-head attention,用到了多个query对一段原文进行了多次attention,每个query都关注到原文的不同部分,相当于重复做多次单层attention:

 

attention 机制整理

 

最后再把这些结果拼接起来:

 

attention 机制整理

相关文章: