How small can a verifier be?
Reasoning models improve by practicing against a verifier, an automatic check that says whether an answer is right. This project asks how small that verifier can be before it stops being reliable, and how the size limit moves as tasks get harder to check. As the corpora used in LLM trainings are generally massive, running different verifiers through all the tokens can quickly become a performance bottleneck, hence the focus on model size. For multi-step reasoning steps or fleets of agents quick verification can also help to discard incorrect statements or branches during inference.
Three tasks, chosen to get progressively harder to verify: Countdown (a number puzzle) and a Maze (judge a proposed shortest-path length) are checkable exactly, so we auto-label unlimited data; faithfulness judging (is an answer supported by its source?) has no exact checker, so the verifier is trained against human labels and benchmarked against a frontier API model scored on those same labels.
What the verifier sees
Each verifier reads a problem and a proposed answer and returns a single verdict. Here are some examples to illustrate each task and how the verifiers judge the proposed solution. Hover above the samples to avoid transitioning to other examples.
(10 + 8 − 10) × 65 stepsHow it's measured
The Pipeline
Every task has the same shape: a problem P, a candidate answer A, and a ground-truth verdict T. The verifier needs to check whether A is a correct answer to P. How we obtain the triples (P, A, T) depends on the task (see the pipeline below), but they are always used the same way: a task-specific verifier is fine-tuned to read the pair (P, A) and reproduce T. At test time the verifier sees only (P, A) and emits its own verdict v̂, which we compare against the held-out T.
A verifier's score on a task is plain accuracy over its frozen N = 1,200-example test set:
What differs between tasks is where the label T comes from. For Countdown and Maze supervision is free: a generator proposes candidate answers and an exact checker supplies T. For faithfulness there is no checker, so T is HaluEval's human judgement, and zero-shot Gemini 2.5 Flash is scored on the same test set as a baseline.
Blue steps run only for the checkable tasks; faithfulness skips to the dataset with HaluEval's ready-made pairs.
Note that we sample 6 answers per problem (at temperature 0.9), which yields a natural mix of correct and incorrect answers to the same problem (and the wrong ones are realistic, model-made mistakes, exactly the near-misses a verifier must catch). It also forces the verifier to judge the answer rather than the problem: when one problem appears with some answers labelled Yes and others No, it can't shortcut on problem features alone.
Finally, it turns 5,000 problems into ~30k labelled examples, and two build-time additions make that set both balanced and difficult for models. Gold solutions are each problem's known-correct answer (for Countdown, an expression using every number once that reaches the target; for Maze, the true shortest-path length), injected as a guaranteed positive. Without them, problems the generator never solves would contribute only wrong answers, so the "correct" class would collapse onto the easy problems and a verifier could score well just by learning "correct looks easy." Hard negatives go the other way: take a correct answer and perturb it just enough to break it (swap one operator, nudge one number), keeping it only if the checker now says it's wrong. Because these are one edit away from correct, catching them requires actually doing the computation, not pattern-matching the surface. This whole set is built once, then deduplicated, balanced to exactly 50 % correct / 50 % wrong, and split, so nothing is repeated or reweighted when scoring. The accuracy above is simply one verdict per item over the frozen 1,200.
Data per task
Each task is built into the same balanced 12,000-example set on an 80 / 10 / 10 split, and the test slice is frozen and shared across every model so the curves are apples-to-apples.
| Task | Supervision | Source · generator | Labeler | Train | Val | Test |
|---|---|---|---|---|---|---|
| Countdown | checkable | 5,000 puzzles · Qwen2.5-7B ×6 | exact checker | 9,600 | 1,200 | 1,200 |
| Maze | checkable | 5,000 puzzles · Qwen2.5-3B ×6 | exact checker | 9,600 | 1,200 | 1,200 |
| Faithfulness | human-labeled | HaluEval (QA · summ · dialogue) | human + Gemini ref | 9,600 | 1,200 | 1,200 |
The models
The same 19-model ladder is fine-tuned on every task with the same data, spanning almost five orders of magnitude from 0.07M-parameter models I pretrained from scratch up to an off-the-shelf 7B. The generators, checkers and reference judge are the ones shown in the pipeline and table above.
Pretrained from scratch
my models: 11Llama-style models copying Monad's architecture (8,192-token vocabulary, tied embeddings) and tokenizer that I pretrained on PleIAs/SYNTH for this project to reach far below any released model.
Taken off the shelf
released: 8Existing pretrained models, fine-tuned as verifiers with no architecture changes, extending to 7B.
Fine-tuning the verifiers (SFT)
Every rung is fine-tuned into a generative verifier: it reads the problem and a candidate answer, reasons briefly (a chain-of-thought derived from the checker's own explanation), and ends with Final verdict: Yes/No. Every model is prompted in its native chat format. The smallest rungs (1M and below) can't hold a rationale together, so they are trained on a verdict-only target instead (see The low end for why).
Each task supplies its own 9,600 / 1,200 / 1,200 train/val/test split (built as described above), and every rung is scored on the identical frozen test set — verdict accuracy, a Wilson 95% CI, and AUROC.
| Method | Sizes | LR | Epochs | Notes |
|---|---|---|---|---|
| Full fine-tune | 0.07M – 7B | 5e-5 | 3 | every rung; paged 8-bit Adam, gradient checkpointing |
| LoRA (r=16) | cross-check | 2e-4 | 2 | run alongside; agrees with full-FT within ~1–4 pts |
All SFT ran on a single H100. Full fine-tune and LoRA produce nearly identical accuracy wherever both were run, so the size trend does not depend on how the verifier is adapted.
Pretraining the tiny models from scratch
The smallest off-the-shelf model in the ladder is Pleias' 56M Monad. To probe further down, I pretrained eleven smaller models from scratch, copying Monad's architecture and tokenizer and shrinking width and depth all the way from ~10M down to 0.07M parameters. Training data is PleIAs/SYNTH only (English), formatted in Monad's ChatML + <think> style and packed into 1,024-token blocks. Monad as well as all the new pretrained verifiers are therefore entirely synthetic small reasoners.
| Model | Params | hidden | layers | vocab | Pretrain tokens | Wall-clock (1×H100) |
|---|---|---|---|---|---|---|
| Nano-630K | 0.63M | 48 | 8 | 8,192 | ~50M | ~2 min |
| Tiny-1M | 1.0M | 64 | 9 | 8,192 | 100M | ~3 min |
| Tiny-2M | 2.0M | 128 | 5 | 8,192 | ~150M | ~4 min |
| Tiny-5M | 5.0M | 128 | 19 | 8,192 | ~250M | ~7 min |
| Tiny-10M | 10.2M | 192 | 18 | 8,192 | 300M | ~10 min |
| Monad-56M (ref) | 56M | 256 | 64 | 8,192 | 200B | — (official) |
Architecture is Llama-style with tied embeddings, head dim 64, and a 3× MLP — identical in kind to Monad, only smaller. Pretraining used a cosine schedule at LR 6e-4 (bf16, from random init); the ~10M model trains in ~10 min on one H100. To locate the cliff I also pretrained a fixed-width (hidden 128) depth sweep at ~2M, 3M, 5M and 7M, plus five nano models below 1M (0.63M down to 0.07M). Token budgets and wall-clock times above are approximate (a representative subset of the eleven models is shown).
The Frontier
This section presents the evaluation results of all models presented above on the three chosen tasks. The pattern is the same everywhere: verification is flat, then on. Below a task-specific size the verifier sits at chance; then it switches on abruptly and plateaus, barely moving for the next three orders of magnitude. Countdown switches on at 0.63M, Maze at 1M, and faithfulness latest of all (it sits at chance below 1M and only climbs from ~1-2M) but each then stays essentially flat up to 7B. Surprisingly, the supposedly hardest to verify task faithfulness climbs highest of all above its switch-on, and even a 2M verifier beats zero-shot Gemini 2.5 Flash (dashed line). "Harder to solve" is not the same as "harder to check." Because the evaluation set is balanced, just guessing randomly gives you a 50% chance of getting the right answer, so this is our performance floor.
How to read it. Each point is plain accuracy over that frozen 1,200-example test set, and the shaded band is its Wilson 95% CI. Use the switch above the chart to flip to AUROC, a ranking metric (the chance a random correct answer is scored above a random wrong one) read from the model's confidence rather than its written verdict. AUROC stays informative even where the verdict text won't parse, which is how the sub-1M models still show a signal there (see The low end). Full per-rung numbers for every task are in the appendix.
Why is the plateau flat?
Across the plateau, accuracy barely moves as the verifier grows. Two things could cause that: every model could be failing a different slice (idiosyncratic errors that happen to sum to the same rate), or they could all be failing the same examples (a shared difficulty structure). To tell them apart, we took the same 6 plateau models on each task and asked, for each of the 1200 test examples, how many get it right.
It's mostly the same examples on every task. The errors are strongly correlated, not independent: a pair of plateau models fails together far more often than chance would predict (4.8× on Countdown, 4.6× on Faithfulness, and 13× on Maze). Whatever a small verifier gets wrong, a bigger one on the same task usually gets wrong too. The plateau height is set by the data's difficulty, not by each model rolling its own dice.
But the contested middle differs by task. On Maze almost everything is already decided, with only 3% of examples are contested, and an oracle that picked the best model per example would score just 0.943 against a best single model of 0.932: no size buys you much. Faithfulness is the opposite, with 26% contested, and its oracle reaches 0.991 versus 0.952 for the best model, so there is real headroom the whole ladder leaves on the table. Countdown sits between the two. In every case a small all-wrong core (Faithfulness 0.9%, Countdown 2.7%, Maze 5.8%) resists every size.
The low end
The switch-on points in the chart above hide a subtlety at the very bottom. Under the default chain-of-thought target the smallest models don't fail gracefully: Tiny-1M collapses, it echoes the puzzle's numbers correctly but then degenerates into pretraining babble and never emits a Final verdict: Yes/No. Not one of 1200 outputs parse and its P(Yes) probe is at chance (AUROC 0.49), while Tiny-2M already verifies at ~0.83.
A 1M model simply can't hold a coherent rationale together and CoT forces it to write one before the verdict, but is able to reach a verdict if trained only on it. Remove that burden by training on a verdict-only target (and a few more epochs, since the signal is now concentrated in one token), and the same 1M model recovers dramatically on the identical frozen test set:
- Countdown: 0.500 → 0.826 (AUROC 0.89) — matching the 2M–10M plateau.
- Maze: 0.500 → 0.934 (AUROC 0.96) — matching the entire ladder.
Verification signal is present at 1M for both tasks, smaller models just cannot reason properly. This is why the 1M and sub-1M points on the frontier chart use a verdict-only target.
If a 1M verifier works, how much further down can we push? I pretrained five more models from scratch: 0.63M, 0.34M, 0.23M, 0.15M, and 0.07M parameters and trained each as a verifier with the recipe that rescued the 1M: verdict-only target, full fine-tune, 8 epochs. The floor turns out different for all the tasks, but relatively close and increasing with the problem's complexity.
How the verdict is read matters here, because below the floor accuracy and AUROC come apart. The verdict v̂ is normally taken from the model's literal Final verdict: Yes/No; in the verdict-only setup it is a token comparison, v̂ᵢ = Yes iff P(Yes) > P(No). That same probability gives a soft score sᵢ = P(Yes) / (P(Yes) + P(No)), and AUROC is computed from it. The point: AUROC still registers signal even when the model never emits a parseable verdict — that gap between a live ranking signal and a dead verdict is exactly what "knows but can't say" means below (flip the chart to AUROC to see it).
Maze and faithfulness break earlier than Countdown. Maze sits at exactly chance (AUROC ≈ 0.50) across the whole sub-1M range (no latent signal at all) then jumps to 0.93 at 1M. Faithfulness is nearly as hard: accuracy is pinned at chance with zero parseable verdicts everywhere below 1M, yet unlike Maze a latent P(Yes) signal does flicker on right at the top of the nano range (AUROC 0.70 at 0.63M) before a usable verdict appears at 1M. One reason that can explain this is prompt length and where the evidence lives: Maze's tell (the answer's magnitude) sits at the very end of a ~100-token ASCII grid, which a nano model can't carry that far; Countdown's far shorter prompt lets signal survive down to 0.15M; faithfulness falls in between with a long source, but with hallucination tells scattered lexically through it, so a some signal reaches as low as 0.63M.
Per-rung sub-1M numbers (accuracy and AUROC for all three tasks) are in the appendix.
Judging Faithfulness
The first two tasks are checkable by a few lines of code. The third is not: deciding whether an answer stays faithful to its source is a human judgement, so there is no free label. Instead of generating and auto-labeling, we train the verifier against HaluEval—a corpus of human-curated answers where each item pairs a source with one faithful and one hallucinated response (across QA, summarization, and dialogue). Each item becomes a balanced positive/negative pair; the same 9,600 / 1,200 / 1,200 split and frozen test set apply. Because there is no checker to derive a rationale from, the target is a verdict only (Final verdict: Yes/No).
To place the small verifiers against a strong baseline, we also judge the identical test set zero-shot with a frontier API model, Gemini 2.5 Flash (1,200 calls, bounded thinking budget). The human labels are the ground truth that every model is scored against and Gemini is a competitor being measured, not the source of the labels.
Faithfulness produces the highest curve, climbing from 0.83 at 2M to 0.95 at 1.5-3B, and every trained verifier from 2M up beats zero-shot Gemini 2.5 Flash. A model 5000x smaller, pretrained in minutes, outscores a frontier model.
This obviously does not make a 2M model a better verifier.. The trained verifiers see HaluEval's training split, so they learn the dataset's hallucination signatures, such as the stylistic tells of a synthetically corrupted answer (over-specific names, added detail, subtle contradiction). It may not reason about the task itself but find proxies for the verdict. Gemini judges cold, by a stricter and more general notion of "supported." So the curve really measures in-distribution fine-tuning versus zero-shot transfer, and in-distribution wins decisively. In conclusion, a tiny verifier is remarkably effective when its target distribution is fixed and available are harder to generalise for faithfulness in other tasks.
Per-rung faithfulness numbers, including the zero-shot Gemini reference, are in the appendix.
Limitations and what's next
- Exploitable shortcuts. In Maze's for instance model-made wrong path-lengths are longer (correct ≈ 6.6 steps, wrong ≈ 15.2), so a rule as dumb as "answer ≤ 10 → correct" already scores well.
- Proxies over reasoning. More generally, a verifier may not reason about the task at all but latch onto proxies that happen to predict the verdict. The Maze length cue and HaluEval's stylistic tells are two we caught, but how often this happens, and how to detect it, would take further work to quantify.
- In-distribution classifiers. The faithfulness verifiers learn HaluEval's hallucination signatures, so their high scores measure in-distribution fine-tuning rather than general faithfulness judging.
- Next: a reward-hacking stress test. Let a model optimize against a small verifier and see whether it learns to fool it, and whether smaller verifiers get fooled sooner.
- Next: use small verifiers at inference time. Try to use fast, small verifiers to test and accept/reject for instance separate reasoning traces based on their correctness. This can help discarding erroneous answers early on at inference time.
- Next: small verifier factory. Expand the synthetic pipeline for fast adaptation to new tasks. This ideally includes an automatic characterisation of the task, generation of synthetic data for the new distribution and validation of different models to find the smallest one with good performance.
References
The models, datasets, and prior work this project builds on.
Models
5- Monad (56M) — Pleias' reasoning model; its architecture & tokenizer seed the from-scratch models
- SmolLM2 (135M · 360M · 1.7B) — Hugging Face instruct models on the off-the-shelf ladder
- Qwen2.5 (0.5B–7B) — Alibaba instruct models; the 7B/3B also generate candidate answers
- Gemini 2.5 Flash — frontier API model, scored zero-shot on faithfulness as a reference
- Nano & Tiny sweeps (0.07M–10M) — pretrained from scratch for this project (code linked)
Datasets
3- PleIAs/SYNTH — synthetic pretraining corpus for the from-scratch models
- HaluEval — human-labelled faithful/hallucinated pairs — supervision for Task 3
- Reasoning Gym — procedural generators + exact checkers for Countdown & Maze
Methods & tools
6- TinyZero — the Countdown-as-RL-task precedent this build follows
- Generative Verifiers (GenRM) — Zhang et al., 2024 — verification as next-token prediction
- HaluEval paper — Li et al., 2023 — the hallucination benchmark
- Reasoning Gym paper — Stojanovski et al., 2025 — verifiable-reward environments
- LoRA — Hu et al., 2021 — the cross-check adaptation method
- TRL · PEFT — the SFT (TRL) and LoRA (PEFT) training libraries
Appendix: full results
The per-rung numbers behind the frontier chart, for reference. Everything here is also in that chart (accuracy and AUROC, via its switch); these tables just list every value.
Sub-1M floor (verdict-only)
| Model | Params | Countdown acc | Countdown AUROC | Maze acc | Faithful. acc | Faithful. AUROC |
|---|---|---|---|---|---|---|
| Nano-70K | 0.07M | 0.500 | 0.513 | 0.500 | 0.509 | 0.502 |
| Nano-150K | 0.15M | 0.500 | 0.740 | 0.500 | 0.509 | 0.524 |
| Nano-230K | 0.23M | 0.500 | 0.842 | 0.500 | 0.509 | 0.500 |
| Nano-340K | 0.34M | 0.501 | 0.852 | 0.500 | 0.509 | 0.513 |
| Nano-630K | 0.63M | 0.848 | 0.863 | 0.500 | 0.509 | 0.701 |
| Tiny-1M | 1M | 0.826 | 0.891 | 0.934 | 0.609 | 0.640 |
Countdown
| Verifier | Params | Family | Accuracy | 95% CI | AUROC | Training |
|---|---|---|---|---|---|---|
| Tiny-1M | 1M | Pleias-tiny | 0.500 | 0.472–0.528 | 0.490 | full FT |
| Tiny-2M | 2M | Pleias-tiny | 0.828 | 0.805–0.848 | 0.851 | full FT |
| Tiny-3M | 3M | Pleias-tiny | 0.814 | 0.791–0.835 | 0.847 | full FT |
| Tiny-5M | 5M | Pleias-tiny | 0.833 | 0.811–0.853 | 0.850 | full FT |
| Tiny-7M | 7M | Pleias-tiny | 0.814 | 0.791–0.835 | 0.857 | full FT |
| Tiny-10M | 10M | Pleias-tiny | 0.828 | 0.806–0.849 | 0.841 | full FT |
| Monad-56M | 56M | Pleias | 0.775 | 0.751–0.798 | 0.813 | full FT |
| SmolLM2-135M | 135M | SmolLM2 | 0.826 | 0.803–0.846 | 0.834 | full FT |
| SmolLM2-360M | 360M | SmolLM2 | 0.863 | 0.842–0.881 | 0.846 | full FT |
| Qwen2.5-0.5B | 500M | Qwen2.5 | 0.898 | 0.880–0.914 | 0.883 | full FT |
| Qwen2.5-1.5B | 2B | Qwen2.5 | 0.910 | 0.892–0.925 | 0.930 | full FT |
| SmolLM2-1.7B | 2B | SmolLM2 | 0.904 | 0.886–0.920 | 0.909 | full FT |
| Qwen2.5-3B | 3B | Qwen2.5 | 0.934 | 0.919–0.947 | 0.927 | full FT |
| Qwen2.5-7B | 7B | Qwen2.5 | 0.917 | 0.900–0.931 | 0.930 | full FT |
Tiny-1M shows its chain-of-thought result (0.500 — format collapse); retrained with a verdict-only target it reaches 0.826 (the value plotted in the chart).
Maze
| Verifier | Params | Accuracy | 95% CI | AUROC |
|---|---|---|---|---|
| Tiny-1M | 1M | 0.500 | 0.472–0.528 | 0.494 |
| Tiny-2M | 2M | 0.928 | 0.912–0.942 | 0.935 |
| Tiny-3M | 3M | 0.928 | 0.912–0.942 | 0.929 |
| Tiny-5M | 5M | 0.928 | 0.912–0.942 | 0.933 |
| Tiny-7M | 7M | 0.928 | 0.912–0.942 | 0.933 |
| Tiny-10M | 10M | 0.928 | 0.912–0.942 | 0.941 |
| Monad-56M | 56M | 0.878 | 0.859–0.896 | 0.902 |
| SmolLM2-135M | 135M | 0.933 | 0.918–0.946 | 0.945 |
| SmolLM2-360M | 360M | 0.927 | 0.911–0.941 | 0.946 |
| Qwen2.5-0.5B | 500M | 0.932 | 0.917–0.945 | 0.931 |
| Qwen2.5-1.5B | 2B | 0.932 | 0.916–0.945 | 0.926 |
| SmolLM2-1.7B | 2B | 0.934 | 0.919–0.947 | 0.937 |
| Qwen2.5-3B | 3B | 0.931 | 0.915–0.944 | 0.929 |
| Qwen2.5-7B | 7B | 0.932 | 0.916–0.945 | 0.932 |
Faithfulness
| Verifier | Params | Accuracy | 95% CI | AUROC |
|---|---|---|---|---|
| Tiny-1M | 1M | 0.609 | 0.581–0.636 | 0.640 |
| Tiny-2M | 2M | 0.825 | 0.802–0.845 | 0.921 |
| Tiny-3M | 3M | 0.854 | 0.833–0.873 | 0.937 |
| Tiny-5M | 5M | 0.864 | 0.844–0.882 | 0.944 |
| Tiny-7M | 7M | 0.876 | 0.856–0.893 | 0.951 |
| Tiny-10M | 10M | 0.873 | 0.852–0.890 | 0.955 |
| Monad-56M | 56M | 0.818 | 0.795–0.838 | 0.912 |
| SmolLM2-135M | 135M | 0.876 | 0.856–0.893 | 0.962 |
| SmolLM2-360M | 360M | 0.908 | 0.891–0.923 | 0.979 |
| Qwen2.5-0.5B | 500M | 0.943 | 0.929–0.955 | 0.987 |
| Qwen2.5-1.5B | 2B | 0.951 | 0.937–0.962 | 0.991 |
| SmolLM2-1.7B | 2B | 0.943 | 0.929–0.955 | 0.991 |
| Qwen2.5-3B | 3B | 0.950 | 0.936–0.961 | 0.992 |
| Qwen2.5-7B | 7B | 0.876 | 0.856–0.893 | 0.951 |
| gemini-2.5-flash (zero-shot) | frontier | 0.697 | 0.670–0.722 | — |