目前深度学习中热点之一就是注意力机制(Attention Mechanisms)。Attention源于人类视觉系统,当人类观察外界事物的时候,一般不会把事物当成一个整体去看,往往倾向于根据需要选择性的去获取被观察事物的某些重要部分,比如我们看到一个人时,往往先Attend到这个人的脸,然后再把不同区域的信息组合起来,形成一个对被观察事物的整体印象。
「同理,Attention Mechanisms可以帮助模型对输入的每个部分赋予不同的权重,抽取出更加关键及重要的信息,使模型做出更加准确的判断,同时不会对模型的计算和存储带来更大的开销,这也是Attention Mechanism应用如此广泛的原因」 ,尤其在Seq2Seq模型中应用广泛,如机器翻译、语音识别、图像释义(Image Caption)等领域。Attention既简单,又可以赋予模型更强的辨别能力,还可以用于解释神经网络模型(例如机器翻译中输入和输出文字对齐、图像释义中文字和图像不同区域的关联程度)等。
本文主要围绕核心的Attention机制 以及Attention的变体 展开。
Attention主要应用于Seq2Seq模型,故首先简介一下Seq2Seq模型。Seq2Seq模型目标是学习一个输入序列到输出序列的映射函数。应用场景包括:机器翻译(Machine translation)、自动语音识别(Automatic speech recognition)、语音合成(Speech synthesis)和手写体生成(Handwriting generation)。
Seq2Seq模型奠基性的两个工作如下:
NIPS2014:Sequence to Sequence Learning with Neural Networks[1]
该论文介绍了一种基于RNN(LSTM)的Seq2Seq模型,基于一个Encoder和一个Decoder来构建基于神经网络的End-to-End的机器翻译模型,其中,Encoder把输入编码成一个固定长度的上下文向量,Decoder基于「上下文向量」 和「目前已解码的输出」 ,逐步得到完整的目标输出。这是一个经典的Seq2Seq的模型,但是却存在「两个明显的问题」 :
把输入的所有信息有压缩到一个固定长度的隐向量,忽略了输入的长度,当输入句子长度很长,特别是比训练集中所有的句子长度还长时,模型的性能急剧下降(Decoder必须捕捉很多时间步之前的信息,虽然本文使用LSTM在一定程度上能够缓解这个问题)。
把输入编码成一个固定的长度过程中,对于句子中每个词都赋予相同的权重,这样做是不合理的。比如,在机器翻译里,输入的句子与输出句子之间,往往是输入一个或几个词对应于输出的一个或几个词。因此,对输入的每个词赋予相同权重,这样做没有区分度,往往使模型性能下降。
注意上图中Encoder得到的上下文向量「仅用于作为Decoder的第一个时间步的输入」 。
Decoder的另一个输入是前一时刻的单词
,需要注意的是,在训练阶段
是「真实label」 (需要embedding一下),而不是上一时刻的预测值。而在测试阶段,则是上一时刻的预测值(具体使用时需要借助beam-search来得到最优翻译序列)。
但是实际训练过程中,「label是否使用真实数据2种方式,可以交替进行」 ,即一种是把标准答案作为Decoder的输入,还有一种是把Decoder上一次的输出的结果作为输入,因为如果完全使用标准答案,会导致收敛的过快,导致测试的时候不稳定。
另外,上述输入输出中的每个单词,都要借助「embedding」 技术。
EMNLP2014:Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation[2]
和NIPS2014几乎同时发表,思想也是一样的。只不过在这篇文章中,作者提出了一种新的RNN Cell,即GRU代替LSTM来构建Seq2Seq模型。
还有一点不同的是,Encoder得到的上下文向量会作用于Decoder「每一个时间步」 的预测。
总结起来:RNN-based Encoder-Decoder Framework,目标是预测
是LSTM或GRU,
是时间步
的单词的one-hot表示,先经过embedding矩阵
嵌入后作为RNN在
时刻的输入,
是
时间步的encode;
是时间步
的encode。
是上下文向量,是关于
的函数。
是输入的最大长度。最简单的,
,即最后一个时间步得到的encode作为上下文向量。
Decoder在给定上下文向量
以及已经预测的输出
条件下,预测下一个输出
。换句话说,Decoder将输出
上的联合分布分解为有序条件分布 (ordered conditionals):
是输出词的one-hot向量(全连接+softmax激活后得到),
是前一时刻已经预测的输出词的one-hot向量,先经过
embedding后再作为
的输入。
是一个非线性函数(e.g., 全连接+softmax),输出关于
的概率分布。
(
,
是LSTM/GRU)是RNN的隐藏层状态。(注意,
不是RNN提取隐藏层状态的LSTM或GRU,而是隐藏层后面接的全连接层或其他非线性函数,LSTM或GRU提取的Decoder隐状态和上下文向量以及已经预测的输出都将作为
的输入,用于预测概率分布)。
如上文所述,传统的Seq2Seq模型对输入序列缺乏区分度,存在明显的两大问题。因此,有大牛提出使用Attention机制来解决问题。下面将按照Attention的不同类型重点介绍一些Attention上的研究工作。
Basic Attention
本小节介绍最传统和基础的Attention模型的应用。首先直观感受下Attention机制的一个示意动图。
Machine Translation
ICLR2015: Neural Machine Translation by Jointly Learning to Align and Translate[3]
这是ICLR2015提出的文章,机器翻译的典型方法。作者在RNN Encoder-Decoder框架上,引入了Attention机制来同时进行翻译和对齐。使用bidirectional RNN作为Encoder,Decoder会在翻译的过程中通过模拟搜索源句子focus到不同部位上来进行更准确的解码。模型示意图如下:
其中,
一般使用softmax全连接层(或多加几层,输入的3个向量concat到一起后进行Feed Forward),
是Decoder中RNN在时间步
的隐状态,根据如下LSTM或GRU函数计算得到:
是关于前一时刻Decoder端隐状态
,前一时刻已经预测的输出
的embedding表示
以及该时刻
的上下文向量
的函数。
是LSTM或GRU。
注意,和已有的encoder-decoder不同,这里的条件概率对「每一个目标单词」
都需要有一个「不同的」 上下文向量
。
而上下文向量
取决于Encoder端输入序列encode后的RNN隐状态
(bidirectional RNN,因此
包含了输入句子
位置周围的信息,有,
)
而
是输出
和输入
的对齐模型(alignment model),衡量了输入位置
周围的信息和输出位置
的匹配程度。
得分依赖于Decoder端
时刻的「前一时刻的隐状态」
和Encoder端
时刻的隐状态。文中使用前馈神经网络学习对齐模型,并且和其他组件联合学习,
实际上学到的是soft alignment,因此可以很容易应用梯度反向传播。
总之,
可以理解为衡量了输出单词
和输入单词
的对齐程度,而
是
时刻,所有encode隐状态根据该对齐程度得到的期望上下文向量,是所有对齐情况下的期望。
衡量了在计算下一个decoder隐状态
和预测
过程中,相对于前一个decoder隐状态
,不同
的重要性程度。这一「Decoder中的」 注意力机制使得只需要关注源句子部分的信息,而不是像此前工作中非要将源句子「所有的信息」 都编码成固定长度的上下文向量来用。
Image Caption
ICML2015: Show, Attend and Tell- Neural Image Caption Generation with Visual Attention[4]
Kelvin Xu等人在该论文中将Attention引入到Image Caption中。Image Caption是一种场景理解的问题,这是视觉领域重要的一个研究方向。场景理解的难点在于既要进行物体识别,又要理解物体之间的关系。这相当于要让机器拥有模仿人类将大量显著的视觉信息压缩为描述性语言的能力。
模型包括两个部分:Encoder和Decoder。其中,Encoder会使用CNN提取图片低层特征;Decoder会在RNN中引入注意力机制,将图片特征解码为自然语言语句。模型总的示意图如下:
如上图,模型把图片经过CNN网络,变成特征图。LSTM的RNN结构在此上运行Attention模型,最后得到描述。
「目标:」 输入一个图像,输出该图像的描述
,其中
是词典词汇的数量,
是词的one-hot表示向量,
是描述的长度。
在encoder端,模型使用CNN来提取L个D维vector,每一个都对应图像的一个区域(这里粗体表示向量):
在原论文中,原始图像先经过center cropped变为
的图像,然后经过卷积和pooling操作,共4次max pooling,最后得到
的feature map,feature map个数共512个,即512个通道。这里
对应的就是196个区域数量,每个区域都是原始图像经过下采样得到的,因此可以通过4次上采样能够恢复原始图像中对应区域。而
,即每个区域的向量化表示是由所有的feature map相应位置数值构造而成。
与此前的工作使用Softmax层之前的那一层vector作为图像特征不同,本文所提取的这些vector来自于 「low-level 的卷积层,这 使得Decoder可以通过从所有提取到的特征集中,选择一个子集来聚焦于图像的某些部分」 。这样子就有点像NLP里的seq2seq任务了,这里的输入从词序列转变成了图像区域vector的序列。作为类比,图像上的
个区域(
平展开为196)就相当于句子的长度(单词的数量
);每个区域的D维向量化表示是由D个Filter提取的该区域的特征concat在一起形成的向量,类比于句子每个单词的embedding经过RNN提取的「隐状态向量」 。
即,在给定一组提取到的图像不同区域的向量表示
,以及不同区域相应的权重
条件下,计算上下文向量,最简单的方式是使用上文所述的加权和来处理。本文使用了两种Attention Mechanisms,即Soft Attention和Hard Attention。我们之前所描述的传统的Attention Mechanism就是Soft Attention。Soft Attention是参数化的(Parameterization),因此可导,可以被嵌入到模型中去,直接训练,梯度可以经过Attention Mechanism模块,反向传播到模型其他部分。相反,Hard Attention是一个随机的过程,根据
随机采样。Hard Attention不会选择整个encoder的输出做为其输入,Hard Attention会依概率来采样输入端的隐状态一部分来进行计算,而不是整个encoder的隐状态。为了实现梯度的反向传播,需要采用蒙特卡洛采样的方法来估计模块的梯度。
而权重
的计算,作者引入了一个Attention模型,实际上就是上篇文章MT任务中的对齐模型。
是当前要预测的「输出词」 的位置,
是输入词的位置。
使用LSTM来解码并生成描述词序列,LSTM结构单元如下:
具体LSTM的计算:(可以发现如何将
融入到LSTM中的,实际上就是多一个线性变换,再全部加起来)
第一个式子实际上是四个式子,分别得到输入门、遗忘门、输出门和被输入门控制的候选向量。其中,三个门控由sigmoid激活,得到的是元素值皆在 0 到 1 之间的向量,可以将门控的值视作保留概率;候选向量由tanh激活,得到的是元素值皆在-1到1之间的向量。
是仿射变换,在上式也就是要对最右边的三项进行加权求和,可以将T理解为分块矩阵。最右边的三个式子,其中
是「输出词的embedding matrix」 ,
是one-hot词表示,
用来lookup,得到dense词向量表示。
是前一时刻的decoder状态,
是LSTM真正意义上的“输入”,代表的是捕捉了特定区域视觉信息的上下文向量,既然它和时刻
有关,就说明它是一个动态变化的量,在不同的时刻将会捕捉到与本时刻相对应的「相关图像区域」 。这个量将由attention机制计算。
第二个式子是更新旧的记忆单元,element-wise 的运算表示三个门控将对各自控制的向量的每个元素做“取舍”:0 到 1 分别代表完全抛弃到完全保留。第三个式子是得到隐状态。
有了隐状态,就可以计算词表中各个词的概率值,那么取概率最大的那个作为当前时刻生成的词,并将作为下一时刻的输入。其实就是softmax全连接层(两层MLPs+softmax)。
是单词的数量。
解码的输出:模型生成的一句caption被表示为各个词的one-hot编码所构成的集合,输出的caption y表示为:
是字典的单词个数,
是句子长度。
的形式为
,即只有第
处位置为1,其它位置为0。
RNN建模时,
会用在embedding,将稀疏one-hot向量转成dense的embedding向量。模型的输出概率
会用于拟合真实的
。
LSTM初始输入 :
LSTM中的记忆单元与隐藏单元的初始值,是两个不同的多层感知机,采用所有特征区域的平均值来进行预测的:
文中使用VGGnet作为encoder进行编码,且不进行finetuning。encoder得到
的feature maps。因此decoder处理的是flattened
(
)。
在decode时,由于模型每次更新所需要的时间正比于最长的句子,如果随机采样句子进行解码,训练时间会很长。为了解决这个问题,文中会在预处理环节,将句子按照长度分组。每次更新时,随机采样一个长度,然后使用相应的分组内的句子进行训练,这样就能显著提高运行效率。
个人觉得输出词的embedding matrix也可以使用word2vec预训练好的词向量代替,文中没提到。
Speech Recognition
NIPS2015: Attention-Based Models for Speech Recognition[5]
给定一个英文的语音片段作为输入,输出对应的音素序列。Attention机制被用于对输出序列的每个音素和输入语音序列中一些特定帧进行关联。
Entailment
ICLR2016: Reasoning about Entailment with Neural Attention[6]
语义蕴含,句子关系推断方面的早期工作,也是采用了基本的Attention模型。给定一个用英文描述的前提和假设作为输入,输出假设与前提是否矛盾、是否相关或者是否成立。举个例子:前提:在一个婚礼派对上拍照;假设:有人结婚了。该例子中的假设是成立的。Attention机制被用于关联假设和前提描述文本之间词与词的关系。
Text Summarization
EMNLP2015: A Neural Attention Model for Sentence Summarization[7]
给定一篇英文文章作为输入序列,输出一个对应的摘要序列。Attention机制被用于关联输出摘要中的每个词和输入中的一些特定词。
本部分介绍Attention机制的各种变体。包括但不限于:
「基于强化学习的注意力机制」 :选择性的Attend输入的某个部分
「全局&局部注意力机制」 :其中,局部注意力机制可以选择性的Attend输入的某些部分
「多维度注意力机制」 :捕获不同特征空间中的Attention特征。
「层次化注意力机制」 :word->sentence->document
「注意力之上嵌一个注意力」 :和层次化Attention有点像。
「多跳注意力机制」 :和前面两种有点像,但是做法不太一样。且借助残差连接等机制,可以使用更深的网络构造多跳Attention。使得模型在得到下一个注意力时,能够考虑到之前的已经注意过的词。
「使用拷贝机制的注意力机制」 :在生成式Attention基础上,添加具备拷贝输入源语句某部分子序列的能力。
「基于记忆的注意力机制」 :把Attention抽象成Query,Key,Value三者之间的交互;引入先验构造记忆库。
「自注意力机制」 :自己和自己做attention,使得每个位置的词都有全局的语义信息,有利于建立长依赖关系。
Reinforcement-learning based Attention
NIPS2014: Recurrent Models of Visual Attention[1]
ICLR2015: Multiple Object Recognition with Visual Attention [2]
NIPS2014论文应该是最早的Attention雏形,虽然和我们通常所说的、广泛应用于Seq2Seq的Attention机制不太一样,但是还是值得提一下。这是Google DeepMind2014年提出的一篇计算机视觉领域的文章,适用于处理图像序列或帧序列来进行场景感知或处理(例如Video Caption)。
其动机在于随着分辨率提高,计算量不断增长,神经网络难以在实时应用场景中,快速处理这么大的计算量。借鉴人类视觉系统的特点,即,为了理解某个场景,并不是一下子处理整个场景,而是Focus到某些关键的位置上,然后联合起来构建出整个场景信息。故本篇论文利用RNN处理图像序列,并使用「强化学习 」来训练模型,使得模型能够学习attention决策。即,针对实时的场景,基于过去的信息和任务的需要选择下一个要focus的感知区域。这个和人类的感知方式比较相似,也是我们最早理解的Attention机制。
但是,上文所述的广泛应用于Seq2Seq中的Attention不大一样。人类的注意力机制实际上是可以节省计算资源的,注意只需要集中到某些区域,可以忽略大部分区域。Recurrent Models of Visual Attention中的做法和这个是一样的。
然而,下文即将要介绍的应用于Seq2Seq模型模型的Attention就不是这样的了。实际上,下文所述Attention模型,需要把每一个部分都观察的仔仔细细(每部分权重都要算一下),才能进一步决策到底需要focus到哪些部分,这和人类的视觉系统不相符,更像是memory,而不是attention(实际上attention可以理解为一种「短期记忆 」,即根据短期记忆在输入特征上分配attention;memory也是另外一种非常重要的机制),然而,这并不妨碍注意力机制的有效性。
以往的文章,主要将attention应用于不同场景中,而这篇文章提出了新的attention架构,引入了Global Attention和Local Attention的概念。
Global Attention和上文的Soft Attention几乎一样,即计算上下文向量时,和所有的encoder隐状态向量求alignment;而Local Attention是Soft Attention和Hard Attention的权衡,既拥有Soft Attention可微分,容易使用反向传播来优化的优点,又拥有Hard Attention复杂度低的优点,除此之外,还不需要强化学习方法进行训练。
对每一个目标单词
,使用Attention机制计算的上下文向量为
;
Attention机制中的对齐模型为
(前面文章中都是使用
, 即「前一个时间步 」的Decoder隐状态和Encoder隐状态来计算对齐权重)。
首先是Global Attention,如下图所示:
Global Attention中上下文向量
的计算路径为: