【转】自然语言处理中的Encoder-Decoder模型,基本Sequence to Sequence模型及Attention Model注意力模型


注:本文出自Bin的专栏blog.csdn.NET/xbinworld。

  Encoder-Decoder(编码-解码)是深度学习中非常常见的一个模型框架,比如无监督算法的auto-encoding就是用编码-解码的结构设计并训练的;比如这两年比较热的image caption的应用,就是CNN-RNN的编码-解码框架;再比如神经网络机器翻译NMT模型,往往就是LSTM-LSTM的编码-解码框架。因此,准确的说,Encoder-Decoder并不是一个具体的模型,而是一类框架。Encoder和Decoder部分可以是任意的文字,语音,图像,视频数据,模型可以采用CNN,RNN,BiRNN、LSTM、GRU等等。所以基于Encoder-Decoder,我们可以设计出各种各样的应用算法。

  Encoder-Decoder框架有一个最显著的特征就是它是一个End-to-End学习的算法;本文将以文本-文本的例子作为介绍,这样的模型往往用在机器翻译中,比如将法语翻译成英语。这样的模型也被叫做 Sequence to Sequence learning[1]。所谓编码,就是将输入序列转化成一个固定长度的向量;解码,就是将之前生成的固定向量再转化成输出序列。 如下图示意[3]:

Encoder-Decoder

  这边为了方便阐述,选取了编码和解码都是RNN的组合。在RNN中,当前时刻隐层状态是由上一时刻的隐层状态和当前时刻的输入决定的,也就是

 

  获得了各个时刻的隐层状态以后,再将信息汇总,生成最后的语义编码c

  q表示某种非线性函数。在[1]中,作者采用LSTM网络作为Encoder网络,实际上在LSTM或者基本的RNN网络中,当前时刻计算完后是看不见前面时刻的隐层状态的了,所以就是用最后一个时刻的隐层状态作为语义编码c,即

 

  解码过程我们要根据给定的语义编码C和已经生成的输出序列y1,y2,…yt−1来预测下一个输出的单词yt,实际上就是把生成句子y={y1,y2,yT}的联合概率分解成按顺序的条件概率:

 

  而每一个条件概率又可以写成是 

 

  其中st是输出RNN中的隐藏层,c代表之前提过的语义向量,yt1表示上个时刻的输出。g表示一种非线性变换,往往就是指一种多层的函数,可以输出yt的概率(比如多层RNN后接softmax)。

  所以,在文本序列的Encoder-Decoder模型中,原本RNN(LSTM)语言模型是要估计p(y1,y2,yT|x1,x2,...,xT),给定一串输入x,得到一串输出y(不需要等长),但是因为Encoder-Decoder中间用语义编码c把前后两部分隔开了,所以输出句子y只需要和c相关即可。

这里写图片描述

  只要端到端训练RNN(LSTM)网络就可以了,在每一个句子末尾打上一个end-of-sentence symbol, EOS符号,用输入句子来预测输出句子。这样的模型就可以完成基本的英语-法语的翻译任务。

  实际上这样的模型能做什么应用完全取决于训练数据,如果用英语-法语对应句子作为输入输出训练,那就是英法翻译;如果用文章-摘要来训练那就是自动摘要机了。

  基本的Encoder-Decoder模型非常经典,但是也有局限性。最大的局限性就在于编码和解码之间的唯一联系就是一个固定长度的语义向量c。也就是说,编码器要将整个序列的信息压缩进一个固定长度的向量中去。但是这样做有两个弊端,一是语义向量无法完全表示整个序列的信息,还有就是先输入的内容携带的信息会被后输入的信息稀释掉,或者说,被覆盖了。输入序列越长,这个现象就越严重。这就使得在解码的时候一开始就没有获得输入序列足够的信息, 那么解码的准确度自然也就要打个折扣了[3]。

  为了弥补上述基本Encoder-Decoder模型的局限性,近两年NLP领域提出Attention Model(注意力模型),典型的例子就是在机器翻译的时候,让生成词不是只能关注全局的语义编码向量c,而是增加了一个“注意力范围”,表示接下来输出词时候要重点关注输入序列中的哪些部分,然后根据关注的区域来产生下一个输出,如下图所示:

这里写图片描述

  相比于之前的encoder-decoder模型,attention模型最大的区别就在于它不在要求编码器将所有输入信息都编码进一个固定长度的向量之中。相反,此时编码器需要将输入编码成一个向量的序列,而在解码的时候,每一步都会选择性的从向量序列中挑选一个子集进行进一步处理。这样,在产生每一个输出的时候,都能够做到充分利用输入序列携带的信息。而且这种方法在翻译任务中取得了非常不错的成果。很显然,每一个输出单词在计算的时候,参考的语义编码向量c都是不一样的,也就是它们的注意力焦点是不一样的。

  基本Sequence to Sequence模型描述了基本的Encoder-Decoder模型,在作为翻译模型的时候,这种基本的Encoder-Decoder模型有较大缺点,就是Encoder部分每一个输入对Decoder部分每一个输出的贡献都是一样的。下面先看一个例子[1],

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

这里写图片描述

  没有引入注意力的模型在输入句子比较短的时候估计问题不大,但是如果输入句子比较长,此时所有语义完全通过一个中间语义向量来表示,单词自身的信息已经消失,可想而知会丢失很多细节信息,这也是为何要引入注意力模型的重要原因。如果引入AM模型的话,应该在翻译“杰瑞”的时候,体现出英文单词对于翻译当前中文单词不同的影响程度,比如给出类似下面一个概率分布值: 

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

  而每个Ci可能对应着不同的源语句子单词的注意力分配概率分布,比如对于上面的英汉翻译来说,其对应的信息可能如下:

这里写图片描述

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

  假设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]: 

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

  [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,它尝试学习访问模式来处理外部接口。

 

参考资料

[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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM