GLInt:基于几何匹配的硬负样本挖掘,提升晚期交互检索性能

0 阅读

引言

晚期交互检索模型(如ColBERT)的评分机制与传统的稠密检索有本质区别。稠密检索将查询和文档各压缩为一个向量,直接比较;而晚期交互模型保留多个token向量,在评分时才进行交互。这种差异通常被视为推理时的优势,但在数据构建阶段同样至关重要。

硬负样本挖掘本身就是一个排序问题。给定查询和已知相关文档,挖掘器需要寻找看似相关但实际不相关的文档作为训练负样本。如果挖掘器与学生模型的相似度判断不一致,训练样本可能无法提供有效的区分度。

独立的相关工作(如Athrael的MaxSim挖掘实验)已经得出了类似的结论:几何匹配的选择有助于晚期交互学生模型。本文从相同的问题出发,但更关注整个数据管道多向量化后的连锁反应:评分分布压缩、稠密空间阈值失效、假阴性暴露增加、过滤消耗浅层候选池,以及蒸馏中的几何问题。

在深入之前,先明确几个术语:正样本是数据集明确标注与查询相关的文档;负样本是训练中视为不相关的文档;硬负样本是检索器评分高但实际不相关的文档;假阴性是实际相关但被当作负样本的文档,通常因为标注不完整。

挖掘器越擅长寻找语义相关的文档,就越接近“负样本”本身不确定的边界。

训练流程的简要概览如下:

模型或训练阶段 BEIR-15平均nDCG@10
LateOn-unsupervised(起点) 50.11
使用BiCA增强LightOn-embeddings-fine-tune进行SFT 50.03
Jina教师+混合KL/InfoNCE蒸馏(仅MS MARCO) 54.58
GLInt 57.43

1. MaxSim空间中的挖掘

对于晚期交互检索器,查询和文档由token向量集合表示。遵循ColBERT的评分公式,简化的MaxSim分数为:

S(q,d) = Σ_i max_j cos(q_i, d_j)

每个查询token选择其最佳匹配的文档token,并将这些匹配求和。

使几何特性变得具体的是检索候选池内分数的分布。

评分函数 正样本 最佳候选 最差候选 候选跨度/正样本
MaxSim 14.83 14.91 14.71 0.014 (1.4%)
稠密(DenseOn) 0.49 0.59 0.45 0.079 (7.9%)
BM25 5.45 9.30 4.21 0.935 (93.5%)

image

整个MaxSim候选池的分数窗口仅围绕正样本基线约1.4%。每个检索到的文档都匹配了许多查询token,因此每个文档都获得了可观的分数下限。有用的差异被压缩在一个狭窄的区间内。

当正样本感知的硬负样本挖掘进入时,这一点变得重要。NV-Retriever推广了正样本感知的挖掘规则,将候选分数与已知正样本分数进行比较。简化形式为:当 score(query, candidate) > threshold × score(query, positive) 时拒绝候选。

这个想法是合理的:如果挖掘的候选分数接近标注的正样本,它可能本身是相关的,不应作为负样本。

隐藏的假设是候选与正样本分数的比率是一个稳定的量。但在MaxSim池中,它并不稳定。

比率阈值 保留的负样本数(MaxSim,共50) 保留的负样本数(稠密,共50)
0.95 0.0 23.3
0.99 20.7 26.8
1.02 50.0 29.6

在0.95时,截止值低于最差的候选,因此所有候选都被拒绝。在1.02时,所有候选都存活。几个百分点的移动使规则从“全部移除”变为“全部保留”。

这比仅仅需要重新调整阈值更重要。统计量本身对于分数几何变得病态。MaxSim是token级最大值的总和,因此检索到的文档积累了可观的基线分数。硬候选之间的信息差异被压缩在该下限之上的小区域。

阈值并不因为表示为比率而与几何无关。

替代方案必须是基于排名的相对规则:用独立的MaxSim评判器对已知正样本和挖掘的候选进行评分,然后询问候选是否排名高于最佳已知正样本。

这保留了正样本感知挖掘的思想,同时将决策规则改为匹配候选被评判的几何。

在MaxSim空间中,重新推导每个常数。为稠密检索校准的阈值、温度、分数尺度和过滤规则不会自动转移。

