蔡银琼,范意兴,郭嘉丰,张儒清
1.中国科学院 计算技术研究所 网络数据科学与技术重点实验室,北京 100190
2.中国科学院大学,北京 100190
大规模的查询-文档检索是搜索系统中的一个关键问题,其目的是在给定用户查询的情况下,从大型文档库中返回一组相关文档。为了平衡搜索的效率和有效性,现代搜索系统通常在实际应用中采用多级流水线排序架构,如图1 所示。其中,第一阶段检索致力于从大型存储库中召回一组初始的相关文档候选集。之后,采用多个重排序阶段对相关文档的排序列表进行修剪和改进。这样的“检索+重排序”流水线架构已被学术界[1-2]和工业界[3]广泛采用,并在多个信息检索基准数据集上取得了非常先进的结果[4-5]。
图1 现代信息检索系统的多级流水线架构Fig.1 Multi-stage architecture of modern information retrieval systems
长期以来,第一阶段检索一直被经典的基于词项的模型(如BM25[6])所主导。具体而言,查询和文档都采用离散的符号表示(即词袋表示),然后利用倒排索引技术支持大规模文档的组织和检索。这种基于词项的模型由于其简单的逻辑和强大的索引而非常有效。同时,它们也被证明在实际应用中取得了良好的召回效果[2-3]。然而,这种基于词项的模型存在明显的缺点:(1)基于符号表示,容易遭受词汇不匹配问题[7-8];(2)基于独立性假设并忽略词序信息,无法很好地捕获文档语义信息[9]。由于这些局限,基于词项的模型可能会成为一个“拦路虎”,从一开始就阻止重排序模型接触到相关文档,从而成为整个搜索系统的性能瓶颈。
为了更好地在第一阶段检索中建模语义信息,研究者们在过去几十年间不断努力,提出了查询扩展模型[10-12]、词项依赖模型[13-15]、主题模型[16-17]、翻译模型[18-19]等早期的语义检索模型。但是由于这些方法大多仍处于离散化的符号表征范式中,不可避免地继承了其局限性。近年来,随着表达学习方法在信息检索领域的发展,研究者们对第一阶段语义检索模型的研究兴趣呈爆炸式增长,并取得了显著的成果[20-23]。为了满足第一阶段检索快速、高效召回的需求,大多数情况下这些模型都采用双编码器(bi-encoder)架构。它们对查询和文档进行独立的编码,分别得到一个稠密表示向量,然后基于得到的查询/文档表示使用简单的相似度函数(例如内积和余弦相似度)计算查询-文档对的相关性得分。这样的模型架构可以对所有文档进行离线编码,并利用稠密向量索引工具[24]建立索引,从而支持快速检索。
尽管双编码器的结构维持了检索的高效性,但是相比跨编码器(cross-encoder)却牺牲了部分的检索准确性。一个主要的原因就是双编码器模型在计算查询和文档表示的过程中缺少两者之间的交互信息,即在对文档进行独立编码的过程中是查询不可知的。而通常文档都比查询具有更长的文本序列,包含多个不同的主题,因此只使用一个向量表示很难覆盖文档包含的全部信息,而且多个主题信息糅杂在一个向量表示中也会影响与查询的相关性判断。
为了提高基于单表达的双编码器模型的有效性,本文提出了基于多表达的语义检索模型。该模型仍然采用双编码器架构,从而能够保持检索的高效性。但是对查询和文档使用不同的编码模型,分别对查询得到单个表示和对文档得到多个表示。在计算查询-文档对的相似度时,分别计算文档各个表示和查询表示之间的相似度得分,然后以最高得分作为文档和查询的最终相关度。进一步,为了保证文档多个表示之间的差异性,并能够捕捉文档中不同主题的信息,引入了覆盖率(coverage)机制[25]。
为了评估本文提出的多表达模型的有效性,在MS MARCO数据集上进行段落排序和文档排序实验,结果显示本文模型相比基准模型取得了明显的性能提升。同时,进行了消融实验和关键参数分析实验,证明了使用覆盖率机制的多表达结构可以有效地提高双编码器模型的检索性能。本文的主要贡献如下:
(1)分析了基于单表达的语义检索模型容易存在信息丢失的缺陷性,从而影响检索准确性。
(2)提出了一种基于多表达的语义检索模型。通过使用覆盖率机制对文档得到多个向量表示,从而可以在不影响双编码器模型的检索效率的情况下提高双编码器模型的检索性能。
(3)进行了对比实验,在MS MARCO 数据集上比基准方法取得了更好的性能,证明了本文所提方法的有效性。
本章简要回顾与第一阶段语义检索相关的工作,包括早期的语义检索模型和最近的基于神经网络的语义检索模型。
从20世纪90年代到21世纪初,人们对提升基于词项的检索方法进行了广泛的研究,这里简要介绍其中一些较为经典的方法。
为了弥补查询和文档之间的不匹配,可以使用查询扩展技术[26]从外部资源中选择词汇来扩展原始查询。查询扩展方法有很多种,一般可以分为全局方法[10-11]和局部方法[27-28]。全局方法通过分析被检索语料库中的词汇共现或使用手工制作的同义词库(例如WordNet)来扩展或重新格式化查询词[29]。另一方面,局部方法根据原始查询检索到的排名靠前的文档调整查询,这种查询扩展通常被称为伪相关反馈(pseudo-relevance feedback,PRF)[30]。查询扩展方法在信息检索应用中得到了广泛的研究和应用,但它们并不总是能得到一致的提升,尤其是基于伪相关反馈的方法更容易出现查询漂移问题[31]。
另一个研究方向关注词与词之间的语义关系,通常通过建立词的共现关系来发现文本中潜在的主题,并根据主题信息进行查询和文档的匹配。主题建模方法在自然语言处理(natural language processing,NLP)任务中受到了广泛关注。总的来说,它们可以分为两类,包括概率方法和非概率方法。应用主题模型提高检索效果的研究主要有两种。第一种是首先获取主题空间中的查询和文档表示,然后根据主题表示计算查询-文档对的相关度[17]。另一种是将主题模型与基于词项的方法相结合。一种简单而直接的做法是将主题模型和基于词项的模型计算出的相关性分数线性组合起来[32],另外也可以把概率主题模型作为信息检索语言模型的平滑方法[33]。
解决词汇不匹配问题的另一个尝试是统计翻译方法。统计机器翻译(statistical machine translation,SMT)通过将查询视为一种语言的文本,将文档视为另一种语言的文本来实现信息检索。Berger 和Lafferty[18]首先提出将检索任务描述为统计机器翻译问题,以条件概率P(d|q)将查询q转化为文档d。翻译概率可以通过查询与其相关文档来估计,例如点击数据集。然而,由于数据稀疏性,统计机器翻译模型通常难以训练,而且在大多数情况下都没有比基于伪相关反馈的词项检索更有效[12],因此统计机器翻译模型在信息检索领域并没有得到太广泛的应用。
2016年之后,随着深度神经模型在重排序阶段的语义建模中显示出强大的能力,将深度学习技术应用于第一阶段检索的研究激增,并取得了初步的效果[20-23]。
其中一条研究路线是改进传统离散符号表示范式中的文本表示[20-21,34],即利用神经网络模型对基于词项的方法的加权机制进行改进。这种方法在仍然采用基于稀疏词项检索的情况下,在构建文档索引之前利用神经网络模型重新评估文档中出现的词项的重要性,而不是使用预定义的启发式函数。例如,Dai和Callan[20]提出了一个基于BERT 的框架(DeepCT)来评估文档中词项的重要性,然后用预测的词项权重替换倒排索引中的原始TF(term frequency)字段。除了显式地预测词项的权重外,另一种方法是使用额外的词项来扩充文档,这样就可以在倒排索引中提升关键词项的权重。例如,doc2query[34]模型基于查询-文档对训练seq2seq模型,对给定文档生成对应的查询,形成扩展文档,然后依赖BM25 算法从扩展文档的集合中进行检索。Bai 等人[21]结合了权重评估和词项扩展两种思想,提出了一个新的SparTerm 框架。它利用预先训练好的语言模型将基于频率的词袋表示映射到整个词汇表中稀疏的词项重要性分布,这样它可以同时学习已有词项的权重,并为文档扩展新的词项。实验结果表明,这些方法有效地改进了基于词项的第一阶段检索方法。
另一种方法抛弃了稀疏表示范式,使用稠密表示范式形成一系列新的语义检索模型[22-23]。为了支持高效的检索,这类方法往往需要通过近似最近邻算法[35-36]进行索引和检索。为了满足第一阶段检索高效性的需求,稠密检索模型通常采用双编码器架构,它由接受不同输入(查询和文档)并独立学习单独的稠密嵌入的双网络组成,然后将学习到的稠密表示输入到匹配层,该匹配层通常通过简单的相似性函数来实现,以产生最终的相关性得分。例如,DPR(dense passage retriever)[22]模型基于BERT 双编码器来学习文本块的稠密嵌入。基于DPR 模型的检索器在开放域问答数据集上取得了优于Lucene BM25系统的效果,并有利于提高端到端的问答性能。与DPR相似,RepBERT[23]模型采用基于BERT 的双编码器来获得查询和文档表示,然后将查询和文档表示的内积作为相关性得分。实验结果表明,RepBERT算法在MS MARCO段落排序任务上优于BM25算法。
本章将介绍本文提出的基于多表达的语义检索模型。首先介绍第一阶段检索任务的问题形式化,然后介绍多表达检索模型,最后介绍模型的训练方法和在线检索方法。
给定一个查询q,第一阶段检索的目的是从一个大型语料库C={d1,d2,…,dN}中召回所有潜在相关的文档。形式上,给定一个数据集,其中qi表示用户查询,Di=[di1,di2,…,dik]表示查询qi的文档列表,并且Yi=[yi1,yi2,…,yik]∈R 是Di中每个文档对应的相关性标签。注意,因为不可能手动标注所有的大量文档,这里每个查询的带标签的文档数k通常明显小于语料库大小N。第一阶段检索的目标是从D 学习一个模型s(·,·),该模型给相关的(q,d)对高分,给不相关的低分。然后,对于任何查询-文档对(q,d),s(q,d)给出一个反映q和d之间相关度的分数,从而可以根据预测的分数对语料库C中的所有文档进行排序。
和典型的双编码器架构相同,本文提出的多表达检索模型的基本架构如图2所示。它主要由编码模块、聚合模块和匹配模块三个模块组成。编码模块由两个编码器网络组成,分别接收查询和文档的词序列输入,然后对其进行独立的上下文编码。聚合模块接收编码器的输出,对查询得到一个全局表示向量,对文档得到多个全局表示向量。匹配模块基于查询表示和文档表示,使用简单的相似度函数计算查询-文档对的相关性得分。
图2 模型架构Fig.2 Model architecture
2.2.1 编码模块
编码模块由查询编码器和文档编码器两个网络组成,它们的输入分别是查询和文档的词序列q={q1,q2,…,qn}和d={d1,d2,…,dm},其中n和m分别是查询和文档的长度。对于查询编码器和文档编码器,本文采用BERT模型[37],且两个编码器的参数是共享的。
BERT 的模型结构主要分为两部分,包括词嵌入层和编码层。词嵌入层部分的目的在于将查询和文档中的离散符号映射到稠密的实值向量空间。BERT使用多种词嵌入方式,包括:词义向量,每个词对应一个向量;位置向量,每个位置对应一个向量;段向量,区分词来自查询还是文档。将这三个向量相加可以获得一个词的最终向量表达。编码层在词向量的基础上通过全连接和自我注意力机制,对词向量进行变换。BERT 中采用多层Transformer 单元的堆叠,每个单元中采用多头的注意力机制和残差连接机制,并加入层归一化机制。在自我注意力机制之后通过全连接结构把向量重新投影。
2.2.2 聚合模块
聚合模块接收编码模块的输出,得到查询和文档的最终向量表示。
对于查询,它通常的文本序列都比较短,并且有较为集中的主题,因此直接将BERT 模型输出中[CLS]对应的编码表示作为整个查询的向量表示eq。
对于文档,它通常很长,并且包含多个主题的信息。因此只使用单个向量表示很难覆盖整个文档的内容,并且把不同主题的信息糅杂在单个向量中也会影响与查询向量的匹配过程。基于此动机,将文档词嵌入序列聚合得到多个向量表示,具体的计算方式如下所示:
其中,k是一个超参数,表示每个文档的向量表示个数。而且
其中,σ表示softmax函数,cj∈Rh×1是第j个注意力层的参数。
但是,直接使用多个注意力层将文档词嵌入序列聚合得到多个向量表示很难保证不同向量之间的差异性。为了使不同的向量表示覆盖文档不同部分的信息,引入了覆盖率机制[25]。具体地,记录历史j个注意力权重分布的累计,即:
在计算第j+1 个文档向量表示时,通过式(2)得到后,用历史累计注意力权重分布更新本次的注意力权重分布:
2.2.3 匹配模块
通过聚合模块,得到查询q的单个向量表示eq和文档d的多个向量表示。考虑到第一阶段检索对效率的要求,只能使用简单的相似度计算函数。这里使用内积函数计算向量之间的相似度得分,即:
在训练过程中,使用交叉熵损失函数来优化所提出模型中的所有参数,即:
其中,q表示查询,d+是q的相关文档,D-是q的不相关文档集。本文使用两种负样本采样策略来构造不相关文档集。其中一种是使用BM25 召回的排名靠前的不相关文档作为难负样本,另一种是使用训练时当前批量内其他查询对应的文档作为随机负样本。整个优化过程使用标准的梯度下降算法。
一旦模型训练完成,就可以对文档集合中所有的文档离线计算它们对应的向量表示。为了支持快速检索,一般需要借助稠密向量索引工具,例如Faiss,对这些文档建立索引。在在线检索过程中,当一个新的查询到来时,首先使用查询编码器得到查询的向量表示,然后再借助索引工具进行文档检索。
但是,一般的索引工具仅支持内积或欧氏距离等基本相似度计算函数,无法直接进行式(5)的计算。因此,在实际应用时,首先对每个文档及其所有表示建立映射关系。然后在建立索引时,将每个向量表示视为一个索引单位。在检索过程中,计算查询表示和每个向量表示的内积,返回最大的top-k个向量表示编号,然后再映射回文档编号并进行去重处理。
本章介绍具体的实验设置及结果分析,以验证所提方法的有效性。
MS MARCO[4]是微软推出的一个段落和文档排序数据集。段落排序任务的重点是对包含大约880 万个段落的集合进行排序。段落排序任务提供了约80.8 万个查询和相关段落对用于监督模型训练。每个查询与稀疏的相关性判断相关联,其中一个(或极少数个)段落被标记为相关,没有任何段落被明确表示为不相关。文档排序任务的重点是对完整文档进行排序,其中包含相关段落的文档被假定为相关文档。整个文档集合包含大约300 万个文档,训练集包含了大约36.7 万个查询。这两个任务所用数据集的具体统计信息如表1所示。
表1 MS MARCO数据集的统计信息Table 1 Statistics of MS MARCO dataset
对于段落排序任务,使用官方指标MRR@10(mean reciprocal rank)。对于文档排序任务,使用官方指标MRR@100。除了排序指标MRR 外,对于第一阶段检索,召回能力也是一个很重要的评价标准,因此还对段落排序任务和文档排序任务分别增加了Recall@1000和Recall@100的评价指标。
为了验证本文所提出模型的有效性,使用一些经典的检索算法和前沿的语义检索算法作为在上述数据集上评价的基准方法。这些算法的介绍如下:
(1)BM25[6]是一个经典的概率检索模型,通常作为检索任务的一个强基准模型。
(2)DeepCT[20]使用BERT模型预测段落中出现的每个词的权重,并使用这些权重替换倒排索引中的TF 字段,然后再使用BM25模型进行检索。
(3)HDCT[38]类似于DeepCT 模型,区别在于它是一个用来学习长文档中的词项权重的模型。首先估计段落级词项的权重,然后通过加权求和将段落级词项权重合并为文档级词项权重。
(4)Doc2query[34]使用生成模型对每个文档生成多个查询,并使用这些生成结果扩展原始文档。然后再基于这些扩展后的文档,使用BM25进行检索。
(5)SparTerm[21]利用BERT 模型将基于词频的词袋表示映射到整个词汇表空间的词项重要性分布。这样可以同时学习已有词项的权重,并为文档扩展新的词项。
(6)RepBERT[23]是一个典型的基于双编码器的语义检索模型。它使用BERT模型作为编码器,分别对查询和文档得到一个向量表示,然后使用内积计算查询-文档对的相关度。
本文使用Anserini 工具包[39]进行BM25 检索,使用PyTorch 框架实现本文提出的模型。对于本文模型,使用BERT-base模型进行编码器部分的初始化,其他模块的参数使用PyTorch 中默认的初始化函数进行初始化。BERT-base模型有12层Transformer单元,隐含层维度为768,多头注意力机制的头数为12。对于段落排序任务,将k设置为4,对于文档排序,设置k为8。对于查询,将其截断或填充到32 个词。对于段落和文档,分别将其截断或填充到256 和512 个词。使用AdamW 算法进行模型的优化,批量大小设为32。
本文使用Faiss[24]工具包来支持大规模相似向量的检索。具体地,使用IVFPQ(inverted file system product quantization)索引方式。在索引创建时,将向量划分成16 个子向量,簇的个数设置为2 000。对于在线检索过程,对每个查询向量,搜索最近的10 个簇进行匹配,并返回规定数量的排名靠前的文档。
表2 给出了不同模型在段落排序任务上的评估结果。从结果中可以看出,所有的语义检索模型相比传统的基于词项的BM25 模型在Recall 和MRR 指标上都有明显的性能提升。在所有的基于语义检索的基准模型中,基于双编码器架构的RepBERT 模型相比DeepCT、Doc2query 和SparTerm 模型取得了更好的结果。但是,相比使用单个表示的RepBERT 模型,本文提出的基于多表示的模型有进一步的性能提高,在Recall@1000和MRR@10 指标上相比基准模型都取得了明显的性能优势。
表2 段落排序任务上各模型的性能对比Table 2 Performance comparison of models on passage ranking task
表3 展示了不同模型在文档排序任务上的评估结果。与段落排序任务相同,所有的语义检索模型相比基于词项的BM25 模型在Recall 和MRR 指标上都有明显的性能提升。但是,在所有的基于语义检索的基准模型中,基于双编码器架构的RepBERT 模型相比HDCT 和SparTerm 没有明显的性能优势。这可能是因为在文档排序任务中,文档长度更长,包含的信息量更大,而RepBERT模型将文档压缩成一个向量表示,容易造成严重的信息损失,从而影响检索结果。同样在双编码器框架下,本文提出的多表达语义检索模型相比所有的语义检索基准模型可以取得明显的性能优势,说明了基于多表达的语义检索模型的有效性。
表3 文档排序任务上各模型的性能对比Table 3 Performance comparison of models on document ranking task
为了进一步分析本文提出的多表达语义检索模型的有效性,在段落排序任务数据集上进行消融实验。
依次对本文提出的多表达语义检索模型去掉覆盖率机制(-coverage),去掉多表达聚合模块并将文档聚合模块使用与查询聚合模块一样的方式(-multi-rep)。
如表4所示,如果去掉coverage机制,模型会有明显的性能下降。说明如果对段落文本聚合的几个向量表示不加任何约束,则使用多个向量表示相比只使用一个向量表示所能提供的增益非常有限。这很可能是因为模型更容易朝向文档的多个向量表示比较接近的方向收敛,而加入覆盖率机制可以有效地解决这个问题。
表4 段落排序任务消融实验结果Table 4 Results of ablation experiment on passage ranking task
进一步地,将多表达的文档聚合模块替换成与查询聚合模块一样的方式,即直接取BERT 输出的[CLS]处的向量作为文档表示。表4中的结果显示,模型的性能会继续下降,这表明了对文档使用多个向量表示的有效性。
在本文提出的多表达语义检索模型中,文档聚合成多个表达的个数k是一个非常关键的参数。因此,在段落排序和文档排序任务上对不同的k值进行分析,实验结果如图3和图4所示。
图3 性能随段落表示向量个数的变化Fig.3 Performance over different number of passage representation vectors
图4 性能随文档表示向量个数的变化Fig.4 Performance over different number of document representation vectors
从结果可以看出,在两个任务上,模型性能随着k值的变化所呈现的趋势相似。随着k值的增加,模型的MRR 指标会先升高,再逐渐下降。如果设置较低的k值,比如对文档排序任务设置k值为4,则模型的性能提升并不十分明显。对于段落排序和文档排序任务,最优的k值分别为4 和16。这是因为文档排序任务的文档长度(平均约为1 129)相比段落排序任务的文档长度(平均约为57)更大,长文档包含更多的信息和更多、更分散的主题,因此需要聚合成的表达个数更多。
需要注意的是,如果将k设置得过大(例如对文档排序任务设置k值为32),模型的性能会变差。这是因为如果设置k值大于最优值,则文档内表达同一个主题的内容可能被强制分散到多个表达中,导致在检索过程中查询向量仅可见少量的文档信息,从而无法将相关文档排到靠前的位置。为了进一步验证该结果,计算了在k值逐渐增加时,所产生的文档多个表达之间的最小余弦相似度的变化情况。图5 展示了在文档排序任务上的实验结果。从结果可以看到,一旦k值大于最优值,文档各表达之间的最小相似度会出现急剧下降。
图5 文档表达间的最小相似度随文档表示向量个数的变化Fig.5 Minimum similarity between document representations over different number of document representation vectors
本文提出了基于多表达的第一阶段语义检索模型。该模型使用双编码器架构,将查询和文档分别表示成一个向量表达和多个向量表达,从而解决了基于单表达的模型存在的文档信息丢失问题。进一步地,为了保证文档的多个向量表示之间的差异性,并能够覆盖文档中不同主题的信息,在文档的聚合模块引入了覆盖率机制。在MS MARCO 数据集的段落排序和文档排序任务上进行了详尽的实验验证,本文模型相比以往的语义检索模型都取得了更好的结果。通过对模型进行消融分析和关键参数分析,进一步验证了多表达机制和覆盖率机制的有效性。
在未来的工作中,将会探索设计可学习的模型,针对不同的文档预测最优的向量表达个数,从而进一步提高检索性能。