提纲
1 简介
2 问题描述
3 模型结构
4 总结
5 讨论
参考文献
1 简介
文本检索是信息检索领域里一个重要课题,在给定用户的自然语言query条件下,从庞大的文本资源库里返回跟query相关的文本信息。 **设计一个有效的检索模型的关键在于如何学习文本的表征以及如何对文本之间相关性匹配进行建模。** 随着预训练语言模型的不断发展,与之相关的稠密向量检索也说受到更多人关注,应用到更多场景中。 ****
2 问题描述
假设q是一个由自然语言表述构成的query,D={doci}是包含众多文本的资源库,doci是其中一个文本。文本检索就是,给定一个query,通过根据检索模型计算的相关性得分,从资源库D中返回n个跟query最相关的文本[doc1,doc2,…,docn]以及对应的相似度得分。 **稠密文本检索则是在这个过程中检索模型会将query跟文本都表征成稠密向量,然后再通过某些相似度函数计算对应的相关性得分。**
区别于传统的稀疏检索,以文本中的词为基本单位,通过tf-idf或者BM25等方式计算词的重要性,通过query跟资源库中文本的词之间的交集,可以计算query跟资源库中的文本的相似度。而稠密检索则是将query跟资源库中文本通过语言模型得到对应的向量表征,再利用某些相似度函数计算对应的相似度。
3 模型结构
**稠密检索的本质就是通过文本在语义空间的表征去建模query跟资源库中文本doc之间的语义交互** 。根据不同的交互方式,目前有两种主流的模型结果,分别是cross-encoder跟bi-encoder。
图1: Bi-encoder跟Cross-encoder结构
3.1 Cross-encoder
最直接的方式就是将query跟资源库中某一个文本看作一个pair对,通过某特定分隔符将query跟文本拼接到一起,视作一个完整的句子,一同作为模型的输入,通过pair对中每任意两个token之间的语义交互,可以得到最终每个token的一个表征向量(通常会在整个输入前插入[CLS],将对应位置的表征作为整个pair对的整体表征),然后将整个pair对的表征输入一个分类层,计算这个pair对中query跟文本之间的相似度。 **简单来说,Cross-encoder的特点就是在整个过程中,query或者doc的每一个token都会跟整个pair对的其他token进行充分的交互。**
3.2 Bi-encoder
Single-representation Bi-encoder
最基础的Bi-encoder结构采用了双塔模型的结构,通过两个独立的query编码器跟doc编码器分别将query跟资源库中的文本doc编码成对应的向量表征,再通过某些相似度函数(例如向量点积,余弦相似度)计算得到对应的相似度。
Multi-representation Bi-encoder
**Single-representation Bi-encoder最大的问题在于它不能很好的建模query跟doc之间的细粒度特征(毕竟这两部分特征都是独自编码得到的,没有任何交互)** ,针对这个问题,为了 **增强文本的表征以及语义之间的交互** ,multi-representation bi-encoder被提出来。 **Multi-representation Bi-encoder通过不同的语义视角将query或者doc表征成多个向量表征,然后再通过更加细粒度的交互计算得到query跟doc之间的相似度** ,这种方式可以有效提升检索效果,但是也会由于multi-representation带来一个明显的成本。例如下图中的poly-encoder,每个query会得到多个对应的多个向量表征,通过跟doc之间的交互可以计算得到这多个向量表征对应的重要性,通过加权求和得到最终的query表征,最终通过相似度函数计算query表征跟doc的相似度。
图2: Multi-representation Bi-encoder的结构
4 总结
Cross-encoder能够学习到query跟doc之间更加细粒度的语义交互信息,在相关性匹配上更加有效。Bi-encoder中的multi-representation bi-encoder虽然表现优于传统的single-representation bi-encoder,但是依旧不及cross-encoder,毕竟它也是在模仿cross-encoder去建模更加细粒度的语义交互。而Bi-encoder在结构上更加灵活跟高效,它可以使用不同的编码网络用于query跟doc的编码,也可以通过相似近邻搜索在大规模向量库搜索中实现加速。
由于Cross-encoder跟Bi-encoder有有利有弊,在实际使用中,可以联合两者寻求一个有效性跟效率之间的平衡。一般在第一阶段利用Bi-encoder进行大范围的候选召回,再通过Cross-encoder对召回结果做进一步的重排,也就是常常提及的召回+精排。
5 讨论
关于稀疏检索跟稠密检索的讨论已经很长时间了,在这里在简单描述下。在更复杂的搜索场景中,稠密检索模型经常会优于稀疏检索模型,因为稠密检索模型的语义匹配能力可以去处理那些query跟资源库中doc在文本上存在极少重叠的场景,而这个问题稀疏检索模型则不行。另一方面,稠密检索模型需要一定的标注数据去优化模型参数,所以在zero-shot场景下,稠密检索模型可能不如稀疏检索模型,而且稀疏检索模型更适合那些要求准确匹配的场景,例如关键词或者实体检索。
参考文献
1.(2022,) Dense Text Retrieval based on Pretrained Language Models: A Survey
https://arxiv.org/abs/2211.14876
