内存网络-内存网络

记忆网络是深度学习的一个小分支。自2014提出以来,逐渐发展了几个成熟的模型。我更关心它在QA领域的应用和发展。本专栏将选择多篇论文系统介绍记忆网络的相关模型和应用。一些论文也将随着TensorFlow的实现而引入。

首先要介绍的论文是FaceBook在2014年发表的论文《记忆网络》(Memory Networks),同期提出的“神经图灵机”也采用了类似的方法(外部记忆)。传统的深度学习模型(RNN、LSTM、GRU等。)使用隐藏状态或注意机制作为它们的记忆功能,但这种方法产生的记忆量太小,无法准确记录一个段落所表达的全部内容,即输入被编码为密集向量时会丢失大量信息。因此,本文提出了一个可读可写的外部存储模块,并用推理组件对其进行训练,最终得到一个可以灵活操作的存储模块。接下来,我们来看看它的框架:

首先,该模型主要包括一系列记忆单元(可以看作一个数组,每个单元保存一句话的记忆)和I、G、O、r四个模块,结构图如下:

简单来说,输入的文本被输入模块编码成一个向量,然后作为泛化模块的输入,泛化模块根据输入向量读写内存,也就是更新内存。然后输出模块会根据问题(也会被输入模块编码)对内存的内容进行加权,根据与问题的相关程度对内存进行组合,得到输出向量。最后,应答模块会根据输出向量编码生成自然语言答案。每个模块的功能如下:

接下来,我们来看看基本模型的实现细节:

根据论文的描述,基本模型的I是简单的嵌入查找操作,即将原文转换成单词向量的形式,而G模块直接将输入向量存储在内存数组的下一个位置,不做其他操作,即直接写入新内存,不修改旧内存。主要工作在O和R模块中进行。O模块根据输入的问题向量从所有内存中选择topk相关的内存,具体选择方法如下:先选择内存中最相关的内存:

接下来,根据选择的o1和输入X,选择与它们最相关的存储器o2:

对于上式,如果X和o1都用线性向量表示(BOW等。),可分为以下求和,否则不能。

只需选择与问题最相关的topk内存插槽。作为R模块的输入,生成最终答案。其实用和上面一样的评分函数计算所有候选词和R输入的相关度也很简单,得分最高的词就可以作为正确答案输出:

上面多次使用的评分函数可以满足以下形式:

在最终的模型中,损失函数选择了保证金排名损失,即要求正确答案的得分比错误答案的得分至少高一个保证金r。公式如下:

这里的错误答案都是从样本中随机抽取的,而不是统计所有的错误样本。让我们举一个简单的例子来说明上述过程:

对于第一个问题:牛奶现在在哪里?输出模块将对所有的记忆(实际上是输入的句子)进行评分,并得到“乔离开了牛奶。”最高分,也就是和问题最相关的,然后给剩下的记忆打分,找出现在的奶在哪里?与乔最相关的记忆是离开牛奶。我们发现它是“乔旅行到办公室”。这样就可以找到最相关的记忆,然后用R模块给所有单词打分,找到分数最高的单词作为答案。

这篇论文的重点是他提出了一个通用的模型框架(记忆网络),但很多部分并不完善。论文后面也阐述了一些单词输入、大内存、生词等问题,但我觉得在此基础上看别人发表的论文更有用。所以这里就不做详细介绍了。