CoolFace
Modelpublic

cognica/Cognica-PoE-v1.0-3B-base

sourceHugging Faceapache-2.0updated 5mo agoView on Hugging Face
0likes70downloads
Model Card

Cognica-PoE-v1.0-3B-base

A 3.02B parameter causal language model pretrained from scratch with Product of Experts (PoE) per-stage-head local learning. The model has 4 PoE stages with asymmetric layer counts (16, 6, 5, 5) — stage 0 (16 layers, ~50% of trunk) acts as a high-capacity general-LM backbone, while stages 1-3 (6+5+5 deeper layers) refine specialty knowledge. Each PoE stage has its own additive lm_head that composes with the shared base lm_head:

logits_k = lm_head(x_k) + lm_head_stages[k](x_k)    for k in 0..3

Inference aggregates per-stage log-softmax distributions (Bayesian PoE, uniform mean / alpha=0.0).

This is a mid-training research release. Final training plan is 83,923 steps (~66B tokens, Chinchilla ratio ~22). Multiple checkpoints are released as branches step-XXXXX (see "Checkpoints" below). main tracks the latest.

TL;DR

  • —3.02B params: 2.08B transformer trunk + 0.54B value-embeds + 0.34B lmheadstages + 0.07B wte
  • —Architecture: depth=32, nembd=2048, nhead=16, nkvhead=8 (GQA 2:1), headdim=128, intermediatesize=12800, maxseqlen=2048
  • —PoE: K=4 stages, asymmetric poe_stage_layers=(16, 6, 5, 5), boundaries at layers [15, 21, 26, 31], poe_mode=flat, poe_alpha=0.0 (uniform stage mean)
  • —Per-stage heads: 4 independent additive lmheadstages composing with shared lm_head
  • —Training: DistMuonAdamW (ZeRO-2), totalbatch=786,432 tokens/step, ~66B target tokens, Chinchilla ratio ~22, FA2, bf16 compute / fp32 weights, `caseaug_prob=0.15`
  • —Dataset: frontier_v1 mix (63B tokens), 11 sources covering English / multilingual / code / math / books / chat
  • —Tokenizer: 32,768 BPE vocab, BOS-prepend protocol (see "Inference" below)
  • —Standard HF AutoModelForCausalLM + AutoTokenizer with trust_remote_code=True
  • —WAND p99 bounds are now per-checkpoint, stored in `config.json` (auto-calibrated; class-constant fallback only)

Architecture details

FieldValue
num_hidden_layers32
hidden_size2048
intermediate_size12800
num_attention_heads16
num_key_value_heads8 (GQA 2:1)
head_dim128
max_position_embeddings2048
vocab_size32768
window_patternSSSL (3 short + 1 long sliding-window per 4 layers; final layer always full)
rope_theta100,000
hidden_actrelu_squared
rms_norm_eps1e-6
tie_word_embeddingsFalse
poe_modeflat
poe_alpha0.0
poe_stage_layers[16, 6, 5, 5]
per_stage_headTrue
poe_head_count4
poe_wand_p99_bounds_per_stage_headper-checkpoint (auto-calibrated, see "WAND bounds" below)

Stage layout

StageLayer range (0-indexed)LayersApprox. trunk-compute share
0[0, 15]1650%
1[16, 21]6~19% (cumulative 69%)
2[22, 26]5~16% (cumulative 84%)
3[27, 31]5~16% (cumulative 100%)

Stage 0 is intentionally deep enough to function as a standalone capable LM. The asymmetric layout (50% / 19% / 16% / 16%) is itself a research variable: see the "Diversity vs layout" note below.

Training

FieldValue
OptimizerDistMuonAdamW (ZeRO-2; reducescatter zero-padded for `vocab=32768 % worldsize != 0`)
total_batch_size786,432 tokens / step
num_iterations83,923 (target)
target tokens~65.99B (Chinchilla ratio ~21.85)
matrix_lr0.015
embedding_lr0.3
unembedding_lr0.008
weight_decay0.28
warmup_steps1,000
warmdown_ratio0.65
case_aug_prob0.15 (80% lower / 20% upper at sample time)
Compute3-node A100 80GB (12 GPUs), DDP TCP cross-zone us-central1-c
Compute dtypebf16
Weight dtypefp32

Dataset (frontier_v1 mix, 63.07B tokens, 848 sharded parquets)

SourceShare
FineWeb-Edu33.5%
DCLM-Baseline24.1%
Stack v2 (codeparrot/github-code-clean mirror)15.7%
Wikipedia5.2%
CulturaX (ko, zh, ja, es, fr)5.2%
ProofPile-24.2%
OpenWebMath4.2%
Gutenberg (PG-19 separate)4.2%
PG-192.1%
UltraChat1.0%
OpenHermes-2.50.6%

Checkpoints

Each ckpt is a separate branch named step-XXXXX. The main branch tracks the latest released checkpoint (currently `step-83923` — final, training complete).

BranchStepTraining %Val BPB (training-eval, 40M tokens, 12 ranks)
step-20002,0002.4%0.987
step-40004,0004.8%0.955
step-60006,0007.2%0.949
step-80008,0009.5%0.944
step-1000010,00011.9%0.936
step-1200012,00014.3%0.932
step-1400014,00016.7%0.932
step-1600016,00019.1%0.928
step-1800018,00021.4%0.922
step-2000020,00023.8%0.923
step-2200022,00026.2%0.923
step-2400024,00028.6%0.923
step-2600026,00031.0%0.922
step-2800028,00033.4%0.919
step-3000030,00035.8%0.914
step-3200032,00038.1%0.903
step-3400034,00040.5%0.905
step-3600036,00042.9%0.896
step-3800038,00045.3%0.896 (training-log s37500=0.894 was lower)
step-4000040,00047.7%0.890
step-4200042,00050.0%0.885
step-4400044,00052.4%0.883
step-4600046,00054.8%0.879
step-4800048,00057.2%0.875
step-5000050,00059.6%0.866
step-5200052,00062.0%0.859 (skipped analysis; HF auto-publish only)
step-5400054,00064.4%0.855
step-5600056,00066.7%0.849
step-5800058,00069.1%0.847
step-6000060,00071.5%0.840
step-6200062,00073.9%0.832
step-6400064,00076.3%0.830
step-6600066,00078.6%0.824
step-6800068,00081.0%0.815
step-7000070,00083.4%0.807
step-7200072,00085.8%0.803
step-7400074,00088.2%0.798
step-7600076,00090.6%0.794
step-7800078,00092.9%0.790
step-8000080,00095.3%0.784
step-8200082,00097.7%0.778
step-8392383,923100.0% (final)0.773
mainlatest—tracks step-83923

Training-log val BPB new-minimum trajectory: s24500=0.9216 → s26500=0.9205 → s27000=0.9170 → s27500=0.9152 → s29000=0.9150 → s30000=0.9139 → s30500=0.9058 → s32000=0.9029 → s33500=0.9025 → s35000=0.9019 → s35500=0.8957 → s37500=0.8936 → s40000=0.8904 → s41500=0.8856 → s42000=0.8849 → s44000=0.8827 → s44500=0.8777 → s46500=0.8735 → s47000=0.8720 → s48500=0.8686 → s49500=0.8677 → s50000=0.8655 → s50500=0.8645 → s51000=0.8604 → s51500=0.8525 → s54500=0.8542. Warmdown phase began at step 29373; LR decay (lrm) is 1.00 at start, 0.85 by step 38000, 0.74 by step 44000, 0.65 by step 50000, 0.59 by step 54000.

Load a specific checkpoint via:

python
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained(
    "cognica/Cognica-PoE-v1.0-3B-base",
    revision="step-83923",       # branch name
    trust_remote_code=True,
    torch_dtype="bfloat16",
)
tokenizer = AutoTokenizer.from_pretrained(
    "cognica/Cognica-PoE-v1.0-3B-base",
    revision="step-83923",
    trust_remote_code=True,
)

WAND bounds (per-checkpoint, calibrated)

Each branch's config.json carries poe_wand_p99_bounds_per_stage_head, calibrated on a 131,072-token val slice using the tight margin-shrinkage metric range(delta) = max(delta) - min(delta) (constant-shift invariant). model.generate_wand(...) reads this field automatically; the class constant POE_WAND_P99_BOUNDS_PER_STAGE_HEAD = (3.2557, 1.5259, 1.1327) is now a fallback only.

stepbound 0→1bound 1→2bound 2→3
2,0003.70311.61210.9499
4,0003.83671.74571.0991
6,0003.63681.68111.0779
8,0003.77471.75181.1965
10,0003.62641.63891.1198
12,0003.48021.62591.1765
14,0003.25571.52591.1327
16,0003.23751.58711.2400
18,0003.08771.49751.1504
20,0003.33911.61461.2223
22,0003.28501.53511.1668
24,0003.09651.51351.2253
26,0003.20141.57871.1850
28,0003.35451.63091.2206
30,0003.26191.57491.1668
32,0003.12061.56111.1859
34,0003.32111.64361.1958
36,0003.12971.54291.1388
38,0003.54191.76121.2951
40,0003.29321.64901.2101
42,0003.18281.69041.2802
44,0003.57381.83131.3495
46,0003.34611.76291.2783
48,0003.46841.77831.3153
50,0003.39071.73821.2635
54,0003.64911.87191.4201
56,0003.50461.87241.3725
58,0003.87592.07011.5092
60,0003.40801.80071.3147
62,0003.42411.80281.3601
64,0003.39291.77221.2997
66,0003.34161.71721.2378
68,0003.80462.00471.4619
70,0003.41131.78391.3367
72,0003.46011.86531.3684
74,0003.75312.04261.4564
76,0003.70311.97771.4586
78,0003.90501.98371.4425
80,0003.84901.95991.4154
82,0003.89552.00101.4470
83,923 (final)3.94292.01931.4479

The bound 0→1 decreased s2k → s18k (from peak 3.84 at s4000 to 3.09 at s18000). Subsequent windows produced repeated widening / narrowing cycles: at s20k → s28k all three rose +3-5%, descended through s30k → s36k, widened sharply at s38k (+13~14%), narrowed at s40k (-7%), split at s42k, widened uniformly at s44k (+12-5%), reverted at s46k (-5%), mild moves through s48-s56, widened uniformly at s58k (+10%; bound 1→2 = 2.0701 set a trajectory-wide single-bound high), narrowed substantially at s60k (-12-13% — the s58 widening fully reverts), held essentially flat at s62k (+0.5% / +0.1% / +3.5%), narrowed mildly through s64-s66 (-0.9% to -4.8%), widened uniformly at s68k (+13.85% / +16.74% / +18.10%), narrowed substantially at s70k (-10.34% / -11.01% / -8.56%), mildly re-widened at s72k (+1.43% / +4.56% / +2.37%), widened moderately at s74k (+8.47% / +9.50% / +6.43%), mildly narrowed at s76k (-1.33% / -3.18% / +0.15%), and split at s78k (+5.45% bound 0→1 / +0.30% bound 1→2 / -1.10% bound 2→3). The trajectory is non-monotonic on every measurement window.

Inference

Standard HF generate (with BOS prepend — REQUIRED for base ckpts)

This is a base (pretrained) model. The training protocol always prepends <|bos|> to the prompt before tokenization. Failing to prepend BOS produces incoherent output:

python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

device = "cuda" if torch.cuda.is_available() else "cpu"
model = AutoModelForCausalLM.from_pretrained(
    "cognica/Cognica-PoE-v1.0-3B-base",
    trust_remote_code=True,
    dtype=torch.bfloat16,
).to(device).eval()
tokenizer = AutoTokenizer.from_pretrained(
    "cognica/Cognica-PoE-v1.0-3B-base",
    trust_remote_code=True,
)

prompt = "The capital of France is"
input_ids = [tokenizer.bos_token_id] + tokenizer.encode(prompt, add_special_tokens=False)
input_ids = torch.tensor([input_ids], device=device)
out = model.generate(
    input_ids=input_ids,
    max_new_tokens=32,
    do_sample=False,           # greedy; set True + temperature for sampling
)
print(tokenizer.decode(out[0].tolist()))

KV cache is enabled by default. CognicaKVCache subclasses transformers.Cache so HF generate() preserves it across decode steps without auto-replacing it with DynamicCache. The cache is preallocated to max_position_embeddings and lives on the device of the input tensor.

Implementation details:

  • —Numerical: SDPA's prefill (is_causal=True, full sequence) and decode (Tq == 1, masked) kernels are mathematically equivalent but accumulate bf16 rounding errors in different orders. To prevent that drift from compounding across decode steps and producing different greedy tokens at low-margin branching points, the SDPA call casts q/k/v to fp32, runs the kernel, then casts back to bf16. The K/V cache itself stays in bf16 (memory unchanged). On a fixed greedy prompt this gives bit-identical agreement between use_cache=True and use_cache=False for at least 200 generated tokens.
  • —Throughput: in single-batch (B=1) interactive use, per-decode Python and dispatch overhead dominates the per-step compute savings from the cache. Measured speedup is +3-6 percent (use_cache=True vs use_cache=False) over 50-500 token runs. To realize the cache's full benefit, batch the decode (B >= 4) or use a fused kvcache kernel (FA2's flash_attn_with_kvcache, FlashInfer).

PoE-specific inference (s83923 final measurements, 8-shard val slice 1.05M tokens)

s83923 is the final ckpt (lrm at s83923 ≈ 0.05; warmdown complete). Same val slice across s8000..s83923, single A100 80GB, bug-fixed code:

Inference moden_layer usedtraining-objective BPBrenormed PoE BPB (α=0)
Full PoE (alpha=0, all 4 stages aggregated)320.7247380.724738
Single stage 0 alone160.7277400.727740
Single stage 1 alone220.7257980.725798
Single stage 2 alone270.7250630.725063
Single stage 3 alone320.7242730.724273
prefix K'=1 (== single s0)160.727740—
prefix K'=2220.726103—
prefix K'=3270.725363—
Self-speculative decoding (stage 0 drafts, full verifies)mixed(no quality loss by construction)—
metrics83923 (final)
Speculative decoding speedup (m=4, 7 prompts × ~60 tokens)1.61x end-to-end
Speculative acceptance α0.9852 (s82000=0.9377, +0.0475; 2nd highest in trajectory after s28000=0.9882)
Routing probe at cap=0.020 (regression-rate-bounded)85.05% routed (s82000=86.08%, -1.03pp), projected speedup 1.715x
Per-stage target accuracy (full K=4)0.4860 (s82000=0.4835, +0.0025; trajectory peak)
Per-stage best (s3) accuracy0.4862 (trajectory peak)
PoE↔single-s3 BPB crossover gap+0.000465 (s82000=+0.000441, s80000=+0.000445)

vs s82000 the local-slice training-objective BPB dropped -0.005308 (full K=4) and -0.005332 (single s3). Sub-0.725 first crossed across the full table.

Cumulative warmdown phase totals: full K=4 BPB s30000 → s83923 = -0.133244 (15.5% relative reduction). Per-stage full acc s32000 → s83923 = +0.0580 (5.80 percentage points).

Per-stage target accuracy across last 12 ckpts (s52000 skipped from analysis):

