EMNLP 2020 | 大道至简,后浪选手DPR暴打前浪BM25

0. 引言

事关休戚已成空,万里相思一夜中。大家好,我是卖麻辣烫的小男孩,先祝各位小伙伴们,元旦快乐,新的一年升职加薪,遇到更好的自己或者那个ta。今天给大家分享的这篇文章是Facebook AI、华盛顿大学和普林斯顿大学发表于EMNLP 2020的paper:Dense Passage Retrieval for Open-Domain Question Answering。文章提出一种名为DPR的向量检索方案,并也已经开源https://github.com/facebookresearch/DPR。DPR大道至简,于工业应用有诸多启发,让我们且看后浪选手DPR如何暴打前浪BM25?

PS: 更多关于EMNLP 2020的内容可以戳这里 和 这里

1. 摘要

Open-domain问答(Question Answering,QA)的第一阶段一般是召回retrieval,即先从大量的文档库中检索出一些和问题相关的文档(即候选文档)。常见的方法有 TF-IDF 和 BM25。这篇文章通过实验证明,学习文档的稠密向量可以替换retrive阶段的传统方法。文章用少量问题和段落,配合一个简单的双encoder框架学习文本的稠密向量表征,这套检索系统为名DPR(Dense Passage Retrieval)。实验结果表明DPR在文章top-20检索的准确率上比 Lucene-BM25 系统高出9%-19%,并在多个Open-domain问答数据集上取得最先进基准。

2. DPR

2.1 整体框架

DPR使用encoder 将文本段落编码为一个d维的稠密向量,再对这些向量化的文本段落建立索引等待召回。在运行推理阶段,DPR用另一个encoder 将输入的问题(即query)编码为一个d维的向量,再检索出与问题向量最相似的k个段落向量。问题向量和段落向量之间的相似度用点积来衡量:

虽然用于度量相似性的方法很多,文章于此做了消融研究发现点积与其他相似度量方法表现相当。鉴于此,文章选择了更简单的点积函数,并通过学习更好的encoder来改进DPR。

Encoder:

问题和段落分别使用独立的BERT进行编码,并使用[CLS] token的最终表征作为输出,所以输出的维度d=768。

Inference:

在推理阶段,使用段落encoder 对所有段落进行编码,并用FAISS(存储向量的数据库)离线建立向量索引。在推理阶段,给定一个问题q,通过question encoder得到对应的向量表征,并用FAISS检索出与最相似的top-k个段落。

2.2 训练

对2个encoder进行训练的终极目标是学习度量函数,使得上述相似度度量成为一个好的排序函数。训练过程会学习一个embedding函数从而创建一个向量空间,在这个向量空间中相关的问题和段落比不相关的相距更近。在训练集中有m个实例,每个实例由一个问题、一个正相关的段落(正样本)和n个无关的段落(负样本)组成。训练目标是优化损失函数:正相关段落的负对数似然值。具体下式子(2)

正、负样本的构造:

在QA数据集中,一般都会标记答案所在段落,所以天然地可以作为训练的正样本。具体到文章中的数据集,正样本构造方法如下。TREC, WebQuestions 和 TriviaQA的数据集中只包含问题和答案,没有段落文本,因此,文章通过BM25算法,在Wikipedia中进行检索,取top-100的段落,如果答案没有在里面,则丢掉这个问题。对于 SQuAD 和 NQ数据集,同样用问题检索Wikipedia,如果检索到的正样本段落能够在数据集中匹配则留下,否则丢掉。至于负样本,最简单的就是把剩下其他段落作为负样本。在实践中,如何选择负样本不容忽视,这往往可以决定encoder的学习质量。为此,文章针对这个问题,做了一系列的实验,最后提出了一个比较好的负样本构造方法,同时也可以加速训练。主要考虑以下3种负样本构造方法:

(1)Random:从语料中随机抽取段落;

(2)BM25:使用BM25检索出不包含答案的段落,再从中选出和问题token匹配最多的段落;

(3)Gold:训练集中其他问题所对应答案的段落;

文章还对比了不同类型负样本的影响。最好的模型是在同一mini batch中用一个BM25负样本段落和多个gold段落。特别地,在同一batch中复用gold段落负样本可以使计算效率提高,同时取得良好的性能。

batch内负样本:

