Skip to content
nano-gpt-data-curation

claude-opus-4-8

nano-gpt-data-curation — graded by the task's verifier against a measured baseline.

backend
modal
variant
claude claude-opus-4-8
metric
held-out multi-domain perplexity
actions
73
duration
1h
recorded
2026-08-04

run iddclm-nano-curation__eYKuduN

Score

reward
319.810
compare against every run on this task →

Summary

All deliverables are finalized and validated. Here's the summary.

Result

Curated a 12M-token selection that cuts held-out dev perplexity from 459.8 (random baseline) → 322.8 — a 30% reduction.

Deliverables (all in place):

  • /workspace/submission/selection.json — 19,954 unique, in-range ids in priority order (packs to exactly 12M tokens)
  • /workspace/submission/curate.py — reproducible, deterministic, from a stated criterion
  • /workspace/claim.md — Hypothesis / Mechanism / Falsification / Transfer

Approach

I decoded the disclosed dev target (multi_dev.npy) back to text and found it's an equal-parts mix of Wikipedia, general web prose, news, and StackOverflow-style technical Q&A. The curator has two parts:

  1. Rank every pool doc by a word-bigram target-vs-pool log-likelihood ratio log P_target(w|prev) − log P_pool(w|prev) — favoring fluent, in-domain prose over generic raw web — with English-prose guards (ASCII ratio, sentence density, line-fragmentation, markup) and out-of-vocab rejection (which killed Lorem-ipsum / SEO word-salad that gamed the smoothing floor).
  1. Guarantee register coverage. The pool is dominated by news/web prose and holds only ~200 technical-Q&A docs, so pure ranking starved that register. Forcing all available Q&A docs to the front of the priority list was the single biggest win.

What the ablation showed (each row adds one mechanism)

selectiondev PPL
random baseline459.8
bigram log-ratio ranking416.6
+ prose guards391.9
+ markup guards + OOV rejection383.3
+ include Q&A register340.2
+ prioritize all Q&A docs322.8

The key finding — and the claim's falsifiable prediction — is that ~two-thirds of the gain comes from register coverage, not per-doc filtering: the model was previously blind to the distinctive <code>/<p> tokens making up ~18% of the target. This mechanism (rank + cover the mixture) should transfer to the disjoint official target since it doesn't overfit any specific dev documents.

I stopped tuning here deliberately — remaining levers (wiki/news rebalancing) are low-leverage and risk overfitting the dev set when the official target is a disjoint sample.

Transcript