imagining syntax

Text set in serif type with a dotted bar in the margin was drafted by an LLM (claude-opus-4-8) and sometimes reviewed by the author. The rest is the author's own. How to read this site

anchor_v1

20260713_144937_anchor_v1 · complete · published 2026-07-16 · seed 42

Intent

Intent: How high the best schedule peaks \@{anchor-intent}

This is Phase 1 of the φ-landscape study, whose design and full term definitions live in the design spec.

Its purpose is to pin down how high the generalization score of the current best training schedule actually peaks, and to reconcile the two ways of delivering that schedule's data, staged and continuous. Both run at a high seed count, forty seeds per arm, so that any run-to-run split in outcomes shows up as itself rather than being averaged away.

Background

Background: The peak_30 schedule \@{anchor-background}

The best-known schedule, peak_30, is a descending staircase whose high-concentration teeth alternate with drops to a moderate floor, trained on freshly generated per-stage data.

Hypothesis

The best-known schedule, trained on staged data, is expected to reach about 98 on the generalization score. Its continuous-data twin, in which every batch is sampled fresh, is expected to reach about 96, a gap of roughly two points between the two settings. The sub-100 average is expected to come from a minority of runs that fail to solve the rule, a split into two clusters across random seeds rather than uniform scatter. A single fixed concentration, α = 1.6, is expected to peak around 95 to 96.

Curricula

All three arms run the same 900-iteration budget at forty replicates each and are scored against the same fixed evaluation suite, so the only things that vary are the training schedule and how its data is delivered. Higher α concentrates training on a few frequent noun-verb pairings; lower α spreads them out. Each arm's α over training is drawn in images/schedules.png, and their generalization trajectories are overlaid in images/curriculum_comparison.png.

  • peak30_staged is the current best schedule, peak_30: a descending three-tooth burst schedule ladder that steps α down through 3.0, 1.0, 2.14, 1.0, 1.29, 1.0 across six 150-iteration segments. It trains on staged data, meaning a fresh finite dataset is generated once per segment and reused within it.
  • peak30_continuous runs the identical α-schedule on continuous data, a data regime in which every training batch is sampled fresh at the current α, so no sentence is ever seen twice. The schedule matches peak30_staged exactly; only the data delivery differs.
  • fixed_16 is the control: the single best fixed concentration, α = 1.6, held for the whole run on staged data.

Setup

model
GPT (nanoGPT-derived), weight-tied embeddings — 2 layers × 4 heads × 256 dim (~1,635,584 params) · block 50 · dropout 0.1 · vocab 167 tokens
training
AdamW (β 0.9/0.95, wd 0.1) · lr 0.0006 constant (no warmup, no decay) · batch 32 · 900 iterations · fresh init per replicate (seeds derived from base seed) · 40 seeds (base 42)
training data
PCFG, zipfian noun–verb pairing (oneshot where noted) · 12,000 sentences per dataset (9,600 train — 1 epoch = 300 iters) · unseen holdout 10
code
commit 2ba5de382136
armdata regimedatasetsiters/datasetepochs/dataset
fixed_16single-dataset-recycled 1 900 3.0
peak30_continuouswith-replacement (legacy stream) 0.0
peak30_stagedfresh-dataset-per-stage 6 150 0.5

Replicate this experiment

Get the code at this exact version:

git clone https://github.com/ClaireHobbs/imagining-syntax
cd imagining-syntax
git checkout 2ba5de382136
pip install -e ".[dev]"

Download the config (experiment.yaml) and run:

imsyn exp run experiment.yaml

Checks

PASS children_complete PASS replicate_coverage PASS schedule_total_matches_final_waypoint PASS instrument_consistent

Claims

claimsourceexpectationΔseedsverdict
peak30_reaches_high_90s manifest peak30_staged >= 96 on unseen_mismatch @ peak -1.6 30/40 mixed mean says rejected, seeds 30/40
staged_at_least_continuous manifest peak30_staged >= peak30_continuous on unseen_mismatch @ peak -2.3 29/40 mixed mean says rejected, seeds 29/40
fixed16_peaks_mid_90s manifest fixed_16 >= 93 on unseen_mismatch @ peak -1.5 27/40 mixed mean says rejected, seeds 27/40

Results — unseen_mismatch (mean ± sd over 40 seeds)

Evaluation data: seen_* probed at reference α = 1.4 · unseen_* = held-out pairings, uniform (α-independent) · 1000 pairs per condition
armend of training (t = 900)per-seedflags
fixed_16 88.8 ±17.1 ⚠ seed_split: range 0.0-100.0 (1 low / 25 high of 40)
peak30_continuous 90.0 ±8.8 ⚠ seed_split: range 55.5-100.0 (1 low / 26 high of 40)
peak30_staged 87.1 ±16.6 ⚠ seed_split: range 26.0-100.0 (1 low / 25 high of 40)

