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
- 71
- duration
- 1h 2m
- recorded
- 2026-08-04
run iddclm-nano-curation__nEEkAJz
Score
Summary
All deliverables are verified. Final state:
Submission: dev perplexity 324.4 vs 470.1 random baseline (−31%), confirmed end-to-end through the official dev_eval.sh path (pack_selection.py + frozen train_nano.py).
| selection (12M tokens each) | dev PPL |
|---|---|
| random baseline | 470.1 |
| quality heuristics only | 459.0 |
| register classifier only | 361.4 |
| gate + classifier, uniform mixture | 355.2 |
| + spacing surface lane | 333.2 |
| + HTML surface lane (submitted) | 324.4 |
What drove the result. Standard curation (Gopher-style quality filters) was worth only 11 of the 146 PPL recovered. Two things mattered more:
- A register classifier — 5-class logistic regression on hashed GPT-2 n-grams, trained with the disclosed dev target as positives and random pool docs as background. This alone took 470 → 361.
- Surface-form matching, which I found by decomposing held-out loss per quarter. The Wikipedia quarter sat ~1 nat above the other three, and a normalization probe showed 0.49 nats of it was pure tokenization convention, not content: the target is detokenized WikiText where
,/.are 7.9% of tokens vs 0.055% of the pool. A lane of pool docs sharing that spacing took 355 → 333. Screening token histograms by excess probability mass then predicted a second instance — HTML markup in the technical Q&A quarter (</at 929× the pool rate) — which took 333 → 324.
Two results worth flagging because they cut against expectations:
- Frequency isn't the mechanism, context is. The densest spaced-punctuation docs (up to 30%) are
. . .boilerplate; using them ungated hurt (342–355) despite 10× the marginal rate. The winning selection reaches only 0.143%,against a 2.0% target. The HTML lane is the reverse — ungated works there, because raw web pages carry markup around genuine prose. - A properly regularized scorer selected worse data (342/347 vs 333). At 6% selectivity you want the scorer keying on rare register-specific markers. Relatedly, held-out validation revealed the "high-quality web prose" class has ~0 accuracy — it's indistinguishable from raw-web background, so that lane was ranking on noise and now ranks by mean affinity to all four registers.
Files: submission/selection.json (35,967 ids, 2.6× the budget, verified unique/in-range and byte-reproducible from curate.py defaults), submission/curate.py (stated criterion in its docstring, all knobs defaulted), claim.md, plus REPRODUCE.md and the work/ pipeline. train_nano.py, model.py, and pack_selection.py are unmodified — diagnostics live in separate copies.
One caveat on the tuned optima: neighbouring configurations vary by roughly ±5 PPL, so STYLE=0.16 / HTML=0.06 sit on a plateau rather than a sharp peak. The mechanism should transfer to the hidden sample since register and surface form are domain properties, but I wouldn't read those specific shares as precise.