假设在一个mini batch中有B个问题,每个问题都有一个相关段落(正样本)。和分别是batch size为B的数据集内问题和段落的embedding,维度大小为。相似度得分矩阵等于,维度大小是。每一行对应一个问题和B个段落的得分。如此可以重用计算结果,有效地在每个batch中训练 问题/段落对。当i =j时,任何对都是正样本,反之则是负样本,所以每个问题会有B-1个负样本。这种策略已被证明可以增加训练样本的数量,从而有效学习双encoder模型。

2.3 实验数据

实验过程使用Wikipedia作为QA过程中的文档源。Wikipedia的预处理方法取自于DrQA,每篇文章被分割成100个字大小的段落以作为召回的基本单元。处理之后最终得到21,015,324个段落。每个段落的开头再加上文章对应的标题,即标题<SEP>段落。评测数据集用了Natural Questions (NQ)、TriviaQA、TriviaQA、CuratedTREC (TREC)和SQuAD v1.1。这5个数据集的概况如Table 1所示。

3. 实验结果:Passage 召回

如果retriever能够根据不同数据集进行调整,那么是否可以进一步期望一个retriever就可以应对多个数据集呢?为此,文章联合全部数据集(不包括SQuAD,因为SQuAD局限于一小部分Wikipedia文档,会引入了不必要的偏见)训练一个多数据集encoder。除了DPR,研究人员还实验了BM25和BM25+DPR的结果,使用它们的分数的线性组合作为新的排序函数。

3.1 实验结果

Table 2展示了不同召回系统在5个评测数据集上的实验结果。

除SQuAD数据集外,在所有数据集上,DPR的性能始终优于BM25。当k值较小时,差距尤其大。例如,在Natural Questions数据集的top-20的准确率上分别是78.4% vs. 59.1%,差距大得不是一点点,简直是将其摁在地上摩擦。当用多个数据集训练之后,数据量最少的TREC从中获益最大。相比之下,Natural Questions 和 WebQuestions数据只有一定的改善,而TriviaQA则略有下降。在某些情况下,在单数据集和多数据集中联合使用DPR和BM25可以进一步改进结果。

文章推测在SQuAD效果差有2个原因:

(1)标注者在看完段落后直接写下问题,这使得段落和问题之间有很高的词法重叠,这有利于BM25,不讲武德

(2)这些数据是从500多篇Wikipedia文章中收集而来,因此训练样本的分布偏差会非常大。

3.1 消融研究

样本数量的影响:

文章在NQ数据集上试验了样本量对DPR准确性的影响,实验结果如Figure 1 所示。

DPR仅用1000个样本数据就可以全面超越BM25的准确性。这表明借助于预训练语言模型使得用少量问答对数据集训练一个高质量的retriever成为可能。当训练数据量逐渐增加时,准确性也随之逐渐提升。当使用全量数据时,DPR的准确性高于BM25 10个百分点以上,且选用的top-n数量越少,DPR的优势越大。

batch内负样本训练:

用 Natural Questions中的dev set评测不同训练策略(即不同负样本构造方法)所带来的影响,评测结果如 Table 3所示。

从Table 3的顶部结果表明,在k≥20的情况下,random、BM25、gold 段落方案不会对top-k的准确率产生很大影响。Table 3的中间部分使用的是in-batch负样本训练策略。这部分实验结果表明使用类似的设置(7个gold负样本段落),in-batch负样本训练方式能够大幅度提升结果指标。这其中的关键差别是:gold负样本段落是来自于同一个batch内部还是整个训练集。batch内负样本训练是一种简单且内存高效的方法,这种方法可以复用batch内已经存在的负样本,而不用创建新负样本。此外,in-batch负样本训练方法能够生成更多的数据对,从而增加训练样本数,从而有助于提升模型性能。另外,随着batch size大小的增大,准确率也会随之提升。Table 3中底部实验结果来自于in-batch负样本训练+'hard'负样本段落)。这里的'hard'负样本段落与给定的问题有较高的BM25分值,但是并不包含答案字符。这些附加的'hard'负样本段落作用于同一个batch内所有问题。结果表明,添加一个BM25负样本段落能够大幅度提升性能指标,而添加2个并不会进一步改善。

相似度和损失函数的影响:

相似度度量方式除了点积,余弦相似度和欧拉L2距离也很常用。因此,文章也做了对比。实验结果发现L2的性能与点积相当,且这两者都优于余弦。在损失函数的选择上,除了负对数似然外,另一种常用的损失是triplet loss。triplet loss是比较将正样本段落、负样本段落分别直接和问题对比。实验结果表明,使用triplet loss对实验结果影响不大。

