Skip to page content
SAVRN
Search Plan a project

Open-weight model

ValidButVacuous

by Koushik koushiks29292/ValidButVacuous

ValidButVacuous is an open-weight model from Koushik, released under MIT License. Its published files total 1.7 MB.

Error guarantees for small medical language models keep their promise by staying silent.

Parameters—
Context—
Weights1.7 MB
Licensemit
AccessOpen weights
Monthly Downloads—

Model Card

By Koushik, published under mit, revision 01b6af99da3d.

Error guarantees for small medical language models keep their promise by staying silent. Koushik Swarna · Invariance Labs · [email protected] A safety certificate lets a model answer only when it is confident, and promises that the error rate on its answers stays under a budget α in all but δ = 5% of deployments. We prove three short facts, test them on 10 small open models, 4 medical benchmarks, and 40,000 simulated deployments, and find that all three hold. Use the certificate on your own scores: 1. Score: python scripts/scoremodels.py --model Qwen/Qwen2.5-1.5B-Instruct --questions medqa.jsonl --out scores/qwen1.5bmedqa.npz. Add --nf4 for 4-bit models. Confidence is the softmax…

Read Koushik's full model card

Error guarantees for small medical language models keep their promise by staying silent.

Koushik Swarna · Invariance Labs · [email protected]

Paper (PDF)


A safety certificate lets a model answer only when it is confident, and promises that the error rate on its answers stays under a budget α in all but δ = 5% of deployments. We prove three short facts, test them on 10 small open models, 4 medical benchmarks, and 40,000 simulated deployments, and find that all three hold.

Fact Statement In the data
1. Silence hides failure Once the model speaks, a valid certificate promises only P(break | speaks) ≤ δ / s, and no better bound exists. Among deployments that speak, 7.4% to 39% break the promise.
2. Strict promises force silence A check must see at least n₀ = ln(1/δ) / ln(1/(1−α)) ≈ 3/α answers before it can pass. At α = 5%, the model never speaks in 40,000 deployments.
3. Passing is luck Luck is at most √(ln(1/p) / 2n), and the rarer the pass, the bigger the luck. New questions went worse than the check said in 68% to 98% of deployments that spoke.

What a report should include: how often the model speaks, the failure rate when it speaks, how many questions it answers compared with a rule without a guarantee, and a matched control for any shift test.

Repository layout

ValidButVacuous/
├── README.md                  ← this card
├── paper/
│   ├── Valid_but_Vacuous.pdf  ← compiled paper
│   ├── main.tex, refs.bib     ← LaTeX source
│   └── figs/                  ← all figures (PDF + PNG)
├── vbv/                       ← the library
│   ├── theory.py              ← Facts 1–3 as functions (δ/s, floor n₀, luck ceiling, g(p))
│   ├── certificate.py         ← Hoeffding–Bentkus p-value, split + fixed-sequence certificate,
│   │                            no-guarantee / oracle reference rules
│   └── simulate.py            ← within-benchmark and transport deployments, Wilson CIs, summaries
├── scripts/
│   ├── score_models.py        ← score MCQ benchmarks with a small model (fp16 or 4-bit NF4)
│   ├── run_within.py          ← 1,000 deployments per (model, benchmark) → pooled report
│   └── theory_tables.py       ← prints every closed-form number in the paper
├── figures/
│   ├── make_figures.py        ← rebuilds Figures 1–4 into paper/figs/
│   ├── paper_data.py          ← counts behind every figure
│   └── data/                  ← per-cell points for Fig. 3c and 4d
├── examples/synthetic_demo.py ← all three facts on a CPU in about 1 second, no GPU needed
└── tests/                     ← checks the code against the paper's stated numbers

Quick start

pip install -r requirements.txt
python scripts/theory_tables.py        # floors 59/29/14/9/6 and 117/57/27/17/12, g(p), ceilings
python examples/synthetic_demo.py      # the silence pattern on a synthetic model
python -m pytest -q tests              # 11 checks against the paper
cd figures && python make_figures.py   # rebuild Figures 1–4

Use the certificate on your own scores:

from vbv import Certificate, run_within, summarize

lam, info = Certificate(alpha=0.2).fit(conf_half1, correct_half1, conf_half2, correct_half2)
# lam is None  → the model stays silent

report = summarize(run_within(conf, correct, n_splits=1000))
# each row: speaking_rate, broke_all, broke_when_spoke, limit_delta_over_s, luck gap, coverage

