research note  ·  finding 09  ·  preprint in preparation  ·  updated with the fix-at-scale verdict 2026-07-10

Write-geometry attractor grows with scale, it is not a qk-norm artifact — and the tested fixes do not survive scale

Sam Larson

pebble, San Francisco

July 9, 2026  ·  updated July 10, 2026 (fix-at-scale wave)  ·  sam@pebbleml.com

abstract

In DeltaNet-family language models, the geometry of what gets written into the fast-weight state — the per-layer key Gram matrix — collapses toward a low-effective-rank basin during training. We call this the write-geometry attractor. It is not a small-model artifact: on a four-point scale ladder it worsens monotonically, span_frac 0.248 at 14M → 0.344 at 98M → 0.389 at 392M → 0.455 at 1.31B parameters. A natural deflationary reading is that this is the published qk-norm eigenvalue-stability issue in disguise, since every run trains with the community-standard qk-l2-norm mitigation on. A pre-registered 2×2 factorial at the 14M rung (qk-norm on/off × decay gating on/off, n = 3 seeds per cell) rules that out: turning qk-norm off moves the collapse metric by −0.103 (0.05σ against the same-corpus noise floor) — a clean null. Decay gating (the Gated-DeltaNet mechanism used in production stacks) shows a direction-consistent worsening trend — +4.31, all three paired per-seed deltas positive — that did not confirm at the pre-registered 2σ bar (1.92σ; exploratory Welch p = 0.062). Gated arms reach lower loss while carrying the pathology no better. Update (July 10): the fix-at-scale wave landed, and no tested frozen-bias construction stabilizes the attractor at scale — the deployed per_token arm stays sign-destabilizing at 98M on both corpora and at 392M-wikitext (CI-excludes-zero, both instruments; 392M-openr1 null; zero cells in the mechanism-predicted direction), and the one construction that stabilized at 14M decays to ≈zero and loses its sign on one corpus by 392M. Every arm stays val-loss-neutral at every tested scale (8/8 gates): the free-of-cost half of the 14M result transfers; the geometry half does not. Preprint in preparation.

01The attractor

A fast-weight layer writes rank-1 updates β v k into a fixed d × d state. How much of the state those writes can address depends on the geometry of the keys: orthonormal keys span the state; collapsed keys pile writes into a shrinking subspace. We track this with the deviation of the per-layer key Gram matrix from orthonormality, summarized on the scale ladder as span_frac — the fraction of the gap between random-init geometry and full collapse that a trained checkpoint has traversed.

span_frac vs parameter count, 14M to 1.31B
fig 1Write-geometry collapse vs scale: span_frac at 14M (0.248), 98M (0.344), 392M (0.389), and 1.31B (0.455) parameters, same corpus family and probe instrument at every rung. The trend is monotonic — the attractor grows more pronounced with scale. The 1.31B run self-terminated at ~85% of its token budget (a disclosed calibration miss, not a crash); its reading was flat-to-declining over the final 25K steps, so the shortfall does not threaten the monotonic read. Data: scale-ladder archives referenced in the project experiment log.

02The 2×2: is it just qk-norm? does gating change it?

Every run in this program trains with use_qk_l2norm_in_kernel=True — the stock mitigation for the known eigenvalue-stability issue in delta-rule kernels (adopted by Kimi Linear and Qwen3-Next, among others). If the attractor were that issue in disguise, toggling the mitigation should move the metric. And Gated DeltaNet's decay gating is the actual production mechanism in modern stacks — if it dissolves the attractor, the pathology is an artifact of the vanilla architecture. So: a 2×2 factorial at the 14M rung, baseline cell byte-identical to the scale ladder's own configuration, outcome = same-corpus layer-pooled Gram deviation, n = 1 screen then n = 3 seeds per cell. The pre-registered confirmation bar: a cell's delta against baseline must exceed 2× the same-corpus cross-seed noise floor (2 × 2.244 = 4.489). The noise floor itself was corrected mid-build after an audit found the original had been pooled across out-of-distribution probe corpora, understating the true floor 2.65×.

2x2 cell means with per-seed points, gram deviation
fig 2The 2×2 at n = 3 seeds per cell: layer-pooled gram_deviation_mean (openr1-mix-ext corpus), bars = cell means, whiskers = sd, open circles = individual seeds. Baseline (qk-norm on, gating off) 20.19 ± 2.21; qk-norm off 20.09 ± 1.65 (Δ −0.103, 0.05σ — null); gating on 24.51 ± 1.83 (Δ +4.31, 1.92σ — below the pre-registered 2σ = 4.489 bar); both off/on 21.32 ± 0.59. Note this instrument reports Gram deviation, not span_frac — figs 1 and 2 use different metrics and are not comparable on one axis. Data: experiment-runs/2026-07-09_attrrob_2x2_harvest/ and …_attrrob_2x2_escalation_harvest/.

qk-norm: exonerated

Turning the qk-l2-norm mitigation off does essentially nothing to the attractor: Δ = −0.873 (0.39σ) at the n=1 screen, Δ = −0.103 (0.05σ) at n=3, mixed sign across seeds. The attractor is not the published qk-norm stability issue wearing a costume. This is the load-bearing null of the experiment, and it held at both stages.

Gating: a direction-consistent trend, not confirmed at the pre-registered bar

The gated cell fired the escalation trigger at the n=1 screen (Δ +6.16, 2.75σ). At n=3 the effect shrank to Δ +4.31 — 1.92σ, below the 2σ bar the design itself set. The runner's own escalation logic reads fire = false. What survives honest scrutiny: all three paired per-seed deltas are positive (+6.16, +3.13, +3.65), and an exploratory (non-pre-registered) Welch t-test gives p = 0.062. We report this exactly as it is: a direction-consistent trend that did not confirm at the pre-registered bar — neither a confirmed amplification nor a null.

