稠密检索之训练篇

提纲

1 简介

2 损失函数

3 主要问题

3.1 Negative selection  

‍‍

3.2 Data augmentation  



3.3 Pretraining for dense retrieval model  

4 总结‍‍

参考文献 ‍

1 简介‍‍‍‍‍‍‍‍‍

  **如何有效训练稠密检索所依赖的预训练语言模型,是获得令人满意的检索效果的关键。在这里我们聚焦于稠密检索第一阶段召回所涉及到的Bi-encoder模型的训练,主要讨论对应的损失函数,以及三个训练相关的事项,包括训练负样本的构造,监督数据缺乏以及预训练模型不匹配。**

2 损失函数‍‍‍‍‍‍‍‍‍

稠密检索常采用负对数似然损失函数,它的核心就是最大化跟query相关的doc(正样本)的概率,如下图所示,q代表query,d表示doc,f表示相似度函数,d+表示跟query相关的文本doc(正样本),而D-表示所有候选文本集合减去跟query相关的文本,也就是负样本集合。  **我们希望query跟d+的相似度尽可能高,从而使得整个损失函数尽可能小。**   

picture.image

图1: 负对数似然损失计算公式

由于上面提及的损失函数在计算每个query的相似度时,都需要计算跟资源库所有的候选文本的相似度,非常耗费时间,于是往里面添加了  **抽样技巧,在计算损失时会从候选文本中进行抽样或者选择其中一部分文本,只考虑query跟这部分文本的相似度,也就是对损失函数分母的右半部进行调整。这也是在训练时更经常被采纳的损失函数。**

picture.image

图2: 基于抽样策略的负对数似然损失计算公式

除此之外,还有一些其他的损失函数,例如triplet ranking loss,直接优化在给定query下一个正样本跟一个负样本的差距。或者还有重排模型训练经常用到的binary cross-entropy,就是直接计算给定query跟某个文本之间的相似度,不考虑跟其他文本之间的关联,也就是训练二分类模型的常见做法。

picture.image,

图3: triplet ranking loss

稠密检索用到的相似度函数可以选择余弦相似度,向量内积,欧式距离等,其中  **余弦相似度更倾向于召回短文本,而向量内积则倾向于召回长文本,目前向量内积被广泛应用于相似度计算中。**

3 主要问题‍‍‍‍‍‍‍‍

 **Large-scale candidate space:** 在检索任务中,资源库里有庞大数量的文本,但是只有极少部分文本跟query相关,所以很难训练出能在大规模资源库上表现优秀的稠密检索模型。另外,由于计算时间跟存储空间限制,在模型训练计算相似度时只会用到一小部分负样本,但是在测试时却是在整个资源库上进行,从而会造成候选空间在训练跟测试阶段的偏移。


  **Limited relevance judgements** :由于资源库非常庞大,很难进行全部的相关性标注,也就是很难讲同一个,所以就不容易训练基于大规模语言模型的稠密检索模型。另外,由于很难对资源库中所有关于query的正样本文本都进行标注,就很容易将这些正样本当作负样本处理,也就是false negative。


 **Pretraining discrepancy** :大规模语言模型的预训练任务通常是掩码预测跟下一句预测,但这些任务并不是不针对检索任务设计的,所以在检索任务中可能达不到最优。为稠密检索模型特意设计新的预训练任务,从而使大规模语言模型适配检索任务是有必要的。

3.1 Negative selection