Full pipeline

  1. Score: python scripts/score_models.py --model Qwen/Qwen2.5-1.5B-Instruct --questions medqa.jsonl --out scores/qwen1.5b_medqa.npz. Add --nf4 for 4-bit models. Confidence is the softmax over the option letters' next-token logits, and each question is scored again with shuffled options.
  2. Deploy: python scripts/run_within.py --scores "scores/*.npz" --splits 1000. Each split uses 560 practice questions (two halves of 280) and 140 new ones, at α ∈ {5, 10, 20, 30, 40}%, with δ = 5% and G = 20 cut-offs.
  3. Plot: update figures/paper_data.py and run make_figures.py.

Models in the paper: Qwen2.5 (0.5B, 1.5B, 3B, 7B), SmolLM2-1.7B, Granite-3.1-2B, Mistral-7B-v0.3, and BioMistral-7B. The 7B models run in NF4, and Qwen 1.5B and 3B run in both fp16 and NF4. Benchmarks: MedMCQA, MedQA, MMLU (medical and biology subsets), and PubMedQA, with 700 questions each. Everything fits on one 16 GB GPU (a T4).

Citation

@article{swarna2026validvacuous,
  title   = {Valid but Vacuous: Error Guarantees for Small Medical Language Models
             Keep Their Promise by Staying Silent},
  author  = {Swarna, Koushik},
  year    = {2026},
  note    = {Invariance Labs}
}

License

Code: MIT. Paper and figures: CC BY 4.0.

Identity and Version

Repository
koushiks29292/ValidButVacuous
Publisher
Koushik
Task
Not stated by the source
Modality
Other
Library
Not stated by the source
Parameters
Not stated by the source
Languages
en
Revision
01b6af99da3d58f6c3774c3601107f21df9f3901
First published
2026-10-08
Last updated
2026-10-08

Files and Weights

33 files, 1.7 MB in total.

Configuration15 files · 62.3 KB
Documentation2 files · 6.3 KB
Other15 files · 1.6 MB
Repository1 file · 1.8 KB
Every file
FileTypeSizeSHA-256
examples/synthetic_demo.pyConfiguration1.0 KB —
figures/data/fig3c.jsonConfiguration8.5 KB —
figures/data/fig4d.jsonConfiguration7.2 KB —
figures/make_figures.pyConfiguration17.3 KB —
figures/paper_data.pyConfiguration3.9 KB —
scripts/__init__.pyConfiguration —
scripts/run_within.pyConfiguration1.9 KB —
scripts/score_models.pyConfiguration3.0 KB —
scripts/theory_tables.pyConfiguration1.2 KB —
tests/test_paper_numbers.pyConfiguration2.9 KB —
upload_to_hf.pyConfiguration1.0 KB —
vbv/__init__.pyConfiguration481 B —
vbv/certificate.pyConfiguration5.1 KB —
vbv/simulate.pyConfiguration5.9 KB —
vbv/theory.pyConfiguration2.9 KB —
LICENSEDocumentation1.1 KB —
README.mdDocumentation5.2 KB —
paper/Valid_but_Vacuous.pdfOther605.1 KB d8fce576ac89
paper/figs/fig1_overview.pdfOther85.6 KB —
paper/figs/fig1_overview.pngOther208.2 KB a464b54ed70f
paper/figs/fig2_within.pdfOther24.8 KB —
paper/figs/fig2_within.pngOther140.4 KB 3b8d4ce7a18a
paper/figs/fig3_luck.pdfOther22.9 KB —
paper/figs/fig3_luck.pngOther122.1 KB ee22c9692c28
paper/figs/fig4_transport.pdfOther25.4 KB —
paper/figs/fig4_transport.pngOther108.1 KB d4f391960f0f
paper/figs/fig5_models.pdfOther74.9 KB —
paper/figs/fig6_calibration_size.pdfOther94.1 KB —
paper/figs/fig7_quantization.pdfOther63.7 KB —
paper/main.texOther53.0 KB —
paper/refs.bibOther11.8 KB —
requirements.txtOther104 B —
.gitattributesRepository1.8 KB —

License and Download

License
mit
Access
Open weights, no gate
Download from Koushik

Released by Koushik through its official repository on Hugging Face. Read the license.

Questions About ValidButVacuous

Can I use ValidButVacuous commercially?

Yes. ValidButVacuous is released under MIT License. The MIT License is a short permissive license. It permits commercial use, modification and redistribution, provided the copyright notice and permission notice are included.