attention机制

时间:2024-03-27 12:26:30

Attention

神经科学和计算神经科学中的neural processes已经广泛研究了注意力机制[1,2]。视觉注意力机制是一个特别值得研究的方向:许多动物专注于视觉输入的特定部分,去计算适当的反映。这个原理对神经计算有很大的影响,因为我们需要选择最相关的信息,而不是使用所有可用的信息,所有可用信息中有很大一部分与计算神经元反映无关。一个类似于视觉专注于输入的特定部分,也就是注意力机制已经用于深度学习、语音识别、翻译、推理以及视觉识别。

Attention for Image Captioning

我们通过介绍一个例子,去解释注意力机制。这个任务是我们想实现给图片加标题:对于给定的图片,根据图片中的内容给图片配上标题(说明/描述)。一个典型的image captioning系统会对图片进行编码,使用预训练的卷积神经网络产生一个隐状态h。然后,可以使用RNN对这个隐状态h进行解码,生成标题。这种方法已经被不少团队采用,包括[11],如下图所示:

attention机制

这种方法的问题是:当模型尝试去产生标题的下一个词时,这个词通常是描述图片的一部分。使用整张图片的表示h去调节每个词的生成,不能有效地为图像的不同部分产生不同的单词。这正是注意力机制有用的地方。
使用注意力机制,图片首先被划分成n个部分,然后我们使用CNN计算图像每个部分的表示h1,,hnh1,…,hn,也就是对n个部分的图像进行编码。当使用RNN产生一个新的词时,注意力机制使得系统只注意图片中相关的几个部分,所以解码仅仅使用了图片的特定的几个部分。如下图所示,我们可以看到标题的每个词都是用图像(白色部分)的一部分产生的。

attention机制

更多的例子如下图所示,我们可看到图片相关的部分产生标题中划线的单词。

attention机制

现在我们要解释注意力机制是怎么工作的,文献[3]详细介绍了基于注意力机制的Encoder-Decoder Network的实现。

What is an attention model

在一般情况下,什么是注意力机制?

attention机制

一个attention model通常包含n个参数y1,..,yny1,..,yn(在前面的例子中,yiyi可以是hihi) ,和一个上下文c。它返回一个z向量,这个向量可以看成是对yiyi的总结,关注与上下文c相关联的信息。更正式地说是,它返回的yiyi的加权算术平均值,并且权重是根据yiyi与给定上下文c的相关性来选择的。

在上面的例子中,上下文是刚开始产生的句子,yiyi是图像的每个部分的表示(hihi),输出是对图像进行一定的过滤(例如:忽略图像中的某些部分)后的表示,通过过滤将当前生成的单词的重点放在感兴趣的部分。
注意力机制有一个有趣的特征:计算出的权重是可访问的并且可以被绘制出来。这正是我们之前展示的图片,如果权重越高,则对应部分的像素越白。

但是,这个黑盒子做了什么?下图能够清晰的表示Attention Model的原理:

attention机制

可能这个网络图看起来比较复杂,我们一步一步来解释这个图。
首先,我们能够看出 一个输入c,是上下文,yiyi是我们正在研究的“数据的一部分”。

attention机制

然后,网络计算m1,,mnm1,…,mn通过一个tanh层。这意味着我们计算yiyi和c的一个”聚合”。重要的一点是,每个mimi的计算都是在不考虑其他yj,jiyj,j≠i的情况下计算出来的。它们是独立计算出来的。

attention机制

mi=tanh(Wcmc+Wymyi)mi=tanh(Wcmc+Wymyi)

然后,我们计算每个weight使用softmax。softmax,就像他的名字一样,它的行为和argmax比较像,但是稍有不同。argmax(x1,,xn)=(0,..,0,1,0,..,0)argmax(x1,…,xn)=(0,..,0,1,0,..,0),在输出中只有一个1,告诉我们那个是最大值。但是,softmax的定义为:softmax(x1,,xn)=(exijexj)isoftmax(x1,…,xn)=(exi∑jexj)i。如果其中有一个xixi比其他的都大,softmax(x1,,xn)argmax(x1,,xn)softmax(x1,…,xn)将会非常接近argmax(x1,…,xn)
attention机制

siexp(wm,mi) isi=1si正比于exp(wm,mi) ∑isi=1

这里的sisi是通过softmax进行归一化后的值。因此,softmax可以被认为是“相关性”最大值的变量,根据上下文。
输出zz是所有yiyi的算术平均,每个权重值表示yi,..,ynyi,..,yn和上下文c的相关性。

attention机制

z=isiyiz=∑isiyi

An other computation of “relevance”

上面介绍的attention model是可以进行修改的。首先,tanh层可以被其他网络或函数代替。重要的是这个网络或函数可以综合c和yiyi。比如可以只使用点乘操作计算c和yiyi的内积,如下图所示:

attention机制

这个版本的比较容易理解。上面介绍的Attention是softly-choosing与上下文最相关的变量(yiyi)。据我们所知,这两种系统似乎都能产生类似的结果。
另外一个比较重要的改进是hard attention。

Soft Attention and Hard Attention

