记忆网络Memory Network

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Irving_zhang/article/details/79094416

本专栏的第一篇文章对话系统综述中提到,seq2seq中的记忆依靠rnnCell或者lstmCell实现,但是rnn和lstm的记忆能力实在有限,最多也就记忆十几个时间步长。因此当句子长度增长时或者需要添加先验知识时,seq2seq就不能满足此时对话系统的需求了。

比起人工增加RNN隐藏状态大小,我们更愿意任意增加加入模型的知识量,同时对模型本身做出最小限度改变。基本上,我们能用独立存储器——作为一种神经网络能够按需读写的知识库——来增强模型。你可以把神经网络视为CPU,而且将这种新的外部存储器视为RAM。下面按照facebook ai研究所和google deepmind研究所的进展回顾一下:

Facebook AI:

2015年提出MEMORY NETWORKS,使用记忆网络增强记忆。(引用数:475)

2015年提出End-To-End Memory Networks,针对上一篇文章中存在的无法端到端训练的问题,提出了端到端的记忆网络。(引用数:467)

2016年提出Key-Value Memory Networks for Directly Reading Documents,在端到端的基础上增加记忆的规模。(引用数:68)

2017年提出TRACKING THE WORLD STATE WITH
RECURRENT ENTITY NETWORKS
,论文提出了一种新的动态记忆网络,其使用固定长度的记忆单元来存储世界上的实体,每个记忆单元对应一个实体,主要存储该实体相关的属性(譬如一个人拿了什么东西,在哪里,跟谁等等信息),且该记忆会随着输入内容实时更新。(引用数:27)

Google DeepMind:

2014年提出Neural Turing Machines,神经图灵机,同facebook团队的记忆网络一样,是开篇之作。(引用数:517)

2015年提出Neural Random Access Machines,神经网络随机存取机。(引用数:55)

2015年提出Learning to Transduce with Unbounded Memory,使用诸如栈或(双端)队列结构的连续版本。(引用数:99)

2016年提出Neural GPUs Learn Algorithms,神经网络GPU,使用了带有读写磁头的磁带。(引用数:86)

本专栏接下来会按照facebook和google的论文顺序进行研究,本篇就从facebook团队的MEMORY NETWORKS开始。

Memory Network出现之前,大多数机器学习的模型都缺乏可以读取和写入外部知识的组件,例如,给定一系列事实或故事,然后要求回答关于该主题的问题。原则上这可以通过如RNN等模型进行语言建模来实现,因为这些模型可以被训练在阅读了一串文字之后用来预测下一个输出。然而,它们的记忆(隐藏状态和权重编码)通常太小,并且不能精确地记住过去的事实(知识被压缩成密集的向量)。

一个Memory Network由一个记忆数组m(一个向量的数组或者一个字符串数组,index by i)和四个组件(输入I,泛化G,输出O,回答R)组成。

这里写图片描述

四个组件的作用:

I :(输入特征映射) - 将输入转换为记忆网络内部特征的表示。给定输入x,可以是字符、单词、句子等不同的粒度,通过I(x)得到记忆网络内部的特征。

G :(更新记忆) - 使用新的输入更新记忆数组m。

mi=G(mi,I(x),m)

即通过输入I(x)和记忆数组m,来更新对应的记忆 mi 。比如论文中给出了一个G()函数的例子:
mH(x)=I(x)

即将I(x)直接插入到记忆单元的插槽(slot)中,H(x)就是选择插槽的函数,这样只更新选择的插槽的记忆,而不更新其他的记忆。论文中也说,更复杂的G()函数,可以更新其他相关的旧的记忆,也可以在memory大小不够时进行遗忘。

O:(输出) - 在记忆数组m更新完以后,就可以将输入和记忆单元联系起来,根据输入选择与之相关的记忆单元。

o=O(I(x),m)

k为超参数,代表支持事例的个数。当k=1时:

o1=O1(x,m)=argmaxi=1,,NsO(I(x),mi)

即根据输出I(x)从记忆单元中选择出与I(x)最相关的记忆事实。而当k=2时,

o2=O2(x,m)=argmaxi=1,,NsO([I(x),mo1],mi)

即将输入I(x)与第一个选择出来的记忆合并,然后再接着选择第二个与之相关的记忆。值得一提的是,因为此处加入了支持事实这一变量,因此在训练的时候数据集除了需要输入文本、问题和答案之外,还需要有支持事实这一个参数。

R:(输出回答) - 得到了输入编码向量I(x),记忆数组m和需要的支持事实,就可以根据问题来得到需要的答案了。文中给出了一个简单的R()函数,将输入和选择的记忆单元与此表中的每个单词进行评分Sr,然后选择得分最大的单词作为回答。即:

r=argmaxwWsR([x,mo1,mo2],w)

举一个例子,
这里写图片描述

前两行为输入的先验知识,第三行有一个问题“where is the milk now?” ,然后得到回答“office”。

根据question:“where is the milk now?”,得到最相关的记忆mo1=“Joe left the milk”,然后由于k=2,得到mo2== “Joe travelled to the office”,然后将[x,mo1,mo2]与词表W中的每个单词w进行评分,得到得分最大的单词”office”作为回复。在论文中也给出了评分函数sR和sO的表达式,它们有相同的样式:

这里写图片描述

U是一个n*D的矩阵,D是特征个数,n是嵌入层的维度。 ϕx ϕy 将原始的文本映射到特征空间(如果已经映射过的,直接使用映射过的向量)。

当k=2时的目标函数:

这里写图片描述

其中带上划线的为真实的label,可以看到当k=2时的目标函数就是使支持事实mo1、mo2和回复r都向训练集收敛。

这篇论文提出了一种泛化的的模型架构(Memory Network),但是很多部分并没有做得很完善,论文接下来也对输入词、memory比较大、新词等问题进行了专门的阐述,但是由于不是端到端训练的过程(因为要求训练集必须有支持事实这一事实),所以可以应用的场景较少,因此接下来Facebook团队就提出了端到端的记忆网络,这在下一篇文章中会详细说明并且实现。

猜你喜欢

转载自blog.csdn.net/Irving_zhang/article/details/79094416