前言
Knowledge-based Question Answering (KBQA) 领域经历了十余年的积淀,留下了诸多优秀的作品。从这些作品的迭代中,我们看到了这个领域逐渐趋于成熟的态势。基于神经网络的语义解析模型在 2014 年前后发迹,并逐渐成为主流,影响至今。而传统的语言学知识从未被遗忘,依然有人在负重前行。从搜索引擎到聊天机器人,KBQA 的应用早已悄悄融入我们的生活。
一、百问
为更好地理解前人的创造是如何工作的,不如先切身地感受他们面对的困难。对 QA 大背景下的所有的问题,进行统一的定义和分类,呈现以下结果:
类别 | 简介 | Example | Example Logical Expression |
---|---|---|---|
Simple Question (Entity) | 简单的实体抽取问题 | “Who was the dad of Jorgen Ottesen Brahe?” | find(set={“Jorgen Ottesen Brahe”}, pre=“father”) |
Simple Question (Predicate) | 简单的关系抽取问题 | “What’s the relationship between Jorgen Ottesen Brahe and Otte Brahe?” | find(set={“Jorgen Ottesen Brahe”,“Otte Brahe”}) |
Complex Question (Logic) | 多重实体抽取问题 | “Which cities are municipalities in southern China?” | filter(set=find(set={“China”},pre=“municipality”),pre=None,cond={“Southern China”}) |
Complex Question (Count) | 实体统计问题 | “How many children did Roosevelt have?” | count(set=find(set={“Roosevelt”}, pre=“children”)) |
Complex Question (Contrast) | 实体比较问题 | “Who is the port with the largest annual throughput in the world?” | argmax(set=find(set={“port”}, pre=“instance”),num=get(set={ENTITY}, pre=“annual throughput”)) |
Complex Question (Count & Contrast) | 实体统计并比较的问题 | “Which university has the maximum number of Nobel Prize winners?” | argmax(set=find(set={“university”}, pre=“instance”),num=count(filter(set=find(set={ENTITY}, pre=“student”),pre=None,cond={“Nobel Prize”}))) |
Complex Question (Verification) | 判断是非类问题 | “Is New York the Capital of USA?” | equal(setA={“New York”},setB=find(set={“USA”}, pre=“capital”))) |
除了以上常规的单问题类型,还有以下非常规的问题类型:
类别 | 简介 | Example |
---|---|---|
Coreference Question | 无法找到实体,常见于多轮对话 | “Who is the spouse of him?” |
Ellipsis Question | 无法找到谓词,常见于多轮对话 | “Also tell me about Brett MacLean.” |
Combined Question | 多个独立问题组合 | “Who created Apple and Amazon respectively?” |
Unfactual Question | 非既成的实时问题 | “Which politican has been infected the coronavirus in USA?” |
Macro Question | 过于宏观的问题 | “Tell me about the worldwide economy in 2020.” |
Subjective Question | 涉及主观判断的问题 | “What do you think of Donald Trump?” |
Nest Question | 嵌套问题 | “Who is the father of the sister of the mother of Mark Twain?” |
Mis-Presented Question | 包含错误的问题 | “Who found the Carnegie Mellon University?” |
Unquantifiable Question | 相关指标无法量化的问题 | “Is there any star more dangerous than quasar?” |
Technical Question | 涉及专业知识的问题 | “How is ozone layer naturally generated?” |
二、十年
十年前的今天,神经网络刚刚从历史的尘埃中走出,重新唤醒人们的记忆。那时的自动化 KBQA 尚无法达到工业应用的要求。在进行的项目中,项目开发者使用大量的语法规则识别问题,将谓词与关系之间的依赖关系定义明确,以期望问题能顺着他们预定义的思路得到解答。这样的项目,在小规模知识图谱的应用上并不少见。但由于缺乏泛化能力,每次在新的知识领域搭建 KBQA 系统,开发者们都需要重新进行规则的定义,以适应领域知识。彼时学术界还正画着依存关系图,思考着解决方案。
2013 年,谷歌第一次搭建起以维基百科作为背书的知识库,更名为知识图谱,引起世界关注。随后两年内推出了搜索引擎即时问答。当用户输入问题时,答案以一定的概率直接出现在搜索框下方。这一举,既完成了维基百科的导流,也提升了用户满意度。巧合的是,正是在这一年前后,KBQA 在学术界的热度迅速上升,并在 2017 年前后达到巅峰。
但是当然,这并不是谷歌的贡献。故事讲到这里先结束。
如同我们在上文所说,有一种简单的构建 KBQA 的方法,是定义大量的语法规则,顺着语法解析的路径,解决多重复合的问题。这样的 KBQA 项目部署起来简单迅速,对软硬件要求不高,搭配同义词映射表和具体的实体消歧规则,能在小规模知识图谱上取得不错的效果,因而十分流行,常见于任务型 KBQA 系统。但这样的模式缺点也非常明显,那便是泛化能力不足。当图谱的规模逐渐扩大,关系的数量逐渐增多,从数据中寻求解决方案,自动构建 KBQA 的需求也就变得非常明确了。因此我们避开工业界这一常见的做法,探讨那些基于大数据构建有效模型的 KBQA 工作。
KBQA 的研究,根据目标问题的性质,可以分为几个方向。第一个是针对 简单问题 (simple question) ,第二个针对与其相对的 复杂问题 (complex question)。大量的研究者认为,现在的学术界连简单问题都没能很好地解决,研究复杂问题简直是在浪费时间。但也有专业人士认为,在寻求复杂问题的解决方案时,能同时收获有效的简单问题应对方案。正是在这样的争论下,针对简单问题和复杂问题的研究齐驱并进,共同占据了 KBQA 的半壁江山。而除这两个方向,其他的领域多和一些特殊的问题类型有关,例如 TEQUILA (Jia et al., 2018) 通过将问题分解,解决时间相关的非事实类问题;TSHCNN (Gupta et al., 2018) 基于文本 CNN,应对多种语言混合的问题。
从设计理念上,最主流的 KBQA 方案是 语义解析 (semantic parsing, SP) 模型。具体做法是通过一定的语义理解架构,将自然语言问题 (utterance/query) 转换为机器可执行的 逻辑表达式 (logical form) (Zelle and Mooney, 1996)。这一理念合情合理,也给予了研究者巨大的探索空间,其中一点表现在数据上:现有的数据集往往提供 问题-答案 对,而模型真正需要的是 问题-逻辑表达式 对。为此,我们需要预先定义完整的 逻辑规则,再基于该逻辑规则,展开深度优先搜索或广度优先搜索,在知识图谱搜寻指向答案的路径。人工标注也能解决这一问题,但很少有人真的这么做。这一套借力的机制称为 距离监督 (distant supervision)。开发者往往在这个过程中添加一定的剪枝策略,以减少时间的损耗。除这一点饱受诟病,SP 模型以其高自由度、强泛化能力以及大型知识图谱的适应性,维持着其难以撼动的地位。
依照具体的技术方案,可以将 SP 模型分为两个大类:一类基于神经网络,一类基于传统语言学。
基于神经网络
KBQA 起初是语言学的天下,自深度学习成为热潮后,主流模型逐渐被神经网络所取代,并任务表现上远远超出了基于传统语言学的模型。类似的事情,也发生在我们熟悉的计算机视觉领域。我们以以下几个具有代表性的作品为例,一窥其演变历史:
- Vlachos and Clark, 2014 使用一系列串行的 分类模型 识别问题的模式,并依据既定的模板生成机器可执行的程序;
- Dong and Lapada, 2016 基于 biLSTM 和 Attention 机制,构建 Seq2Tree 的 encoder-decoder 架构,在推理时逐路径生成 逻辑树;
-
Zhong et al, 2017 使用 强化学习 (reinforcement learning) 使模型自动生成 SQL 条件,最终形成完整的 SQL 语句;
-
Suhr et al., 2018 在逻辑中引入 copy mechanism,以在模型需要时复刻前几轮对话生成的序列,完成共指消解 (coreference) ;
-
Guo et al., 2018 使用能应付绝大多数复杂问题的 语法 将逻辑表达式定义为线性的逻辑组合,并引入 记忆模块 管理实体和关系;
-
McCann et al., 2018 汇集来自十个 NLP 子领域的公开数据集,统一转换为 context-question-answer 的数据形式,训练 multi-task learning 网络;
-
Shen et al., 2019 基于 D2A,加入时下流行的 BERT 预训练及微调,构建 multi-task learning 框架,并在实体和关系两项检测之外,加入 实体类别分类器,提高实体链接的准确度。
基于神经网络的这一套演变中,有变,也有不变。不变的是,依靠语义解析生成逻辑表达式这一中心思想从未改变;变的是,底层模型的架构跟随 NLP 社区的进步而演化。每当 NLP 社区有突破性的算法或理念出现时,基于神经网络的 SP 模型都会迎来一阵研究热潮,先后的几个燃点分别有:LSTM、Seq2Seq、Attention、pointer、强化学习、multi-task learning、BERT。从过去的历史来看,KBQA 领域内部难以产生