上面我们描述的机制称为Soft Attention,因为它是一个完全可微的确定性机制,可以插入到现有的系统中,梯度通过注意力机制进行传播,同时它们通过网络的其余部分进行传播。
Hard Attention是一个随机过程:系统不使用所有隐藏状态作为解码的输入,而是以概率sisi对隐藏状态yiyi进行采样。为了进行梯度传播,使用蒙特卡洛方法进行抽样估计梯度。

attention机制

这两个系统都有自己的优缺点,但是研究的趋势是集中于Soft Attention,因为梯度可以直接计算,并不是通过随机过程来估计的。

Return to the image captioning

现在,我们来理解一下image captioning 系统是怎样工作的。

attention机制

从上面的图我们可以看到image captioning的典型模型,但是添加了一个新的关于attention model的层。当我们想要预测标题的下一个单词时,发生了什么?如果我们要预测第i个词,LSTM的隐藏状态是hihi。我们选择图像相关的部分通过把hihi作为上下文。然后,attention model的输出是zizi,这是被过滤的图像的表示,只有图像的相关部分被保留,用作LSTM的输入。然后,LSTM预测一个下一个词,并返回一个隐藏状态hi+1hi+1

Learning to Align in Machine Translation

Bahdanau, et al[5]中的工作提出了一个神经翻译模型将句子从一种语言翻译成另一种语言,并引入注意力机制。在解释注意力机制之前,vanillan神经网络翻译模型使用了编码-解码(Encoder-Decoder)框架。编码器使用循环神经网络(RNN,通常GRU或LSTM)将用英语表示的句子进行编码,并产生隐藏状态h。这个隐藏状态h用于解码器RNN产生正确的法语的句子。

attention机制

编码器不产生与整个句子对应的单个隐藏状态,而是产生与一个词对应的隐藏状态hjhj。每当解码器RNN产生一个单词时,取决于每个隐藏状态作为输入的贡献,通常是一个单独的参数(参见下图)。这个贡献参数使用Softmax进行计算:这意味着attention weights ajajaj=1∑aj=1的约束下进行计算并且所有的隐藏状态hjhj给解码器贡献的权重为ajaj
在我们的例子中,注意力机制是完全可微的,不需要额外的监督,它只是添加在现有的编码-解码框架的顶部。
这个过程可以看做是对齐,因为网络通常在每次生成输出词时都会学习集中于单个输入词。这就意味着大多数的注意力权重是0(黑),而一个单一的被**(白色)。下面的图像显示了翻译过程中的注意权重,它揭示了对齐方式,并使解释网络所学的内容成为可能(这通常是RNNs的问题!)。

attention机制

Attention without Recurrent Neural Networks

到现在为止,我们仅介绍了注意力机制在编码-解码框架下的工作。但是,当输入的顺序无关紧要时,可以考虑独立的隐藏状态hjhj。这个在Raffel et Al[10]中进行了介绍,这里attention model是一个前向全连接的网络。同样的应用是Mermory Networks[6](参见下一节)。

From Attention to Memory Addressing

NIPS 2015会议上提出了一个非常有趣的工作叫做 RAM for Reasoning、Attention and Memory。它的工作包含Attention,但是也包括Memory Networks[6],Neural Turing Machines[7]或 Differentiable Stack RNNS[8]以及其他的工作。这些模型都有共同之处,它们使用一种外部存储器的形式,这种存储器可以被读取(最终写入)。
比较和解释这些模型是超出了这个本文的范围, 但注意机制和记忆之间的联系是有趣的。例如,在Memory Networks中,我们认为外部存储器-一组事实或句子xixi和一个输入q。网络学习对记忆的寻址,这意味着选择哪个事实xixi去关注来产生答案。这对应了一个attention model在外部存储器上。In Memory Networks, the only difference is that the soft selection of the facts (blue Embedding A in the image below) is decorrelated from the weighted sum of the embeddings of the facts (pink embedding C in the image).(PS:实在读不懂了)。在Neural Turing Machine中,使用了一个Soft Attention机制。这些模型将会是下个博文讨论的对象。

attention机制

Soft Attention Model:

这里其实是上面图的拆解,我们前面说过,“Neural machine translation by jointly learning to align and translate”这篇论文提出了soft Attention Model,并将其应用到了机器翻译上面。其实,所谓Soft,意思是在求注意力分配概率分布的时候,对于输入句子X中任意一个单词都给出个概率,是个概率分布。

即上图中的ci是对Encoder中每一个单词都要计算一个注意力概率分布,然后加权得到的。如下图所示:

attention机制

其实有Soft AM,对应也有一个Hard AM。既然Soft是给每个单词都赋予一个单词对齐概率,那么如果不这样做,直接从输入句子里面找到某个特定的单词,然后把目标句子单词和这个单词对齐,而其它输入句子中的单词硬性地认为对齐概率为0,这就是Hard Attention Model的思想。Hard AM在图像里证明有用,但是在文本里面用处不大,因为这种单词一一对齐明显要求太高,如果对不齐对后续处理负面影响很大。

