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

版权声明:本文为博主原创文章,欢迎转载分享,请注明本文出自Bin的专栏:http://blog.csdn.net/xbinworld https://blog.csdn.net/xbinworld/article/details/54607525

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


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

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

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

这里写图片描述
没有引入注意力的模型在输入句子比较短的时候估计问题不大,但是如果输入句子比较长,此时所有语义完全通过一个中间语义向量来表示,单词自身的信息已经消失,可想而知会丢失很多细节信息,这也是为何要引入注意力模型的重要原因。如果引入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)

是如何得到的呢?

为了便于说明,我们假设对图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

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页