前面两篇文章分别介绍了Memory Networks和End-To-End MemNN两种模型,但是都是基于bAbI数据集进行的介绍,更像是一种阅读理解式的任务,也就是给定一段文字和一个问题,从中找出答案。然而平时遇到的QA任务,往往并不会给定一段材料和问题,而是直接给一个问题需要给出答案,那么这种情况下应该如何使用记忆网络的模型来解决呢?我们这次结合两篇论文来介绍一下MemNN如何迁移到开放域的QA问题上。
首先说一下上面所提出的问题,如何在只有Question的时候直接回答呢?这里需要引入知识库(Knowledge Bases, KBS)的概念,其实在Memory Networks兴起之前,传统的QA都是通过知识库进行检索或者信息抽取等方式进行建模的(这个有时间应该也会专门研究一下,这里先不进行引申)。所谓知识库,其实就是将互联网上的信息经过专家人工提取和构造,以三元组的形式存储下来(subject, relationship, object),是一种非常结构化的信息,比较知名的有FreeBase。有了知识库,那么给定一个问题我们自然可以进行检索记忆并作出回答。那么Memory Network的优点是什么呢相比传统方法,因为问题往往是以自然语言的方式提出,而知识库是高度结构化的组织,所以如何进行检索或者信息抽取其实是一个很困难的工作,所以就引入了深度学习==另外还有一个问题就是,前面所提到的Memory Network记忆的都是一个相对较小的文档存储起来,那么面对KB这么庞大的知识库应该如何解决内存容量问题呢?下面我们进行探索。
第一篇要介绍的是Facebook在15年6月份发表的论文“Large-scale Simple Question Answering with Memory Networks”,作者是Bordes(之前他还发过一篇Question Answering with Subgraph Embedding,是将知识库子图进行Embedding,本文中也会用到相似的概念)和Weston(Memory Networks就是他的大作)还有Chopra(恩,他们几个经常一块发文章就对了==),说这个是因为最近看这方面文章发现这几位大牛出现频率过高,所以关注了一下。下面介绍一下本文的主要工作。
本文首先提出了一个数据集:Simple Question Answering(关于QA领域常用的数据集总结可以看文末)。由于以前的QA数据集都比较小(几千个问题),而且问题的类型比较局限,问题的语法也比较单一(自动生成的问题)。通过这些数据集学习出来的模型扩展型如何是一个很大的问题。所以本文作者构造了一个新的数据集,有以下几个特点:
接下来我们介绍一下论文使用的模型,仍然沿用Memory Networks提出的I、G、O、R四组件的架构,其工作流程如下:
这里专门加入了Reverb数据集是因为作者认为传统的数据集很小不具有扩展性,而且在单一数据集上训练出的模型在别的数据集上的泛化能力可能会很差,为了证明本论文训练出来的模型具有这种泛化能力加入了这一项。Reverb数据集跟FreeBase有一定差距,主要体现在他的非结构化,直接从文本中直接提取出来,有较少的人工干预。所以在实体数目相同的情况下,有更多的relationship。见下图:
熟悉了工作流程之后,接下来我们看一下I、G、O、R四个模块的设计细节:
Input Module:输入模块主要负责对FreeBase、Question、Reverb这三个输入数据进行Embedding操作,将其转化为向量表示。
Generalization Module:从Memory Networks那篇论文我们知道,G模块主要负责对记忆进行更新。这里是将FreeBase知识库的所有facts以Multigraph结构存储在记忆中。其中Entity作为结点,Relationship作为边。其实这里我并不太明白最终应该如何仿真实现,因为我们知道Memory是以数组的形式进行存储的,那么如何保存图结构呢?还是说论文本身就是用图结构来代替数组来存储Memory,如果是这样的话,最后如何选择与Question相关的Memory呢?这里的细节部分论文中都没有涉及,所以我也有点困惑,希望有大神可以指点一二。
至此我们就介绍完了本文所使用的模型和解决问题的思路。主要还是使用Memory Network结合FreeBase等知识库来进行QA任务的建模。
这篇文章相对来说没有什么创新,只不过是将Memory Networks和End-To-End MemNN模型运用到不同的数据集上面进行测试,并且针对不同的数据特点做出了一定的调整和修改,我们主要学习其针对不同任务是如何微调模型以解决问题的方法。
首先作者将QA任务分为检索和推理两部分(retrieval and inference)。其实就是将知识库保存在Memory中以供检索,然后结合问题推理其意图并作出回答这么一个模式。而且QA作为研究对话系统的一个“入门”任务,解决好这个对一个好的对话系统很有帮助。这里不再对模型进行介绍,因为前面两篇文章都已经介绍过了,主要来说一下文中使用到的三个数据集和做出的一些改进。
了解了数据集之后我们接下来看看针对每个数据集应该怎么修改模型的结构以适应。bAbI数据集就不用说了,因为End-to-end MemNN本身就可以直接对该数据集进行训练。
因为原始的模型输出是针对整个Vocabulary的,也就是从整个单词表中选出一个单词作为答案。但是MCTest是从4个候选答案中选择一个正确答案即可,这很显示一个很重要的信息,我们应该利用起来。此外,答案还可能是多个词,应该如何处理也是一个问题。
首先,如歌一个选项包含多个单词的话,就用下面BOW的方式进行压缩表示成一个向量。
然后对于四个选项而言,很明显正确答案就在其中,那么我们在这里就不需要在选择相关的记忆而直接对这四个答案进行相关性评分就可以了。并且直接把得分最高的当做是预测结果。这样做既利用了选项提供的信息,也简化了模型的复杂度。感觉看完这个方法效果应该是不错的,但是呢,看作者最后做的实验准确度却不是很高,跟baseline比起来还是有一定的差距==
接下来我们看一下针对Wiki QA应该如何修改模型。该数据集的特点是需要一个更大的Memory Size来存储所有的Wikipedia文章信息,此外,Vocabulary也更大,相对bAbI的40个单词中选择一个正确答案,这里需要从40000+个单词里面选择,难度太高。所以作者提出了两种基于剪枝的解决方法,思路就是根据Question对查找相关的memory,其实跟第一篇论文的思路是一样的。
上面这两种方法的好处在于,一方面可以加速模型的训练速度,另外一方面通过剪枝,可以将大部分不相关的数据去掉,达到消除噪声的目的,让模型更快地找到相关的memory。最终的效果如下所示,从结果可以看出来,使用剪枝的方法会使训练准确度降低,但是测试的准确度却有所提升。
最后我们总结一下QA领域常用的一些数据集及其特点和适应场景。