MEMORY NETWORKS
摘要
作者说自己提出了一个新的学习模型叫做“memory networks”,模型将推理与“长记忆”组件相结合。使用长记忆组件,可以用其进行推理预测,作者将该模型用于问答系统QA(Question Answering)。
介绍——为什么要提出这个模型
作者说当前的大多数的机器学习系统,无法自由的对记忆组件进行读写。如果可以无缝的自由读写,那么将大大提高模型的预测、推理能力。比如说,对于问答系统、文章推理,此类问题都会涉及大量的上下文内容,只有通过对上文内容的分析,才能获得较优的回答或推理。但是,当前包括RNN或LSTM等模型在内,虽然存在记忆功能,但并不理想,或者说是记忆单元太小了,不足以对上文的信息进行存储。所以作者就想将当前优秀的机器学习算法同“记忆”模块向组合,这样记忆模块的存储以及读写就弥补了原始算法的缺陷。
模型概述
既然知道了模型的想法和要解决的问题,那么该怎么解决呢?
作者也是简单粗暴,你不是存储记忆单元小吗?好,我给你一个单独的存储单元,并且空间很大,记为Memory M。这个M是什么呢?其实它就是一个数组对象,
mi
代表数组的第i个对象。除此之外,memory networks还有其他四个组件,分别是
I,G,O,R
。
1.
I(Input)
代表的是输入特征映射,作用是将原始输入转换成模型的内部表示。比如说文章中作者以VSM(Vector Space Model) 作为输入的模型内部表示,当然还可以有很多其他的表示,如词嵌入(word2vect)表示。
2.
G(Generalization)
的作用是对于给定的输入,对M进行更新。这个组件其实作者并没有向文章中提出的完全使用起来,而是将其作为未来可能将使用到的模块。
3.
O(OutputFeatureMap)
根据当前给定的输入以及M的状态,给出输出。本文中主要用于 获取与问题最相关的M的下标。
4. R(Response) 响应组件。将产生的输出转换成想要的对应的格式。例如,可以将输出作为RNN的输入,用于sequence-to-sequence任务。
由这个四大组件,作者就提出了该模型Memory Neural Networks(MemNNs)。
整个模型对于输入就产生了一个流过程:
从给出的架构可以看出,作者认为本次提出的更是一种想法,在这种架构下,可以完成任何你想干的事情。例如说,内部特征表示文章中使用VSM,你可以使用word embedding;文中响应是根据 output 的输出,将其映射到单一的词上,这里也可以换成RNN、SVM或更加复杂的模型;所以说MeMNNS具有较大的潜力。
案例分析
文章中作者给出了一个样例,样例给出一段文章,文章之后紧跟上提问,模型的任务就是通过学习文章,对于提问给出解答。
下面看一下模型的四大组件是如何相互合作,完成这项任务的。
1.
Input
输入映射模块,首先要做的就是上文中的小短文(story)转换成内部特征表示
I(x)
。文章中使用的向量空间模型(VSM),每个维度以该词的词频为大小。
2.
Generation
将
I(x)
更新M的“卡槽”(slot)。
其中函数 H(x) 是用于选择M的卡槽的,其实可以简单的认为是数组的下标。作者在文章对G组件进行了简化,仅对输入的特征表示进行了存储,对于更新等更复杂的任务并太涉及,将其作为了G的潜力。如更新时不仅对指定下标 mi 进行更新,同时还可以根据上文或更久前的历史信息对多个下标进行更新。
所以在基础模型中,作者直接将输入存入到了M中。
3. 第1,第2步进行了简化,那么3,4步的任务就较重,同时也是该模型的核心部分。 Output 输出组件要做的就是根据当前输入问题,也就是“Where is the milk now?/Where is Joe?/Where was Joe before the office?”其中之一,查找M中与其关系最接近的上下文,也就是文中所说的k个候选支持记忆(candidate supporting memory),其中k可以手动设置,文中设置k=2.
- k=1 最相关的 mi
- k=2 第二相关的 mi
说明:
此处的 o1,o2 是M的的索引下标。
o2 公式表示中:
4. Response 响应组件以O的输出作为输入,得到单一词作为响应。
其中W是训练集中所有的词汇。
让我们串起来看一下,首先通过 I,G 将小文章读入,转化并存储在M中;然后通过 O 得到与问题
那么实验中作者是如何做到这一步的呢?其中的关键在函数
其中参数 U∈Rn×D , D代表特征的数量,n代表嵌入维度。 Φx 和 Φy 将原始的输入文本映射到D维的特征空间。文章中 D=3|W| ,D的维度等于所有词汇数量的3倍,为什么要3倍呢?因为作者认为词典中的每个词都有3种不同的表示方式,其中一份给予 Φy ,另两份给 Φx 。若输入x是问题中的词,则映射在位置1,若输入词是“记忆支撑”,那么映射在位置2,y映射在位置3。若其中某个位置未映射则置0。
在这 O,R 中,虽然 s(x,y) 的公式相同,但其中的训练参数U并不相同 Uo,UR 。
训练
模型的训练是一个监督学习的过程,使用最大距离损失和梯度下降法训练参数,文中作者的训练已知部分包括问题的答案和支持答案的句子索引(支持记忆索引),就是在训练中事先知道哪句话对答案的帮助最大,而训练的过程就是要让(1)模型选择支持答案的句子索引与事先知道的尽量一致,(2)预测的答案尽量一致。
可以看到,其中
f¯
和
f′¯¯¯
就是事先知道的“支持记忆索引”,
mo1,mo2
是模型预测的;
r¯
是正确答案,
r
是预测答案。
论文中作者还强调如果将
扩展
- 在模型中加入“segmentation”函数,以此来应对输入是词序列问题。
- 使用“hash”映射的方式替代原始直接memory存取,由此提高M的查询速度。
- 通过(1)添加三个维度,(2)修改 sot 函数使模型获取写时间特性,主要是何时写memory。
- 处理未登录词。对于未登录词,作者采用该词左右两边的内容来代替,所以
D
的维度从
3|W|−>5|W|
下面着重看一下扩展2:
作者说memory中的存入对象是何时被写入的,该特征信息对询问事实的问题没有太大帮助,如“中国的首都是哪里?”。但对于回答基于小故事的问题至关重要,作者在原有模型D的基础上增加了3个维度
D=3|W|+3
。
这三个维度的大小0/1,由公式
Φt(x,y,y′)
决定。判断x是否晚于y,x是否晚于y’,y是否晚于y’,用不着置为0。若
sot(x,y,y′)>0
模型选择y,否则选择y’。
由于公式的改变,原来的 o1=O1(x,m)=argmaxi=1,...Nso(x,mi) , ot 的公式:
遍历整个Memory,通过公式 sot(x,y,y′) 获取最优解。
训练方法变成:
代码
代码请参考(https://github.com/npow/MemNN)(感谢代码作者的贡献)