深度学习方法(九):天然语言处理中的Attention Model注意力模型

欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.NET/xbinworld。
技术交流QQ群:433250724,欢迎对算法、技术感兴趣的同窗加入。html


上一篇博文深度学习方法(八):Encoder-Decoder模型,基本Sequence to Sequence模型描述了基本的Encoder-Decoder模型,在做为翻译模型的时候,这种基本的Encoder-Decoder模型有较大缺点,就是Encoder部分每个输入对Decoder部分每个输出的贡献都是同样的。下面先看一个例子[1],算法

输入的是英文句子:Tom chase Jerry,Encoder-Decoder生成:“汤姆”,“追逐”,“杰瑞”。

在基本模型中,每个英文单词对杰瑞都是同样的贡献,这彷佛是不太合理的;也就是说markdown

这里写图片描述
没有引入注意力的模型在输入句子比较短的时候估计问题不大,可是若是输入句子比较长,此时全部语义彻底经过一个中间语义向量来表示,单词自身的信息已经消失,可想而知会丢失不少细节信息,这也是为什么要引入注意力模型的重要缘由。若是引入AM模型的话,应该在翻译“杰瑞”的时候,体现出英文单词对于翻译当前中文单词不一样的影响程度,好比给出相似下面一个几率分布值:网络

(Tom,0.3)(Chase,0.2)(Jerry,0.5)

即生成目标句子单词的过程成了下面的形式:框架

这里写图片描述

而每一个Ci可能对应着不一样的源语句子单词的注意力分配几率分布,好比对于上面的英汉翻译来讲,其对应的信息可能以下:函数

这里写图片描述

其中,f2函数表明Encoder对输入英文单词的某种变换函数,好比若是Encoder是用的RNN模型的话,这个f2函数的结果每每是某个时刻输入xi后隐层节点的状态值(通过激活函数);g表明Encoder根据单词的中间表示合成整个句子中间语义表示的变换函数,通常的作法中,g函数就是对构成元素加权求和,也就是经常在论文里看到的下列公式:学习

ci=j=1Txαijhj

假设Ci中那个i就是上面的“汤姆”,那么Tx就是3,表明输入句子的长度,h1=f2(“Tom”),h2=f2(“Chase”),h3=f2(“Jerry”),对应的注意力模型权值分别是0.6,0.2,0.2,因此g函数就是个加权求和函数。若是形象表示的话,翻译中文单词“汤姆”的时候,数学公式对应的中间语义表示Ci的造成过程相似下图:
这里写图片描述优化

这里还有一个问题:生成目标句子某个单词,好比“汤姆”的时候,你怎么知道AM模型所须要的输入句子单词注意力分配几率分布值呢?就是说“汤姆”对应的几率分布:编码

(Tom,0.6)(Chase,0.2)(Jerry,0.2)atom

是如何获得的呢?

为了便于说明,咱们假设对图1的非AM模型的Encoder-Decoder框架进行细化,Encoder采用RNN模型,Decoder也采用RNN模型,这是比较常见的一种模型配置,则图1的图转换为下图:
这里写图片描述

注意力分配几率分布值的通用计算过程:

这里写图片描述

至关于在原来的模型上,又加了一个单层DNN网络,当前输出词Yi针对某一个输入词j的注意力权重由当前的隐层Hi,以及输入词j的隐层状态(hj)共同决定;而后再接一个sofrmax获得0-1的几率值。

写成公式[2]:

αij=exp(eij)Txk=1exp(eik)eij=a(si1,hj)

也就是说,si−1先跟每一个h分别计算获得一个数值,而后使用softmax获得i时刻的输出在Tx个输入隐藏状态中的注意力分配向量。这个分配向量也就是计算ci的权重。咱们如今再把公式按照执行顺序汇总一下[3]:

eij=a(si1,hj)αij=exp(eij)Txk=1exp(eik)ci=j=1Txαijhjsi=f(si1,yi1,ci)yi=g(yi1,si,ci)

[3]做者还给了一个示意图:

这里写图片描述

上面主要在讨论解码,相比于上面解码的创新,编码就比较普通了,只是传统的单向的RNN中,数据是按顺序输入的,所以第j个隐藏状态h→j只能携带第j个单词自己以及以前的一些信息;而若是逆序输入,则h←j包含第j个单词及以后的一些信息。若是把这两个结合起来,hj=[h→j,h←j]就包含了第j个输入和先后的信息。

Attention机制的一个主要优点是它让咱们可以解释并可视化整个模型。举个例子,经过对attention权重矩阵a的可视化,咱们可以理解模型翻译的过程(相关词的关注点)。

这里写图片描述
当从法语译为英语时,网络模型顺序地关注每一个输入状态,但有时输出一个词语时会关注两个原文的词语,好比将“la Syrie”翻译为“Syria”。

下面讨论一些RNN+NLP以外的AM的问题,这些参考[4]

**

Attention的成本