Conclusions

Read one seed at a time, the peak-height question is already settled.

Result: Per-seed peak height is saturated near 100 \@{anchor-peak-saturated}

Taking each replicate's own best point in training, unseen_mismatch reaches a median of 100.0 for peak30_staged, 99.8 for peak30_continuous, and 100.0 for fixed_16, with means of 99.1, 99.3, and 97.5. Between 37 and 39 of the 40 seeds in each arm peak at 95 or above. By this per-seed reading the generalization score is saturated near 100, and the hypothesis's estimate of about 98 for the staged schedule is low. There is little height left to gain.

The familiar sub-98 ceilings come from summarizing the same cohort the other way. The peak of the mean curve, the average across seeds at whichever single waypoint that average is highest, is 94.4 for peak30_staged, 96.7 for peak30_continuous, and 91.5 for fixed_16. That number sits below what the seeds individually reach for two reasons the mean folds together: seeds peak at different training times, so no single waypoint catches them all at their best, and a small group of failing seeds pulls the average down. The per-seed peak is the honest measure of how high a schedule goes, and by it the ceiling is essentially 100.

What separates the arms is not the height a good seed reaches but how many seeds reach it. The middle of each cohort is tight, with an interquartile range of per-seed peaks of 0.0 for staged and 0.6 for continuous, so most seeds land on the ceiling together. The spread lives in the tail, where one to three of the 40 seeds fail to reach the 95 band. Continuous data produces the tightest cohort, with a per-seed-peak standard deviation of 1.4, against 4.8 for staged and 8.4 for fixed_16. This is a small failing minority, not the broad two-cluster split the hypothesis imagined.

Result: Continuous data is the tightest and fastest cohort \@{anchor-continuous-tightest-fastest}

The two data settings reach the same peak, and continuous reaches it sooner. Per seed both settle near 100, so the roughly two-point staged-over-continuous gap the hypothesis predicted does not appear; at the peak of the mean curve the ordering is reversed, with continuous at 96.7 above staged at 94.4. Where they differ is speed. Averaged over the seeds that reached the band, continuous crosses the 95 line at about 236 iterations, staged at about 330, and fixed_16 at about 511, computed over 39, 39, and 37 of the 40 seeds respectively. Continuous is both the tightest and the fastest of the three, which reverses the earlier reading that staged near 98 beat continuous near 96.

Referenced by (1 direct)

All three pre-registered claims come back mixed, and for one shared reason. Each was written against the cohort mean at the peak waypoint, which the failing minority drags below the threshold even though most seeds individually clear it. The claim peak30_reaches_high_90s asked whether peak30_staged reaches 96 on unseen_mismatch at its peak: the mean is 94.4 against the threshold of 96, short by 1.6, while 30 of 40 seeds meet it individually. The claim staged_at_least_continuous asked whether staged is at least as high as continuous at the peak: the mean puts staged at 94.4 below continuous at 96.7, a gap of 2.3, with 29 of 40 seeds meeting the bound. The claim fixed16_peaks_mid_90s asked whether fixed_16 reaches 93: its mean is 91.5 against 93, short by 1.5, with 27 of 40 seeds meeting it. The verdicts reflect the summary the claims were written on, not a failure of the schedules. The lesson carried forward is to write claims on per-seed summaries, the median and the fraction of seeds past a threshold, rather than on the mean.

Conclusion: Height is closed; speed and consistency are the live axes \@{anchor-speed-consistency-axes}

For the rest of the campaign this closes the first objective and sharpens the other two. Absolute peak height is answered: it is saturated near 100 and reached by roughly 95 percent of seeds, so Phases 2 through 5 have no height left to chase. What stays live is speed, the time it takes to reach the band, and the failing-seed minority, the consistency question. Those are the axes the later phases are scored on.

Conclusion: Time-to-band must be read with seed coverage \@{anchor-time-to-band-caution}

One caution from code review carries into every later phase. The time-to-band figure averages only the seeds that actually reached the band, so it has to be read next to the seed coverage figure, the fraction of seeds peaking at 95 or above. A fast crossing computed over a handful of survivors is not a win.

Comparison figures

curriculum_comparison.png
curriculum_comparison.png
schedules.png
schedules.png

Children

Child peak unseen_mismatchStatus
peak30_staged 94.4 done
peak30_continuous 96.7 done
fixed_16 91.5 done

experiment.yaml