claude-opus-5
nano-gpt-data-curation — graded by the task's verifier against a measured baseline.
- backend
- modal
- variant
- claude claude-opus-5
- metric
- held-out multi-domain perplexity
- actions
- 61
- duration
- 57m
- recorded
- 2026-08-04
run iddclm-nano-curation__phgXX4s
Score
Summary
All three deliverables are in place and validated.
Result
Dev perplexity 317.04 vs. random-selection baseline 485.46 — a 34.7% reduction.
Approach
The key realization: data/multi_dev.npy is 1M GPT-2 tokens of the actual target distribution. Decoding it gives labeled positives for free, turning "guess what quality means" into supervised importance estimation. Decoding also revealed the target's exact composition — wiki 24.9% / web+news 50.1% / technical Q&A 25.0% by token, matching the disclosed "equal parts of four domains".
Three components, ranked by measured effect:
- Target-similarity ranking — one hashed-n-gram logistic regression per register (torch
EmbeddingBag, since sklearn/scipy are absent), target segments vs. random pool docs. - Junk gate — Gopher/C4-style surface filters, looser for the code-bearing register. Worth ~24 PPL.
- Mixture-matched round-robin — makes every prefix of the list correctly mixed, so the selection is robust to wherever the 12M budget cuts (verified: 0.22/0.43/0.35 at every prefix).
I pre-tokenized the whole pool once up front, which made candidate packing instant and let me run 14 training variants (3 concurrently per batch) instead of ~5.
Two findings worth flagging
- Falsification test passed decisively. A selection of only the cleanest encyclopedic register scores 445.9 — barely better than random — despite every document being individually high-quality. Coverage beats single-axis quality.
- My own prior was wrong, and I kept the data's answer. I expected stripping HTML markup from the Q&A positives to help (markup can't transfer to plain-text pool docs). It measurably hurt: 329.7 vs 322.1.
curate.pykeeps the markup, with the ablation documented in the docstring.
The mechanism claim rests on a zero-training observable: unigram/bigram cross-entropy of the target under a candidate training set. It rank-orders all four key selections identically to trained PPL, and correctly predicts the wiki-only failure (8.1299 vs random's 8.1343) before any training runs.
Two honest caveats, both stated in claim.md: the mixture tilt away from the target's own 25/50/25 is the weakest claim — neighboring mixtures cluster at 321–326, so run-level variance is a few PPL and 317.04 likely sits at the lucky end of that band. Three further tweaks (stricter gate, length cap, higher minimum length) each came out 4–5 PPL worse, so the recipe is saturated at this budget. Separating tilt from noise needs multiple seeds per mixture, which didn't fit the compute budget.
curate.py was run end-to-end from the raw pool and reproduces selection.json bit-identically (18,543 ids / 13.50M tokens, 12.5% budget headroom), retraining to the same 317.04.