What it is. The jump from multiple choice to open-ended QA: the answer space is unbounded, so the model can no longer enumerate it. It generates K candidate answers with weights plus an Other bucket for everything unlisted, summing to 1. Dataset: HotpotQA-Modified — 10 context paragraphs (2 gold + 8 distractors), with 0/1/2 gold paragraphs randomly dropped to induce genuine ambiguity. Model: Qwen3-4B, GRPO, 25k train / 500-sample calibration eval.

<hypotheses>
<h1>First candidate</h1><w1>0.40</w1>
<h2>Second candidate</h2><w2>0.30</w2>
<h3>Third candidate</h3><w3>0.20</w3>
<other>0.10</other>
</hypotheses>
parsed output {hᵢ, wᵢ} + wₐ gold listed? F1 ≥ 0.75 equivalence match yes no R = log( Σ w of all matching hypotheses ) equivalence classes summed ("Seattle" + "Seattle, WA") R = log(wₐ) + log p_LM(gold | x) LM-prior backoff (precomputed); parse fail → fail_reward
Reward semantics. The backoff branch implements the induced distribution \(\hat p(\text{gold}) = w_0 \, p_{\text{LM}}(\text{gold}\mid x)\); the intractable denominator \(p_{\text{LM}}(\mathcal{Y}\setminus H \mid x)\) is dropped (weak function of H).

Design decisions

The backoff bug — and why "read the rollouts" is a project rule

Broken until 2026-04-25: a silent no-op chat-template patch. The precompute script "disabled thinking" via chat_template.replace("enable_thinking=True", "enable_thinking=False") — but the Qwen3 template never contains that literal string, so nothing changed. The base LM was then scored for \(p(\text{gold})\) at a position where it expects to open a <think> block: single-token answers like "no" or "Scotland" got log-probs of −30 to −42. Every backoff experiment (Exp 7/8) trained against this pathological prior.

The fix: append a literal "Final answer: " prefix after the chat template before scoring gold. Diagnostic over prompt variants (200 examples, per-token mean \(\log p(\text{gold})\)):

Prompt variantper-token meanmedian
V0 — broken baseline (assistant + think position)−15.24−13.46
V5 — thinking disabled only−15.80−12.55
V1 — "Final answer: " prefix (chosen)−1.530.00
V2 — raw QA format−1.180.00

On the full 5k-example precompute: total \(\log p\) mean −43.92 → −4.64; per-token −14.66 → −1.33. The "gold missed" reward is now comparable in magnitude to the "gold listed" reward, as the theory wants.

Experiment grid

ExpConfigAcctop1 ECEBrier# hypswotherTakeaway
BaseQwen3-4B untrained0.4990.3610.3471.9overconfident
1log + CW1.00.43collapses without diversity
2log + CW + min-K (best ckpt s600)0.5470.0460.1693.00.30best overall
3pure log0.0991.10.39self-calibrating but collapses
4log + min-K0.5050.0430.1813.00.28CW adds ~2% acc
5Brier + CW + min-K0.5150.0600.1763.00.29log > Brier
6log + CW + soft-diversity0.5160.0690.1813.00.25smoothest wother plateau
7v2backoff, no min-K (broken precompute)0.5060.1010.1892.00.30partial collapse
8backoff + min-K (broken precompute)0.4990.0830.1792.90.26no gain over min-K
9fixed backoff, no min-K (5k train)0.4760.0630.1752.90.25diversity without min-K
10fixed backoff + min-K (5k train)0.520*2.70.22*training-eval; calib eval pending

Evals at step 300 (Exp 2: step 600) on 500 validation samples, temp 0.6. Exp 9/10 used 5k train samples vs 25k for Exp 2 — scale confound when comparing accuracy.

The headline of Exp 9 (2026-04-25). With the corrected backoff, the model maintains ≈2.9 hypotheses with no min-K hack at all (vs 2.0 under the broken precompute, and 1.0–1.1 with nothing). The principled formulation does the job the hack was doing. Caveat: Exp 10 suggests min-K may still buy accuracy (0.520 vs 0.470 training-eval), and the broken-era conclusion "backoff adds nothing over min-K" needs the scale-matched rerun before it's final.

Calibration must be viewed three ways

The historical metric, top1_ece, looks only at the heaviest hypothesis — it never touches wother and hid systematic under-confidence. The eval now reports:

Open items

Status: analysis phase — no runs active. Last activity 2026-04-25 (audit + Exp 9/10). Per the 2026-05 meetings, exact-match was reinstated for HotpotQA (fuzzy matching removed → more stable), and the LM-prior backoff is the framework-level formulation going forward.