参考文献 1 简介对于一个完备的检索系统,通常是由多个不同模块一同组成的,包括第一阶段的检索召回模块以及后续的重排模块,在这里我们会介绍下检索系统整体的pipeline,以及几种不同pipeline优化的方式。 2 Pipelinea) Retriever,高效地从资源库中召回若干候选文档。这个阶段对时耗要求严苛,不适合用上太过复杂的模型,通常采用bi-encoder模型结构。 Multi-stage ranking 合理的多阶段排序结构是为构建一个更加有效的检索流水线,在这样一个流水线中,第一阶段通常利用BM25等算法先从资源库中召回K1个跟query最相关的候选文本。然后第二阶段利用类似monoBERT(pointwise)等模型计算出K1个候选文本doc跟query之间的相似度,保留其中得分最高的K2个候选文本。第三阶段利用duoBERT(pairwise)计算在给定query条件下,将这个K2个候选文本两两组合,计算彼此之间的优先级,也就是将query跟doc1,doc2通过分隔符一起作为Bert的输入,计算对应的得分,这里的得分表示doc1比起doc2,与query更加相关的程度,汇总这K2*(K2-1)个组合的结果,就可以对这个K2个候选文本重新进行排序,再将排序结果作为最终检索结果输出。 图1: multi-stage ranking框架 c) Listwise:直接针对一系列文档的排序结果进行优化。 3 Training稠密检索整个流水线是有一系列不同模块堆叠组合的,包括检索模块retrieval以及一个或者多个reranker模型,为此需要设计合理的算法去优化整个流水线。 最直接的方式就是对于流水线上的各个模块分别优化,但是这种优化方式没有考虑到各个模块之间的联系以及信息交互,所以常常会得到一个并非整体最优的结果。例如对于整个流水线而言,reranker模型依赖于retriever的召回结果,当retriever模块更新时,召回结果就会有所变化,新的负样本对于reranker模型可能就会难以识别,而不考虑retriever的召回结果去优化reranker模型就会导致reranker模型无法很好的适配retriever的召回结果。另外,后续阶段的reranker模型也需要依赖于前面阶段reranker的排序结果等等。 基于separate的一些弊端,一种改进版的优化方式就是让retriever跟reranker去适配彼此,让这两者在优化时进行充分信息交互,从而获得一个整体更优的流水线。例如将retrieverl召回的结果作为reranker训练的负样本,或者迭代训练retrieval跟reranker,固定其中一个模块,优化另一个模块,然后交互角色,反复进行。 一般情况下,retriever跟排序模型reranker是通过不同的方式去优化的,所以很难同时优化。Retriever通常是去最大化正样本相对于负样本的概率,根据候选正样本跟候选负样本的整体排名去优化,采用的是listwise优化方式,而reranker多采用的是pointwise或者pairwise的优化方式。于是,有人提出用统一的listwise任务同时优化bi-encoder的retriever跟cross-encoder的reranker,对于这两个模块的相关性预测都通过listwise分布建模,通过一种动态蒸馏的方式来进行retrieval跟reranker之间的信息交互。 4 总结尽管不容易同时优化整个稠密检索的流水线,但是相对于稀疏检索,稠密检索更容易针对特定下游任务进行优化。目前稠密检索也被广泛应用在knowledge retriever跟task solver两种不同类型任务中。在前面篇章提及的一些知识增强场景中,也有适应性的训练方式。 参考文献 1.(2022,) Dense Text Retrieval based on Pretrained Language Models: A Survey https:///abs/2211.14876 |
|