Join the conversation

Join the community of Machine Learners and AI enthusiasts.

Sign Up
tardellirs 
posted an update 2 days ago
Post
5,457
I really like the LocalLLaMA/typed-decisions benchmark, so I built a small Space to make its leaderboard easier to explore: tardellirs/typed-decisions-explorer

It reads the dataset card on every visit, so new submissions show up as soon as they are merged. It has a sortable ranking and two Pareto charts: accuracy × size and accuracy × latency.

A few things it makes easy to see in the zero-shot table today:
- Only three models are within noise of the top: Quyet-1.0-Large (0.791), meraGPT Decider 1 and Baseten Mammoth 1 (0.768).
- The smallest model above Jev 1.13 (0.727) is d3-mini, at 4B.
- The fastest local run above Jev is FastBrain-9B: 50 ms on an RTX PRO 6000.
- 15 of 41 models score above the teacher's self-agreement (0.735), so the top of the table measures agreement with the teacher more than correctness.

Congrats to @codelion and @sandeep85 , the maintainers, for a great benchmark. Feedback welcome!

Your own parser disagrees with one line of the post.

Run parse.js on today's card and the smallest model above Jev 1.13 (0.727) is nanoGentzen-Jev-v3: 4.93M parameters, 0.731, row 16, added 10-29.
d3-mini is 4B, about 800x bigger.

But 0.731 vs 0.727 is 8 decisions out of 2,000.
Your pairwise rule puts that band at 0.028, so neither 0.731 nor d3-mini's 0.743 clears Jev in a way the table can resolve.

The bigger lever is the n inside that rule.
accVar assumes 2,000 independent decisions. The test split is 400 cases with 5 decisions each.
If decisions inside a case move together, n is closer to 400.
At n = 400 the same rule ties 14 models with Quyet, down to 0.736.
That is exactly the 15 models above the teacher's 0.735.

The truth sits somewhere between 2,000 and 400, and a bootstrap over cases would place it.
Do any submissions ship per-decision predictions, so the explorer could resample cases instead of decisions?

·

Thanks, Dipankar, both points are fair to raise.

