#问答系统 #NLP #检索
知乎博客:RocketQAv2 阅读笔记 - 知乎
百度的检索技术厉害的原因:现实中 海量的用户历史数据、强大的中文ERNIE预训练模型、各种创新的模型训练策略。其中RocketQA v2便是其一。
先前,自己工作中,也有使用过RocketQA v1模型(策略),并完成相关业务。特此拜读v2论文《RocketQAv2: A Joint Training Method for Dense Passage Retrieval and Passage Re-ranking》--EMNLP2021
在QA检索中,passage retrieval 和passage re-ranking 是QA召回的一个流行的pipeline的两个模块。通常是在dense passage retrieval 后面加一个passage re-ranker 来提升 dense passage retrieval 召回的效果。这两部分性能的共同作用,最终决定了QA检索性能。传统的方法使用迭代优化的思想,即固定其中一个模型来优化另一个模型。然而,研究表明,如果两者的共同优化训练(联合训练),那么将有助于提升系统的整体性能。
然而,联合训练的最大难题是如何解决retriever and re-ranker训练方式的不一致的问题。
具体的,retriever 通常通过采用in-batch 负采样来训练,以期望最大限度地提高positive样本的概率,最小限度地减少采样得到的negatives样本的概率。retriever 一般通过在一个list规模的样本中拔高正样本的概率来训练,即listwise的训练方式。
re-ranker 通常以根据单一样本(point)的具体类别(或打分)或者一个正负样本对(pair)的正负对比关系 来训练模型的,即pointwise 或pairwise的训练方式。
为了解决联合训练的问题,于是文章提出了RocketQAv2 这个可以联合训练retriever和 re-ranker的训练策略。RocketQAv2主要由 dynamic listwise distillation和hybrid data augmentation strategy两部分组成。
通过将retriever和re-ranker的训练方式都统一为listwise模式,于是dynamic listwise distillation机制被提出来,从而实现retriever 和the re-ranker的联合训练。
因为listwise训练方式,需要多样化的、高质量、可以更好地代表整个语料库中所有passage分布的训练list样本。于是一个能更有效构建listwise训练数据的数据扩充方法hybrid data augmentation strategy被提了出来。
4.1预备知识
4.1.1dense passage retrieval(双塔模型)
给定一个query q,retrieval功能是从库中整体的M个文本passage中检索出top k个最相关的passage。retrieval 一般使用 dual-encoder(双塔模型)实现功能。
具体的,分别计算 query 和 passage的embedding EQ(·)和EP(·),以及通过embedding 点积形式计算文本相似性。
Tip: 一般双塔模型训练后,会第一时间推理库中所有passage为embedding存储起来,并为每个文本和embedding建立索引。从而实现一次双塔embedding推理,多次检索召回的目的,以减少时间。
retrieval 检索完对应的候选passage列表后,一般会使用re-ranker预测列表中passage的正负置信度。通过从候补正例中剔除负例,或增加强负例的方式,调整listwise中样本的label,提高listwise 数据质量。通过使用re-ranker产生的listwise 数据,再次训练更优质的retrieval 。
re-ranker一般基于cross-encoder(CE)。
cross-encoder能够评估query和passage列表相关性分数s(q,p),测量候选passage p与query q的语义相关性水平。
在re-ranker一般基于cross-encoder (CE),CE 可以更好地捕获passage和query之间的语义交互。但是相比于 dual-encoder ,CE也需要更多的计算工作量。
re-ranker用[SEP]拼接q和p并输入到CE中,将CE的[CLS]embedding输入一个MLP(多层线性网络)中,最终得到q和p相关性得分Sce(q,p)。
dense passage retrieval 和passage re-ranking 通常以一种单独训练,或者迭代训练方式进行学习的(即,固定一个,然后优化另一个)
一般基于cross-encoder的re-ranker性能更强大,因此通常是将模型知识从 re-ranker 蒸馏进retriever。也就是,re-ranker是teacher 模型,retriever是student 模型。
但是两者通常独立训练,re-ranker的参数是被冻结的。这也就无法实现共同优化这两部分的目的,这两部分也无法达到彼此相互优化的作用。Dynamic Listwise Distillation便是为联合训练而提出的。
步骤:
关于为何取名为Dynamic Listwise Distillation的原因:
Listwise :retriever和re-ranker都是用Listwise 方式训练的。
Distillation:联合训练的过程是一个模型蒸馏的过程。
Dynamic :这个训练的过程中,teacher 和 student是共同进行参数更新优化的,在训练teacher的时候,student通过学习soft label也实现了参数更新。
传统的,训练好teacher后,teacher参数固定后,进而进行student的指导训练。
为了执行Dynamic Listwise Distillation,我们需要为每个query生成listwise 训练的passage list。并且,passage list应该是由多样化的、高质量的passage组成,这样才能逼急现实情况中passage库的数据分布。
研究表明,passage list包含hard negatives(极度像正样本的难的负样本)是很重要的。因为weak negatives 很容易被学习到,是不会为这两个模块增加额外收益的。前人有使用randomly sampled hard negatives和denoised hard negatives这两种数据构造策略。
Hybrid Data Augmentation是通过综合randomly sampled hard negatives 和denoised hard negatives这两种方法后,得到的混合的方法。
结合图2,描述Hybrid Data Augmentation的实现步骤:
Hybrid Data Augmentation与前人方法相比,其利用了更多的方法(undenoised and denoised)来生成positives和negatives,提高了list样本的多样性。并且重点关注了hard negatives的构建。
步骤:
RocketQA这里训练好的retriever和re-ranker,分别为RocketQA中步骤1和步骤2处得到的模型,非全步骤训练的最强模型。也不一定非得RocketQA中的模型,也可以是其他已经训练好的召回模型和精排模型替代。
首先,RocketQA也是蒸馏的过程,不过采用的是teacher对样本进行打标签来蒸馏Student(通过产生hard pseudo labeled data)。而v2使用soft labels的蒸馏方式。
其次,RocketQA无法实现两个模块的联合训练,只能固定re-ranker来蒸馏优化retriever。
最后,RocketQA只使用了denoised hard negatives的数据构造方式。而v2的Hybrid Data Augmentation综合了randomly sampled hard negatives 和denoised hard negatives这两种方法。构建了更多样和高质量的训练数据。
5.1 Main results
关键的参数:构建listwise数据时候,the ratio of the positive to the hard negative is set to 1:127 on MSMARCO and 1:31 on NQ.
Passage retrieval results on MSMARCO and Natural Questions datasets.
Results on Passage Re-ranking
细节:
RocketQAv2 re-ranker 有基于BM25 retriever 和 RocketQA retriever 以及RocketQAv2 retriever 初始化的。
结论:静态蒸馏效果不及动态蒸馏(表第2行数据)
将re-ranker从listwize转换为pointwise,会导致性能下降。listwize训练方法比pointwise更适用于我们的联合训练架构,因为它可以更好地模拟dynamic listwise distillation中的相关性分布。
去掉训练样本中的去噪样本会导致性能下滑。这表明从不同方式生成的训练数据能更好地代表了整个passage库中所有passage的分布,并提高了性能。
对每个query的强负例个数的增加会带来检索模型与精排模型性能的提升。
时间上:
Dual-encoder(双塔)一般是面向千万级别的检索库,速度更快。
因为可以一次性对库中所有的文本生成embedding并建立索引存储。后面,面对不同query,都无需在进行embedding的推理,节省了大量时间开销。
而Cross-Encoder一般只用到的100或1000级别的数据规模上,因为对于不同的query,Cross-Encoder都得反复的计算passage的embedding。而Dual-encoder 一次inference ,多次使用
Cross-Encoder为何性能更优秀,并常被用于精排模型中?
其实两者都可以对检索样本进行打分,但是Cross-Encoder往往更准确。
查了很多资料,没找到答案。
个人认为,Cross-Encoder通过【SEP】拼接句子对的方式,可能符合BERT等模型的预训练任务NSP有关。NSP加持了模型的性能。
还有就是,同样的数据,训练单一的encoderCross-Encoder的,可能比同时训练两个encoder的双塔模型,更容易。
两者应用的选择上:
当需要对小规模的一组要进行的要评分的句子对时,就可以使用Cross-Encoder。
比如,您有 100 个句子对,您想获得这 100 个句子对的相似度分数。
当需要在向量空间中,对大量的句子embedding以进行快速比较时,都会使用Dual-encoder。例如信息检索/语义搜索或聚类。
Cross-Encoder 比双塔有更高的性能,但是,Cross-Encoder不能很好地扩展到大型数据集。一种流行的做法是,结合两者模型的优点,取长补短。
例如在QA检索/语义搜索中,通常用Dual-encoder当召回模型,用Cross-Encoder当精排模型。
首先,使用Dual-encoder从海量数据的passage库中检索top 100 最相似的句子。然后,使用Cross-Encoder通过计算每个句子对的分数来重新排列这 100 个候选答案。