steps0s1s2s3full
s320000.42580.42790.42810.42800.4280
s340000.42660.42790.42810.42810.4280
s360000.43030.43110.43100.43100.4311
s380000.43360.43420.43450.43470.4347
s400000.43800.43940.43920.43930.4394
s420000.43880.44030.44060.44070.4407
s440000.43950.44000.44030.44050.4403
s460000.43970.44070.44100.44140.4410
s480000.44190.44270.44270.44300.4429
s500000.44560.44660.44710.44710.4470
s540000.45000.45120.45150.45210.4515
s560000.45310.45420.45470.45490.4546
s580000.45350.45470.45490.45500.4550
s600000.45630.45700.45730.45780.4573
s620000.45900.45990.46030.46080.4602
s640000.46260.46340.46390.46420.4639
s660000.46430.46520.46520.46550.4651
s680000.46740.46850.46870.46880.4687
s700000.46970.47060.47080.47110.4708
s720000.47110.47200.47220.47260.4721
s740000.47310.47410.47450.47480.4745
s760000.47630.47750.47770.47820.4776
s780000.47860.47980.47990.48040.4801
s800000.48120.48200.48240.48290.4824
s820000.48240.48300.48350.48370.4835
s839230.48440.48560.48590.48620.4860

Cumulative s32 → s82 full acc gain: +0.0555. 0.05 cumulative milestone crossed at s78k; 0.48 boundary first crossed at s80k (s2/s3/full = 0.4824 / 0.4829 / 0.4824); s82k continues +0.0011 mild descent.

Sample-level outputs at s78000 (greedy temp=0.0, 60 tokens):

  • —Capital France: "Paris. It is the largest city in France and the capital of the country. Paris is the seat of the government, the seat of the French Academy, and the seat of the European Union. It is also the seat of the United Nations. Paris is the second largest city in the European Union." (Paris ✓; "largest city in France" ✓; "seat of government" ✓; "seat of French Academy" ✓ — Académie française is in Paris; "seat of European Union" wrong; "seat of UN" wrong; mixed factual quality)
  • —Gold symbol: "Au. Gold is a soft, malleable, ductile, highly unreactive ✓, precious, yellow, ductile, malleable, ..." (Au ✓; "highly unreactive" ✓ — corrects the s72 "highly reactive" error; precious + yellow + soft + malleable + ductile correct; output then degenerates into ductile/yellow/malleable repetition loop)
  • —Friday → tomorrow: "Saturday. If you are a Christian, then you know that the Bible says that God created the world on the sixth day of Creation Week. If you are a Muslim, then you know that the Quran says ... If you are a Jew ..." (Saturday is incorrect — correct is Sunday; religious tangent about Creation Week)
  • —Opposite hot: "cold. The opposite of cold is hot. ..." (binary loop)
  • —Planets list: "the bodies that orbit the Sun. The planets are the only bodies in the solar system that have atmospheres. The planets are named after the Roman gods of the Greek pantheon. The planets are Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and Neptune." (FIRST TIME the response produces a complete and correct modern 8-planet list across the entire trajectory — Mercury through Neptune, no Pluto, in correct order; "named after the Roman gods of the Greek pantheon" ✓; richest planets output by a wide margin)
  • —Color: "red. I love the color red. ..." (red + repetition; first non-blue since s70)
  • —5x + 3 = 13: "x is equal to 1.5. ..." (1.5 wrong — correct is 2; closer than s76 "1/3"; cleaner format, no MC, no equation echo loop)

Sample-level outputs at s76000:

  • —Capital France: "Paris. ... largest city in France / 3rd largest in Europe / 2nd most populous / 2nd most visited after London"
  • —Gold: Au + atomic number 79 ✓ + comprehensive properties + use list (jewelry/coins/electronics/dentistry/medicine)
  • —Friday: "Saturday" + Matrix simulation drift
  • —Planets: "objects that orbit the Sun" generic only
  • —Algebra: "x = 1/3" single fractional answer (wrong)

s32000 → s78000 pattern across 24 analyzed warmdown checkpoints: per-stage accuracy increased across 22 of 23 2k-step windows (s44 alone broke; s58 was near-flat). Local-slice training-objective BPB descended non-monotonically (s34/s38/s44 produced positive deltas; the rest negative). The s78 planets prompt produced the first complete and correct modern 8-planet list across the entire trajectory (Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune in correct order; no Pluto). The s76 gold prompt was the first correct atomic number 79 in a comprehensive Au response; s78 corrects the s72 "highly reactive" error to "highly unreactive ✓". Routing crossed the 90% boundary at s76 (90.76% peak at cap=0.020) and pulled back to 83.79% at s78. Cumulative full-stack acc gain s32 → s78 = +0.0521 (0.05 milestone crossed at s78).

Trajectory and findings (s8000 → s33000)

This is a research release; we publish per-checkpoint experiment data so the trajectory of PoE behavior is externally auditable. The 8-shard local-val BPB and per-checkpoint WAND bounds are first-class artifacts of each branch.

BPB trajectory