2. 硬负样本、假阴性与过滤

第一次直接审计比较了同一对(查询,正样本)的多向量和稠密负样本,由独立的重新排序器评分。

负样本来源 平均硬度 假阴性率
多向量挖掘 +0.011 11.6%
稠密挖掘 −0.046 5.9%

多向量负样本的硬度高出0.057,且假阴性率约为两倍。硬度是重新排序器对负样本的平均相关性分数,在同一列表传递中与正样本一起评分;假阴性率是这些负样本中得分高于正样本的比例。

这些不是独立的现象。token级检索器更擅长找到与查询证据结构对齐的段落。这正是它找到困难干扰项的方式,也是它找到未标注但回答查询的段落的方式。

更硬的负样本和假阴性是同一行为的两个方面。更强的挖掘器更接近“负样本”标签不确定的边界。

使用独立的晚期交互评判器的第二次审计发现,原始挖掘池顶部的加权假阴性率为17.6%。在Natural Questions和MS MARCO中问题尤其严重,最高排名的挖掘候选通常得分高于标注的正样本。

最终的过滤管道使用GTE-ModernColBERT-v1作为晚期交互评判器。对于每个查询,它使用MaxSim对已知正样本和挖掘的候选进行评分,拒绝任何排名高于最佳已知正样本的候选,并从该边界下方的分数带中采样负样本。

为了测试这是否真的减少了假阴性,我使用了单独的模型jina-reranker-v3.5作为独立的事后审计器。Jina不参与构建过滤数据集,仅用于比较原始池和几何匹配池。

数据集版本 加权假阴性暴露 正样本排名第一
原始多向量数据 12.2% 64.7%
几何匹配评判数据 3.8% 84.7%

假阴性暴露减少了69%。模型按预期方向改进:相对于无监督基线的损伤从−4.79降至−2.66。

过滤是必要的,但它创造了下一个问题。我的第一次挖掘运行每个查询仅保留前80个候选。LateOn稠密配方挖掘到2048深度,相差25倍。一旦排名高于正样本的候选被否决,浅层多向量池通常几乎没有有用的材料,尤其是在MS MARCO和NQ中。

重新挖掘到2048深度,同时保持训练配方不变,将诊断损伤从−2.66降至−1.02。这是任何负样本选择变化中最大的改进。

变化 诊断均值差异
池深度:80 → 2,048 +1.54
更软的分数带 +0.28
每行负样本数:7 → 10 −0.03
上采样上限 −0.03
深度池上的排名扩展 −0.39
添加评判的BM25候选流 −0.02

模式比我预期的更清晰。更硬并不单调更好。 故意在更硬的排名上扩展样本使迁移变差。硬度有一个内部最优值。

一旦池足够深并通过相同的评判器,确切的采样规则就不那么重要了。甚至添加评判的BM25流,在过滤前贡献了非常不同的候选,结果仅变化−0.02。

最重要的是,除非控制池深度,否则挖掘方法之间的比较没有意义。前80挖掘器和前2048挖掘器不在相同条件下测试。

一旦过滤是几何感知的,挖掘深度就成为训练配方的一部分。

更深的挖掘解决了每个查询的短缺,但没有解决跨数据集的不平衡。

评判否决从不同来源移除了非常不同的部分,导致幸存的SFT池严重偏向:MS MARCO占所有可用对的37.9%,而FiQA仅贡献0.3%。在这些原始比例上训练将主要保留不平衡。

因此,我使用 w_s = sqrt(usable_s) * (1 - FN risk_s) 对每个来源进行加权。

这两个术语做不同的工作。平方根是标准的α=0.5平滑,遵循稠密配方的相同约定。它给数据集大小带来递减的回报:一个来源有4倍多的幸存对,得到2倍的大小权重,而不是4倍。

第二个术语解释了基于计数的平滑无法看到的东西:并非每个幸存的配对都同样可信。具有高测量假阴性率的来源应贡献更少,即使它有大量可用行。

NQ和SQuAD v2使差异具体化。过滤后它们包含几乎相同数量的可用对:NQ为112,900,SQuAD v2为113,579。使用α=0.5平滑,它们接收几乎相同的目标,比率为1.003。

但它们的测量假阴性率完全不同。NQ为32.6%,而SQuAD v2仅为2.8%。将这些池视为等效将意味着花费NQ训练预算的很大一部分来教导模型推下可能实际回答查询的文档。

乘以(1 − FN risk)将比率移至1.45,因此SQuAD v2最终多出44%的行,尽管起始可用池几乎相同。

风险项故意在平方根之外:sqrt(usable) * (1 - FN risk) 而不是 sqrt(usable * (1 - FN risk))。平方根应抑制大小,而不是质量。如果污染放在平方根内,NQ的32.6%假阴性率会与数据集大小一起软化。NQ/SQuAD比率回落到约1.21,质量校正停止做太多。

数据集大小有递减的回报。缺陷率没有。

我也考虑过直接丢弃最脏的来源。那会丢弃太多。NQ在32.6%风险下仍然大部分是干净的,它代表自己的检索分布,后来的实验表明广度是整个项目中最强的杠杆之一。降权保持了覆盖,同时为污染付出更少。

平滑指数和风险校准都仅使用FiQA固定。没有使用BEIR评估组来调整配方。

来源 FN风险 可用对 之前份额 写入行数 之后份额 上采样
MS MARCO 24.0% 446,692 37.9% 337,991 21.5% 0.76×
TriviaQA 8.4% 238,126 20.2% 297,619 19.0% 1.25×
HotpotQA 1.1% 127,703 10.8% 234,817 15.0% 1.84×
FEVER 2.8% 124,063 10.5% 227,340 14.5% 1.84×
SQuAD v2 2.8% 113,579 9.6% 217,595 13.9% 1.92×
NQ 32.6% 112,900 9.6% 150,738 9.6% 1.34×
BiCA 0.4% 12,069 1.0% 72,885 4.6% 6.04×
FiQA 20.8% 3,672 0.3% 31,900 2.0% 8.71×

MS MARCO是唯一实际下采样的来源。其他一切都接受某种程度的上采样,但出于两个不同的原因。

平方根项将小来源向上拉。BiCA从幸存池的1.0%到最终SFT混合物的4.6%,尽管只有12,069个可用对。

风险项阻止脏来源随之上升。NQ和SQuAD v2以几乎相同的可用计数开始,但SQuAD v2接收多44%的行,因为其测量假阴性率大约低12倍。

上采样在这里不是字面上的行重复。每次发出一个(查询,正样本)对时,我从其幸存的候选带中随机重新采样7个负样本。因此,FiQA的8.71×并不意味着模型看到完全相同的例子九次。这意味着相同的查询-正样本对出现在大约九个不同的负样本集上。

表中还有一个警告,我直到后来才意识到。BiCA以19,997个原始行开始,但7,928个被丢弃,因为少于七个负样本通过评判否决。其候选池自然浅。

在每SFT行七个负样本时,这是可存活的。

在每蒸馏行32个候选时,则不是。

3. 从SFT到知识蒸馏

相同的压缩分数几何在从监督微调转向知识蒸馏时再次出现。

PyLate的默认蒸馏路径在应用softmax之前对每行教师分数进行最小-最大归一化。使用32个候选,得到的教师分布熵为3.437,而完全均匀分布为3.466。目标距离均匀99.2%。

添加教师温度τ=0.3重新锐化目标,将模型在诊断套件上提高了+0.36。

学生目标内部有第二个压缩点。晚期交互分数需要对查询token求和。平均token贡献再次压缩分数范围,因此温度1下32个候选的softmax变得几乎均匀。

挖掘部分的教训直接延续到蒸馏:一旦底层分数几何改变,相同的数值操作可以表现得非常不同。

我最初期望用作蒸馏教师的重新排序器很重要。在实践中,它几乎没有移动结果。

蒸馏配置 平均nDCG@10
MS MARCO,BGE-Gemma教师 54.72
MS MARCO,Jina教师 54.58
七源混合物,Jina教师 57.33

保持Jina教师和相同的目标,但将蒸馏数据从仅MS MARCO扩展到七个来源,将分数从54.58提高到57.33,增益+2.75。

七源混合物覆盖MS MARCO、Natural Questions、SQuAD v2、FEVER、HotpotQA、TriviaQA和FiQA。教师没有改变。目标没有改变。改变的是学生看到的硬排名问题的范围。

这大约是二十比一的效应大小差异:教师选择几乎无关紧要,而数据广度占了几乎所有的改进。

你蒸馏的分布可能比产生分数的模型重要得多。

BiCA使该结论的边界更加清晰。

我首先将生物医学引文数据集添加为第八个SFT来源。BiCA自然提供了足够的评判负样本用于七负样本SFT行,因此数据可以在不发明额外候选的情况下使用。一旦应用七源KD阶段,效果大致中性:完整BEIR均值+0.10。它没有在KD混合物提供的广度之外增加太多,但也没有损害模型。最终的GLInt检查点使用这个BiCA增强的SFT检查点。

将BiCA添加为第八个知识蒸馏来源是完全不同的结果。诊断均值从55.46降至54.03,损失−1.43,八个数据集中有七个变差。最大的下降在TREC-COVID、NFCorpus和SciFact,即BiCA本应帮助的科学和生物医学数据集。

BiCA添加位置 候选构建 结果
SFT 每行七个评判负样本 在KD后大致中性:BEIR-15 +0.10
KD 固定32路候选列表 诊断均值−1.43

问题不是生物医学数据。而是固定的32路KD池。

BiCA每个查询仅提供约7.5个真实引文负样本,但列表式蒸馏格式需要32个候选。其余槽位用语料库中的随机文档填充。总共489,936个候选槽位(共639,904个)是随机填充,占77%。

在锐化的列表式目标下,这些随机文档不是无害的填充物。它们成为排名目标的一部分,教导学生区分琐碎容易的负样本,而不是解决硬候选之间的有意义歧义。

SFT结果表明BiCA本身是可用的。失败来自将自然浅的来源强制进入32路排名格式,并假装7.5个硬负样本加上24.5个随机文档形成有用的列表式任务。

数据广度的有用单位不是来源数量。而是它们贡献的硬排名问题的数量。

BiCA保留在GLInt使用的SFT路径中,但从最终的七源KD混合物中排除。

4. 最终结果

最终模型因此不是单一挖掘技巧的结果。它是管道中挖掘几何、假阴性过滤、候选深度、混合物构建和蒸馏设置都围绕晚期交互评分调整的终点。

BEIR-15。 下表报告了标准15个BEIR组的平均nDCG@10,CQADupStack在其子论坛上平均。

模型 平均 大小(M) 嵌入维度 ArguAna CQADupstackRetrieval ClimateFEVER DBPedia FEVER FiQA2018 HotpotQA MSMARCO NFCorpus NQ QuoraRetrieval SCIDOCS SciFact TRECCOVID Touche2020
ColBERTv2 48.63 110 128 46.50 38.30 17.60 45.20 78.50 35.40 67.50 46.00 33.70 52.40 85.50 15.40 68.90 72.60 26.00
Jina-ColBERT-v2 51.85 600 128 36.60 40.80 23.90 47.10 80.50 40.80 76.60 46.90 34.60 64.00 88.70 18.60 67.80 83.40 27.40
ColBERT-small 53.79 33 96 50.09 38.75 33.07 45.58 90.96 41.15 76.11 43.50 37.30 59.10 87.72 18.42 74.77 84.59 25.69
GTE-ModernColBERT-v1 54.75 149 128 47.52 41.08 31.33 47.56 87.67 45.25 77.48 45.60 37.83 61.62 86.71 19.22 76.33 84.84 31.25
ColBERT-Zero 55.39 149 128 52.82 41.41 35.90 47.43 90.52 42.50 79.45 45.95 37.21 61.82 85.19 19.84 76.33 78.27 36.24
LateOn-unsupervised 50.11 149 128 43.12 47.71 18.76 43.36 65.74 51.94 68.17 37.51 37.15 58.41 89.48 21.13 76.89 69.81 22.53
LateOn 57.22 149 128 50.52 47.36 39.67 45.99 92.02 53.12 79.98 45.67 37.79 63.91 89.67 21.90 76.61 83.60 30.52
GLInt 57.43 149 128 52.38 46.49 34.17 47.68 92.45 50.85 82.54 46.38 37.51 68.03 90.08 20.65 77.13 84.78 30.26

GLInt达到57.43平均nDCG@10,而LateOn为57.22。它在ArguAna、DBPedia、FEVER、HotpotQA、MS MARCO、Natural Questions、Quora、SciFact和TREC-COVID上优于LateOn,以及整体平均。

BEIR-Decontaminated。 遵循LateOn,我也在BEIR-Decontaminated上评估了GLInt,该基准移除了已知污染,提供了跨14个BEIR组的泛化第二视图。

模型 平均 ArguAna ClimateFEVER DBPedia FEVER FiQA2018 HotpotQA MS MARCO NFCorpus Natural Questions Quora SciDocs SciFact TREC-COVID Touché-2020
GLInt 62.50 51.67 36.35 42.50 92.89 56.88 81.16 72.70 26.21 94.97 92.06 22.02 89.07 81.51 34.97
LateOn 61.4 52.2 42.1 31.7 92.7 57.9 78.9 70.3 27.0 93.1 91.5 15.1 88.9 80.9 36.8
DenseOn 58.8 40.0 39.5 28.8 91.2 55.9 73.7 68.9 28.5 92.1 91.1 14.7 85.4 82.5 31.0
pplx-embed-v1-0.6b 59.7 43.7 42.4 28.4 91.1 55.2 73.5 71.9 28.0 91.6 91.5 15.4 89.0 83.7 30.0
jina-v5-text-nano 58.8 47.2 41.6 30.2 90.0 51.5 67.5 68.6 29.4 92.3 91.3 14.9 89.4 76.8 33.2
harrier-oss-v1-0.6b 58.0 47.4 25.7 31.3 80.7 50.1 71.4 73.4 27.9 90.0 90.9 17.1 90.7 81.8 33.3
arctic-embed-l-v2 57.9 43.1 45.7 45.7 92.2 50.4 63.1 71.0 26.0 90.7 91.3 13.9 87.4 81.4 26.8
bge-large-en-v1.5 57.3 46.0 39.0 28.9 87.6 49.3 75.2 68.9 29.8 85.9 91.3 14.0 86.5 72.7 26.9
Qwen3-Embedding-0.6B 57.0 48.4 38.0 25.3 86.4 49.1 62.2 63.6 25.8 88.3 90.0 15.3 85.5 87.9 31.8
GTE-ModernBERT 56.6 52.5 47.5 25.9 94.1 55.5 65.5 64.8 26.1 84.5 90.8 11.6 88.6 62.4 23.1
bge-base-en-v1.5 56.2 45.6 32.9 26.7 86.8 44.5 72.7 66.8 27.4 85.6 91.1 13.8 87.6 76.6 28.1
Nomic v1.5 55.9 35.8 43.5 28.8 86.8 44.7 72.7 67.4 24.4 85.1 87.2 12.7 83.3 80.7 29.4
modernbert-embed-base 55.6 36.5 37.8 24.7 87.8 46.0 62.7 65.3 24.3 89.3 89.9 12.9 85.5 82.7 33.1
ColBERT-Zero 60.0 54.5 36.8 33.0 90.5 46.6 77.8 74.2 26.6 91.1 88.3 14.2 89.5 75.3 40.9
pplx-embed-v1-late-0.6b 59.8 60.9 36.4 29.9 89.7 50.9 78.6 69.2 27.9 92.8 83.8 13.5 89.3 80.2 34.7
GTE-ModernColBERT 59.3 48.8 33.5 33.2 88.1 50.2 77.3 71.6 27.3 93.1 89.1 13.6 87.7 81.4 35.3
colbert-small 58.1 47.7 35.7 31.7 89.3 45.6 77.1 71.4 25.0 86.2 90.1 13.1 89.2 81.5 29.0

image

GLInt在此评估中达到平均62.50,而LateOn为61.4。

5. 大规模挖掘

以上所有内容都假设完整的多向量挖掘在计算上是可行的。因此,工程问题是如何检索深度MaxSim池,而不将数据构建变成多天的瓶颈。

我将精确暴力MaxSim与通过PyLate的Rust fast-plaid实现的PLAID和WARP进行了比较。基准使用250,000个文档,以精确MaxSim为参考。

后端 Recall@50 吞吐量 发货排名带的分数与精确比较
精确MaxSim 1.000 20查询/秒 地面真值
fast-plaid (nfs=2048) 0.851 54–80查询/秒 −0.01%
WARP,默认,8线程 0.642 371查询/秒 0.00%

乍一看,WARP的召回率看起来很差:它错过了精确前50的三分之一以上。然而,对于硬负样本挖掘,集合重叠不是我最终关心的指标。

由于MaxSim候选分布如此压缩,排名50和200可能是近并列。Recall@50严重惩罚将一个近并列文档与另一个交换,即使两者作为训练负样本同样有用。WARP返回的候选在进入训练的实际排名带中与精确候选具有几乎相同的MaxSim分数。

这使得WARP比fast-plaid快约四倍:整个作业约四小时墙钟时间,而不是十六小时。

分数比较使用了每个后端自我报告的分数,这些分数在不同配置中并不完全可比。严格的精确比较将采用每个后端返回的文档ID,并用精确MaxSim重新评分。我没有运行那个详尽的重新评分,因此我将分数等价结果视为工程信号,而不是精确基准。

对于挖掘,分数等价的近并列比精确的前50 ID重叠更重要。

实际分工是:

  • WARP用于挖掘,其中近并列替换是可接受的,吞吐量占主导。
  • fast-plaid用于评估,其中精确的顶级排名身份对nDCG很重要,并且我希望与其他晚期交互模型的评估设置一致。

附录:未成功的实验

在最终模型收敛后,我尝试了一系列后训练和继续训练的想法,旨在提取进一步的改进。它们都没有整体工作。

尝试 结果
推理时[MASK]查询扩展 −4.92至−5.93
训练扩展向量 −0.92
静态语料库IDF token加权 −1.17
学习查询token门 −0.18
PLAID前100的精确MaxSim重新评分 −0.78
LLM生成的证据扩展 −3.53
语料库接地共识反馈 −0.36
短形式Nomic KD继续 −0.57
与该检查点的均匀模型汤 −0.09
最优传输自蒸馏 0.25 vs 55.46:完全崩溃

失败分为三个有用的类别。

添加查询内容改变了MaxSim评分的对象。 推理时[MASK]扩展、训练扩展向量、LLM生成的证据和语料库接地反馈都向查询添加了向量。这个家族在精神上与查询和伪文档扩展方法(如HyDE)相关,但在基于和的MaxSim评分器下,添加的向量不是无害的上下文:它们接收自己的最佳文档token匹配并改变分数预算。

检索器开始回答扩展而不是原始查询。短查询数据集如TREC-COVID、Quora和FiQA受到最严重的打击,因为添加的向量在最终查询表示中占更大比例。

重新加权收敛的评分器几乎没有提供改进空间。 静态IDF加权、学习token门、精确候选重新评分和模型平均产生小或负的变化。检查点已经在其原生评分器下收敛。事后重新加权该几何主要扰乱了已经内部一致的解决方案。

模型汤实验遵循了Model Soups的检查点平均思想,但在这种情况下,与Nomic继续检查点的均匀汤仍然是−0.09。

精确重新评分值得具体澄清:实验重新评分了PLAID现有的前100。它可以改变它们的顺序,但不能恢复PLAID从未返回的精确MaxSim文档。负面结果拒绝了廉价的重新排名技巧,而不是精确穷举检索。

自派生目标可以在没有外部锚的情况下崩溃。 最优传输实验使用模型自己的token相似性矩阵来创建分离的传输目标。目标是鼓励查询token在文档中分布证据,而不是折叠到几个强匹配上。

损失平滑下降,但检索崩溃到平均0.25。

分离目标防止梯度流过它,但并没有防止目标随学生改变。一旦模型的分数变得均匀,其传输目标也变得均匀,创建一个自洽的退化解决方案。自蒸馏方法如DINO和SwAV使用额外的机制来避免这种崩溃。我的目标没有金正样本、冻结教师、参考模型、居中机制或交叉视图锚,因此它可以最小化自己,同时学习检索不到任何东西。

参考资料和资源

模型和数据集

  • LateOn和LateOn-unsupervised:监督参考和无监督起点检查点。
  • MS MARCO BGE-Gemma分数:原生知识蒸馏数据集和教师分数。
  • jina-reranker-v3.5:替代列表式教师和独立事后审计器。
  • GTE-ModernColBERT