目前深度学习中热点之一就是注意力机制(Attention Mechanisms)。Attention源于人类视觉系统,当人类观察外界事物的时候,一般不会把事物当成一个整体去看,往往倾向于根据需要选择性的去获取被观察事物的某些重要部分,比如我们看到一个人时,往往先Attend到这个人的脸,然后再把不同区域的信息组合起来,形成一个对被观察事物的整体印象。
「同理,Attention Mechanisms可以帮助模型对输入的每个部分赋予不同的权重,抽取出更加关键及重要的信息,使模型做出更加准确的判断,同时不会对模型的计算和存储带来更大的开销,这也是Attention Mechanism应用如此广泛的原因」
,尤其在Seq2Seq模型中应用广泛,如机器翻译、语音识别、图像释义(Image Caption)等领域。Attention既简单,又可以赋予模型更强的辨别能力,还可以用于解释神经网络模型(例如机器翻译中输入和输出文字对齐、图像释义中文字和图像不同区域的关联程度)等。
本文主要围绕核心的Attention机制以及Attention的变体展开。
Seq2Seq Model
Attention主要应用于Seq2Seq模型,故首先简介一下Seq2Seq模型。Seq2Seq模型目标是学习一个输入序列到输出序列的映射函数。应用场景包括:机器翻译(Machine translation)、自动语音识别(Automatic speech recognition)、语音合成(Speech synthesis)和手写体生成(Handwriting generation)。
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,目标是预测 ,其中
都是one-hot向量。
是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隐状态和上下文向量以及已经预测的输出都将作为
的输入,用于预测概率分布)。
Attention
如上文所述,传统的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」,