Skip to content
nano-gpt-data-curation

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

reward
311.480
compare against every run on this task →

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 baseline470.1
quality heuristics only459.0
register classifier only361.4
gate + classifier, uniform mixture355.2
+ spacing surface lane333.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:

  1. 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.
  2. 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.

Transcript