记忆网络之Dynamic Memory Networks模型介绍及代码实现

记忆网络之Dynamic Memory Networks

今天我们要介绍的论文是“Ask Me Anything: Dynamic Memory Networks for Natural Language Processing”,这篇论文发表于2015年6月,从题目中就可以看得出来,本文所提出的模型在多种任务中均取得了非常优秀的表现,论文一开始说道,NLP中很多任务都可以归结为QA问题,所以本文的DMN模型以QA为基础进行训练,但是可以扩展到很多别的任务中,包括序列标注、分类、seq-to-seq、QA等等。之所以有这么强的推广能力,原因就在于其使用RNN作为处理数据的工具,而大部分NLP任务都是序列问题,所以很方便就可以进行推广。而前面介绍的几篇Memory Networks的局限性就在于,其使用词袋子的方法处理输入,使用embedding来编码输入的信息,限制了模型用在别的任务上面。

模型架构

本文提出的DMN网络模型包含输入、问题、情景记忆、回答四个模块,架构图如下所示。模型首先会计算输入和问题的向量表示,然后根据问题触发Attention机制,使用门控的方法选择出跟问题相关的输入。然后情景记忆模块会结合相关的输入和问题进行迭代生成记忆,并且生成一个答案的向量表示。最只答案模块结合该向量以及问题向量,生成最终的答案。从整个框架上看跟MemNN十分相似,也是四大模块,而且各模块的功能都很像。

接下来我们看一个各个模块的细节是如何实现的,这也是其区别与MemNN的地方。首先结合实例和细节模型图了解一下模型的原理:

如上图所示,假设我们的输入就是Input模块中的8句话,问题是“Where is the football?”首先,模型会将相应的输入都编码成向量表示(使用GRU),如图中的S1~S8和问题向量q。接下来q会触发Attention机制,对输入的向量进行评分计算,如上图中在计算第一层的memory时,只选择了S7(因为问题是足球在哪,而S7是jhon放下了足球,与问题最为相关)。然后q作为第一层GRU的初始隐层状态进行迭代计算得到第一层的记忆m1;之后因为第一层选择出了john这个关键词,所以在第二层memory计算时,q会选择出S2和S6(其中S2属于干扰信息,权重较小),同样结合m1进行迭代计算得到第二层的记忆m2,然后将其作为输出向量传递给Answer模块,最终生成最后的答案hallway。这就是整个模型直观的解释,然后我们在对每个模块一一介绍。

Input Module

使用GRU对输入进行编码,(这里论文中有提到GRU和LSTM,说GRU可以达到与LSTM相似的准确度而且参数更少计算更为高效,但都比RNN要好),具体GRU的计算公式就不在详细列了,这里说一下当输入不通时应该如何区别对待。

  • 输入是一个句子时,直接输入GRU,步长就是句子的长度。最终也会输出句长个向量表示(对应S1~S8),这是Attention机制用来选与Question最相关的单词;
  • 输入是一堆句子时,将句子连接成一个长的单词序列,然后每个句子之间使用end-of-sentence的特殊标志进行分割,然后将每个end-of-sentence处的隐层状态输出即可,这时Attention机制选择的就是与Question相关的句子表示;

Question Module

这部分与Input Module一样,就是使用GRU将Question编码成向量。不同的是,最后只输出最后的隐层向量即可,而不需要像Input模块那样(输入是句子时,会输出句长个向量)。而且,q向量除了用于Attention外,还会作为Memory模块GRU的初始隐层状态~~

Episodic Memory Module

本模块主要包含Attention机制、Memory更新机制两部分组成,每次迭代都会通过Attention机制对输入向量进行权重计算,然后生成新的记忆。

首先看一下Attention机制,这里使用一个门控函数作为Attention。输入是本时刻的输入c,前一时刻的记忆m和问题q。首先计算相互之间的相似度作为特征向量传入一个两层的神经网络,最终计算出来的值就是门控函数的值,也就是该输入与问题之间的相似度。如下:

其中相似度的特征向量是有c,m,q,c*m,c*q,|c-q|,|c-m|,cWq,cWm contact起来的向量,将其传入一个二层神经网络即可。

接下来看一下记忆更新机制,计算出门控函数的值之后,我们就要根据其大小对记忆进行更新。更新方法就是GRU算出的记忆乘以门控值,再加上原始记忆乘以1-门控值,其实就类似于反向传播中的梯度更新一样。公式如下,更直观:

Answer Module

仍然使用GRU最为本模块的模型,根据memory模块最后的输出向量(将其作为初始隐层状态),然后输入使用的是问题和上一时刻的输出值连接起来(每个时刻都是用q向量)。并使用交叉熵损失函数作为loss进行反向传播训练。

模型扩展

以上就是DMN的模型架构及细节介绍,可以看得出来,其每个模块都使用GRU作为编码/记忆的基础模型,而且模型性能很依赖于Attention机制的效果。所以可以从以上两个方面对DMN进行改进,接下来我们就参考两篇论文来说一下他们对DMN作出的改进:

DMTN

这是论文“Ask Me Even More: Dynamic Memory Tensor Networks (Extended Model)”所提出的改进模型,DMN在用于bAbI数据集时,和MemNN一样,需要对答案所依赖的事实进行监督训练。而本文所提出的模型由于改进了Attention机制,所以可以自己学习到这个点。本文提出的模型叫做Dynamic Memory Tensor Network(DMTN),主要的改进点就是DMN的Attention机制,其他地方未做改动。

原始的Attention机制,首先根据c,m,q三个向量构造一个相似度的特征向量,然后通过一个二层神经网络计算门控值g(见上图)。而DMTN中,作者认为上面那种人工构造特征向量计算相似度的方法存在某种局限,所以推广到让模型自己学习参数构造该特征向量,最后仍适用一个二层神经网络计算门控值g。如下图所示,其实就是将原来的内积、|~|距离替换成使用矩阵参数学习两个向量之间的相似度而已(个人感觉比较牵强==):

然后作者有尝试了另外一种方案,令z=(c,m,q),然后使用下面的公式直接进行计算,而不再使用上面的几个变量连接的方法,这样可以减少参数量的同时保持比较高的准确度:

DMN+

这是论文“Dynamic Memory Networks for Visual and Textual Question Answering”提出的改进模型。上面的DMTN改动较小,仅仅是对特征向量表示方法的一些尝试。而本篇论文所提出的改进就相对较多,而且还把模型运用到了visual QA的任务上面并取得了较好地成果。其改进点主要集中在对Input module、Attention机制和Memory更新三个地方,是结合了End-to-End MemNN和DMN两个模型的优点作出的改进,可以说是比较完善的解决方案,下面我们看一下改进的点:

1,Input Module的改进:考虑到DMN的强监督性,作者认为是由两点导致的,一是输入模块采用单向GRU,所以只能记住前向的上下文,而无法get到后向上下文的相关信息。二是答案的依据可能距离问题较远,单词水平的GRU无法记忆这么远的信息。所以模型无法自己学习到所以来的句子,而要靠监督学习辅助。因此本文提出了Input Fusion Layer来解决这个问题。

该模型分为两部分,首先将句子采用positional Encoding的方法编码成一个向量(这部分可以参考End-to-End那篇论文,其实就是对句子中每个单词进行位置编码,然后加权求和。这部分主要是解决上面第二个问题,也就是从句子层面编码,然后再输入GRU,以减小文体之间的距离。而且,根据要解决的任务,问题总是于某个句子相关,所以从句子层面进行建模更合理),这部分就是论文所说的sentence reader。这里作者说也尝试了使用GRU或者LSTM进行句子编码,然后回过拟合,而且计算量较大。所以直接使用这种位置编码的方法效果反而会更好。

接下来将所有句子表示输入一个双向GRU模型进行学习,得到其表示,也就是Input Fusion Layer。这部分主要是让句子之间进行信息的交互,学习到前后上下文的信息并进行编码。从而解决上面提出的第一个问题。其结构如下图所示:

2,Attention机制的改进:这部分与DMN思想一样,但是细看会发现有一定区别。这里把一开始简单的门控值作为Attention的方法替换成了使用GRU来产生一个中间输出c。而这个c就相当于End-to-End模型中的softmax的评分向量~~(这里可能比较绕,需要好好理解一下)。

首先同样是使用特征向量来构造门控值,如下图所示,但是这里作者有省去了两项含有参数的部分,一方面是为了减少计算量,另一方面作者认为并不需要这些项,简直与上面那篇论文完全相反的思路,这里在特征向量的构造上做了尽可能的简化。

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值