针对第一个问题,为了更好的优化稠密检索模型,如果选择更加高质量的negative文本变成了一种重要事项,以下就是不同的负样本选择策略。



  **Random** :随机选择若干个文本作为negative样本


  **In-batch Negative** :对于每一个batch里的b(b>1)个query,对于每一个query,可以将其他b-1query的正样本视作该query的负样本。也就是对于整个batch内的每一个query而言,将其他query的正样本作为该query的负样本。


 **Cross-batch Negative** :将负样本的范围从同一个batch扩展到多个batch,需要建立多个GPU下不同batch的关联。


  **Hard Negative:**  **上述几种方法虽然可以增加负样本,但是不能保证这些负样本的质量,于是有人提出一些方法用于选择得到高质量的负样本,** 高质量的负样本也称hard negative,指的是跟query不相关但是跟query之间有一个较高的语义相似度的文本。根据负样本选择模块是固定或者动态的,可以将这类方法可以分为static hard negative跟dynamic hard negative。其中static head negative利用其他检索器检索得到的某query对应的topK个文档,从中抽样作为hard negative,在整个检索器训练过程中不会有其他变化。而dynamic hard negative考虑到稠密检索器的训练是一个反复迭代的过程,所以最好也要不断更新其中的negative样本。在具体训练过程,利用更新后的query编码器或者doc编码器分别对query跟doc进行编码,从而获得动态的negative样本。另外还有denoised hard negative,将经过bi-encoder方式筛选得到的负样本送出更加强大的cross encoder模型进行打分,只要预测得分足够低的样本才会作为最终检索器训练的负样本,防止false negative的情况。



 **In-batch sampling不能生成关于稠密检索的信息量足够的负样本,因为它只考虑到了一个batch内的样本,而不是整个资源库的文档。随机负采样主要最小化了整个资源库的pairwise error,容易过度注重于那些困难query的优化,而hard负采样最小化的是顶层的那些文档(被召回的topK文档)的pairdwise error,更适合针对顶层文档排序的优化。**

3.2 Data augmentation

针对前面提及的第二个问题,  **为了增加训练数据中relevance judgment的数量,常常会采用数据增强的方式。** 目前主要有两种做法, 一种是利用额外的监督数据集,利用多个数据集或者多个任务可以训练得到一个更加强大且鲁棒的检索器,另一种则是通过知识蒸馏来生成对应的伪标签,可以利用一个更加强大的teacher模型(例如corss encoder)给训练数据pair带上对应的hard标签或者soft标签,然后加入到student模型(通常是bi-encoder)的训练中。  **在蒸馏过程中,如果teacher模型跟student模型在能力上存在较大差距时,很难直接进行蒸馏,也需要采用渐进式的方式。例如分阶段增加teacher模型的能力以适配student模型,或者固定teacher模型,逐步增加蒸馏知识的难度。**

3.3 Pretraining for dense retrieval model

  **预训练语言模型一开始的目的是从文本中学习到通用的语义表征,从而泛化到不同的下游任务中去。但是由于缺乏针对特定任务的优化,往往会导致在下游任务中只能达到一个局部最优的效果** 。于是也有人针对稠密检索任务设计了一些对应的预训练任务,例如基于自监督的Inverse Cloze Task,随机选择给定文本中的一句话作为query,而将给定文本的其余句子作为要检索匹配到的文本。这个任务可以捕捉到句子之间的语义,并且提高query跟相关文档之间的匹配能力。也有基于生成任务的,给定文档,让模型基于阅读理解的能力,直接生成对应的question跟answer。除此之外,另外一种增加预训练语言模型能力就是学习利用外部检索器,通过使用外部检索器来提升语言模型MLM的训练。



对于Bi-encoder检索器而言,通常会将[CLS]位置上的表征作为query或者doc的表征,但是原始的[CLS]并没有被显示设计成整个文本的表示,所以可以通过自重建任务去解决这个问题。自重建任务就是通过编码器将文本信息压缩到[CLS]的表征,然后再通过解码器利用[CLS]的表征重建出原本的文本。在这个任务中发现如果解码器太过强大的话,可能会解码是更依赖于当前生成的文本,而不是通过编码器得到的文本表征。除此之外,另一个有前景的方向是通过对比学习去增加模型的表征能力。

4 总结‍‍‍‍‍‍‍‍‍‍‍‍‍

首先,cross batch的方法能明显提升检索性能,其中的关键是能够构造更多的负样本,这也就意味着应该使用更大的batch size。其次,Denoise hard negative也能提升检索性能,归因于低质量的负样本会损害模型性能。另外,数据增强的方式可以增加伪标签样本数量,进一步提升性能。最后,动态蒸馏学习的方式也能提供帮助。

参考文献

1.(2022,) Dense Text Retrieval based on Pretrained Language Models: A Survey

https://arxiv.org/abs/2211.14876

0
0
0
0
评论
未登录
暂无评论