编辑整理:姚顺鹏 北京公瑾
出品平台:DataFunTalk
导读:知识图谱在现有的实际业务中存在着各种各样的应用,问答是其中一个非常重要的应用,本文主要关注如何解决基于知识图谱的复杂问题,该任务又称为推理问答。
本文的介绍会围绕下面四点展开:
--
01
背景介绍
1. KBQA
首先回顾下什么是知识图谱问答——KBQA。一个给定的知识图谱,包含了许多信息,如实体、属性以及实体之间的关系。基于一个已经构建好的知识图谱,我们希望机器能够通过知识图谱来自动回答一些问题,如上图中,提问“勒布朗·詹姆斯生日是什么时候?”,我们希望机器能够给出答案1984年12月30日。
2. 简单问答和复杂问答
一个问题,根据它的复杂程度,可以分为简单问题与复杂问题两种类型。对于简单问题来说,通常包含一个实体和一个关系,比如“中国的首都是哪里?”,这个问题包含了实体“中国”和关系“首都”。而复杂问题需要更多的推理技能才能解决,主要包括多跳推理、计数、比较、逻辑运算这四类。
3. 简单问答相关工作
简答问答通常可以拆分为两个任务,实体链接与关系分类。
对于问题“中国的首都是哪里?”,通过问题的mention“中国”链接到知识图谱中的实体“中国”。第二个任务是关系分类,寻找问题中提及的关系,问题中的谓语动词是“首都”,我们通过一个分类任务,将关系联系到知识图谱上。通过这两个任务得到了实体“中国”和关系“首都”,就能从知识图谱中提取出答案“北京”。
4. 复杂问答相关工作
复杂问答涉及的相关工作会更加多样,通常可以分为两类:
对于一个给定的自然语言问题,通过某些模型或操作,转换为逻辑语言,比如SPARQL是知识图谱中常用的逻辑语言,将逻辑语言输入到知识图谱引擎中并得出答案。
依赖于神经网络的表达能力,隐式地寻找问题的答案,比如Memory Networks在知识图谱中的变种Key-Value Memory Networks,引入了Key-Value键值对,对于一个给定的查询,维护一个查询向量,基于查询向量在Memory中进行多次的查询并更新查询向量,模拟复杂问题的多步推理。另一种检索法是基于图神经网络,基于给定的问题,在图神经网络中进行特征更新,最后通过分类得到答案。
这两类方法各有各的优势和劣势,语义解析法能够处理各种类型的问题,比如前文提到的四种类型复杂问题,而且整个推理过程的可解释性强,但构建推理过程的标注数据成本很高。对于信息检索法来讲,它只需要问题与答案这样的标注数据即可训练模型,可以端到端地预测结果,但解决问题能力有限,中间过程不可解释,所以一般使用中我们更倾向于语义解析法。
5. 关键问题
本文主要针对语义解析类方法探讨三个问题:
--
02
构造推理过程数据
首先考虑第一个问题,如何构造推理过程数据?
1. 推理过程描述语言——KoPL
SPARQL是一种非常经典的知识图谱逻辑语言,能够进行复杂问答的查询,但它更偏向于对图结构进行查询,无法获取查询的中间过程,也不符合人类思维的过程,不易于理解。
因此我们提出一种推理过程描述语言:Knowledge-oriented Programming Language,简称KoPL。通过这种语言来帮助我们构造推理过程数据。举个例子,对于问题“勒布朗·詹姆斯和他儿子谁更高?”,KoPL会将这个问题的推理过程分解为如上图右侧,首先在知识图谱中找到实体“勒布朗·詹姆斯”,再通过关系“儿子”找到对应的实体,然后对这两个实体进行一个比较操作,从中选取属性“高度”更大的实体,最终得到问题的答案。
可以看出,KoPL拆解问题更加注重过程,符合人类思维,更容易理解。
KoPL是一种强类型语言,它包含7种知识类型、实体、实体概念,比如中国就是一个实体概念、实体属性、实体之间的关系、属性型三元组、关系型三元组,以及一种更加高阶的修饰型知识。对于属性型三元组或关系型三元组,存在一种新的针对三元组的知识,比如说“勒布朗·詹姆斯参加选秀,被某个队选中”,而“被选中”这个事件的时间,就是一种高阶的修饰型知识,它是用于修饰一个已有的三元组。KoPL支持以上7种知识类型,并且在表达过程中,KoPL对这些类型进行了显式约束。
KoPL中包含了14个针对知识图谱元素的操作,比如找到知识图谱中某个实体或概念,根据属性值作为过滤条件找到对应的实体,也包括了13个查询操作,比如查询某个实体的名字。
KoPL具有以下四点优势:
2. 大规模知识库问答数据集——KQA Pro
基于KoPL的基本操作与组合,我们能够大规模地生成复杂问题,具体生成的策略有四个。第一个策略是模板,比如针对比较类型问题定义这样的模板“<>和<>谁的<属性>更<大/小>”,询问两个人的身高更高就可以套用这个模板,我们可以对这样的模板填充各种实体和属性得到不同的问题。第二个策略是采样,根据第一个策略得到的模板,我们在知识库中进行采样,然后对模板中空缺的位置进行填空,得到不同的问题。第三个策略是组合,根据KoPL的基本操作,我们可以做各种各样的排列组合得到不同的问题。第四个策略是递归,对于问题中已有的实体,我们对其进行递归拆解,增加问题的复杂度,比如将问题“勒布朗·詹姆斯和布朗尼·詹姆斯谁更高?”中的“布朗尼·詹姆斯”使用关系描述为“勒布朗·詹姆斯的儿子”,那么问题就会变为“勒布朗·詹姆斯和勒布朗·詹姆斯的儿子谁更高?”,这样问题的复杂度也就变高了。
基于这四种策略,我们可以生成大量多样化的高复杂度问题。
最终每个样例生成5个元素,由模板得到的问题,回答问题使用的SPARQL,问题拆解的KoPL,10个候选答案以及标准答案。
通过问题生成,我们得到了大量的模板问题以及问题对应的SPARQL, KoPL, 选项和标准答案。下一步对模板问题众包转写,在保持原意的前提下,转写得到更加流畅多样的问题。最后对众包转写的结果进行众包评测,评价指标为是否保持问题的原意和转写问题的流畅性,我们会丢弃未保持原意的问题,比如转写二“勒布朗·詹姆斯的个子是不是比他儿子高?”,这个转写将问题的答案变为是或否。
最终我们得到了约12万条五元组数据,将其命名为KQA Pro,是目前首个包含了自然语言、全知识类型、多种逻辑形式的大规模数据集。
3. 下一个问题
以上是我们探讨的第一个问题——如何构造大规模推理过程数据。在拥有领域一的推理过程数据之后,我们思考这些数据是否可以帮助其他领域学习推理过程?在这些领域里,已经有了一些问题和答案,但缺乏推理过程,比如是否可以使用金融领域的推理过程数据帮助医学领域的推理过程学习?
--
03
跨领域迁移
这是我们分享的第二个问题,我们希望将已有的推理过程迁移到其他领域中。
1. 跨领域迁移
考虑在KoPL推理过程的跨领域迁移,我们将推理过程划分为两个部分:
通过将推理过程分解这样两个部分之后,我们发现了骨架和参数的特点:
2. 骨架解析器
对于骨架部分的迁移,我们设计了一个带有注意力机制的Seq2Seq骨架解析器,选用BERT作为编码器,通过注意力机制选取BERT的编码结果,再输入到GRU解码器中,将骨架中的操作逐步解码出来。
3. 参数解析器
对于参数解析器,我们采取了不同的策略。由于参数与知识图谱是强相关的,所以我们需要对知识图谱中的元素也进行编码,这里使用BERT作为知识图谱元素的编码器。比如上图中,骨架解码器解码得到一个关于Concept的操作,我们将这个解码得到的特征向量与知识图谱中使用BERT编码的概念特征向量作相似度计算,选取相似度最高的概念。上图中相似度最高的是公司,所以最终选择公司作为参数。
4. 训练方法
我们将模型训练方法分为两个阶段:
5. 实验设定
下面介绍一下我们的实验设定:
WebQuestionSP和ComplexWebQuestions,使用Freebase构造的知识图谱,它们的训练数据分别为4737条和34689条。
上图右侧展示了两个知识图谱之间的差距,Source表示Wikidata的子集,Target表示Freebase。
6. 实验结果
我们在WebQSP和CWQ数据集上做了一些实验,在我们之前的SOTA方法能够做到74.0和44.0的准确率,而我们的完整方法能够做到76.5和58.7的准确率。从消融实验中可以看出,两个阶段对于结果来说都是非常重要的。
7. 下一个问题
假如我们现在没有推理过程数据,只有问题和答案的数据,能不能直接学习出推理过程?
--
04
隐式学习推理过程
这是我们分享的第三个话题,如何隐式地学习推理过程。
1. TransferNet
在隐式学习推理过程中,我们将复杂问题类型进行约束,仅考虑多跳类问题,通过实体之间的多跳关系进行回答,比如问题“xx公司的董事长投资了哪家公司”,通过主题实体“xx公司”的董事长关系找到张三,再通过张三的投资关系找到答案实体“yy公司”,中间过程的关系和实体称为推理路径。我们的目标是自动地把推理路径准确地学习出来。
我们的方法是通过向量矩阵乘法来建模实体转移,方法中有两个核心概念:
激活向量表示的是每一步中关注的实体,比如问题“xx公司的董事长投资了哪家公司”,在回答问题的推理过程中,我们分别关注到三个实体,分别是“xx公司”、“张三”和“yy公司”。它的维度为实体的数量,关注到哪个实体,对应位置的权重被置为1,其它实体置为0。
激活矩阵表示的是每一步中关注的关系,比如我们关注问题“xx公司的董事长投资了哪家公司”中的两个关系“董事长”和“投资”。我们通过一个矩阵来表示关系,对于知识图谱来说有N个节点,对这N个节点考虑它们两两之间的关系,得到一个NxN的矩阵。我们的激活矩阵对应到这个NxN的矩阵上,相应关系上的元素置为1,其它位置置为0。
激活向量和激活矩阵用a和W表示,因为这是一个多跳过程,使用上标t来表示进行到哪一步,每一步我们关注的实体和关系都是不一样的。方法的核心是建模实体通过关系转移到另一实体,我们通过at-1乘以Wt的矩阵乘法来实现,上图给出一个直观的例子。
我们可以通过链式乘法来进行多跳转移,一开始主题实体是a0,然后通过链式乘法构造不同的激活矩阵W,来一步一步建模多跳问题的转移。在每一步中通过注意力机制关注问题的不同部分,激活对应关系。如上图下侧,在第0步,找到问题中的主题实体“xx公司”,构造激活向量a0,在第1步中对问题做一个注意力机制,找到需要关注的关系“董事长”,然后将图谱中“董事长”对应的边做矩阵激活,得到W1,通过a0乘以W1得到激活向量a1这个实体,在第2步关注新的关系“投资”,将对应激活的边W2做矩阵乘法得到a2,最终得到实体答案“yy公司”。
上图展示了整个推理过程,我们的方法最显著的优势是推理过程完全可导,训练模型时仅需要对最终预测的实体施加loss,即在进行了第T步转移之后计算损失和优化,即可自动学出整个推理过程。
2. 实验结果
最后简单介绍我们三个数据集上做的实验,在针对电影领域的多跳数据集MetaQA,我们首次实现了100%准确率,比如三跳问题“xx电影的导演执导的影片中主角是谁?”,从“电影”跳到“导演”,再跳到“影片”,最后跳到“主角”,对于这样的问题,我们的模型实现了100%的准确率。
--
05
成果与资源
--
06
问答
Q:非链式查询如何解码?
A:非链式查询一般是二叉树的形式,我们可以通过前序或中序遍历的方法将其转变为链式查询。
Q:KoPL是否有一些序列化的表示方法?比如文本到查询图是如何生成的?
A:KoPL是一种过程化的语言,基本上不存在图结构。它主要有序列化和树形两种结构,树结构主要是二叉树。如果是SPARQL这种图结构,可以采用深度优先或广度优先方法来进行遍历。
Q:KBQA中需要对每个问题进行复杂度识别么?系统是通过实体加规则的方法进行判断的么?
A:这个问题不需要进行区分,如果复杂问题都能够回答的话,那么简单问题也能够回答得很好。简单问题可以看做多跳推理的特例,它是一跳的推理。如果要进行区分的话,可以直接训练一个分类模型。
Q:KoPL能够在Neo4J上进行推理?
A:目前来说是不行的,KoPL是运行在我们自研的引擎上。但KoPL是可以跟其它语言作转换,这是我们目前正在进行的工作,通过中间语言来将KoPL转换为其它查询语言。
今天的分享就到这里,谢谢大家。
有话要说...