key observation Gated arms train to lower loss (3.515 vs 3.682 final train loss in the qk-on pair) while carrying more Gram deviation. A healthier-looking checkpoint carries the pathology no better — loss curves do not surface this failure mode, which is part of why it matters.

03The fix-at-scale wave: no tested construction stabilizes the attractor at scale

The 14M diagnosis run had produced two frozen-bias candidate mitigations: the per_token arm (deployed in the sibling head-to-head campaign; val-loss-neutral at 14M but with its own 14M geometry evidence pointing the wrong way, +0.196/+0.227 Δspan_frac destabilizing, CI-excludes-zero) and the global-vector arm, which genuinely stabilized at 14M (−0.332/−0.231, CI-excludes-zero). Neither had ever been run above 14M. The fix-at-scale wave adjudicated both: 28 cells at 98M and 392M on both corpora (openr1-mix-ext, wikitext-mix-ext), n = 3 seeds per confirmatory cell, reference bands pinned from fresh same-scale arm_off runs before any treated cell trained (blind discipline enforced mechanically and tamper-verified at harvest), two instruments per cell (post-blend primary + pre-blend co-primary). ≈130 GPU-h realized.

delta span_frac with CIs across 14M, 98M, 392M for the per_token arm (left, persistently positive/destabilizing) and the global-vector arm (right, stabilization decaying to zero and sign-flipping)
fig 3The fix-at-scale verdict. Left: the deployed per_token arm's Δspan_frac vs the same-scale arm_off reference (positive = destabilizing = the 14M sign), pinned 95% CIs. Right: the global-vector construction — n = 3 CIs at 14M; diamonds at 98M/392M are the pre-registered n = 1 exploratory probe (no CI, never a confirmatory bar). Data: experiment-runs/2026-07-06_frozen_bias_rung1/…/PHASE_D_FULL_REPORT.json and experiment-runs/2026-07-10_fixscale_harvest/fixscale_harvest_verdict.json (archive md5 manifest verified 132/132), both read directly by the figure script.

The per_token arm: the destabilizing sign persists at scale. 98M reads +0.113 [+0.054, +0.172] on openr1 and +0.101 [+0.054, +0.148] on wikitext — CI-excludes-zero positive on the primary AND the pre-blend co-primary (which rules out a static blend artifact: the effect is training-mediated, exactly as at 14M). 392M-wikitext reads +0.019 [+0.011, +0.027], still positive; 392M-openr1 is a null (+0.007 [−0.036, +0.049]). Zero of four scale×corpus cells move in the mechanism-predicted (stabilizing) direction on either instrument. Descriptively the magnitude attenuates up the ladder (+0.20 → +0.11 → +0.01/+0.02), but this is not a registered claim: the 392M cells ran a reduced 20k-step token budget vs 98M's Track-C-matched budget, so the 98M→392M attenuation is confounded with token budget by design. The within-scale readings are the registered claims.

The global-vector arm: the 14M stabilization does not survive transfer. Under the pre-registered n = 1 exploratory probe (no CI, never confirmatory), the construction that read −0.332/−0.231 at 14M reads −0.058/−0.034 at 98M — sign preserved, magnitude ≈1/6th–1/10th — and −0.012/+0.019 at 392M: essentially zero on one corpus and sign-flipped to destabilizing on the other. A curious mechanism datum for any future pass: the probe cells' pre-blend raw-key geometry is consistently worse than arm_off's own (98M +0.061/+0.055) — training through a constant bias degrades raw-key geometry even where the post-blend population reads better.

Val-loss neutrality is the half that transfers. All 8 gates pass (4 scale×corpus cells × per_token arm-mean + probe): both constructions remain free at the loss level at every tested scale, exactly as at 14M. One disclosed single-seed excursion (98M-wikitext per_token s0 = 3.2038 vs ceiling 3.2020; the arm mean passes) and thin 392M margins (0.001–0.003 nats, because arm_off's cross-seed spreads are tiny) are in the archived verdict.

key observation This strengthens the pathology story on both ends: the attractor grows with scale (section 01), and it now also resists the mitigations that looked promising at small scale — including the one that genuinely worked at 14M. "Val-loss-neutral" and "geometry-fixing" dissociate cleanly at scale. Any claimed fix for this class of pathology needs to be validated at scale on the geometry itself, not at 14M and not on loss.

04Limitations

05Reproducibility

Raw probe JSONs, aggregate files, MD5 manifests, and the independent recompute script (matches the runner's aggregates to <1e-6) are archived under experiment-runs/2026-07-09_attrrob_2x2_harvest/ and experiment-runs/2026-07-09_attrrob_2x2_escalation_harvest/ in the project repository. The fix-at-scale wave is archived under experiment-runs/2026-07-10_fixscale_harvest/ (train/calib/pins/pilots/measure trees, fixscale_harvest_verdict.json, the independent analyze_fixscale_harvest.py recompute — identical numbers — and the md5 manifest, 132/132 verified at publication); its 14M reference numbers come from experiment-runs/2026-07-06_frozen_bias_rung1/. Realized compute: ≈1.0 GPU-h (screen) + ≈2.0 GPU-h (escalation) + ≈130.2 GPU-h (fix-at-scale wave). The figure-generation script for this page is at assets/plots/generate_write_geometry_attractor.py.

References

  1. Yang, S., Kautz, J., & Hatamizadeh, A. (2024). Gated Delta Networks: Improving Mamba2 with Delta Rule. arXiv:2412.06464
  2. Kimi Team (2025). Kimi Linear: An Expressive, Efficient Attention Architecture. arXiv:2510.26692 (§4, qk-norm eigenvalue stability)