imagining syntax

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

bimodality_grid_v2

20260504_211432_bimodality_grid_v2 · complete · published 2026-08-28 · seed 1000

part of investigation bimodality

Intent

Run 2026-05-04 to 2026-05-05 in three batches on one commit, 400 models at 1200 iterations each. Backfilled into the standardized results object on 2026-08-27 from the original run directories; the accuracies were re-read from the per-condition evaluation files and checked against the runner's own log, and no cell disagreed.

This experiment asks whether models that differ only in their seed land in one place or two, and how that depends on α. Each grid point trains fifty replicates at a single α and scores them on the same minimal-pair suite, so the only thing separating one replicate from another is initialization and data order. Eight α values run from 0.8 to 1.2, spaced every 0.05 through the middle of that interval and every 0.025 across 1.10 to 1.20, which is where the cohort spread in earlier runs was widest. The same fifty seeds run at every α, so a cohort at one grid point is comparable to the cohort at its neighbour rather than being a fresh draw.

Background

A first grid and a five-seed pilot had already suggested that cohorts near α = 1 do not concentrate around one accuracy. Both ran before the training pipeline was made deterministic across runners. Evaluation consumed the global random state that model construction and batching also draw on, so two runners given the same α and the same seed did not produce the same weights, and a grid point could not be re-measured exactly or continued from its own checkpoints. That was fixed immediately before this experiment started. This run asks the question again on the corrected pipeline and adds the denser spacing the first pass lacked.

Hypothesis

Hypothesis: The split appears where the rule is only partly learned \@{bimodgrid2-hypothesis}

At a budget of 1200 steps there should be a range of α in which some replicates have found the subject-verb number rule and the rest are still agreeing with the nearest noun, with few cohort members between the two. The prediction is that mean unseen_mismatch rises with α across this grid while the spread around it stays wide, that the wide spread reflects two groups rather than one diffuse one, and that the lower group's accuracy climbs with α until the two groups meet.

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 · 1200 iterations · fresh init per replicate (seeds derived from base seed) · 50 seeds (base 1000)
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 ee28502

data regime (all arms): single-dataset-recycled — 1 dataset(s) × 1200 iters each = 4.0 epochs per dataset

Replicate this experiment

Get the code at this exact version:

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

Download the config (experiment.yaml) and run:

imsyn exp run experiment.yaml

Checks

PASS children_complete PASS replicate_coverage PASS instrument_consistent

Results — unseen_mismatch (mean ± sd over 50 seeds)

Evaluation data: seen_* generated at each grid point's own training α · unseen_* = held-out pairings, uniform (α-independent) · 1000 pairs per condition
armpeak over α (end of training)per-seedflags
alpha_grid 85.0 ±19.8 @ α=1.175 ⚠ seed_split: range 4.9-100.0 (1 low / 29 high of 50)

Conclusions

The cohort does divide, and the division is not confined to a narrow band of α. At every one of the eight grid points the lowest replicate finishes below 20 and the highest above 99, and the spread never contracts the way it would if the grid had passed through an edge. What changes with α is not whether the two groups exist but how many seeds are in each.

Result: The low group shrinks with α while both groups stay put \@{bimodgrid2-low-group-shrinks}

Mean unseen_mismatch rises from 35.3 at α = 0.8 to a peak of 85.0 at α = 1.175, easing to 80.9 at α = 1.2, but the standard deviation stays between 17.7 and 37.1 across the whole grid. Counting replicates below 50, the point at which a model is agreeing with the nearest noun more often than with the subject, gives 33 of 50 at α = 0.8, 17 at α = 1.0, 7 at α = 1.1, and 3 at α = 1.15. The rise in the mean is that count draining from one group into the other, not either group moving.

The denser spacing across 1.10 to 1.20 was placed to catch a boundary and did not find one. The widest single gap between neighbouring sorted replicates is 34.7 points at α = 1.125 and 29.0 at α = 1.15, so the middle of the range stays empty exactly where the spacing was tightest. The hypothesis expected the lower group to climb until it met the upper one; instead the lower group holds its position and loses members.

Every number here is read at 1200 steps, and that qualification carries the weight. Follow-up runs that continued these checkpoints to ten and twenty thousand steps found the two groups converging on a single distribution: the upper group drifts down, the lower group drifts up, and by twenty thousand steps the separation is no longer distinguishable from zero. The split this experiment measures is therefore a statement about where replicates have got to at a fixed budget, and reading it as two attractors in the loss landscape would overstate it. The open question this leaves is not where the boundary sits on the α axis, since there is no boundary on this grid, but what decides which group a given seed joins early and whether that is visible before the two groups separate.

Comparison figures

comparison_by_condition.png
comparison_by_condition.png
comparison_unseen_mismatch.png
comparison_unseen_mismatch.png

Children

Child peak unseen_mismatchStatus
alpha_grid 85.0 done

experiment.yaml