Memory Networks 通过结合长时记忆模块 和 推断模块 联合工作来进行推理。长时记忆模块可以进行读写,也为了用来预测。我们是为了问答系统来研究这个模型,长时记忆模块正作为问答系统的(类似内存的)知识库。
现在的RNN记忆能力不行,本文解决这个问题。核心思想是弄一个读写的内存组件。
一个Memory Networks包括一个内存m(也就是一个对象的数组,每个是来表示) 以及4个会被训练的组件 I G O R: I : (输入特征映射)–把输入转变成内部的特征表示 G : (生成)–在新的输入来了的时候更新旧的内存 O : (输出特征映射) – 给定新的输入和现在的内存状态,在特征表示空间 产生新的输出 R : (回馈结果) – 把输出转化为想要的格式,比如文本或者 动作Action
给一个输入x,x可以是 字,词,句子,图像,声音。然后: 1,把x转成内部特征表示I(x) 2,更新,给定I(x) 3,计算输出特征o,给定输入和内存 4,最后解码 输出特征o 为想要的输出 以上1-4的过程在 训练和测试 的时候差不多,但是测试的时候 I G O R 没有更新
I 部件:把文本转换成稀疏或者密集特征向量 G部件:G最简单的形式是把I(x)存储到内存的格子里,即: 这里H(x)是选择内存哪个格子的函数,可见H(x)在m的右下角index的位置。G更新m的index即H(x),但是内存的其他部分没有动。更加复杂的G可以更新以前的内存。如果输入的字母或者单词可以group成chunk,那么可以将每个chunk存在一个内存的格子里。
如果内存很大,比如Freebase或者Wikipedia,G就不能一下操作所有内存。
如果内存满了,就要有“遗忘”的H机制。
O和R部件:O用来读内存和做推断,R是最后的response用的。例如一个问答系统,O找到相关的内存,R产生实际的答案文本,R可以是根据O的输出的一个RNN。
I模块取文本作为输入,假设是一句话。文本被存储在下一个指定的内存格子 作为初始化的形式,S(x)返回下一个空的内存格子N,
上图中,