On the post line: the explorer leaves nanoGentzen-Jev-v3 out of the zero-shot view, and the footer gives the reason (its own eval YAML in #59 describes it as fitted on train). The post followed that view without saying so; I should have. And yes, "above Jev" there is a point estimate: by the explorer's own rule neither 0.731 nor 0.743 separates from 0.727.

On n: you're right that the 5 decisions per case are not independent, so I ran a case bootstrap on the submissions that ship per-decision predictions (od1-typed-decisions, Decider-4B, nullspan v1.3.0, Qwen3.8-27B from #60), using the scorer's own accuracy rule. Design effects came out at 1.0–1.4, so n_eff is about 1,450–2,000, not 400. For comparing two models it helps further that both answer the same cases: the paired, case-resampled SE of the difference is 0.64–0.90× the independent n = 2,000 SE the explorer uses, so its tie band is, if anything, conservative. Caveat: only four models, and none of the current top zero-shot rows publish predictions, so I can't check those directly. If more submissions add predictions, a paired case bootstrap would be the right rule and I'll switch to it.

Your bootstrap holds up. I re-ran it on od1's published predictions and got the same answer.
Case-resampled SE 0.0105 vs 0.0091 independent, so deff 1.35 and n_eff about 1,480.
n = 400 was the floor, and I treated it as the estimate. That tie list of 14 was too long.

Your paired ratio is the more useful number for the post line.
Even at its best, 0.64 x 0.028 is about 0.018, and d3-mini leads Jev by 0.016.
So that pair stays a tie under every version of the band.

What four models can't show is whether deff grows near the top.
If a strong model's misses cluster in a few hard cases, its rows are less independent than od1's.
Would the explorer show the paired band when both rows ship predictions, and the independent one otherwise?

·

Thanks for re-running it. Since then I found more predictions: the OpenDecider repo (#8) publishes per-decision files for its own models and for its runs of Jev 1.13 (TypeSafe API), microsoft-decision-1 and clm-8b (the last two are not on the card), so the check now covers 12 runs. Numbers below use the analytic case-level SE, which matches the bootstrap and gives 1.35 for od1 as you found.

On the top: deff does grow with accuracy (Spearman 0.82 over the 12), from 1.02–1.18 below 0.67 to 1.28–1.40 above 0.78. The highest is Decider-4B at 0.827 with 1.40, n_eff about 1,430. So it rises, but in this sample it levels off near 1.4.

Paired against Jev (OpenDecider's whole-case run, 0.7305 under the dataset scorer's argmax rule, 0.737 in their own report, which breaks the 35 tied gold labels differently; the card's 0.727 is a separate run), the paired SE is 0.72–0.93x the independent one, median 0.79. d3-mini's +0.016 stays inside the band even at 0.72x.

On showing the paired band when both rows ship predictions: I'd rather not mix two kinds of band in one table yet. Of the 90 rows, only about ten have public predictions, two of them zero-shot, and the only Jev predictions come from a third-party run rather than the card's. The cleaner fix is upstream: score_with_jobs.py writes only the summary to results.json; if it also wrote the per-decision answers, every new row would ship them and the explorer could move every comparison to a paired case bootstrap at once. @sandeep85 @codelion , would that be welcome as a PR?

Script, sources and output: https://huggingface.co/spaces/tardellirs/typed-decisions-explorer/tree/main/analysis

Checked score_with_jobs.py at today's commit (c9e8c416). You're right: results.json gets 7 summary keys and nothing per decision.
The per-decision list already exists. accs is built one decision at a time inside the case loop, then dropped after the mean.

One thing I'd ask that PR to save: the probabilities, not the hits.
The 35 tied gold labels are the reason. score_one breaks a gold tie with g.index(max(g)), so the first-listed option wins.
In the test split, 17 of the 35 ties resolve to it.
Your Jev numbers show the stake. 0.7305 vs 0.737 is about 13 decisions from the tie rule alone, about 40% of d3-mini's 0.016 lead.
Saved hits freeze one rule. Saved probabilities, keyed on the case id, let the explorer re-score any rule and pair on the same cases.

Would split credit on ties (1/k for k tied options) be a fairer default than first-listed?

·

Confirmed on c9e8c416: 35 ties, all two-way, 17 of them including the first-listed option. One more thing in the same spot: the gold label field breaks those ties the other way in 31 of the 35, so scoring against label and running score_with_jobs.py give different numbers for the same predictions. Rows on the card use both: Decider-4B, od1 and OpenDecider match their card values under label; nullspan and Qwen3.8-27B (#60) match under the scorer's argmax. Across the 12 runs the two rules differ by 0.001 to 0.007.

On Jev, the 0.006 to 0.0065 gap splits into 9 decisions from gold ties and 3 from ties in the prediction itself. Jev returns probabilities rounded to two decimals, so 20 of its 2,000 answers have a tied top option, and list.index breaks those by option order too (OpenDecider-medium has 104).

So yes to split credit, and I'd apply it on both sides: the expected hit when gold ties and predicted ties are each broken at random, |top_gold ∩ top_pred| / (|top_gold| × |top_pred|). It is deterministic, independent of option order, and equal to the current rule when nothing is tied. For Jev's whole-case run it gives 0.7328, between the scorer's 0.7305 and label's 0.7350.

Agreed on the PR: save the normalized probabilities per decision, keyed on case id and question id, not the hits, so the tie rule becomes a scoring choice anyone can rerun.

Per-rule table for all 12 runs: https://huggingface.co/spaces/tardellirs/typed-decisions-explorer/tree/main/analysis

Reproduced on the same test.parquet: 2,000 decisions, 35 gold ties, all two-way, label on the other option in 31 of 35.

There is a third rule in the same rows.
label_agreement.argmax_majority lands inside the tied pair in all 35 cases.
On the 31 where label and the scorer split, it sides with label in 21 and with the scorer in 10.
On the 4 where they agree, it picks the other option once.
So one decision can carry three readings, and they don't nest.

label is not a fixed rule either. It takes the second-listed option in 31 and the first-listed in 4.
Nothing in score_with_jobs.py produces that split, so it was set upstream of the scorer.

That makes your symmetric split credit the right default to me. It is the only rule that gives the same score whichever field a scorer reads.

Do you know what decided label on those 4?

·

Reproduced your three-reading split on test, and train shows the same pattern (61 ties, label on the later-listed option in 53).

My best guess for the 4, which only the generator code can confirm: label was taken from the unrounded means, before the 6-decimal rounding, with ties going to the later option. Two things point that way. The gold values are means of three 2-decimal samples (p x 3 sits on the 0.01 grid for 98.5% of the 28,400 probabilities). And the noul ties are all exactly 0.5, with label "true" in 9 of 10 on test and 21 of 22 on train, which is what a ">= 0.5 is true" rule gives. The exceptions then come from float noise: summing three 2-decimal values in a different order changes the last bit in about 13% of permutations, so two options that tie after rounding can differ by ~1e-16 before it, and that decides it. customer_service_000066, the one noul tie labelled "false", is one of your 4.

If that's right, label is deterministic but not meaningful on ties, which is one more reason for symmetric split credit. I opened the PR that saves per-decision probabilities (#68 on the dataset) and left the tie rule out of it, so the maintainers can pick it separately.