跨数据集的一般化:

一个有趣的问题是,非独立同分布的设置会使DPR的性能降低多少?换句话说,训练之后的DPR在没有微调的情况下直接应用于其他不同的数据集上是否仍然work?为了测试DPR跨数据集的通用性,只用Natural Questions数据集训练DPR,然后直接在更小得数据集WebQuestions和CuratedTREC上进行测试。实验结果表明,DPR泛化能力很好。相比于微调之后最好的模型,在top-20上只下降了3-5个百分点。在WebQuestions和TREC数据集的top-20准确率分别是69.9/86.3 vs. 75.0/89.1。这个结果仍然是优于BM25(55.0/70.9)。

4. 实验结果:问答

最后,实验了不同段落retrievers对QA精度的影响。

4.1 端到端QA系统

研究团队实现了一个端到端问答系统,该系统由retriever和reader组成,且支持直接插入不同的retriever。reader将输出问题所对应的答案。给定top-k的召回段落(文章这里k>100),reader会给每个段落打分(段落得分)。此外,reader从每个段落提取一个答案span并给span打分。在段落得分最高的段落中span得分最高的span被选为最终的答案。段落选择模型通过问题和段落之间的cross-attention起到reranker作用。由于cross-attention的不可分解性,所以在大型语料库中检索相关段落是不可行的,但它比如式(1)的双encoder模型能够召回更多的结果(容量更大)。用该方法从少量候选检索中选取目标段落,效果良好。

假设 表示第个段落的BERT表征结果,其中L表示段落长度上限,h是隐层维度。一个token作为答案span的起始/结束位置和段落被选择的概率定义如下:

其中、都是待学习的参数。第i个段落中第s个token到第t个token之间span得分定义为:,第i个段落被选中的得分passage selection score为。

4.2 实验结果

各个QA模型的实验结果如 Table 4所示,其中实验指标是EM(exact match)。

从实验结果可以看出,除了SQuAD之外,retriever的准确率越高,最终QA结果会越好。用DPR召回的段落比用BM25召回的段落,所提取出得的答案更准确。对于大型数据集,如NQ和TriviaQA,使用多个数据集训练的模型(Multi)与使用单个训练集训练的模型(Single)结果相近。相反,在WQ和TREC这样的小数据集上,多数据集设置的优势更为突出。总而言之,在4个任务数据集中,DPR-based的模型比此前最先进的模型高出1%-12%的准确率。此前的先进模型ORQA和REALM都动用了额外pretraining任务并均采用昂贵的端到端训练方式。而DPR仅凭专注于使用问题-答案对学习文章检索模型,即可在NQ和TriviaQA上都胜过这2种模型。只有当目标训练集很小时,额外的预训练任务才可能更有用。虽然在单数据集设置中,DPR在WQ和TREC上的结果竞争力较低,但增加更多的问题-答案能进一步提高性能,从而刷新记录。

文章还进一步对比了这种pipeline训练方式和联合训练方式,实验数据集也是 Natural Questions。retriever 和reader联合训练的方式与ORQA一样,其EM得分为39.8,仍然不敌DPR。这表明,单独训练retriever和reader的策略可以有效地利用已有的监督数据。文章的这种方案不仅比联合训练方案设计更加简单,结果还比联合训练要好。

最后,值得注意的一点是,reader确实比ORQA参考了更多的段落,只是暂时尚未完全清楚需要推理时间需要多出多少。如果一个问题,DPR需要处理100个段落,那么reader可以将所有段落作为一个batch载入一个32GB的GPU上进行处理,因此延迟几乎与单个段落相同(大约20ms)。对吞吐量的确切影响很难衡量:与DPR相比,ORQA使用了2-3倍长的段落(288个word pieces,而DPR是100个token),且计算复杂度在段落长度上是超线性(superlinear)的。在实验中还发现,k = 50对于NQ是最优的,而k = 10只会导致EM精度的边际损失(NQ上40.8 vs. 41.5 EM),这与ORQA的5个段落设置大致相当。

5. 总结

文章证明了在开放域问题回答中,基于稠密向量的retrieval优于传统的稀疏retrieval。实验表明简单的双encoder方法就可以取得令人惊奇的效果。更复杂的模型框架或相似性度量函数不一定能够提供额外的增益。DPR改进检索性能的结果,并在多个开放域问题回答基准测试中刷新了记录。


由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方'AINLP',进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心

欢迎加入问答系统交流群
(0)

相关推荐