steptraining-obj. full K=4 BPB (8 shards)training-log val BPB (12 ranks)comment
s8,0000.8866470.943905early plateau exiting
s12,0000.8797520.931519mid-training, oscillation begins
s14,0000.8728350.931956first local low on 8-shard slice
s16,0000.8785140.927683regression on 8-shard slice (recovery on training-log)
s18,0000.8771020.922033training-log prior minimum
s20,0000.8751790.9226408-shard recovery in progress
s22,0000.8743450.923003gap to s14k baseline now +0.0015; both slices in agreement
s24,0000.8660000.923228largest 2k-step drop in trajectory (-0.0083); crossed below prior s14k floor
s24,500(not run)0.921583training-log new min
s26,0000.8634330.922316local slice min through this point; per-stage acc -0.0018; routing 68.26%
s26,500(not run)0.920499training-log new min
s27,000(not run)0.917032training-log new min
s27,500(not run)0.915166training-log new min (5-step streak)
s28,0000.8581380.918785local slice min through this point; per-stage acc +0.0035; spec α 0.9882; crossover gap +0.000073
s29,000(not run)0.915006training-log new min
s30,0000.8579820.913886both slices min through this point; first warmdown ckpt (lrm≈0.988); routing 68.39%
s30,500(not run)0.905847training-log new min; -0.008 single-step jump
s31,000(not run)0.906107small bounce in [0.902, 0.907] band
s31,500(not run)0.906766continued
s32,0000.8479910.902863-0.0100 local slice drop vs s30000; per-stage acc +0.0044 uniform; routing 74.33% (+5.94%); 4 prompts (Friday chain, modern planets, single-integer algebra, antonym graph) produced new output forms vs s30000
s32,500(not run)0.907459reversal at upper band edge
s33,000(not run)0.906124oscillation in [0.902, 0.907] band; lrm ≈ 0.94
s33,500(not run)0.902453training-log new min (9th); lrm ≈ 0.93
s34,0000.8536210.904607local slice +0.0056 vs s32000; routing -13.11%; algebra prompt produced "A. 2 / B. 3 / C. 4" multiple-choice format
s35,000(not run)0.901891training-log new min (10th)
s35,500(not run)0.895684training-log new min (11th); first sub-0.9; -0.0062 vs s35000
s36,0000.8419360.895738-0.0117 local slice drop vs s34000; per-stage acc +0.003 uniform; routing 67.63%; WAND bounds -5~-6% vs s34000
s37,500(not run)0.893594training-log new min (12th); first sub-0.895
s38,0000.8421980.896005local slice +0.000262 vs s36000 (first +Δ this warmdown); per-stage acc +0.0036 uniform; spec α 0.9483 (+0.0189); routing 72.06% (+4.4%); WAND bounds +13~14%; crossover gap +0.000476 → +0.000067
s39,500(not run)0.891012training-log new min (13th)
s40,0000.8316780.890430local slice -0.010520 vs s38000 (full K=4); training-log -0.005575 (sub-0.89 first); per-stage acc +0.0047 uniform; spec α 0.9822 (+0.0339); routing 73.19% (+1.13%); WAND bounds -7%/-6.4%/-6.6%; crossover gap +0.000346; algebra prompt produced "x is equal to 2" (correct)
s41,500(not run)0.885587training-log new min (14th)
s42,0000.8265500.884868local slice -0.005128 vs s40000 (full K=4); training-log -0.005562 (sub-0.885 first); per-stage acc +0.0013 uniform; spec α 0.9403 (-0.0419); routing 68.90% (-4.29%); WAND bounds split (-3.4% / +2.5% / +5.8%); crossover gap +0.000109
s44,0000.8284150.882684local slice +0.001865 vs s42000 (slice/log disagree on direction at s44); training-log -0.002184; per-stage acc s0 +0.0007 / s1-s3 -0.0002~-0.0003; spec α 0.9294 (-0.0109); routing cap=0.020 77.57% (+8.67%, surpasses s32000 prior peak 74.33%); WAND bounds widened uniformly (+12.3% / +8.3% / +5.4%); crossover gap +0.000038
s44,500(not run)0.877723training-log new min; -0.0050 single-step drop
s46,0000.8270730.878585local slice -0.001342 vs s44000 (reverts s44 +Δ); training-log -0.004099; per-stage acc +0.0002~+0.0009 (monotonic increase resumes; s32→s46 cumulative full acc gain +0.0130); spec α 0.9294 (unchanged); routing cap=0.020 70.97% (-6.60%, reverts s44 jump); WAND bounds reverted (-6.4% / -3.7% / -5.3%); crossover gap +0.000158
s46,500(not run)0.873460training-log new min
s47,000(not run)0.871953training-log new min
s48,0000.8213330.874640local slice -0.005740 vs s46000; training-log -0.003945; per-stage acc +0.0016~+0.0022; spec α 0.9320 (+0.0026); routing cap=0.020 79.18% (+8.21%, NEW trajectory peak); WAND bounds mildly widened (+3.7% / +0.9% / +2.9%); crossover gap +0.000303
s48,500(not run)0.868639training-log new min
s49,500(not run)0.867675training-log new min
s50,0000.8119910.865501local slice -0.009342 vs s48000; training-log -0.009139; per-stage acc +0.0037~+0.0044 (largest single-step acc gain through s50); spec α 0.9852 (+0.0532, second-highest in trajectory after s28000=0.9882); routing cap=0.020 77.33% (-1.85% vs s48 peak); WAND bounds mildly narrowed (-2.2% / -2.3% / -3.9%); crossover gap +0.000107
s51,500(not run)0.852479training-log new min; -0.0079 single-step drop (largest 500-step descent in trajectory)
s52,000(not run)0.858810epoch 1 ended around this region; pq_idx wrapped to 0 entering epoch 2
s54,0000.8017170.855220first ckpt analyzed in epoch 2; local slice -0.010274 vs s50000 (cumulative s48→s54 full K=4: -0.019616); training-log -0.010281; per-stage acc +0.0044~+0.0050 (LARGEST single-step acc gain in trajectory; 0.45 boundary first crossed at s3=0.4521); spec α 0.9566; routing cap=0.020 73.57%; WAND bounds widened uniformly (+7.6% / +7.7% / +12.4%); crossover gap +0.000023 (LOWEST in entire trajectory)
s55,500(not run)0.851502training-log new min
s56,0000.7950690.849220local slice -0.006648 vs s54000 (sub-0.80 first crossed on full K=4); training-log -0.005978 (0.85 boundary first crossed); per-stage acc +0.0028~+0.0032 (0.455 boundary first crossed at s3=0.4549); spec α 0.9430; routing cap=0.020 79.77% (+6.20%, NEW trajectory peak); WAND bounds mildly narrowed (-4.0% / +0.0% / -3.4%); crossover gap +0.000359
s58,0000.7923910.844465local slice -0.002678 vs s56000 (smallest single-step descent since s44→s46); per-stage acc +0.0001~+0.0005 (smallest gain since s32→s34, essentially flat); spec α 0.8784 (-0.0646, lowest since s20000=0.9086); WAND bounds widened uniformly (+10.6% / +10.6% / +10.0%; bound 1→2=2.0701 trajectory single-bound high); crossover gap +0.000194; multiple sample-level regressions co-occur
s60,0000.7853700.840422local slice -0.007021 vs s58000 (descent rate recovers); training-log -0.004043; per-stage acc +0.0023~+0.0028 (resumes growth); spec α 0.9402 (+0.0618, recovers from s58 low); routing cap=0.020 80.92% (+4.16%, NEW trajectory peak surpassing s56=79.77%); WAND bounds substantially narrowed (-12.1% / -13.0% / -12.9%, s58 widening fully reverts); crossover gap +0.000553
s60,500(not run)0.834882training-log new min; -0.0055 single-step drop
s61,000(not run)0.833518training-log new min
s62,0000.7790530.832344local slice -0.006317 vs s60000 (sub-0.78 first crossed); training-log -0.008078; per-stage acc +0.0027~+0.0030 (0.46 boundary first crossed); spec α 0.9795 (third-highest in trajectory); routing cap=0.020 77.43%; WAND bounds essentially flat; crossover gap +0.000471
s63,000(not run)0.829964training-log new min (sub-0.83 first)
s64,0000.7723340.825504local slice -0.006719 vs s62000; per-stage acc +0.0034~+0.0037 (s32→s64 cumulative full acc gain +0.0359); spec α 0.9483; routing cap=0.020 80.51%; WAND bounds mildly narrowed
s64,500(not run)0.823171training-log new min (sub-0.824)
s66,0000.769515(s65500=0.823685; s66000 not yet observed at probe time)local slice -0.002819 vs s64000 (smaller magnitude; descent rate decelerating); per-stage acc +0.0012~+0.0018 (s32→s66 cumulative full acc gain +0.0371); spec α 0.9738 (+0.0255, recovers toward s62 third-place); routing cap=0.020 83.21% (+2.70%, NEW trajectory peak surpassing prior s60=80.92%); WAND bounds mildly narrowed (-1.5% / -3.1% / -4.8%); crossover gap +0.000553
s68,0000.7617940.814863local slice -0.007721 vs s66000 (largest single-window descent of warmdown phase); training-log -0.009; per-stage acc +0.0031~+0.0036 (s32→s68 cumulative full acc gain +0.0407); spec α 0.9162 (-0.0576; sits between s60=0.9402 and s58 trajectory low 0.8784); routing cap=0.020 82.07% (-1.14pp; below s66 peak); WAND bounds widened uniformly (+13.85% / +16.74% / +18.10%); crossover gap +0.000326
s70,0000.7574160.806862local slice -0.004378 vs s68000 (moderate descent); training-log -0.008; per-stage acc +0.0021~+0.0023 (0.47 boundary first crossed; s32→s70 cumulative full acc gain +0.0428); spec α 0.9139 (-0.0023, basically flat-low; the s68 drop did not recover); routing cap=0.020 83.45% (+1.38pp, NEW trajectory peak surpassing prior s66=83.21%); WAND bounds narrowed uniformly (-10.34% / -11.01% / -8.56%, fully reverts s68 widening); crossover gap +0.000268
s72,0000.7550750.802531local slice -0.002341 vs s70000 (mild descent); training-log -0.004; per-stage acc +0.0013~+0.0015 (s32→s72 cumulative full acc gain +0.0441); spec α 0.9708 (+0.0569, sharp recovery from s68/s70 low pair; the s58 single-window recovery pattern repeats with two-window delay across s68→s72); routing cap=0.020 84.31% (+0.86pp, NEW trajectory peak surpassing prior s70=83.45%); WAND bounds mildly re-widened (+1.43% / +4.56% / +2.37%, well below s68 widened regime); crossover gap +0.000306
s74,0000.7497130.797773local slice -0.005362 vs s72000 (moderate descent; sub-0.75 first crossed); training-log -0.005; per-stage acc +0.0020~+0.0024 (s32→s74 cumulative full acc gain +0.0465); spec α 0.9484 (-0.0224, pulls back from s72 recovery but stays well above s68/s70 low pair); routing cap=0.020 86.52% (+2.21pp, NEW trajectory peak surpassing prior s72=84.31%); WAND bounds widened moderately (+8.47% / +9.50% / +6.43%, second-largest single-window since s58); crossover gap +0.000204 (lowest since s50-s54 era); algebra prompt produced first "Explanation: 5x = 13 - 3" algebraic-step structure since s62
s76,0000.7418180.793753local slice -0.007895 vs s74000 (largest single-window descent since s66→s68 -0.0077; sub-0.745 first crossed); training-log -0.004; per-stage acc +0.0031~+0.0034 (s32→s76 cumulative full acc gain +0.0496); spec α 0.9568 (+0.0084, mild recovery); routing cap=0.020 90.76% (+4.24pp, NEW trajectory peak and 90% boundary first crossed); WAND bounds mildly narrowed (-1.33% / -3.18% / +0.15%); crossover gap +0.000403; gold prompt produced first atomic # 79 ✓ embedded in comprehensive Au + properties + use list response across the trajectory; France prompt produced best multi-fact response across the trajectory with no internal contradictions
s78,0000.7380870.789612local slice -0.003731 vs s76000 (mild descent; sub-0.74 first crossed); training-log -0.004; per-stage acc +0.0022~+0.0025 (s32→s78 cumulative full acc gain +0.0521; 0.05 cumulative milestone first crossed); spec α 0.9190 (-0.0378, pulls back from s76 mild recovery); routing cap=0.020 83.79% (-6.97pp, major pullback from s76 trajectory peak); WAND bounds split (+5.45% bound 0→1 / +0.30% bound 1→2 / -1.10% bound 2→3); crossover gap +0.000365; planets prompt produced first complete and correct modern 8-planet list across the entire trajectory (Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune; no Pluto; "named after Roman gods of Greek pantheon" ✓); gold prompt corrected s72 "highly reactive" error to "highly unreactive ✓"
s80,0000.7327130.783510local slice -0.005374 vs s78000 (moderate descent; sub-0.735 / sub-0.733 first crossed); training-log -0.006; per-stage acc +0.0022~+0.0026 (s32→s80 cumulative full acc gain +0.0544; 0.48 boundary first crossed); spec α 0.9483 (+0.0293, recovers from s78 pullback); routing cap=0.020 87.66% (+3.87pp, recovers but below s76 peak); WAND bounds mildly narrowed (-1.43% / -1.20% / -1.88%); crossover gap +0.000445; France prompt produced richest factual output across trajectory (Paris + largest + north + Seine + culture/art/fashion + museums/parks/monuments, no errors); Gold prompt added transition metals classification ✓ for first time across trajectory; planets and algebra prompts regressed (s78 8-planet breakthrough not retained; algebra back to "x is 5" pattern from s64 era)

