中文开放域问答系统数据增广研究
2023-01-18杜家驹叶德铭孙茂松
杜家驹,叶德铭,孙茂松
(1. 清华大学 计算机科学与技术系,北京100084;2. 清华大学 人工智能研究院,北京100084;3. 清华大学 智能技术与系统国家重点实验室,北京100084)
0 引言
智能问答是自然语言处理中的重要任务,其目标是回答人类用自然语言形式提出的各种问题,涉及检索、语义匹配、推理等自然语言处理中的重要技术。与搜索引擎不同,它能够为用户直接提供答案,省去用户阅读文档的时间,拥有重要的实际价值。
开放域问答是智能问答的主要研究领域之一。它的目标是回答任意领域的问题,而不是把问题限定在某个领域内。给定一个问题Q以及许多文档(如维基百科的全部内容,或互联网上的所有网页),模型需要根据这些文档回答问题。开放域问答模型的一种常见实现方式由检索器和阅读器两部分构成。检索器需要从给定的文档集合中检索出可能相关的一些文档,之后阅读器需要阅读并综合处理这些文档,得出问题的答案。这两部分通常是分离的,检索器通常使用传统方法进行检索,如TF-IDF或BM25,或者使用搜索引擎(如Bing),阅读器一般使用标注好的阅读理解数据集训练,其文档通常来自于维基百科。阅读理解是智能问答的另一重要研究领域。目前,阅读理解模型通常在大规模预训练语言模型上微调(Fine-tune),在各类数据集上能够接近甚至超出人类水平。
但是,阅读理解和开放域问答是不同的场景,所以用阅读理解数据集训练得到的模型直接迁移到开放域问答往往会遇到很多问题。我们使用目前通行的方法训练了一个阅读理解模型,并在真实场景下进行了评测,发现了一些问题,如图1所示。在示例1中,检索器抽取网页的主要内容并进行分段处理,会出现形如“乔戈里峰”这样仅含一个实体的较短的段落。此时阅读器看到了问题要求回答某一座山峰,且段落中包含一座山峰后就直接输出了“乔戈里峰”。在示例2中,问题和文章中涉及的地点限定词是不同的,但模型仍然输出了属于“山峰”这一类型的一个实体。这两个例子说明目前的阅读理解模型没有真正地理解问题和文章之间的关系,只是学习到了浅层的文本匹配。
图1 阅读理解模型错误输出示例
上述问题出现的原因本质上是因为目前开放域问答系统的阅读器使用阅读理解数据集训练。在开放域问答中,人们通常是先想到问题再去找相关文章。而在标注阅读理解数据集时,标注者在阅读文章后提出若干问题,文章内容的先入为主导致他们提出的问题通常与文章的句子比较相近。所以较短的段落以及与问题中不同的限定词这样的情况并不会在阅读理解数据中出现,进而使开放域问答模型在这几种情况下出错。为了解决这些问题,我们提出了几种能在现实场景下增强问答系统鲁棒性的数据增广方法。其中包括针对无上下文的答案,提出使用类似答案的文章;针对问题文章中限定词不匹配的问题,提出条件删除,构造不含问题中条件的文章;针对模型会受到与问题高度相似的句子影响,提出句子替换,用高度相关的句子替换含有答案的句子。这些数据增广方法能够帮助阅读器获得辨别这几种情况的能力,进而提升开放域问答系统的鲁棒性。
考虑到阅读理解数据集和实际场景的巨大差异,我们构造了一个开放域问答数据集OpenCQA用于评测。与以往阅读理解数据集的区别是: OpenCQA给出的文章是从网页中提取出来的,且没有做相关的过滤处理,更接近人类阅读网页时的情景,具有更强的干扰性。实验结果表明本文提出的几种数据增广方法都在这个数据集上取得了一定的效果提升。
本文的贡献主要包含:
(1) 发现目前的阅读理解模型不能够处理真实场景下的文章,提出了几种能够增强鲁棒性的数据增广方法,并在真实场景下获得了性能提升。
(2) 为了修正目前阅读理解数据集不能有效评估实际场景下模型效果的问题,构造并发布一个开放域问答数据集。
1 相关工作
智能问答近年来已经有了许多进展,性能有了很大的提升。这些进展得益于许多数据集的出现。在中文领域,阅读理解数据集有以下几种形式: 完型填空形式,给出的文本有若干个词被删除,需要根据上下文恢复这些词,如CMRC 2017[1];抽取式,答案是给出的文本中的一个区间,如CMRC 2018[2],DRCD[3],WebQA[4],XQA[5];生成式,需要根据问题和文章生成一段文本作为答案,如DuReader[6],Gaokao History[7];以及多项选择形式,从四个答案中选出最合适的一项,如Gaokao Challenge[8-9],MCQA 2017[10],ChID[11],C3[12]。总体上来说,上述中文的数据集的规模远远小于英文数据集,如SQuAD[13],TriviaQA[14],Natural Questions[15]等。
当前问答模型遇到的一个重要问题是模型总是倾向于做简单的文本匹配。为了解决这一问题,Jia和Liang[16]通过对文章进行一定的修改,可以误导模型输出错误的答案,并通过加入对抗样本训练缓解这一问题。Zhu[17]等人提出通过神经网络模型生成若干不可回答的问题来帮助训练问答模型。Welbl[18]等人发现了问答系统的不敏感性(Undersensitivity),即对文章做出一定的更改后,模型仍然会输出原有的答案,然后用了对抗训练的方法降低不敏感性。Back[19]等人提出了NeurQuRI,能够检测出问题中的一些条件能否被答案所满足,但这一模型仅使用答案的表示作为输入,没有显式地对文章中的片段和问题中的条件进行匹配。
除阅读理解外,近年来开放域问答也有了许多进展。Chen[20]等人提出了两阶段的“检索+阅读”框架,在此基础上,有一些研究专注于提升这一类模型在某方面的效果,如多文章训练[21]、文章排序[22]等。这类方法在检索阶段需要使用一个传统的检索器,因此有一些工作尝试使用神经网络模型来做检索。Lee[23]等人提出用问题和文章编码后的向量做检索,同时优化检索任务和阅读任务,形成一个端到端的模型。在此基础上,Guu[24]等人为这种端到端的模型提出了一种预训练方法,提升了其性能。
此外,还有一些特殊技巧被应用于开放域问答中。如Seo[25]等人提出了PIQA,把维基百科中所有区间都编码为向量,用向量相似度直接从这些区间中检索出答案,避免了阅读大量文本带来的性能开销。还有一些工作把知识图谱融入检索和阅读中[26-27]。
2 模型
在本节,我们首先介绍作为基准模型的开放域问答系统,包含目前抽取式阅读理解的常见做法和对某些特殊情况的处理,然后介绍几种能够改善系统鲁棒性的数据增广方法。
2.1 基准模型
基准模型采用检索+阅读的流水线形式,其中检索器使用搜索引擎返回的结果,阅读器在抽取式阅读理解数据集上训练。抽取式阅读理解是阅读理解的一种特殊形式,可以形式化为如下问题: 给定一个问题Q,以及若干篇文章D1,D2,…,Dn,从这些文章中选择一个片段a作为答案输出,或者输出“无答案”。目前,抽取式阅读理解问题最好的解决方法是利用大规模的预训练模型。
以BERT[28]为例,如图2所示,对于问题Q和文章Di,我们使用WordPiece[29]切分它们,得到符号序列Q=q1,q2,…,qm,Di=d1,d2,…,dl。把问题和文章拼起来,得到输入序列[CLS]q1q2…qm[SEP]d1d2…dl[SEP],其中[CLS]和[SEP]是两个特殊符号,分别用于输入的开头和分隔问题与文章。然后,BERT模型将会处理这个序列,经过embedding层和若干self-attention及全连接层后,输出一组向量h0,h1,…,hn∈RH,与输入序列中的符号一一对应。之后,这些向量会分别通过两个线性层及softmax层,得到每个符号是答案的开始位置或结束位置的概率:
这里假定答案的开始位置和结束位置的概率分布是相互独立的。我们把Wstarthi+bstart,Wendhi+bend称为i位置作为初始位置和结束位置的分数,记为si和ei。答案是某一区间[a,b]的概率为:
P([a,b])=Pstart(a)Pend(b)∝exp(sa+eb)
(3)
可以认为文章中每个答案区间的分数为开始位置和结束位置分数之和。
由于输入序列包含问题和文章,所以只需要考虑起始位置和结束位置都在文章对应位置的区间。一般来说,答案通常不会太长,所以在进行预测时,还会剔除掉那些太长的区间。另外,文章中不一定含有回答问题所必要的信息,所以模型需要针对这种情况给出“无答案”的预测。我们把包含[CLS]这个符号的区间作为一个特殊的“答案”。如果这个答案的概率是最高的,就认为模型输出了“无答案”。
在实际情况中,有的文章的长度会超出预训练模型能处理的长度上限(如512个符号)。在这种情况下,需要采用滑动窗口的形式把文章划分为有重叠的若干段,如图3所示。其中会有一些段落不含有答案,在训练时需要让这些段落预测“无答案”。在阅读完所有的文章后,需要把所有文章或段落预测出的答案合并起来,每个答案的分数是它在所有文章段落中被预测的分数的最大值。在下文中,本小节提到的模型记为Baseline。
图3 文章长度超过预训练模型能处理的上限时的滑动窗口机制仅第2个窗口含有答案,用其他窗口训练时训练目标是输出“无答案”。
2.2 提升鲁棒性的数据增广
为了缓解上文提到的问答模型的问题,我们提出了若干种数据增广的方法,期望模型在学习过这些增广数据之后能够避免上述的问题。
2.2.1 针对无上下文的答案的增广
在实际场景中,如果某一个段落仅包含一个实体,且这个实体的类型和问题询问的类型是匹配的,那么模型有很大的可能性会直接把这个实体预测为答案。但是这种情况是不合理的,因为文章没有提供任何与问题有关的信息。
为了避免这种情况,可以手工构造出这样的情况,并要求模型不预测这个实体。假定有一个实例,包含问题Q,一些文章D1,…,Dn,以及一些答案a1,…,am。我们构造了这样的实例,它的问题是Q,文章是a1,…,am,每篇文章都是一个原有的答案,答案为空。图4(1)展示了一个替换的例子。对已有的所有数据做这样的处理后,把所有新实例加入到原有的数据集中。这种数据增广方法记为类似答案的文章(Answer-like Context,AC)。
2.2.2 针对缺少条件的文章的增广
人类在阅读文章并回答问题时通常会快速找到问题所隐含的条件,然后在文章中寻找能够匹配上所有隐含条件的地方。如果缺少一个条件或条件错误,一般会认为无法回答此问题。例如,在问题“云南最高的山峰是什么?”中,“云南”“最高”“山峰”可以认为是隐藏的条件,如果“云南”或其近义词没有在文章中出现,就无法回答问题。目前的模型无法满足这种需求,所以我们针对这种情况提出了一种增广数据的方法。
假定一个实例含有问题Q,文章D1,…,Dn,以及答案a1,…,am。首先使用Stanford CoreNLP[30]对Q进行分词、命名实体识别和依存语法分析。然后,抽取出问题中所有的命名实体、名词和所有形如“第……”“最……”的词,这些词被视为回答问题必需的条件,构成条件集合P={p1,…,pl}。一般来说,一个问题通常可以抽取出2~4个条件,如果一篇文章中不含有任意一个条件,那么它几乎不可能含有回答问题所需要的信息。把文章中每个条件都删除掉,得到一个新的实例,包含问题Q,文章D1-P,…,Dn-P,以及空答案。然后新实例加入到已有的数据集中,记为条件删除(Condition Deletion,CD)。图4(2)给出了条件删除的一个数据增广示例。
图4 类似答案的文章示例
2.2.3 针对与问题高度相关的句子的增广
如果文章中含有与问题高度相似的句子但此句子又不含有真正的答案,那么这个句子中的一些区间(或词语)就很容易被预测为答案。为了解决这一问题,我们提出一种利用句子替换增广数据的方法。
(4)
训练完成后,就可以检索出与问题相似的所有句子。我们用Faiss[31],一个十分高效的开源向量相似度检索与聚类库,进行基于向量内积的检索,为每个问题找到相似度最高的100个句子。
只要把文章中含有答案的句子替换成与问题高度相似且不含答案的句子,就可以认为得到的新文章不足以回答问题。模型在用这样的(问题,文章)训练之后就应当能够避免直接用问题匹配与问题高度相关的句子。这种处理方式记为句子替换(Sentence Replacement,SR)。图4(3)给出了句子替换的一个数据增广示例。
但是,上述处理方法可能存在以下问题: 如果一个句子含有与答案重合度较高的一些片段,如答案为“古埃及人”,但原文章中有一个句子含有“古代埃及人”,这个句子就不会作为无答案的句子被替换掉,导致构造的文章仍然能够回答问题。为了处理这种情况,我们引入一种启发式的匹配方法。假设答案长度为n,统计它的n(n+1)/2个子串有哪些在句子中出现。如果在句子中出现的子串数量不少于2n-1,就认为句子和答案是匹配的,应当被替换掉。这种处理方式记为近似句子替换(Approximate Sentence Replacement,ASR)。
最后,以上几种数据增广方法分别针对了几种不同的问题,在实际场景中可以混用这几种增广方法,记为集成(Ensemble)。
3 实验
3.1 数据集
本文主要专注于抽取式的阅读理解和开放域问答,相关的数据集主要有:
(1) CMRC2017[1]是一个填空式的中文阅读理解数据集,但人工标注了少量抽取式的问题。其语料主要来源于《人民日报》和《格林童话》。
(2) CMRC2018[2]是第一个标准的抽取式阅读理解数据集,其文章来源于中文维基百科。
(3) DRCD[3]同样是一个抽取式数据集,所有问题和答案都是繁体中文,文章取自繁体中文维基百科。我们使用OpenCC(1)https://github.com/BYVoid/OpenCC进行繁简转换。
(4) WebQA[4]是一个大规模的真实场景下的问答数据集,其问题主要来源于百度知道中的事实性的问题,都是在非受限的场景下提出的。用搜索引擎检索问题,得到若干文章,并人工标注了答案。
(5) DuReader[6]包含了许多从搜索引擎日志中获得的高频问题,包括事实型问题、观念型问题和是否型问题。在百度搜索和百度知道中检索这些问题,得到一些文章,并人工标注答案。与其他数据集不同的是DuReader给出是的完整的文章,而不是单个段落。
为了能够充分利用各个数据集,本文把这些数据集转化为了统一的格式。同时,为了与抽取式的问答模型兼容,我们删除了答案没有在给出的文章中出现的问答对。由于部分数据集没有提供测试集,因此在实验中统一把验证集和测试集合并为验证集。最终得到的数据集规模统计如表1所示。
表1 数据集规模统计信息
此外,为了评估模型在实际场景中的性能,我们利用这些数据集提供的问答对构造了一个开放域问答的数据集OpenCQA,类似于Chen[20]等人提出的做法。首先忽略数据集给出的所有文章,对于数据集中的所有问题答案对(Q,a),在Bing(2)https://www.bing.com/搜索引擎中用Q检索并抓取前十位的网页,抽取出其主要内容作为文章D,与原有的问题Q和答案a合并构造一个新的(Q,D,a)三元组。如果原有的答案a没有在这些文章D中出现,则把a替换为“无答案”。问题Q无法检索出相关结果时直接丢弃此问答对。文章如果存在大量不可读字符或中文字符占比小于一半,也会直接丢弃。为促进中文问答系统的研究,我们公开发布了OpenCQA(3)https://github.com/jiajudu/openCQA数据集,包含约20万问题、答案,以及每个问题的参考文章。此外,为方便其他研究者,还把所有的阅读理解数据集整合在了一起,并统一成相同的格式,也同时公开发布。
3.2 评测指标
封闭域阅读理解和开放域问答都使用EM和F1两种指标评测。假设问题有若干个可能的答案a1,…,an,模型给出的预测为a。EM和F1的计算方法如式(5)、式(6)所示。
其中,lcs为两个字符串的最长公共子串。计算前需要先去除这些答案中的标点符号。
3.3 实验设置
我们使用阅读理解数据集训练了若干模型,分别使用了不同的数据增广策略。然后,分别在阅读理解验证集和OpenCQA验证集上评测了性能。所有的实验都借助Transformers库[32]完成,预训练语言模型(4)https://huggingface.co/hfl/chinese-roberta-wwm-ext使用中文维基百科、新闻、问答等数据训练,利用了全词Mask(Whole Word Masking)技术,区分大小写。微调时使用的学习率为3e-5,其中前10%的时间学习率由0线性上升至最大值,随后线性下降至0。使用的优化器为Adam,共训练2轮。模型使用了8张RTX 2080 Ti显卡,batch size设置为48。其余参数均采用常见的默认值。
此外,为了让模型能够处理是否型问题,我们在每个段落前都添加两个特别的符号“Yes”和“No”。如果应该输出是/否,就要求模型预测含有这两个符号的区间。在训练句子和问题的相似度模型时,每个问题都随机采样5个负例。在评估集成增广方法时,使用三种增广方法分别构造了三组额外的数据,每组数据都随机采样出1/3的数据,加入原有的训练集。表2给出了各种增广策略对应的数据规模以及在原数据集的基础上增加的比例。
表2 数据增广规模
3.4 开放域问答实验结果
在进行开放域问答的评测时,一个问题会对应十篇文章,但是这些文章中可能会存在特别长的段落。如果直接阅读这些段落,就会消耗大量的计算资源。由于计算资源有限,我们把所有的段落用滑动窗口切分为片段,仅取出512个片段阅读。片段数量超过512时,优先选取每个段落靠前的片段,丢弃长段落靠后的内容。这样模型阅读的内容会覆盖所有段落,而又不在极长段落上花费过多资源。
与阅读理解不同,OpenCQA中有许多无答案的例子。但是在使用不同的数据训练之后,不同的模型输出“无答案”的概率是不同的。为了保证比较的公平性,我们引入了“分数差”(5)https://github.com/huggingface/transformers/blob/v3.4.0/examples/question-answering/run_squad.py#L542这一概念。假设已经获得了文章中所有区间的最高得分sm和“无答案”的分数snull,可以仅在sm>snull-τ时输出一个非空的答案。这里τ是一个可以任意调整的变量。显然τ减小时,输出“无答案”的概率Pnull增大。我们可以适当地取一些τ值,得到EM-Pnull曲线(见图5)和F1-Pnull曲线(见图6)。曲线的最高点代表每个模型在调整τ后能达到的最优性能,如表3左侧两列所示。曲线的最左侧代表Pnull=0(即模型必须输出一个非空答案)时的性能,如表3右侧两列所示。
表3 开放域问答性能比较 (单位: %)
从表3、图5和图6可以观察到:
图5 开放域问答各模型曲线
图6 开放域问答各模型曲线
(1)Pnull=1时,所有模型的EM和F1都相同,这是因为数据集中无答案数据的比例是固定的。
(2)Pnull=0,即模型必须给出非空答案时,我们提出的各种方法都能带来一些提升,在EM上的提升更明显(+1.2~2.2,集成方法+2.4),只有句子替换(SR/ASR)在F1指标上提升较小,可能是因为近义词没有被替换时问题仍然是可回答的。
(3)Pnull: 0→1时,EM和F1都先上升后下降。可以看到Pnull处于(0,1)之间时,各个模型相比于基准模型的提升更大(+3.0~5.3,集成方法+6.9~7.9,见表3左侧两列)。这说明数据增广不仅能够提升在可回答问题上的效果,还可以提高模型判断问题是否可回答的能力。
(4) AC的EM/F1相比于基线模型增长了4.69/4.75,我们对性能的增长做了来源分析。性能的增长来源于三方面: ①问题有答案且AC和基线模型均预测出了答案的情况下,AC贡献了1.14/1.23的性能增长。②在11.45%的问题上,AC把基线模型预测出的有答案改成了无答案,其中有5.22%的问题AC是正确的,贡献了2.92/1.91的性能提升。尽管正确率不到一半,但由于发生错误的那部分问题基线模型也没有完全回答正确,所以总体贡献仍然是正的。③在8.16%的问题上,AC把基线模型预测出的无答案改成了有答案,其中有6.08%的问题AC是正确的,贡献了0.63/1.61的提升。因此我们同样可以得到AC不仅提高了预测“无答案”的比例,在其他方面也有所贡献。其他策略也有相似的贡献分布,在此不再列出。
(5) 综合EM和F1指标,集成三种方法的数据增广能够取得最好的效果,条件删除(CD)是最好的单一数据增广方法。
我们还分析了各种数据增广方法在OpenCQA各个子数据集上的效果,如表4所示。实验结果表明,无论在哪个子数据集上,模型在可回答的问题上的EM和F1都有所提升,其中条件删除(CD)仍然是最好的方法。在除WebQA外的数据集中,模型识别问题是否可回答的成功率也都有所提升。在WebQA上数据增广会导致识别成功率下降,其原因主要是WebQA中几乎的所有问题都有答案,数据增广导致模型把部分问题预测为了“无答案”。
表4 各种数据增广方法在OpenCQA的子数据集上的表现 (单位: %)
最后,我们人工评测了本文提到的三种错误情况(无上下文的答案;问题文章中限定词不匹配;与问题高度相似的句子)的出现频率。从基线模型判断出错的例子中随机选取了100个,手工标注了每个错误例子是否与三种错误情况相关。三种错误情况分别对应了其中17%、23%、9%的例子,总计占所有错误例子的一半左右。
3.5 阅读理解实验结果
表5展示了各种模型在3.1节中构造的阅读理解数据集上的结果。模型有可能对于某些问题输出“无答案”,但由于此数据集中所有问题都有答案,所以我们强制所有模型忽略“无答案”,必须输出一个答案。从表5可见,各种数据增广方法在阅读理解这一任务上对性能影响不大,或者会使性能略微下降。这说明阅读理解和开放域问答是两个差别较大的任务,OpenCQA将有助于更准确地评估未来模型的效果。
表5 阅读理解性能比较 (单位: %)
3.6 案例分析
在这一部分,我们首先给出从验证集中选出的若干例子,证明数据增广能够有效地解决上述几种问题。图7列出了这些例子以及模型给出的答案和得分。在示例1中,与基线模型相比,加入由答案作为文章的实例(AC)后,模型不再把“乔戈里峰”预测为答案,原有的一些高分答案的分数也大大下降。在示例2中,条件删除(CD)模型能够识别出“云南”和“东北”是不同的条件,降低了“白云峰”的得分。在示例3中,句子替换(SR)模型降低了作为干扰项的某抑制剂的得分。总之,对模型输出的答案分数的观察说明数据增广达到了目的。
图7 案例分析括号内是答案的分数
4 结论
本文针对阅读理解模型在实际场景中出现的几种问题,提出了能够增强中文开放域问答鲁棒性的数据增广方法。实验结果表明这几种方法能够提升模型在实际场景中的性能。本文还发布了一个开放域问答的数据集,用于评估中文问答系统的性能。
虽然在使用本文提出的几种方法后,模型能够避免犯某些错误,但距离人类阅读理解水平还有一定距离,仍然有很多错误情况没有解决。所以我们下一步将会进一步地分析目前问答系统的弱点,并针对问题进行改进。