Contents
Overview#
Shared setup, and where every run landed
- Data
- FineWeb-Edu, 16k BPE
- Batch
- 128 × 4,096 tokens
- Length
- 76,294 updates · 40B tokens
- Width
- 1,024 · 8 query heads, 1 K/V head
- Residuals
- Attention Residuals, pairwise queries + biases
- Optimizer
- Muon, peak LR 5 × 10⁻³
- Validation
- every 5k updates · 400 batches
Reading the charts. Each line is a run's validation loss minus its baseline's at the same update, in nats per token, so the dashed zero line is the baseline and lower is better. Every run sees the same tokens in the same order, so updates are directly comparable. For latent runs the plotted loss is the fourth parallel pass; their token-by-token recurrence stays within 0.001 nats of it at every checkpoint. The first chart weighs quality against an estimated decode cost, which is what a deployed model pays per token; its other view shows measured training time, which reflects the kernels each run used, so treat it as indicative.
- Alternative feedback paths
- Training schedules
- Bank width
- Depth and compute controls
- 16-layer foundations
Table of values
| Run | Set | GFLOP / token | Δ at 30k |
|---|---|---|---|
| s3e2 | 16-layer foundations | 0.545 | −0.196 |
| s3e3 | 16-layer foundations | 0.545 | −0.172 |
| s3e9 | 16-layer foundations | 0.545 | −0.131 |
| s3e1 | 16-layer foundations | 0.545 | −0.128 |
| s3e4 | 16-layer foundations | 0.545 | −0.094 |
| s3e36 | Bank width | 0.290 | −0.084 |
| s3e37 | Bank width | 0.289 | −0.084 |
| s3e31 | Bank width | 0.289 | −0.083 |
| s3e38 | Bank width | 0.290 | −0.080 |
| s3e32 | Bank width | 0.290 | −0.078 |
| s3e35 | Depth and compute controls | 0.417 | −0.078 |
| s3e42 | Training schedules | 0.289 | −0.077 |
| s3e48 | Alternative feedback paths | 0.289 | −0.077 |
| s3e50 | Alternative feedback paths | 0.289 | −0.072 |
| s3e41 | Training schedules | 0.289 | −0.063 |
| s3e34 | Depth and compute controls | 0.545 | −0.062 |
| s3e49 | Alternative feedback paths | 0.289 | −0.048 |
| s3e33 | Depth and compute controls | 0.289 | 0 |
Table of values
| Run | Set | s / update | Δ at 30k |
|---|---|---|---|
| s3e2 | 16-layer foundations | 2.49 | −0.196 |
| s3e3 | 16-layer foundations | 2.51 | −0.172 |
| s3e9 | 16-layer foundations | 2.51 | −0.131 |
| s3e1 | 16-layer foundations | 2.52 | −0.128 |
| s3e4 | 16-layer foundations | 2.51 | −0.094 |
| s3e36 | Bank width | 5.39 | −0.084 |
| s3e37 | Bank width | 5.29 | −0.084 |
| s3e31 | Bank width | 5.87 | −0.083 |
| s3e38 | Bank width | 5.18 | −0.080 |
| s3e32 | Bank width | 6.73 | −0.078 |
| s3e35 | Depth and compute controls | 1.83 | −0.078 |
| s3e42 | Training schedules | 3.91 | −0.077 |
| s3e48 | Alternative feedback paths | 4.44 | −0.077 |
| s3e50 | Alternative feedback paths | 4.67 | −0.072 |
| s3e41 | Training schedules | 3.43 | −0.063 |
| s3e34 | Depth and compute controls | 2.46 | −0.062 |
| s3e49 | Alternative feedback paths | 3.77 | −0.048 |
| s3e33 | Depth and compute controls | 1.29 | 0 |
Decode cost is estimated from each recipe: two FLOPs per weight in every matrix a generated token passes through (attention, FFNs, latent projections and the LM head) plus attention over a 2,048-token cache. Latent runs decode with one decoder pass per token, so their repaid projections leave them at the plain eight-layer model's cost; s3e34 runs its eight layers twice. Prompt prefill, reader scoring and norms are left out.
Training cost is the dashboard's measured time per update. Latent runs pay for several parallel passes here, and kernels improved over the month, so compare within a set rather than across it.
- Alternative feedback paths
- Training schedules
- Bank width
- Depth and compute controls
- 16-layer foundations
- still running
1Alternative feedback paths#
What shape should the carried state take?
With s3e42 as the reference two-slot model, these runs change what crosses the token boundary while keeping its mixed three/four-pass schedule. s3e48 keeps far more state: sixteen memories, one per attention or FFN output, each updated by projecting out a low-rank direction generated from a single gather. s3e50 keeps s3e48's memories but lets every reader take two separate softmaxes, one over the current pass and one over the memories, mixed by learned per-channel gains. s3e49 goes the other way, towards the Full-bandwidth Transformer: a single gathered vector, gated by the next token, replaces the embedding as source 0.
s3e42
Two slots, three/four-pass schedule, full gradients.
- Δ vs s3e42
- baseline
- Validation
- 2.4583 at 75k
- Cost
- 3.91 s / update
- Recurrent − pass 4
- −0.0002
finished
s3e48
Per-output memories with projected-out directions.
- Δ vs s3e42
- +0.0010 at 40k
- Validation
- 2.6526 at 40k
- Cost
- 4.44 s / update
- Recurrent − pass 4
- −0.0003
paused at 40.5k
s3e50
s3e48 memories read through a separate softmax.
- Δ vs s3e42
- +0.0050 at 30k
- Validation
- 2.7006 at 30k
- Cost
- 4.67 s / update
- Recurrent − pass 4
- −0.0003
paused at 31.9k
s3e49
One gated feedback vector replaces the embedding.
- Δ vs s3e42
- +0.0327 at 60k
- Validation
- 2.5699 at 60k
- Cost
- 3.77 s / update
- Recurrent − pass 4
- +0.0000
running · 63.6k
- Residual stream
- Feedback route
- Token conditioning
The reference: a compactor gathers the whole bank of position (embedding and all sixteen sublayer outputs, plus incoming slots), and two Householder-reflected slots become sources for every reader at .
Each attention and FFN output at keeps its own memory slot at . One gather generates eight rank-128 latents that produce a direction per memory, and that direction is projected out of the previous memory value. The embedding and incoming memories are not carried.
One gather over the 17 sources at is projected and multiplied by a sigmoid gate computed from the next token's embedding. The product takes the embedding's place as source 0 on feedback passes; there are no banks. Input and output embeddings are tied in this run.
s3e48's memories, but every reader takes two softmaxes: one over the current pass's sources and one over the sixteen memories. Learned per-channel gains and , initialized to one, mix the two reads before the reader's RMSNorm.
s3e48 · low-rank memory update
s3e49 · gated feedback vector
s3e50 · split reads
- s3e48 16 low-rank memories
- s3e50 split reads
- s3e49 gated vector
- s3e42 baseline
Table of values
| Update | s3e48 | s3e50 | s3e49 |
|---|---|---|---|
| 5k | −0.001 | +0.009 | +0.028 |
| 10k | −0.001 | +0.008 | +0.028 |
| 15k | −0.001 | +0.006 | +0.030 |
| 20k | −0.003 | +0.005 | +0.028 |
| 25k | +0.000 | +0.004 | +0.028 |
| 30k | +0.000 | +0.005 | +0.029 |
| 35k | +0.001 | – | +0.030 |
| 40k | +0.001 | – | +0.030 |
| 45k | – | – | +0.030 |
| 50k | – | – | +0.031 |
| 55k | – | – | +0.032 |
| 60k | – | – | +0.033 |
2Training schedules#
How much parallel-pass compute does the two-slot model need?
The two-slot model (s3e37) learns the token recurrence through Jacobi passes: every position runs in parallel and reads the previous pass's bank one position to the left. Its mixed64 schedule is expensive: six microbatches run four supervised passes, and two run eight, supervising the last four. s3e42 trims this to three supervised passes, plus two microbatches of four passes with loss only on the fourth, and keeps full gradients through every pass. s3e41 tries the subset refinement from the Latent Recurrent Transformer: a bank-free pass over every token, then even positions and then odd positions are refined once each, reading the freshest bank and K/V cache.
s3e37
Two Householder slots, mixed64 schedule.
- Δ vs s3e37
- baseline
- Validation
- 2.5620 at 55k
- Cost
- 5.29 s / update
- Recurrent − pass 4
- −0.0007
paused at 55.1k
s3e42
Two slots, three/four-pass schedule, full gradients.
- Δ vs s3e37
- +0.0076 at 55k
- Validation
- 2.4583 at 75k
- Cost
- 3.91 s / update
- Recurrent − pass 4
- −0.0002
finished
s3e41
LRT-style even/odd refinement.
- Δ vs s3e37
- +0.0204 at 30k
- Validation
- 2.7093 at 30k
- Cost
- 3.43 s / update
- Recurrent − pass 4
- −0.0000
paused at 31.6k
- Supervised pass (weight shown)
- Run without gradients
Six microbatches supervise passes 1–4 with weights 0.2, 0.2, 0.3, 0.3. Two run passes 1–4 without gradients, detach the bank, then supervise passes 5–8 at 0.25 each.
Seven microbatches run one bank-free initial pass (weight 0.3), then refine even positions and then odd positions once each (weight 0.7 on the pooled refined loss). The eighth is ordinary 4-pass Jacobi.
Six microbatches supervise three passes at 0.3, 0.3, 0.4; two run four passes with all the loss on the fourth. Gradients cross every pass and bank boundary, with no damping or detachment.
Mixed Jacobi objective (s3e37, s3e42)
Interleaved objective (s3e41), seven of eight microbatches
- s3e42 2 slots, mixed34
- s3e41 interleaved
- s3e37 baseline
Table of values
| Update | s3e42 | s3e41 |
|---|---|---|
| 5k | +0.000 | +0.011 |
| 10k | +0.003 | +0.017 |
| 15k | +0.005 | +0.018 |
| 20k | +0.007 | +0.018 |
| 25k | +0.007 | +0.019 |
| 30k | +0.007 | +0.020 |
| 35k | +0.006 | – |
| 40k | +0.007 | – |
| 45k | +0.008 | – |
| 50k | +0.007 | – |
| 55k | +0.008 | – |
3Bank width#
How many slots should cross each token boundary?
These five runs share one recipe and change only the number of slots the compactor writes between tokens: one, two, four, eight or sixteen. Each slot is a pairwise-softmax gather over the previous token's whole bank, reflected by a token-conditioned Householder transform (the s3e42 section of the plan draws one slot in detail). Every slot adds a projection, repaid by narrowing the lowest FFNs so parameter counts stay matched. All five beat the plain eight-layer model by about 0.08 nats at 30k (see the overview), so the chart measures them against the two-slot run, s3e37, the width later kept for s3e42.
s3e37
Two Householder slots, mixed64 schedule.
- Δ vs s3e37
- baseline
- Validation
- 2.5620 at 55k
- Cost
- 5.29 s / update
- Recurrent − pass 4
- −0.0007
paused at 55.1k
s3e38
One Householder slot, mixed64.
- Δ vs s3e37
- +0.0037 at 40k
- Validation
- 2.6478 at 40k
- Cost
- 5.18 s / update
- Recurrent − pass 4
- −0.0006
paused at 43.5k
s3e36
Four Householder slots, mixed64.
- Δ vs s3e37
- +0.0006 at 55k
- Validation
- 2.5298 at 60k
- Cost
- 5.39 s / update
- Recurrent − pass 4
- −0.0007
paused at 60.3k
s3e31
Eight Householder slots, mixed64.
- Δ vs s3e37
- +0.0037 at 55k
- Validation
- 2.4561 at 75k
- Cost
- 5.87 s / update
- Recurrent − pass 4
- −0.0009
paused at 76.1k
s3e32
Sixteen Householder slots, mixed64.
- Δ vs s3e37
- +0.0051 at 35k
- Validation
- 2.6732 at 35k
- Cost
- 6.73 s / update
- Recurrent − pass 4
- −0.0010
paused at 38.0k
- Residual stream
- Slots
- Reads the slots
s3e38: a single slot. Its one projection is repaid by trimming the first FFN to 2,816 hidden units.
s3e37: two slots, the width later used by s3e42. The first FFN drops to 2,304.
s3e36: four slots; the first two FFNs shrink to 2,048 and 2,816.
s3e31: eight slots; the first three FFNs shrink. This run reached 76,100 of 76,294 updates.
s3e32: sixteen slots; five FFNs at 2,048 and one at 2,816. Paused at 38,000 updates.
Compactor, slot s of S
Parameter repayment
- s3e38 1 slot
- s3e36 4 slots
- s3e31 8 slots
- s3e32 16 slots
- s3e37 baseline
Table of values
| Update | s3e38 | s3e36 | s3e31 | s3e32 |
|---|---|---|---|---|
| 5k | −0.001 | −0.005 | −0.004 | +0.000 |
| 10k | +0.002 | −0.003 | −0.002 | +0.002 |
| 15k | +0.003 | −0.002 | −0.002 | +0.003 |
| 20k | +0.003 | −0.000 | −0.001 | +0.004 |
| 25k | +0.004 | −0.001 | −0.001 | +0.005 |
| 30k | +0.004 | −0.000 | +0.001 | +0.005 |
| 35k | +0.004 | −0.001 | +0.001 | +0.005 |
| 40k | +0.004 | −0.001 | +0.002 | – |
| 45k | – | +0.001 | +0.003 | – |
| 50k | – | −0.000 | +0.003 | – |
| 55k | – | +0.001 | +0.004 | – |
4Depth and compute controls#
What do extra layers, or reused layers, buy without any latent state?
The latent runs are eight-layer models that run their stack several times, so they need plain references at matched depth and matched compute. s3e33 is the eight-layer model itself. s3e34 runs the same eight layers twice, each of its 33 readers with its own queries and biases and the second loop reading every earlier output. s3e35 and s3e1 add depth instead: twelve and sixteen layers. All four use the same Attention Residuals reader.
s3e33
Plain eight-layer model, no latent state.
- Δ vs s3e33
- baseline
- Validation
- 2.5308 at 75k
- Cost
- 1.29 s / update
finished
s3e34
The same eight layers run twice.
- Δ vs s3e33
- −0.0675 at 75k
- Validation
- 2.4633 at 75k
- Cost
- 2.46 s / update
finished
s3e35
Plain twelve-layer model.
- Δ vs s3e33
- −0.0954 at 75k
- Validation
- 2.4354 at 75k
- Cost
- 1.83 s / update
finished
s3e1
The 16-layer reference.
- Δ vs s3e33
- −0.1549 at 75k
- Validation
- 2.3759 at 75k
- Cost
- 2.52 s / update
finished
- Residual stream
- Shared weights, second loop
Attention Residuals reader (every run)
s3e34 · loop 8 × 2
- s3e34 8 layers × 2
- s3e35 12 layers
- s3e1 16 layers, LR 5e-3
- s3e33 baseline
Table of values
| Update | s3e34 | s3e35 | s3e1 |
|---|---|---|---|
| 5k | −0.057 | −0.071 | −0.119 |
| 10k | −0.058 | −0.074 | −0.122 |
| 15k | −0.057 | −0.075 | −0.122 |
| 20k | −0.059 | −0.076 | −0.125 |
| 25k | −0.060 | −0.079 | −0.127 |
| 30k | −0.062 | −0.078 | −0.128 |
| 35k | −0.061 | −0.080 | −0.130 |
| 40k | −0.062 | −0.081 | −0.132 |
| 45k | −0.064 | −0.083 | −0.135 |
| 50k | −0.064 | −0.084 | −0.137 |
| 55k | −0.065 | −0.087 | −0.140 |
| 60k | −0.065 | −0.089 | −0.144 |
| 65k | −0.066 | −0.092 | −0.149 |
| 70k | −0.067 | −0.094 | −0.153 |
| 75k | −0.068 | −0.095 | −0.155 |
516-layer foundations#
Fixing the learning rate and the attention values
Setting 3 started with a sixteen-layer Attention Residuals model and a learning-rate sweep around 5 × 10⁻³ (s3e1–s3e4), followed by one architectural probe: s3e9 adds a learned per-head RMSNorm to the attention values after their short convolution, alongside the existing query and key norms.
s3e1
The 16-layer reference.
- Δ vs s3e1
- baseline
- Validation
- 2.3759 at 75k
- Cost
- 2.52 s / update
finished
s3e2
Learning rate 2 × 10⁻³.
- Δ vs s3e1
- +0.0037 at 75k
- Validation
- 2.3796 at 75k
- Cost
- 2.49 s / update
finished
s3e3
Learning rate 3 × 10⁻³.
- Δ vs s3e1
- −0.0005 at 75k
- Validation
- 2.3754 at 75k
- Cost
- 2.51 s / update
finished
s3e4
Learning rate 7 × 10⁻³.
- Δ vs s3e1
- +0.0019 at 75k
- Validation
- 2.3778 at 75k
- Cost
- 2.51 s / update
finished
s3e9
Per-head RMSNorm on attention values.
- Δ vs s3e1
- −0.0030 at 65k
- Validation
- 2.4266 at 65k
- Cost
- 2.51 s / update
paused at 65.2k
s3e9 · value normalization
- s3e2 LR 2e-3
- s3e3 LR 3e-3
- s3e4 LR 7e-3
- s3e9 value RMSNorm
- s3e1 baseline
Table of values
| Update | s3e2 | s3e3 | s3e4 | s3e9 |
|---|---|---|---|---|
| 5k | −0.041 | −0.029 | +0.026 | −0.003 |
| 10k | −0.059 | −0.039 | +0.033 | −0.003 |
| 15k | −0.067 | −0.044 | +0.034 | −0.004 |
| 20k | −0.069 | −0.043 | +0.036 | −0.003 |
| 25k | −0.070 | −0.044 | +0.035 | −0.002 |
| 30k | −0.068 | −0.044 | +0.035 | −0.003 |
| 35k | −0.067 | −0.042 | +0.034 | −0.003 |
| 40k | −0.062 | −0.039 | +0.032 | −0.002 |
| 45k | −0.058 | −0.037 | +0.030 | −0.003 |
| 50k | −0.052 | −0.034 | +0.026 | −0.003 |
| 55k | −0.045 | −0.030 | +0.023 | −0.003 |
| 60k | −0.034 | −0.023 | +0.019 | −0.003 |
| 65k | −0.021 | −0.016 | +0.014 | −0.003 |
| 70k | −0.006 | −0.007 | +0.007 | – |
| 75k | +0.004 | −0.000 | +0.002 | – |
- at 30k updates
- at the last checkpoint
Table of values
| Run | Setting | Δ at 30k | Δ at end |
|---|---|---|---|
| s3e2 | LR 2e-3 | −0.068 | +0.004 |
| s3e3 | LR 3e-3 | −0.044 | −0.000 |
| s3e4 | LR 7e-3 | +0.035 | +0.002 |
| s3e9 | value RMSNorm | −0.003 | −0.003 |