Local-slice training-objective BPB across the warmdown ckpts: 0.857982 (s30k) → 0.847991 (s32k) → 0.853621 (s34k) → 0.841936 (s36k) → 0.842198 (s38k) → 0.831678 (s40k) → 0.826550 (s42k) → 0.828415 (s44k) → 0.827073 (s46k) → 0.821333 (s48k) → 0.811991 (s50k) → 0.801717 (s54k) → 0.795069 (s56k) → 0.792391 (s58k) → 0.785370 (s60k) → 0.779053 (s62k) → 0.772334 (s64k) → 0.769515 (s66k) → 0.761794 (s68k) → 0.757416 (s70k) → 0.755075 (s72k) → 0.749713 (s74k) → 0.741818 (s76k) → 0.738087 (s78k) → 0.732713 (s80k) → 0.730046 (s82k) → 0.724738 (s83923, final). Non-monotonic (s32→s34 +Δ, s38 +Δ, s44 +Δ). Through s83923 the cumulative drop from s30000 is -0.133244 (15.5% relative reduction).

Sample-level concept oscillation under monotone BPB improvement

Greedy continuations on a fixed 7-prompt probe set track concept-level retention separately from BPB:

capabilitys78000s76000s74000s72000s70000s68000s66000s64000s62000s60000s58000s56000s54000s50000s48000s46000s44000s42000s40000s38000s36000s34000s32000s30000s28000s26000s24000s22000s20000s18000s16000s14000
gold symbol → Au✓ Au + soft/malleable/ductile + "highly unreactive" ✓ + precious + yellow (then property repetition)✓ Au + atomic # 79 ✓ + soft/yellow/lustrous/malleable/ductile + uses (jewelry/coins/electronics/dentistry/medicine)✓ Au + soft/yellow/malleable/ductile + "easily cut with knife" ✓✓ Au + soft/yellow/malleable/ductile + "highly reactive" wrong✓ Au + clean sentence repetition✓ Au + self-referential definition loop✓ Au + correct properties (soft/malleable/ductile/conductor)✓ Au + Wikipedia fact list (atomic # "19" wrong)✓ Au + 5 properties + Latin "aurum"✓ Au + "A and U" decomposition✗ "A" only✓ Au + sentence repetition (4th stable)✓ Au + sentence repetition (3rd stable)✓ Au + sentence repetition (stable)✓ Au + sentence repetition (no swap)✓ Au + 79-reference + jewelry✗ "79" only✗ "A" only + soft/malleable✓ Au + soft/malleable/jewelry✓ Au + "Au" loopAu + yellow + soft/malleableAu + ✗ "abundant"✓ + soft/malleable✓ but "abundant" wrong✓ + industries✓ + properties✓✓✓✗ "24"✓✗
gold atomic number → 79(avoided in s78 sample)✓ "79" embedded in comprehensive Au response(avoided)(avoided)(avoided)(avoided)(avoided)✗ "19" (wrong; potassium's number)(avoided)(avoided)(avoided; truncated)(avoided)(avoided)(avoided)(avoided)(s46 produced 79 within Au response)(s44 produced 79 alone)(avoided)(avoided)(avoided)(avoided)(avoided)(avoided)(avoided)✓ "79"(avoided)✗ "24"-----
Friday→tomorrow → Sunday✗ "Saturday" + religious Creation Week drift✗ "Saturday" + Matrix simulation drift✗ "Saturday" + bizarre "rest of the week" meta-language✗ "Monday" + initial Mon↔Fri loop then clean +1-day chain Fri→Sat→Sun→Mon→Tue✗ "Saturday" + alternating yesterday→today/tomorrow chain (+1/+2 confusion)✗ "Saturday" + alternating-frame all→Saturday✗ "Monday" + Internet topic drift✗ "Friday" + circular self-ref✗ "Saturday" + first logically correct +1-day chain✗ "Saturday" + chain logic broken✗ "Saturday" + alternating-framing✗ "Saturday" + clean self-repetition✗ "Monday" + mixed-framing✗ "Saturday" + correct +1-day chain✗ "Wednesday" + correct +1-day chain✗ "Saturday" + weekend continuation✗ "Tuesday" + bizarre temporal✗ "Saturday" + "100 years old"✗ "Saturday" + reverse-chain✓ "Sunday" + Sunday-school drift✗ narrative drift✗ + narrative drift✗ first ans, +1-day chain✗ infinite loop✗✗✗✗✗✗✗✓
Full planet list (Mercury…)✓ Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune (modern 8, no Pluto, correct order) + named after Roman gods of Greek pantheon ✓✗ "objects orbit the Sun" generic✗ "Sun is the star at the center"✗ "objects orbit Sun + Sun is center of solar system"✗ "only objects with solid surface" (factually wrong)✗ "objects orbit Sun + classified terrestrial/gas giants" generic✗ "objects that orbit the sun" generic (regression)✗ terrestrial/gas-giants split + first names: Mercury/Venus/Earth/Mars/Moon (Moon wrong)✗ "Jupiter largest at farthest"✗ "near/far from Sun" structure✗ "all in same orbit"✗ inner/outer/rocky/gas-giants taxonomy (no names)✗ "named after gods/goddesses"✗ "most common objects in universe"✗ "closest to sun, most massive"✗ "named after Greek god of sky"✗ "most diverse in universe"✗ "most massive bodies"✗ "orbit the sun" generic✗ "state of flux"✗ Sun/Moon included; Pluto/Venus/Mercury absent✗ Pluto re-added + ice/water✓ modern 8 (no Pluto)✗ Sun+Moon+Pluto+Belt✓ full 9 + Charon✗ Earth droppedfull 99+Charon+beltinner 4full 9partialpartial
Math 5x + 3 = 13 → x = 2"x is equal to 1.5" single fractional answer (wrong; closer to 2 than s76 "1/3")"x is equal to 1/3" single fractional answer (wrong)5-option MC w/ "Explanation: 5x = 13 - 3" — first algebraic-step structure since s62 (truncated)4-option MC duplicate "A.5 B.3 C.5 D.3" (correct value 2 absent)"two solutions x=1 and x=13" (both wrong; 13 as one solution)5-option MC fractional choices A=1/3..E=1/4 (correct value 2 absent; D and E duplicate "2/3")5-option MC "A.1 B.2 C.3 D.4 E.5" (correct B=2 enumerated, not selected)"x is 5. The answer is 5." (coefficient confusion)"5x = 13-3 / 5x = 8 / x = 8/5 / x = 1" (first algebraic-step)"A.3/B.4/C.5/D.6 / The answer is C." MC"A.1.5/.../D.4.5 / The answer is B. 2.5" MC"method of substitution" instruction"A.3/B.4/.../H.10" 8-option MC"x is 3""x is equal to 13/5" (treats 5x=13)"x is 3""5 times as big as 3" + echo"5x+3=13" echo"x is equal to 2" (correct)"x = 1""x is:" truncated"A. 2 / B. 3 / C. 4" choices"3" single integer"multiple of 13""5x+3" circularMC D=75"a square""13 times bigger""5","3""prime""3.5""factor 13"
Capital of France → Paris✓ Paris + largest in France ✓ + seat of govt ✓ + seat of French Academy ✓ (+ seat of EU/UN wrong, 2nd largest in EU debatable)✓ Paris + largest in France ✓ + 3rd in Europe + 2nd populous + 2nd visited after London (best multi-fact)✓ Paris + cascading wrong superlatives (1st/2nd/3rd contradicting)✓ Paris + north + Île-de-France + seat of govt + largest city + 10th in world✓ Paris + "largest city / most populous / Paris region / north" multi-fact✓ Paris + sentence repetition only (Île-de-France/Seine lost)✓ Paris + Île-de-France ✓ + Seine ✓ + north (richest factual output yet)✓ Paris + "capital of EU" loop✓ Paris + factual world-capital fragments✓ Paris + "capital of the world" loop✓ Paris + Hauts-de-Seine✓ Paris + Seine-et-Marne✓ Paris + sentence✓ Paris + "French Empire"✓ Paris + sentence✓ Paris + degenerate "Paris, Paris" loop✓ Paris + "south / 2nd largest"✓ Paris + "Europe/world largest"✓ Paris + "world capital"✓ Paris + "EU / largest city"✓ Paris + spurious extras✗ "French Republic"✓ + "most important city"✓ + UK/US loop✓ "Paris"✗ "south of France"✗ "2nd largest world"-----
Favorite colorred + "I love the color red" repetitionblue + "I love the color blue" repetitionblue + "I love the color blue" repetitionblue + "I love the color blue" repetitionred + "looks/feels/makes me feel" multi-clauseblue + "feel/think" two-clause alternationblue + "I love the way" multi-clauseblue + multi-sense descriptionblue + "I love the way" loopblue + clothing/household nounsblue + clothing nounsred + "I love the way" loopred + "I love the way" loopblue + "blue-eyed monster"blue + "sky/water/clouds"blue + "sky/ocean"purple + "beautiful and mysterious"blue + "I love blue" loopred + "movie" loopred + "I love red" loopblue + "calming/soothing"blue + "blue friends"blue (positive)red (dark)blueblackred-----
Antonym graph (hot→)cold/hot binary loopcold/hot binary loopcold/hot binary loophot/cold/warm/cool multi-hop chaincold/hot binary loopcold/hot binary loopcold/hot binary loopcold/hot binary loopcold/hot binary loopcold/hot binary loopcold/hot binary loopcold/hot binary loopcold/hot binary loopcold/hot binary loopcold/hot binary loopcold/heat binary loopcold/hot binary loopcold/hot binary loopcold/hot binary loopcold/hot/dry/wet/windy chaincold/hot binarycold/cold loopcold/warm/dry/moist/wet chaincold↔hot loop--------

Specific factual tokens swing in and out of top-1 between checkpoints even as token-averaged BPB improves. This is the long-tail-vs-frequent-token tradeoff: BPB is dominated by the bulk of frequent-token predictions, where a small calibration sharpening can hide rare-token rank shifts.

Sample-level output changes through s30000: s24000 produced wrong "atomic number 24" (gold prompt); s26000 produced "south of France" (capital prompt) and dropped Earth from the planet list; s30000 added Sun/Moon/Kuiper Belt to the planet list and looped on the Friday prompt.

At s32000 the four prompts produced new output forms versus prior checkpoints:

  • —Calendar: "Saturday" first-answer (still incorrect) followed by a +1-day chain continuation ("Saturday → Sunday → Monday → ...").
  • —Planets: 8-planet list (Mercury through Neptune), no Pluto, no Sun/Moon.
  • —Algebra 5x + 3 = 13: "3" single integer. Truth is 2.
  • —Antonym: "hot/cold/warm/dry/moist/wet" multi-token continuation.

At s40000 the algebra prompt produced "x is equal to 2" — first checkpoint to produce the correct answer. Subsequent checkpoints produced an equation echo (s42), "5 times as big as 3" (s44), "x is 3" (s46/s50), "x is equal to 13/5" (s48), and an 8-option multiple-choice format A-H without 2 in the choices (s54). The gold-symbol prompt evolved Au+properties (s40) → "A" (s42) → "79" (s44) → "Au+79-ref+properties" (s46) → stable "Au + sentence repetition" (s48 / s50 / s54). The Friday prompt at s48/s50/s54 produces an incorrect first-answer (Wednesday/Saturday/Monday) but the continuation produces a +1-day chain across 7 days at s48/s50, with mixed-framing chain at s54. Color choice across s38-s54: red/red/blue/purple/blue/blue/red.

The dataloader is sequential (pq_idx advances monotonically through 848 shards); s44000 has seen pq_idx ≈ 719. The same prompt set will be re-run at s50000, s83923.

Speculative-decoding acceptance trend

stepE2 acceptance αend-to-end speedup
s80000.95391.54x
s120000.95391.54x
s140000.96521.55x
s160000.98531.59x
s180000.93751.52x
s200000.90861.48x
s220000.95111.54x
s240000.98241.58x
s260000.97371.59x
s280000.98821.60x
s300000.98241.58x
s320000.93481.52x
s340000.93201.51x
s360000.92941.51x
s380000.94831.53x
s400000.98221.57x
s420000.94031.54x
s440000.92941.52x
s460000.92941.52x
s480000.93201.51x
s500000.98521.59x
s540000.95661.56x
s560000.94301.54x
s580000.87841.45x
s600000.94021.52x
s620000.97951.58x
s640000.94831.53x
s660000.97381.58x
s680000.91621.50x
s700000.91391.50x
s720000.97081.58x
s740000.94841.54x
s760000.95681.56x
s780000.91901.51x
s800000.94831.54x
s820000.93771.53x
s839230.98521.61x

Drafter acceptance is non-monotone across the trajectory: declined s16k → s20k, rose through s22k → s28k (peak 0.9882 at s28k), drifted s32-s36 (0.93 range), rose through s38k-s50k with intermittent dips, dropped to 0.8784 at s58k (lowest since s20k), recovered through s60-s62, oscillated through s64-s78 with the s68/s70 low pair (0.9162 / 0.9139) standing out as a localized regime change followed by partial recovery (s72=0.9708, s74=0.9484, s76=0.9568, s78=0.9190). End-to-end speedup has been 1.45-1.69x across all 31 measured checkpoints.

Confidence-aware routing trend

steprouted @ cap=0.020projected speedup
s800059.94%1.416x
s1200063.70%1.454x
s1400063.37%1.450x
s1600063.07%1.447x
s1800066.04%1.478x
s2000067.05%1.489x
s2200061.21%1.428x
s2400067.35%1.493x
s2600068.26%1.503x
s2800062.45%1.441x
s3000068.39%1.504x
s3200074.33%1.573x
s3400061.22%1.429x
s3600067.63%1.496x
s3800072.06%1.546x
s4000073.19%1.559x
s4200068.90%1.510x
s4400077.57%1.613x
s4600070.97%1.533x
s4800079.18%1.634x
s5000077.33%1.610x
s5400073.57%1.564x
s5600079.77%1.642x
s5800076.76%1.603x
s6000080.92%1.657x
s6200077.43%1.611x
s6400080.51%1.652x
s6600083.21%1.688x
s6800082.07%1.673x
s7000083.45%1.692x
s7200084.31%1.704x
s7400086.52%1.736x
s7600090.76%1.801x
s7800083.79%1.697x
s8000087.66%1.753x
s8200086.08%1.729x
s8392385.05%1.715x

Position-level top-1 routing fraction (cap=0.020) and speculative acceptance α track different slices of the trunk's confidence distribution: routing reads margin at boundary positions; spec acceptance reads step-by-step alignment between stage 0 and full-stack. Through s40000 they have moved in different directions in some windows and the same direction in others. The late-trajectory routing fraction progressed s40k=73% → s60k=81% → s76k=91% (peak) → s78k=84% — stage 0 alone suffices for 84-91% of positions within a 2% accuracy regression budget across the late warmdown, with the s76 peak followed by a s78 pullback. Speculative acceptance α has been more volatile (0.88-0.99 range) but remains in a regime where 4-token speculative draft delivers consistent 1.45-1.69x end-to-end speedup.

Stage diversity probe — early vs late trajectory

Early trajectory: s14000 head decomposition

Inference-time analysis of lm_head_stages[k].weight at s14000 (results essentially unchanged at s20000):

  • —SVD top-1 alignment: stages s1, s2, s3 dominant left singular vectors are mutually identical (cosine ≈ 1.000); stage s0 is anti-aligned (cosine ≈ -0.98). The 4 stages collapse into a 2-cluster structure {s0} vs {s1, s2, s3}.
  • —Gram-Schmidt orthogonalization: 77.2% of s1, 91.8% of s2, 92.0% of s3 weight projects onto the span of earlier stages. Only ~38% of total per-stage parameter budget carries unique information.
  • —Single-stage perturbation symmetry: turning OFF any single stage (β_k = 0) costs a uniform +0.0025-0.0030 BPB, regardless of k — operationally interchangeable.
  • —β scaling sweep: the trained β = 1 inference rule is BPB-optimal but factual-recall-suboptimal. β = 2 recovers ~2× the gold-as-Au probability at +0.05 BPB cost; β = 0 (drop the stage delta entirely) costs +0.10 BPB.
Late trajectory: s76000 head decomposition

Re-running the same probes at s76000 (90.6% trained):

  • —SVD top-1 alignment: cluster structure shifted from {s0} vs {s1, s2, s3} (s14k) to depth-tier `{s0, s1} vs {s2, s3}` (s76k). Pairwise dominant-singular-vector cosines: s0↔s1 = +0.977 (aligned), s2↔s3 = +0.997 (aligned), {s0,s1}↔{s2,s3} = -0.97 to -0.99 (anti-aligned). Stage 1 has migrated from the s1/s2/s3 cluster (early) into alignment with s0 (late). The boundary now corresponds to trunk depth: shallow tier (s0 at depth 16, s1 at depth 22) vs deep tier (s2 at depth 27, s3 at depth 32).
  • —Gram-Schmidt orthogonalization: unique residual norms grew from s14k {s1=22.8%, s2=8.2%, s3=8.0%} to s76k {s1=21.1%, s2=11.8%, s3=11.3%}. Total unique parameter budget increased from ~38% (s14k) to ~44% (s76k). Stages s2 and s3 each gained ~3 percentage points of unique content; stage s1 lost ~2pp.
  • —Top-singular-vector token list: s0 and s1 both load on suffix-like tokens ('TION', 'ATE', 'EAR', 'IAL', 'BER'); s2 and s3 load on shorter morpheme fragments ('UN', 'IT', 'PER', 'TH', 'EV', 'AL'). The shallow tier emphasizes longer suffix completions; the deep tier emphasizes finer morphemic refinement.

Reading: at s14000 the stages-as-experts story was degenerate — only stage 0 carried distinct signal and stages 1-3 were mutually redundant. By s76000 the structure has reorganized into a depth-tier specialization: shallow stages {s0, s1} cluster together and deep stages {s2, s3} cluster together, with non-trivial unique content in each later head (s2 / s3 each ~11% unique vs ~8% earlier). This is consistent with the late-trajectory routing improvement (cap=0.020 fraction routed to stage 0 went from 73% at s40k to 91% at s76k): the shallow tier becomes confident enough to handle most positions, while the deep tier specializes on the residual ~9-15% where extra refinement is needed. The PoE↔single-s3 crossover gap remains small (+0.0002 to +0.0005) — meaning the geometric-mean aggregation gives a measurable but modest improvement over the deepest single stage at every point in the trajectory. See cognica/Cognica-PoE-v1.0-1.3B-base (4 symmetric stages of 6 layers, shared lm_head only) for the diversity-vs-layout disambiguation.

Diversity vs layout

The asymmetric (16, 6, 5, 5) layout itself is a hypothesis on the input variable side: stage 0's 50% trunk share gives stages 1-3 only shallow depth (5-6 layers each) on top of an already-refined representation, which structurally biases them toward refining stage 0's output rather than producing independent evidence. Whether the absence of diversity is caused by this layout or by the PoE training signal itself can be cleanly separated by comparing against the 1.3B symmetric (4×6, shared head) release. Result of that comparison will be added when measured.

Advanced PoE inference helpers

All four PoE-specific inference modes are exposed directly on CognicaPoEForCausalLM. They re-forward the full prefix each decode step (no KV cache); wall-clock speedups come from reduced trunk depth.

python
import torch

# 1. Single-stage prediction (uses head k at boundary k only).
logits = model.forward_stage(input_ids, stage=3)        # (B, T, V) float32

# 2. PoE-aggregated log-probabilities over the first K' stages.
log_p = model.forward_aggregated(input_ids, max_stages=2)  # log-softmax shape (B, T, V)

# 3. Generation with prefix pruning (K' <= K stages, asymmetric trunk depth).
out = model.generate_prefix(input_ids, max_stages=1, max_new_tokens=64)
# K'=1 on (16,6,5,5) -> 16 trunk layers (~2.2x decode speedup)

# 4. Single-stage generation.
out = model.generate_stage(input_ids, stage=0, max_new_tokens=64)

# 5. WAND adaptive depth (Jeong 2026 Section 5.3). p99 bounds are now read
#    from config.json (`poe_wand_p99_bounds_per_stage_head`); the class
#    constant is fallback only. Override per call via `p99_bounds=...`.
out, stages_used = model.generate_wand(
    input_ids, max_new_tokens=64, safety=1.0,
    return_stages_used=True,
)

# 6. Self-speculative decoding (zero-extra-training accelerator).
out, accept_rate = model.generate_speculative(
    input_ids, max_new_tokens=64,
    draft_stage=0, k_draft=4, return_acceptance=True,
)

# 7. Parallel stage composition (Jeong 2026 Section 6.5.5).
out = model.generate_parallel_composition(
    input_ids, stages=(2, 3), stage_weights=(1.0, 1.0), max_new_tokens=64,
)

Implementation notes for this release (per_stage_head=True):

  • —forward_stage(stage=k) returns logits using lm_head(x_k) + lm_head_stages[k](x_k) at boundary k. Each stage head was trained additively on top of the shared lm_head.
  • —generate_speculative verifier uses the full PoE aggregate over all K stages. Greedy match by construction guarantees output identity with model.generate(...).
  • —generate_wand runs in cumulative-PoE log-prob space; the p99 bound must be expressed in that same scale (config.json carries this per-checkpoint).

Limitations

  • —Final release (s83923 / 100.00% complete; training finished 2026-05-07 12:31 KST): all 27 published checkpoints (s2000, s4000, ..., s82000, s83923) remain available as separate branches for trajectory analysis. The main branch tracks the final ckpt s083923.
  • —Calendar prompt ("yesterday → tomorrow"): first-answer outputs have been "Sunday" (s14000 only), narrative drifts (s16-s30), "Saturday" (s32, s40-s42, s46, s50, s56-s62, s68, s70, s74, s76, s78), "Tuesday" (s44), "Sunday" (s38), "Wednesday" (s48), "Monday" (s54, s66, s72), "Friday" (s64). At s62k the chain continuation was the first to be logically correct; at s72k the chain stabilized into a clean +1-day chain. From s74k onward the response drifts into topic tangents (rest-of-the-week meta-language at s74, Matrix at s76, Creation Week at s78) — the calendar prompt remains a persistently unsolved factual probe.
  • —Math prompt 5x+3=13 (correct: x=2): outputs include "factor 13" / "a square" / multiple-choice formats / circular / "multiple of 13" / "3" / "1" / "x is equal to 2" (s40, only correct so far) / "5x+3=13" echo / "5 times as big as 3" / "x is 3" (s46/s50) / "x is equal to 13/5" (s48) / 8-option MC A-H (s54) / "method of substitution" instruction (s56) / 4-option MC self-asserted "B. 2.5" (s58) / 4-option MC "C" (s60) / first algebraic-step structure with arithmetic error (s62) / "x is 5" coefficient confusion (s64) / 5-option MC including B=2 enumerated but not selected (s66) / 5-option MC with fractional choices A=1/3..E=1/4 (s68) / "two solutions x=1 and x=13" (s70) / 4-option MC duplicate "A.5 B.3 C.5 D.3" (s72) / 5-option MC negative integers w/ "Explanation: 5x = 13 - 3" (s74) / "x is equal to 1/3" single fractional answer (s76) / "x is equal to 1.5" single fractional answer (s78; closer to correct value 2 than s76 1/3 but still wrong).
  • —Planets prompt: at s56k inner/outer/rocky/gas-giants taxonomy first appeared. At s60k near/far structural language. At s62k ordering-by-distance with "Jupiter largest". At s64k the response listed actual planet names for the first time but with "terrestrial / gas giants" categorical split where terrestrial = "Mercury, Venus, Earth, Mars, and the Moon" (Moon wrongly included). At s66-s76 the response oscillated between generic "objects orbit the Sun" framings and incorrect categorical claims. At s78k the response produced the first complete and correct modern 8-planet list across the entire trajectory: "The planets are Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and Neptune" + "named after the Roman gods of the Greek pantheon" ✓.
  • —s58000 reorganization signals (transient): spec α dropped sharply (-0.0646), WAND p99 widened uniformly (+10%), per-stage acc gain decelerated, gold/planets prompts regressed. At s60k–s64k these signals reverted: spec α rose to 0.9402, 0.9795, then 0.9483; WAND narrowed and held; per-stage acc resumed +0.002~0.004 growth; gold/planets prompts produced richer / structured outputs.
  • —s68000 signal mismatch (fully recovered by s72000): at s68 largest local-slice BPB descent of the warmdown phase (-0.0077 full K=4) co-occurred with largest spec α drop since s56→s58 (-0.0576) and uniform WAND widening (+14~18%). At s70 WAND fully reverted, routing set new peak 83.45%, BPB descent continued, per-stage acc crossed 0.47, but spec α stayed flat at 0.9139. At s72 spec α recovered sharply (+0.0569 → 0.9708), routing set another peak 84.31%. The s58→s60 single-window recovery pattern played out across s68→s72 with a two-window delay.
  • —s74000 → s78000 progression: at s74 BPB descended moderately, spec α pulled back, WAND widened moderately, sample regressed on France and Antonym. At s76 BPB descent resumed strongly (-0.0079), per-stage acc gained +0.003, routing crossed the 90% boundary (90.76% peak), gold prompt produced first correct atomic # 79 ✓ in a comprehensive Au response, France prompt produced best multi-fact response. At s78 BPB continued (-0.0037; sub-0.74 first crossed), per-stage acc crossed the 0.05 cumulative milestone (s32→s78 = +0.0521), routing pulled back to 83.79%, and the planets prompt produced the first complete and correct modern 8-planet list across the entire trajectory (Mercury through Neptune, no Pluto). Gold prompt corrected the s72 "highly reactive" error to "highly unreactive" ✓.
  • —Stage diversity at the (16, 6, 5, 5) asymmetric layout: PoE↔single-s3 crossover gap stays in [+0.000067, +0.000553] across all measured checkpoints — the PoE renormalized aggregate is close to the single-best-stage value at every point. The early-trajectory finding ("stages-as-experts degenerate at s14000") is partially superseded by the late-trajectory measurement: at s76000 the head SVD shows a depth-tier cluster structure {s0, s1} vs {s2, s3} and unique parameter budget grew from ~38% to ~44%. See "Stage diversity probe" section above for the early-vs-late comparison.
  • —The model is a base (pretrained) checkpoint — chat / SFT fine-tuning is not included in this release.

License

Apache 2.0. See LICENSE and NOTICE.

Citation

If you use this release, please cite the companion paper for the PoE per-stage-head methodology:

@misc{jeong2026poe,
  author = {Jeong, Jaepil},
  title  = {Product of Experts as Scalable Local Learning: Modular Construction at 1.3B Parameters},
  year   = {2026},
  doi    = {10.5281/zenodo.19547653},
  publisher = {Zenodo},
}

A 3B-specific paper is in preparation.

Related models