开放域的问答依赖于准确地文档召回。传统做法,通常依赖于TF-IDF或BM25这类方法。在本篇论文中,作者提出一种仅使用深度语义向量的方法进行召回,而这个文档的语义向量,即来自于简单的对偶encoder框架(说的这么玄乎,其实就是俩一样的BERT-encoder,分别处理query和doc),本文提出的模型框架,面对top20文档召回的准确率问题,相较于强大的Lucene-BM25,有至多9%~19%的效果提升,这帮助我们得到了一个全新的、端到端的sota QA系统。
论文链接:https://arxiv.org/abs/2004.04906
代码链接:https://github.com/facebookresearch/DPR
1. Introduction
面对大规模候选语料的开放域QA,早期的QA系统通常包含了多个模块,包括问题分析、文档召回、篇章召回、答案抽取和验证等。然而,深度学习的发展将大规模语料的阅读理解提取成了简单的两阶段框架——(1)retriever:在全部文档中找到包含答案的候选文章子集;(2)reader:全面地理解召回的文章,并找出其中正确的的答案。
为开放域QA构建retriever的主流方法,是使用传统信息召回方法,如unigram/bigram的TF-IDF匹配、支持BM25的term weighting功能的工具(ElasticSearch、Lucene)。在这里,TF-IDF、BM25可被视为query或doc的高维度、稀疏向量表示。这类工具通常会使用倒排索引,快速地基于关键词,大幅地缩减做MRC(机器阅读理解,Machine Reading Comprehension)时的搜索空间。举例,对于这样两个问题:“How many provinces did the Ottoman empire contain in the 17th century?” 、“What part of the atom did Chadwick discover?”,这两个问题中,“Ottoman”和“Chadwick”就是关键词,这类工具也就会重点寻找包含这些关键词的文章。
相反的,query和doc的深度语义表示(dense representation)是前面所述的、TF-IDF/BM25给出的稀疏表示的补充。例如问题“指环王中的坏人是谁”,与包含该答案的文章“Sala Baker是一名新西兰演员,因为在指环王中出演一名恶棍而闻名”。显然,“坏人”和“恶棍”是同义词,但在以词为搜索基础的工具中,由于没有相同的字符而难以被召回。而我们可以使用dense encoder,用以生成对应的embedding vector,然后使用FAISS工具,进行高效的深度向量召回。
本文即专注于,用dense vector representation召回以取代传统的BM25或TF-IDF召回方式,来提升开放域QA的效果。我们训练一个简单的dual-encoder框架,在较小的query-doc数据集上进行fine-tune,然后用此训练好的模型生成向量,做纯dense向量召回。
2. background
略
3. Dense Passage Retriever,DPR
3.1 Overview
假设全部语料共有文档M篇,那么在线下,DPR会使用dense encoder
E
P
(
.
)
E_P(.)
EP(.)将文档均转为维度为d的向量,并建立索引,为召回备用。当线上时,DPR会使用另一个dense encoder
E
Q
(
.
)
E_Q(.)
EQ(.)对query进行编码,同样得到一个维度为d的向量,然后召回k篇最接近query向量的文章passage。passage和query的相似度用向量点乘定义:
s
i
m
(
q
,
p
)
=
E
Q
(
q
)
T
⋅
E
P
(
p
)
T
sim(q, p) = E_Q(q)^{T} \cdot E_P(p)^{T}
sim(q,p)=EQ(q)T⋅EP(p)T
Encoders
就是俩独立的bert,分别对query和passage做编码,dimension=768,使用最后一层的[CLS]位置的向量作为输入的最终表示
Inference
我们首先提前在线下使用
E
P
(
.
)
E_P(.)
EP(.)对每篇passage进行编码,并用FAISS建立索引。线上时,对于给到的一个query q,我们获得
v
q
=
E
Q
(
q
)
v_q = E_Q(q)
vq=EQ(q),然后召回k个与向量
v
q
v_q
vq最相近的passage向量。
3.2 Training
我们的训练目标为:对dual-encoders进行训练,以致于让点乘的相似度计算公式称为一个优质的召回排序公式。
公式以及相关符号定义:
q
i
q_i
qi:query_i;
p
i
+
p_i^{+}
pi+:针对query_i的唯一正样本passage;
p
i
,
j
−
p_{i,j}^{-}
pi,j−:针对query_i的负样本passage_j,负样本一共有n篇
对于每个query_i,我们定义loss function如下,并在训练中使loss最小
L
(
q
i
,
p
i
+
,
p
i
,
1
−
,
.
.
.
,
p
i
,
n
−
)
=
−
l
o
g
e
s
i
m
(
q
i
,
p
i
+
)
e
s
i
m
(
q
i
,
p
i
+
)
+
∑
j
=
1
n
e
s
i
m
(
q
i
,
p
i
,
j
−
)
L(q_{i}, p_{i}^{+}, p_{i,1}^{-},..., p_{i,n}^{-}) = - log \frac{e^{sim(q_i, p_i^+)}}{e^{sim(q_i, p_i^+)} + \sum_{j=1}^n e^{sim(q_i, p_{i,j}^-)}}
L(qi,pi+,pi,1−,...,pi,n−)=−logesim(qi,pi+)+∑j=1nesim(qi,pi,j−)esim(qi,pi+)
正负样本选择
负样本的选择不是瞎选,选取好的负例对结果可能会有决定性的提升。作者主要考虑到了三种负样本采样的原则:
(1)Random:就是从全体文档中简单随机采样
(2)BM25:不包含答案,但与query的BM25匹配度相当高的样本
(3)Gold:训练集中,其他query所对应的正样本
作者所得到的最佳model的负样本采样方式,是使用同一个batch中的gold负样本,再加上一个best BM25的负样本。与此同时,对同一个batch中gold样本的复用还会增加计算效率,并以此达到更好的效果。
In-bach负样本
假设我们的mini-batch大小为B,即我们有B个query,同时也有B个query对应的正样本passages,我们设Q和P分别为tensor size = (B × d)的query矩阵和passage矩阵(d显然是encoder编码后的embedding size)。 S = Q P T S = QP^T S=QPT就是一个大小为 (B × B) 的query-passage相似度矩阵。其中每一行即代表了一个query所对应的B个passages样本。为了将计算结果易于复用,我们将每个query对应的正样本放置在该矩阵S的对角线上,故每行有对角线上的一个正样本,以及 (B-1) 个gold负样本。
这个in-batch负样本采样方法,对开放域QA的最终结果提升有至关重要的作用
值得一提的是,上面这句话我是按照原文直译而来的。实际上Gold更应被称为一种负样本的采样方法,in-batch更像是一种数据整合和计算的方法
4. Experimental Setup
略。作者主要在本节介绍了他们对数据预处理、对SQuAD、Natural Questions数据集的特殊正样本文档选取方法。
5. 文章召回实验
DPR使用的batch size=128,其中1个正例,一个BM25得到的负例,其余是gold负例。与此同时,作者还对BM25召回的top-2000文档进行了rerank,具体公式为 B M 25 ( q , p ) + λ ⋅ s i m ( q , p ) BM25(q,p) + \lambda \cdot sim(q,p) BM25(q,p)+λ⋅sim(q,p),作者将 λ \lambda λ取值1.1。
5.4 训练方法的比较

如本图所示,top-5/20/100分别是召回的文档数,第二列#N指的是negative sample数量,第三列IB即in-batch的负样本采样策略(in-batch与gold的区别,大概在于,in-batch是选择本batch内其他query的正样本作为当前query的负样本,而gold则是没有“本batch”这个限制)。
从结果可以看出,负样本采样方式里,gold比纯随机或BM25这种传统方式都要好;在使用gold的负样本的前提下,使用in-batch采样策略更好;而由于in-batch的方法可将一些计算结果复用从而继续将batch扩大,所以因in-batch而扩大的batch size,对结果也有显著帮助(作者扩充至batch size=128)。最后,在gold负样本的存在下,再补充一个best BM25负样本,对结果还有一点提升,但多于一个BM25的负样本,就没有更进一步的作用了。
至此,我们可以大致将DPR的改进策略进行总结:
- 在选取负样本时,采用gold原则;
- 在组建batch时,要使用in-batch原则,并尽你所能扩大batch size;
- 最后,在batch内补充一个不包含答案的BM25得分最高的passage作为负样本。

404

被折叠的 条评论
为什么被折叠?



