华为史佳欣:基于知识图谱的复杂问题推理问答
分享嘉宾:史佳欣博士 华为云计算公司
编辑整理:姚顺鹏 北京公瑾
出品平台:DataFunTalk
导读: 知识图谱在现有的实际业务中存在着各种各样的应用,问答是其中一个非常重要的应用,本文主要关注如何解决基于知识图谱的复杂问题,该任务又称为推理问答。
本文的介绍会围绕下面四点展开:
- KBQA背景介绍
- 构造推理过程数据
- 跨领域迁移
- 隐式学习推理过程
01 背景介绍
1. KBQA
首先回顾下什么是知识图谱问答——KBQA。一个给定的知识图谱,包含了许多信息,如实体、属性以及实体之间的关系。基于一个已经构建好的知识图谱,我们希望机器能够通过知识图谱来自动回答一些问题,如上图中,提问“勒布朗·詹姆斯生日是什么时候?”,我们希望机器能够给出答案1984年12月30日。
2. 简单问答和复杂问答
一个问题,根据它的复杂程度,可以分为简单问题与复杂问题两种类型。对于简单问题来说,通常包含一个实体和一个关系,比如“中国的首都是哪里?”,这个问题包含了实体“中国”和关系“首都”。而复杂问题需要更多的推理技能才能解决,主要包括多跳推理、计数、比较、逻辑运算这四类。
- 多跳推理 (“XX公司的CEO有哪些朋友?”),从“XX公司”找到对应CEO的一跳,再从CEO找到对应朋友关系的第二跳,这样形成一个多跳推理的问题。
- 计数类型 ,统计满足某类条件或关系的实体的数量,比如“有多少家公司持有XX公司的股票?”。
- 比较类型 ,通过比较实体的某个属性,筛选得到符合条件的一个实体,比如“A股市场2021年涨幅最高的是哪家公司?”。
- 逻辑运算 ,对符合条件的实体集合作逻辑运算,比如“哪些专家同时在BAT工作过?”,对在BAT工作过的专家取交集运算。
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具有以下四点优势:
- 注重过程 :KoPL拆解问题的过程结果都是可见的,而SPARQL是无法定位中间过程的。
- 符合人类思维 :KoPL是一种过程性语言,将一个问题拆分为多个简单问题,然后组合进行解决。
- 操作具有良好的可组合性 :我们将知识图谱的复杂问答拆分为20多个简单操作,这些操作能够互相组合来解决各种各样的问题。
- 可以面向多种知识来源 :除了结构化数据外,还可以对非结构化的文本数据进行操作,比如KoPL还可以对Wikipedia的非结构化文本,描述文本问答的复杂问题的解决过程。
2. 大规模知识库问答数据集——KQA Pro
基于KoPL的基本操作与组合,我们能够大规模地生成复杂问题,具体生成的策略有四个。 第一个策略是模板 ,比如针对比较类型问题定义这样的模板“<>和<>谁的<属性>更<大/小>”,询问两个人的身高更高就可以套用这个模板,我们可以对这样的模板填充各种实体和属性得到不同的问题。 第二个策略是采样 ,根据第一个策略得到的模板,我们在知识库中进行采样,然后对模板中空缺的位置进行填空,得到不同的问题。 第三个策略是组合 ,根据KoPL的基本操作,我们可以做各种各样的排列组合得到不同的问题。 第四个策略是递归 ,对于问题中已有的实体,我们对其进行递归拆解,增加问题的复杂度,比如将问题“勒布朗·詹姆斯和布朗尼·詹姆斯谁更高?”中的“布朗尼·詹姆斯”使用关系描述为“勒布朗·詹姆斯的儿子”,那么问题就会变为“勒布朗·詹姆斯和勒布朗·詹姆斯的儿子谁更高?”,这样问题的复杂度也就变高了。
基于这四种策略,我们可以生成大量多样化的高复杂度问题。
最终每个样例生成5个元素,由模板得到的问题,回答问题使用的SPARQL,问题拆解的KoPL,10个候选答案以及标准答案。
通过问题生成,我们得到了大量的模板问题以及问题对应的SPARQL, KoPL, 选项和标准答案。下一步对模板问题众包转写,在保持原意的前提下,转写得到更加流畅多样的问题。最后对众包转写的结果进行众包评测,评价指标为是否保持问题的原意和转写问题的流畅性,我们会丢弃未保持原意的问题,比如转写二“勒布朗·詹姆斯的个子是不是比他儿子高?”,这个转写将问题的答案变为是或否。
最终我们得到了约12万条五元组数据,将其命名为KQA Pro,是目前首个包含了自然语言、全知识类型、多种逻辑形式的大规模数据集。
3. 下一个问题
以上是我们探讨的第一个问题——如何构造大规模推理过程数据。在拥有领域一的推理过程数据之后,我们思考这些数据是否可以帮助其他领域学习推理过程?在这些领域里,已经有了一些问题和答案,但缺乏推理过程,比如是否可以使用金融领域的推理过程数据帮助医学领域的推理过程学习?
03 跨领域迁移
这是我们分享的第二个问题,我们希望将已有的推理过程迁移到其他领域中。
1. 跨领域迁移
考虑在KoPL推理过程的跨领域迁移,我们将推理过程划分为两个部分:
- 第一个部分是推理过程的骨架 , 指的是图谱的基本操作 ,比如问题“AI行业哪家公司2021年融资最多?”对应的KoPL有四个操作,第一个操作是找到知识图谱中对应AI行业的实体,第二个操作是通过关系找到跟AI行业具有所属关系的实体,这个操作可以找到跟AI行业相关的实体,比如公司、高校或从业人员等,第三个操作是对概念进行过滤,得到行业的所有公司,最后第四个操作是从公司里去比较属性“2021年融资”,从中选出属性值最大的实体。
- 第二个部分是推理过程的参数 , 指的是骨架中每个操作选取的内容 ,比如Concept选择了公司,公司就是一个参数。
通过将推理过程分解这样两个部分之后,我们发现了 骨架和参数的特点 :
- 骨架与知识图谱本身是弱相关的,知识图谱一和知识图谱二的领域完全不一样,但在问题的骨架上有相似之处,比如问题一“AI行业哪家公司2021年融资最多?”与问题二“传染病领域哪家医院2021年病人最多?”提问的内容完全不一样,但骨架是类似的。所以我们认为骨架与问题是强相关的,比较容易在跨领域间进行迁移。
- 参数与知识图谱和问题都是强相关的,例如问题一中的参数均来自金融领域的知识图谱一,问题二中的参数则是来自医学领域的知识图谱二。
2. 骨架解析器
对于骨架部分的迁移,我们设计了一个带有注意力机制的Seq2Seq骨架解析器,选用BERT作为编码器,通过注意力机制选取BERT的编码结果,再输入到GRU解码器中,将骨架中的操作逐步解码出来。
3. 参数解析器
对于参数解析器,我们采取了不同的策略。由于参数与知识图谱是强相关的,所以我们需要对知识图谱中的元素也进行编码,这里使用BERT作为知识图谱元素的编码器。比如上图中,骨架解码器解码得到一个关于Concept的操作,我们将这个解码得到的特征向量与知识图谱中使用BERT编码的概念特征向量作相似度计算,选取相似度最高的概念。上图中相似度最高的是公司,所以最终选择公司作为参数。
4. 训练方法
我们将模型训练方法分为两个阶段:
- 阶段一 ,在领域一中进行有监督学习,通过标注好的推理过程数据训练骨架解析器和参数解析器。
- 阶段二 ,将阶段一训练好的两个解析器迁移到领域二上,采取强化学习的训练方法,在这个阶段中的训练数据是问答对的形式。对于一个问题,使用骨架解析器和参数解析器进行解析,解析过程中根据概率进行采样,得到不同的推理过程,再将这些不同的推理过程在相应的引擎上执行。比较执行结果与问题答案是否正确,给正确推理过程一个正向奖励,通过强化学习优化正确推理过程的概率,降低错误推理过程的概率。
5. 实验设定
下面介绍一下我们的实验设定:
- 领域一 ,采用KQA Pro数据集,使用Wikidata子集构造的知识图谱,训练数据为12万条。
- 领域二 ,使用两个公开的数据集:
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 成果与资源
- Shulin Cao*, Jiaxin Shi*, et al. KQA Pro: A Dataset with Explicit Compositional Programs for Complex Question Answering over Knowledge Base. ACL 2022.
- Shulin Cao, Jiaxin Shi, et al. Program Transfer for Answering Complex Questions over Knowledge Bases. ACL 2022.
- Jiaxin Shi, Shulin Cao, et al. TransferNet: An Effective and Transparent Framework for Multi-hop Question Answering over Relation Graph. EMNLP 2021.
- KoPL:https://kopl.xlore.cn/
- KQA Pro:
http://thukeg.gitee.io/kqa-pro/ - ProgramTransfer:
https://github.com/THU-KEG/ProgramTransfer - TransferNet:
https://github.com/shijx12/TransferNet
06 问答
Q:非链式查询如何解码?
A:非链式查询一般是二叉树的形式,我们可以通过前序或中序遍历的方法将其转变为链式查询。
Q:KoPL是否有一些序列化的表示方法?比如文本到查询图是如何生成的?
A:KoPL是一种过程化的语言,基本上不存在图结构。它主要有序列化和树形两种结构,树结构主要是二叉树。如果是SPARQL这种图结构,可以采用深度优先或广度优先方法来进行遍历。
Q:KBQA中需要对每个问题进行复杂度识别么?系统是通过实体加规则的方法进行判断的么?
A:这个问题不需要进行区分,如果复杂问题都能够回答的话,那么简单问题也能够回答得很好。简单问题可以看做多跳推理的特例,它是一跳的推理。如果要进行区分的话,可以直接训练一个分类模型。
Q:KoPL能够在Neo4J上进行推理?
A:目前来说是不行的,KoPL是运行在我们自研的引擎上。但KoPL是可以跟其它语言作转换,这是我们目前正在进行的工作,通过中间语言来将KoPL转换为其它查询语言。
分享嘉宾: