GLInt: Geometry-Matched Hard Negatives for Late-Interaction Retrieval

Community Article
Published August 8, 2026

A field report on multi-vector mining, MaxSim geometry, knowledge distillation, and the experiments that did not work.

image

I started with a narrow question: Do hard negatives mined by a multi-vector retriever produce a better late-interaction model than negatives mined by a dense retriever? Pffftt, Obviously!
I introduce GLInt, which reaches 57.43 mean nDCG@10 on the 15 BEIR Tasks, starting from the unsupervised LateOn checkpoint. It outperforms the 57.22 result of LateOn, making it the strongest retriever under 300M parameters in this comparison. It also sets the highest Quora and HotPotQA score among models below 7B parameters.

The model and training data are available here:

Contents

  1. Introduction
  2. Mining in MaxSim space
  3. Hard negatives, false negatives, and filtering
  4. From SFT to knowledge distillation
  5. Final results
  6. Mining at scale
  7. Appendix: experiments that did not work
  8. References and resources

Introduction

Late-interaction retrievers such as ColBERT do not score documents the way conventional dense retrievers do. A dense retriever compresses the query and document into one vector each and compares those vectors directly. A late-interaction retriever keeps multiple token vectors and delays the interaction until scoring time.

That difference is usually discussed as an inference-time advantage. In this project, it turned out to matter just as much during data construction.

Hard-negative mining is itself a ranking problem. Given a query and a document the dataset says is relevant, the miner searches for other documents that look deceptively relevant and uses them as negatives during training. If the miner and the student disagree about similarity, the miner can spend training slots on examples the student finds easy while missing documents the student actually finds confusing.

Related independent work has reached the same first-order conclusion from a different setup. Athrael's MaxSim mining experiment reranks a dense candidate net with MaxSim and shows that geometry-matched selection can help a late-interaction student. My experiments started from the same broad question, but the more useful part turned out to be what happened after making the entire data pipeline multi-vector: the score distribution compressed, dense-space thresholds stopped transferring, false-negative exposure increased, filtering consumed shallow candidate pools, and the same geometry showed up again during distillation.

Before going further, four terms matter:

  • A positive is a document that the training dataset explicitly labels as relevant to the query.
  • A negative is a document treated as irrelevant for training.
  • A hard negative is a negative that the retriever nevertheless scores highly, making it difficult to separate from the positive.
  • A false negative is a document treated as a negative even though it is actually relevant, often because the dataset's relevance labels are incomplete.

The better a miner becomes at finding semantically relevant documents, the closer it gets to the boundary where "negative" itself becomes uncertain.

The high-level training progression1 was:

Model or training stage Mean nDCG@10 on BEIR-15
LateOn-unsupervised, the starting checkpoint 50.11
Augmenting LightOn-embeddings-fine-tune with BiCA for SFT 50.03
Jina teacher with Mixed KL/InfoNCE distillation using only MS MARCO 54.58
GLInt 57.43

1. Mining in MaxSim space

For a late-interaction retriever, the query and document are represented by sets of token vectors. Following the ColBERT scoring formulation, a simplified MaxSim score is

S(q,d)=imaxjcos(qi,dj). S(q,d) = \sum_i \max_j \cos(q_i, d_j).

Each query token selects its best matching document token, and those matches are summed.

The measurement that made the geometry tangible was the spread of scores inside a retrieved candidate pool.

image

Scoring function Positive Best candidate Worst candidate Candidate spread / positive
MaxSim 14.83 14.91 14.71 0.014 (1.4%)
Dense (DenseOn) 0.49 0.59 0.45 0.079 (7.9%)
BM25 5.45 9.30 4.21 0.935 (93.5%)

The entire MaxSim candidate pool occupied a window of only about 1.4% around a large positive baseline. Every retrieved document matched many query tokens reasonably well, so every document received a substantial score floor. The useful differences were compressed into a narrow band.

That becomes important when positive-aware hard-negative mining enters the picture.

NV-Retriever popularized positive-aware mining rules that compare the score of a candidate against the score of the known positive. In simplified form, a candidate is rejected when

score(query, candidate) > threshold × score(query, positive)

The idea is sensible: if a mined candidate scores suspiciously close to the labelled positive, it may itself be relevant and should not be used as a negative.

The hidden assumption is that the ratio between candidate and positive scores is a stable quantity.

In my MaxSim pool, it was not.

Ratio threshold Negatives retained of 50 (MaxSim) Negatives retained of 50 (Dense)
0.95 0.0 23.3
0.99 20.7 26.8
1.02 50.0 29.6

At 0.95, the cutoff fell below even the worst retrieved candidate, so every candidate was rejected. At 1.02, every candidate survived. A movement of only a few percentage points changed the rule from "remove everything" to "remove nothing."

This is more important than a threshold that merely needed retuning. The statistic itself had become poorly conditioned for the score geometry. MaxSim is a sum over token-level maxima, so retrieved documents accumulate a substantial baseline score. The informative differences between hard candidates are compressed into a small region above that floor.

A threshold is not geometry-independent just because it is expressed as a ratio.

The replacement had to be rank-relative rather than ratio-relative: score the known positives and mined candidates with an independent MaxSim judge, then ask whether a candidate ranks above the best known positive.

That preserved the idea behind positive-aware mining while changing the decision rule to match the geometry in which the candidates were actually being judged.

In MaxSim space, re-derive every constant. Thresholds, temperatures, score scales, and filtering rules calibrated for dense retrieval do not transfer automatically.


2. Hard negatives, false negatives, and filtering

The first direct audit compared multi-vector and dense negatives for the same (query, positive) pair, scored by the same independent reranker.

Negative source Mean hardness False-negative rate
Multi-vector mined +0.011 11.6%
Dense mined −0.046 5.9%

The multi-vector negatives were 0.057 harder, consistently across every source. They also contained roughly twice as many false negatives.

Hardness here is the mean relevance score the reranker assigns to a source's negatives, scored in the same listwise pass as the positive; the false-negative rate is the fraction of those negatives that outscore the positive outright. (This is an absolute reranker score, distinct from the mining band, which is expressed relative to each pair's own positive.)

Those are not separate phenomena.

A token-level retriever is better at finding passages that line up with the query's evidence structure. That is exactly how it finds a difficult distractor and also how it finds an unannotated passage that answers the query.

Harder negatives and false negatives are two sides of the same behavior. A stronger miner moves closer to the boundary where the label "negative" becomes uncertain.

A second audit with an independent late-interaction judge found a weighted false-negative rate of 17.6% in the top of the original mined pool. The problem was especially severe in Natural Questions and MS MARCO, where the highest-ranked mined candidate often scored above the annotated positive.

The eventual filtering pipeline used GTE-ModernColBERT-v1 as the late-interaction judge. For each query, it scored the known positives and mined candidates with MaxSim, rejected any candidate ranked above the best known positive, and sampled negatives from the score band immediately below that boundary.

To test whether this actually reduced false negatives, I used a separate model, jina-reranker-v3.5, as an independent post-hoc auditor. Jina was not involved in constructing the filtered dataset. It was used only to compare the original and geometry-matched pools.

Dataset version Weighted false-negative exposure Positive ranked first
Original multi-vector data 12.2% 64.7%
Geometry-matched judged data 3.8% 84.7%

That is a 69% reduction in false-negative exposure.

The model improved in the expected direction: the damage relative to the unsupervised base was cut from −4.79 to −2.66 on the diagnostic evaluation.

Filtering was necessary, but it created the next problem.

My first mining run retained only the top 80 candidates per query. The LateOn dense recipe mined to a depth of 2,048, a 25-fold difference. Once candidates that outranked the positive were vetoed, the shallow multi-vector pool often had very little useful material left, especially for MS MARCO and NQ.

Re-mining to depth 2,048 while holding the training recipe fixed reduced the diagnostic damage from −2.66 to −1.02. It was the largest improvement from any negative-selection change.

Change Difference on the diagnostic mean
Pool depth: 80 → 2,048 +1.54
Softer score band +0.28
Negatives per row: 7 → 10 −0.03
Upsampling cap −0.03
Rank-spread over the deep pool −0.39
Add a judged BM25 candidate stream −0.02

The pattern was clearer than I expected.

Harder was not monotonically better. Deliberately spreading samples across harder ranks made transfer worse. Hardness had an interior optimum.

Once the pool was deep enough and passed through the same judge, the exact sampling rule mattered much less. Even adding a judged BM25 stream, which contributed very different candidates before filtering, changed the result by only −0.02.

And most importantly, comparisons between mining methods are not meaningful unless pool depth is controlled. A top-80 miner and a top-2,048 miner are not being tested under the same conditions.

Once filtering is geometry-aware, mining depth becomes part of the training recipe.

Deeper mining solved the per-query shortage. It did not solve the imbalance across datasets.

The judge veto removed very different fractions from different sources, leaving the surviving SFT pool heavily skewed: MS MARCO accounted for 37.9% of all usable pairs, while FiQA contributed just 0.3%. Training on those raw proportions would mostly preserve the imbalance.

So I weighted each source using

ws=usables(1FN risks). w_s = \sqrt{\text{usable}_s}\,(1-\text{FN risk}_s).

The two terms do different jobs.

The square root is standard $\alpha=0.5$ smoothing, following the same convention as the dense recipe. It gives diminishing returns to sheer dataset size: a source with four times as many surviving pairs gets twice the size weight rather than four times the weight.

The second term accounts for something count-based smoothing cannot see: not every surviving pair is equally trustworthy. A source with a high measured false-negative rate should contribute less, even if it has plenty of usable rows.

NQ and SQuAD v2 make the difference concrete. They contain almost the same number of usable pairs after filtering:

  • NQ: 112,900
  • SQuAD v2: 113,579

With $\alpha=0.5$ smoothing alone, they receive essentially identical targets, a ratio of 1.003.

But their measured false-negative rates are completely different. NQ is at 32.6%, while SQuAD v2 is only 2.8%. Treating those pools as equivalent would mean spending a large fraction of NQ's training budget teaching the model to push down documents that may actually answer the query.

Multiplying by (1 − FN risk) moves the ratio to 1.45, so SQuAD v2 ends with 44% more rows despite starting from almost the same usable pool.

The risk term is deliberately outside the square root:

usable(1FN risk) \sqrt{\text{usable}}\,(1-\text{FN risk})

rather than

usable(1FN risk). \sqrt{\text{usable}(1-\text{FN risk})}.

The square root should damp size, not quality. If contamination is placed inside the square root, NQ's 32.6% false-negative rate is softened along with dataset size. The NQ/SQuAD ratio drops back to about 1.21, and the quality correction stops doing much.

Dataset size has diminishing returns. A defect rate does not.

I also considered simply dropping the dirtiest sources. That threw away too much. NQ at 32.6% risk is still mostly clean, it represents its own retrieval distribution, and later experiments showed that breadth was one of the strongest levers in the whole project. Down-weighting kept the coverage while paying less for the contamination.

Both the smoothing exponent and risk calibration were fixed using FiQA alone. No BEIR evaluation group was used to tune the recipe.

Source FN risk Usable pairs Share before Rows written Share after Upsample
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 is the only source that is actually downsampled. Everything else receives some degree of upsampling, but for two different reasons.

The square-root term pulls small sources upward. BiCA goes from just 1.0% of the surviving pool to 4.6% of the final SFT mixture, despite having only 12,069 usable pairs.

The risk term stops dirty sources from rising with them. NQ and SQuAD v2 begin with almost identical usable counts, yet SQuAD v2 receives 44% more rows because its measured false-negative rate is roughly twelve times lower.

Upsampling here is not literal row duplication. Each time a (query, positive) pair is emitted, I randomly resample 7 negatives from its surviving candidate band. FiQA's 8.71× therefore does not mean the model sees the exact same example nine times. It means the same query-positive pair appears against roughly nine different negative sets.

There was also a warning hidden in the table that I did not appreciate until later. BiCA started with 19,997 raw rows, but 7,928 were discarded because fewer than seven negatives survived the judge veto. Its candidate pools were naturally shallow.

At seven negatives per SFT row, that was survivable.

At 32 candidates per distillation row, it was not.


3. From SFT to knowledge distillation

The same compressed score geometry that broke positive-aware filtering appeared again when I moved from supervised fine-tuning to knowledge distillation.

PyLate's default distillation path min-max normalized each row of teacher scores before applying a softmax. With 32 candidates, the resulting teacher distribution had entropy 3.437, compared with 3.466 for a perfectly uniform distribution. The target was 99.2% of the way to uniform.

Adding a teacher temperature of τ = 0.3 to re-sharpen the target improved the model by +0.36 on the diagnostic suite.

There was a second compression point inside the student objective. The late-interaction score needs to be summed over query tokens. Averaging the token contributions compresses the score range again, so a softmax over 32 candidates at temperature 1 becomes nearly uniform.

The lesson from the mining section carried straight into distillation: the same numerical operation can behave very differently once the underlying score geometry changes.

I initially expected the reranker used as the distillation teacher to matter a lot. In practice, it barely moved the result.

Distillation configuration Mean nDCG@10
MS MARCO, BGE-Gemma teacher 54.72
MS MARCO, Jina teacher 54.58
Seven-source mixture, Jina teacher 57.33

Keeping the Jina teacher and the same objective, but expanding the distillation data from MS MARCO alone to seven sources, raised the score from 54.58 to 57.33, a gain of +2.75.

The seven-source mixture covered MS MARCO, Natural Questions, SQuAD v2, FEVER, HotpotQA, TriviaQA, and FiQA. The teacher did not change. The objective did not change. What changed was the range of hard ranking problems the student saw.

That was roughly a twenty-to-one difference in effect size: teacher choice was almost a wash, while data breadth accounted for nearly the entire improvement.

The distribution you distill over can matter far more than the model producing the scores.

BiCA made the boundary of that conclusion much clearer.

I first added the biomedical citation dataset as an eighth SFT source. BiCA naturally supplied enough judged negatives for the seven-negative SFT rows, so the data could be used without inventing extra candidates. Once the seven-source KD stage was applied on top, the effect was roughly neutral: +0.10 on the full BEIR mean. It did not add much beyond the breadth already provided by the KD mixture, but it also did not damage the model. The final GLInt checkpoint uses this BiCA-augmented SFT checkpoint.

Adding BiCA as an eighth knowledge-distillation source was a completely different result. The diagnostic mean fell from 55.46 to 54.03, a loss of −1.43, with seven of eight datasets getting worse. The largest drops were on TREC-COVID, NFCorpus, and SciFact, the scientific and biomedical datasets BiCA was supposed to help.

Where BiCA was added Candidate construction Result
SFT Seven judged negatives per row Roughly neutral after KD: +0.10 on BEIR-15
KD Fixed 32-way candidate lists −1.43 on the diagnostic mean

The problem was not biomedical data. It was the fixed 32-way KD pool.

BiCA supplied only about 7.5 real citation negatives per query, but the listwise distillation format required 32 candidates. The remaining slots were padded with random documents from the corpus. In total, 489,936 of 639,904 candidate slots, or 77%, were random padding.

Under a sharpened listwise objective, those random documents were not harmless filler. They became part of the ranking target, teaching the student to separate trivially easy negatives instead of resolving meaningful ambiguities between hard candidates.

The SFT result showed that BiCA itself was usable. The failure came from forcing a naturally shallow source into a 32-way ranking format and pretending that 7.5 hard negatives plus 24.5 random documents formed a useful listwise task.

The useful unit of data breadth is not the number of sources. It is the number of hard ranking problems they contribute.

BiCA stayed in the SFT path used by GLInt, but it was excluded from the final seven-source KD mixture.


4. Final results

The final model is therefore not the result of one mining trick. It is the endpoint of a pipeline in which the mining geometry, false-negative filtering, candidate depth, mixture construction, and distillation setup were all adjusted around late-interaction scoring.

BEIR-15. The table below reports mean nDCG@10 over the standard 15 BEIR groups, with CQADupStack averaged across its subforums.

Model Average Size (M) Embed dim 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 reaches 57.43 mean nDCG@10, compared with 57.22 for LateOn. It improves on LateOn on ArguAna, DBPedia, FEVER, HotpotQA, MS MARCO, Natural Questions, Quora, SciFact, and TREC-COVID, as well as on the overall average.

BEIR-Decontaminated. Following LateOn, I also evaluated GLInt on BEIR-Decontaminated, which removes known contamination and provides a second view of generalization across 14 BEIR groups.

Model Average 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

GLInt reaches an average of 62.50 on this evaluation, compared with 61.4 for LateOn in the same table.


5. Mining at scale

Everything above assumes that full multi-vector mining is computationally practical. The engineering question was therefore how to retrieve deep MaxSim pools without turning data construction into a multi-day bottleneck.

I compared exact brute-force MaxSim with PLAID through PyLate's Rust fast-plaid implementation and WARP. The benchmark used 250,000 documents and exact MaxSim as the reference.

Backend Recall@50 Throughput Score of the shipped rank band vs. exact
Exact MaxSim 1.000 20 queries/s Ground truth
fast-plaid (nfs=2048) 0.851 54–80 queries/s −0.01%
WARP, defaults, 8 threads 0.642 371 queries/s 0.00%

At first glance, WARP's recall looks poor: it misses more than one-third of the exact top 50. For hard-negative mining, however, set overlap was not the metric I ultimately cared about.

Because the MaxSim candidate distribution is so compressed, ranks 50 and 200 can be near-ties. Recall@50 heavily penalizes swapping one near-tied document for another even when both are equally useful as training negatives. The candidates WARP returned in the rank band that actually entered training had nearly the same MaxSim score as the exact candidates.

That made WARP roughly four times faster than fast-plaid: about four hours of wall-clock time instead of sixteen for the full job.

The score comparison used each backend's self-reported scores, which are not perfectly comparable across configurations. A rigorous exact comparison would take the document IDs returned by every backend and rescore all of them with exact MaxSim. I did not run that exhaustive rescore, so I treat the score-equivalence result as an engineering signal rather than a precision benchmark.

For mining, score-equivalent near-ties mattered more than exact top-50 ID overlap.

The practical split was:

  • WARP for mining, where near-tie substitutions are acceptable and throughput dominates.
  • fast-plaid for evaluation, where exact top-rank identity matters for nDCG and where I wanted consistency with the evaluation setup used for other late-interaction models.

Appendix: Experiments that did not work

After the final model converged, I tried a series of post-training and continuation ideas intended to extract another improvement. None of them worked overall.

Attempt Result
Inference-time [MASK] query expansion −4.92 to −5.93
Training the expansion vectors −0.92
Static corpus-IDF token weighting −1.17
Learned query-token gate −0.18
Exact MaxSim rescoring of PLAID's top 100 −0.78
LLM-generated evidence expansion −3.53
Corpus-grounded consensus feedback −0.36
Short-form Nomic KD continuation −0.57
↳ uniform model soup with that checkpoint −0.09
Optimal-transport self-distillation 0.25 vs. 55.46: complete collapse

The failures fell into three useful categories.

Adding query content changed what MaxSim was scoring. Inference-time [MASK] expansion, trained expansion vectors, LLM-generated evidence, and corpus-grounded feedback all added vectors to the query. This family is related in spirit to query and pseudo-document expansion methods such as HyDE, but under a sum-based MaxSim scorer the added vectors are not harmless context: they receive their own best document-token matches and alter the score budget.

The retriever began answering the expansion rather than the original query. Short-query datasets such as TREC-COVID, Quora, and FiQA were hit hardest because the added vectors made up a larger fraction of the final query representation.

Reweighting a converged scorer offered little headroom. Static IDF weighting, a learned token gate, exact candidate rescoring, and model averaging produced small or negative changes. The checkpoint had already converged under its native scorer. Reweighting that geometry after the fact mostly disturbed a solution that was already internally consistent.

The model-soup experiment followed the idea of averaging checkpoints from Model Soups, but in this case the uniform soup with the Nomic continuation checkpoint was still −0.09.

Exact rescoring deserves a specific clarification: the experiment rescored PLAID's existing top 100. It could change their order but could not recover an exact-MaxSim document that PLAID never returned. The negative result rejects the cheap reranking trick, not exact exhaustive retrieval.

Self-derived targets can collapse without an external anchor. The optimal-transport experiment used the model's own token-similarity matrix to create a detached transport target. The goal was to encourage query tokens to distribute evidence across the document rather than collapse onto a few strong matches.

The loss decreased smoothly, but retrieval collapsed to a mean of 0.25.

Detaching the target prevented gradients from flowing through it, but it did not prevent the target from changing with the student. Once the model's scores became uniform, its transport targets also became uniform, creating a self-consistent degenerate solution. Self-distillation methods such as DINO and SwAV use additional mechanisms to avoid this kind of collapse. My objective had no gold-positive, frozen teacher, reference model, centering mechanism, or cross-view anchor, so it could minimize itself while learning to retrieve nothing.


References and resources

Models and datasets

Methods and references

Huge thanks to the amazing people at LightOn whose numbers and evaluations I can blindly trust, making my life a tad bit easier.

1 Most ablations in this post use an eight-dataset diagnostic suite consisting of SCIDOCS, SciFact, FiQA, TREC-COVID, ArguAna, Touché-2020, Quora, and NFCorpus. These datasets are substantially smaller and faster to evaluate than the full BEIR suite, which made them practical for rapid iteration across many experimental arms. Unless otherwise stated, ablation results refer to this diagnostic suite; final model comparisons are reported on all 15 BEIR groups.

Community

Sign up or log in to comment