但是,斯坦福大学的一篇paper“Effective Approaches to Attention-based Neural Machine Translation”提出了一个混合Soft AM 和Hard AM的模型,论文中,他们提出了两种模型:Global Attention Model和Local Attention Model,Global Attention Model其实就是Soft Attention Model,Local Attention Model本质上是Soft AM和 Hard AM的一个混合。一般首先预估一个对齐位置Pt,然后在Pt左右大小为D的窗口范围来取类似于Soft AM的概率分布。

Global Attention Model和Local Attention Model

attention机制

Global AM其实就是soft AM,Decoder的过程中,每一个时间步的Context vector需要计算Encoder中每一个单词的注意力权重,然后加权得到。


attention机制

Local AM则是首先找到一个对其位置,然后在对其位置左右一个窗口内来计算注意力权重,最终加权得到Context vector。这其实是Soft AM和Hard AM的一个混合折中。


静态AM

其实还有一种AM叫做静态AM。所谓静态AM,其实是指对于一个文档或者句子,计算每个词的注意力概率分布,然后加权得到一个向量来代表这个文档或者句子的向量表示。跟soft AM的区别是,soft AM在Decoder的过程中每一次都需要重新对所有词计算一遍注意力概率分布,然后加权得到context vector,但是静态AM只计算一次得到句子的向量表示即可。(这其实是针对于不同的任务而做出的改变)

attention机制


强制前向AM

Soft AM在逐步生成目标句子单词的时候,是由前向后逐步生成的,但是每个单词在求输入句子单词对齐模型时,并没有什么特殊要求。强制前向AM则增加了约束条件:要求在生成目标句子单词时,如果某个输入句子单词已经和输出单词对齐了,那么后面基本不太考虑再用它了,因为输入和输出都是逐步往前走的,所以看上去类似于强制对齐规则在往前走。


看了这么多AM模型以及变种,那么我们来看一看AM模型具体怎么实现,涉及的公式都是怎样的。

我们知道,注意力机制是在序列到序列模型中用于注意编码器状态的最常用方法,它同时还可用于回顾序列模型的过去状态。使用注意力机制,系统能基于隐藏状态 s_1,...,s_m 而获得环境向量(context vector)c_i,这些环境向量可以和当前的隐藏状态 h_i 一起实现预测。环境向量 c_i 可以由前面状态的加权平均数得出,其中状态所加的权就是注意力权重 a_i:

attention机制

注意力函数 f_att(h_i,s_j) 计算的是目前的隐藏状态 h_i 和前面的隐藏状态 s_j 之间的非归一化分配值。

而实际上,注意力函数也有很多种变体。接下来我们将讨论四种注意力变体:加性注意力(additive attention)、乘法(点积)注意力(multiplicative attention)、自注意力(self-attention)和关键值注意力(key-value attention)。

加性注意力(additive attention)

加性注意力是最经典的注意力机制 (Bahdanau et al., 2015) [15],它使用了有一个隐藏层的前馈网络(全连接)来计算注意力的分配:

attention机制

也就是:attention机制


乘法(点积)注意力(multiplicative attention)

乘法注意力(Multiplicative attention)(Luong et al., 2015) [16] 通过计算以下函数而简化了注意力操作:

attention机制

加性注意力和乘法注意力在复杂度上是相似的,但是乘法注意力在实践中往往要更快速、具有更高效的存储,因为它可以使用矩阵操作更高效地实现。两个变体在低维度 d_h 解码器状态中性能相似,但加性注意力机制在更高的维度上性能更优。


自注意力(self-attention)

注意力机制不仅能用来处理编码器或前面的隐藏层,它同样还能用来获得其他特征的分布,例如阅读理解任务中作为文本的词嵌入 (Kadlec et al., 2017) [37]。然而,注意力机制并不直接适用于分类任务,因为这些任务并不需要情感分析(sentiment analysis)等额外的信息。在这些模型中,通常我们使用 LSTM 的最终隐藏状态或像最大池化和平均池化那样的聚合函数来表征句子。

自注意力机制(Self-attention)通常也不会使用其他额外的信息,但是它能使用自注意力关注本身进而从句子中抽取相关信息 (Lin et al., 2017) [18]。自注意力又称作内部注意力,它在很多任务上都有十分出色的表现,比如阅读理解 (Cheng et al., 2016) [38]、文本继承 (textual entailment/Parikh et al., 2016) [39]、自动文本摘要 (Paulus et al., 2017) [40]。

attention机制


关键值注意力(key-value attention)

关键值注意力 (Daniluk et al., 2017) [19] 是最近出现的注意力变体机制,它将形式和函数分开,从而为注意力计算保持分离的向量。它同样在多种文本建模任务 (Liu & Lapata, 2017) [41] 中发挥了很大的作用。具体来说,关键值注意力将每一个隐藏向量 h_i 分离为一个键值 k_i 和一个向量 v_i:[k_i;v_i]=h_i。键值使用加性注意力来计算注意力分布 a_i:

attention机制

其中 L 为注意力窗体的长度,I 为所有单元为 1 的向量。然后使用注意力分布值可以求得环境表征 c_i:

attention机制

其中环境向量 c_i 将联合现阶段的状态值 v_i 进行预测。