**
若是再仔细观察attention的等式,咱们会发现attention机制有必定的成本。咱们须要为每一个输入输出组合分别计算attention值。50个单词的输入序列和50个单词的输出序列须要计算2500个attention值。这还不算太糟糕,但若是你作字符级别的计算,并且字符序列长达几百个字符,那么attention机制将会变得代价昂贵。

其实它和咱们的直觉偏偏相反。人类的注意力是节省计算资源的。当专一于一件事时,咱们能忽略其它事情。但这并非咱们上一个模型的做法。咱们在决定专一于某个方面以前先仔细观察每件事。直观地说,这至关于输出一个翻译后的词语,而后遍历记忆里全部文本再决定下一个输出什么。这彷佛是一种浪费,并且没人会这么干。事实上,它更相似于内存访问,不是attention,在我看来有点儿用词不当(下文会继续讨论)。不过,这并无阻碍attention机制的流行传播。

attention的另外一种替代方法是用强化学习(Reinforcement Learning)来预测关注点的大概位置。这听起来更像是人的注意力,这也是Recurrent Models of Visual Attention文中的做法。然而,强化学习模型不能用反向传播算法端到端训练,所以它在NLP的应用不是很普遍(我本人反而以为这里有突破点,数学上的不可求解必然会获得优化,attention model在RL领域的应用确实很是有趣)。

机器翻译以外领域的Attention机制

到目前为止,咱们已经见识了attention在机器翻译领域的应用。但上述的attention机制一样也能应用于递归模型。让咱们再来看几个例子。

在Show,Attend and Tell一文中,做者将attention机制应用于生成图片的描述。他们用卷积神经网络来“编码”图片,并用一个递归神经网络模型和attention机制来生成描述。经过对attention权重值的可视化(就如以前机器翻译的例子同样),在生成词语的同时咱们能解释模型正在关注哪一个部分。
这里写图片描述

在Grammar as a Foreign Language论文中,做者用递归神经网络模型和attention机制的来生成语法分析树。可视化的attention矩阵让人深刻地了解网络模型如何生成这些树:

这里写图片描述

在Teaching Machines to Read and Comprehend论文里,做者利用RNN模型读入文本,先读入一个(合成的)问题,而后产生一个答案。经过将attention可视化,咱们能够看到网络模型在试图寻找问题答案的时候关注哪些方面:

这里写图片描述

ATTENTION = (FUZZY) MEMORY?

attention机制解决的根本问题是容许网络返回到输入序列,而不是把全部信息编码成固定长度的向量。正如我在上面提到,我认为使用attention有点儿用词不当。换句话说,attention机制只是简单地让网络模型访问它的内部存储器,也就是编码器的隐藏状态。在这种解释中,网络选择从记忆中检索东西,而不是选择“注意”什么。不一样于典型的内存,这里的内存访问机制是弹性的,也就是说模型检索到的是全部内存位置的加权组合,而不是某个独立离散位置的值。弹性的内存访问机制好处在于咱们能够很容易地用反向传播算法端到端地训练网络模型(虽然有non-fuzzy的方法,其中的梯度使用抽样方法计算,而不是反向传播)。

记忆机制自己的历史更久远。标准递归网络模型的隐藏状态自己就是一种内部记忆。RNN因为存在梯度消失问题而没法从长距离依赖学习。LSTM经过门控机制对此作了改善,它容许显式的记忆删除和更新。

更复杂的内存结构的趋势还在延续。End-To-End Memory Networks一文中的方法容许网络在输出内容前屡次读入相同的序列,每一步都更新记忆内容。举个例子,输入一个故事,在通过多步推理以后回答一个问题。然而,当网络参数的权重以某种特定方式被绑定,端到端记忆网络的记忆机制就和这里所介绍的attention机制同样了,只是它是多跳的记忆(由于它试图整合多个句子信息)。

神经图灵机器使用相似的记忆机制,但有一个更复杂的解决方案,它同时基于内容(如在这里)和位置,使网络模型经过学习模式来执行简单的计算机程序,好比排序算法。

在未来,咱们极可能看到记忆机制和attention机制之间有更清晰的区别,也许是沿着Reinforcement Learning Neural Turing Machines,它尝试学习访问模式来处理外部接口。


本文其实是对网络上的一些很棒的博文的整理,便于本身之后回忆理解,实际上网上写的东西通常都比较浅显易懂,可是真正要理解仍是建议看一下相关论文,基本的两篇推荐[2][6],更多论文能够参考网页[7][8]的参考文献;最后再推荐一个网页文章[5],介绍了RNN模型在Attention以及Memory方向的一些变化,总结的很不错,后面有时间我再用本身的理解来记录一下,看完本文的同窗能够看看:)


参考资料

[1] http://blog.csdn.net/malefactor/article/details/50550211
[2] NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE
[3] http://blog.csdn.net/u014595019/article/details/52826423
[4] http://geek.csdn.net/news/detail/50558
[5] http://distill.pub/2016/augmented-rnns/
[6] Sequence to Sequence Learning with Neural Networks, 2014, Google
[7] https://www.52ml.net/20093.html
[8] http://blog.csdn.net/malefactor/article/details/50583474