Buckets:
Can diffusion steps replace token thinking in a decision model?
Think-then-Decide, 6 November 2026. One A100 80GB, ~8 hours. Code, logs, predictions and checkpoints are in the
bucket Mercity/Desicion-Model-Custom under think-decide/. Lab notebook: NOTEBOOK.md; every change to the plan:
DEVIATIONS.md.
TL;DR
- No latent "thinking" design worked. Six designs that iterate on latent vectors were tried, from the original plan's thought slots to a separate latent reasoner read by a decision head. All six score the same with 32 steps as with 1 step (gains between -0.04 and +0.24 points, every 95% CI includes 0).
- The one design that gains from extra passes is answer-level diffusion (MQ). All of a task's sub-questions go on one canvas, and the model commits its most confident answer each pass, so earlier answers help later ones. Result: +0.48 points [+0.21, +0.76] on the same questions, rising to +1.5 on the questions answered last. The ceiling is +1.75 (all other answers given), so MQ captures about 27% of it.
- The gains are small next to token thinking. In the bucket's previous project, the 4B model gained about 48 points on the same procedural tasks by writing reasoning tokens. Here, iteration buys about half a point.
- Diagnosis. Iteration only helps when the positions being refined are supervised (answers or sub-answers). Unsupervised latent vectors get ignored, whether they sit inside the backbone, in a separate latent reasoner, or behind a gate. Both literature reviews reached the same conclusion.
Figure 1. Accuracy gain from extra passes vs one pass, same questions, paired bootstrap over items (95% CI). The two Core rows use Core's reasoning suites; all other rows use the procedural testbed. *MQ-soft's gain is relative to its own one-pass accuracy, which is 1.5 points below MQ's; in absolute terms MQ is better (see section 3.3).
1. Question and setup
The user's question: can the token-by-token thinking of an LLM be replaced by diffusion steps? The test was a small diffusion decision model doing a few extra denoising passes "in its head" before deciding, compared with deciding in one pass.
- Backbone. S1 (
SEU-ZZH/Shared-YesNo-Qwen3-0.6B-S1, from jev-dllm) is Qwen3-0.6B converted to a masked diffusion LM with bidirectional attention, fine-tuned to make decisions in one pass. Each option gets a [MASK]; its score is logit(Yes) - logit(No) at that mask, followed by a softmax over the options. - Benchmarks.
- Core: jev-dllm's 17-suite benchmark, 6,744 decisions. All items were scored; S1's own protocol drops 221 long ContractNLI items.
- Procedural testbed:
tasksource/procedural-typed-decisions, 18 multi-step task families × 5 difficulty levels. Not in S1's training data. Token thinking helped the previous project's 4B model by about 48 points on this distribution.
- Statistics. Every gain is measured within one model (K passes vs 1 pass) on the same items, with a paired bootstrap (10,000 resamples) stratified by suite or task family.
2. Everything that was run
| ID | What | Data | Result |
|---|---|---|---|
| E0 | Harness parity: jev-dllm's evaluator and ours, on S1 | Core | reproduces published S1; group scores equal |
| E1 | S1 + decision head, 1 epoch (control) | S1's 40k train | Core reasoning 64.99 (S1 64.07) |
| E2 | Plan: 32 thought slots, gated latent loop, K in {1,2,4,8} | 40k | flat (+0.08 [-0.27, +0.43]); gate stuck at 0.002 |
| E3 | E2 + CODI-style distillation from S1 reading notes | 40k + 5.4k teacher targets | flat (-0.04 [-0.58, +0.59]) |
| P0 | S1 zero-shot | procedural | 42.4% |
| P1 | S1 + head, 1 question per state, K=1 | 32k procedural | 88.7% |
| P2o | E2's loop, gate opened at 0.014 | 32k | killed at step 520: 4 passes = 1 pass on dev (83.97 = 83.97) |
| P2s | Soft-token feedback into the slots, no gate | 32k | killed at step 310: 4 passes = 1 pass on dev (71.80 = 71.80) |
| MQ | All sub-questions on one canvas; diffusion over answers | 32k states (105k questions) | sequential +0.48 [+0.21, +0.76]; 1 pass 90.7 on target questions |
| MQ-soft | MQ + soft-belief self-conditioning | 32k states | multi-pass +0.8 over its own 1 pass, but below MQ overall |
| LDR A-D | Separate latent reasoner (32 vectors, K steps) read by a decision head | 32k procedural | flat in all four variants |
Not run, by decision: E5 (notes written as tokens by diffusion; dropped at the user's request), general-mix E2o/E2s (superseded), E4 latency (not measured), and the full-data MQ run (the user called time).
3. Results
3.1 The pre-registered plan on Core (E0-E3)
| Model | K | Reasoning | Lookup | Other | Core17 | Core14 |
|---|---|---|---|---|---|---|
| S1 | 1 | 64.07 | 73.96 | 61.49 | 66.07 | 64.05 |
| E1 (head, no thinking) | 1 | 64.99 | 74.10 | 60.50 | 66.08 | 64.15 |
| E2 (latent loop) | 1 / 8 | 64.67 / 64.76 | 74.45 / 74.35 | 59.82 / 59.94 | 65.83 / 65.88 | 63.93 / 63.97 |
| E3 (+ distillation) | 1 / 8 | 64.51 / 64.47 | 75.31 / 75.34 | 59.56 / 59.63 | 65.94 / 65.96 | 64.02 / 64.01 |
Core17 is the equal-weight mean accuracy over all 17 suites. Core14 drops three suites that S1 saw in training.
| Pre-registered hypothesis | Test | Result [95% CI] | Verdict |
|---|---|---|---|
| H1: accuracy rises with K | E2, K=8 vs K=1, reasoning | +0.08 [-0.27, +0.43] | not supported |
| H2: the gain comes from thinking, not the head or extra epoch | E2 (best K) vs E1 | -0.31 [-1.51, +0.91] | not supported |
| H3: a teacher target helps | E3 (best K) vs E2 (best K) | -0.59 [-1.84, +0.60] | not supported |
Why it failed: the gate deadlocks. The feedback is x = e_mask + g·W·LN(h), with g starting at 0.
- W's gradient is proportional to g, so W cannot learn while the gate is shut.
- g's gradient points along W·LN(h): a last-layer state pushed into input-embedding space, which is meaningless until W has learned something.
So neither can move first. The gate ended at 0.002 in E2 and 0.001 in E3, while about 0.014 is needed for the feedback to match the mask embedding's size. Opening the gate (P2o) or removing it (P2s) did not help either: the model left the channel unused.
Why E3's teacher could not help. Frozen S1 barely uses notes, even notes written by Qwen3.5-9B with the gold answer in view: 93.6% accuracy with a note vs 93.7% without, over 9,370 training items. E3's distillation target was therefore close to S1's own states.
3.2 The procedural testbed (P0-P2)
| Model | All | L0 (easy) | L1 | L2 | L3 | L4 (hard) |
|---|---|---|---|---|---|---|
| P0: S1 zero-shot | 42.37 | 53.25 | 47.52 | 40.65 | 36.21 | 34.21 |
| P1: trained, 1 question, 1 pass | 88.68 | 96.28 | 91.93 | 87.94 | 84.01 | 83.20 |
Levels are difficulty: level 0 is short and few-step, level 4 long and many-step. One epoch of training on 32k items (9% of the dataset) takes S1 from 42% to 89%. The errors left over are concentrated at levels 3-4.
3.3 Answer diffusion (MQ): the only positive result
Design. Every question of a state goes on one canvas, in S1's own format, each with its answer masks:
State: ...
Question 1: Which policy governs? P1: [MASK] P2: [MASK]
Question 2: Is access allowed? Answer: [MASK]
Question 3: How risky is it? level 0: [MASK] level 1: [MASK] level 2: [MASK]
- Training is masked diffusion over answers: each question's gold Yes/No tokens are revealed with probability 1-t (t ~ U(0,1)), and the loss is computed on the hidden ones.
- Inference has three modes, all on the same model and questions:
- parallel: all answers in 1 pass;
- sequential: each pass commits the most confident open question, then re-reads;
- oracle: all other answers are given correctly.
- There are no new parameters and no gate. What carries information between steps is committed answer tokens, which are supervised.
| MQ readout (11,582 test questions) | All | Target q | L3 | L4 | vs parallel [95% CI] |
|---|---|---|---|---|---|
| parallel (1 pass) | 88.45 | 90.67 | 83.07 | 82.75 | - |
| sequential (1 answer per pass) | 88.98 | 91.10 | 83.82 | 83.25 | +0.48 [+0.21, +0.76] |
| oracle (others given) | 90.84 | 92.28 | 87.29 | 86.81 | +1.75 [+1.45, +2.06] |
- The gain grows with commit order. Questions answered later have more committed answers to use. Against parallel they gain +0.6 at rank 1, +0.8 at rank 2 and +1.5 at rank 3.
- The clearest gains come from families whose questions chain explicitly. Policy applicability goes 97.5 to 99.0 and belief tracking 98.8 to 100.0. The largest untapped headroom is record eligibility: 78.1 sequential vs 87.5 oracle.
- Training on all the questions helps one-pass accuracy too. On the same target questions MQ scores 90.67 in one pass vs P1's 88.68.
Does accuracy grow with the number of steps? Yes, up to about 3, then it plateaus. These are the same questions with only the step budget changed; each pass commits ceil(open/passes left) answers.
MQ-soft (continuous diffusion). Nothing is committed: each pass feeds back soft Yes/No beliefs as blended embeddings.
- Continuous soft passes gain about as much as discrete commits, relative to the same model's one-pass score: +0.81 [+0.50, +1.14] for soft passes vs +0.80 for commits.
- But soft self-conditioning training lowered one-pass accuracy by 1.5 points. MQ-soft's best result (87.86 on all questions) therefore stays below plain MQ's (88.98).
- My automatic rule for the large run compared gains instead of absolute accuracy, so it picked MQ-soft. That run was stopped once this was noticed.
3.4 Latent-vector reasoners (LDR): the user's target architecture
Design. The backbone runs once and its token states are cached. A small weight-tied reasoner (38M parameters: self-attention over 32 latents and the answer-belief slots, cross-attention to the cached states, MLP) refines the latents for K steps. A decision head then reads them and adds a correction to the option states before the Yes/No readout.
- Zero-initialised output, so K=0 equals the encoder alone.
- Random depth K ~ U{1..12}, truncated backprop through the last 3 steps, EMA weights.
- Noise in the initial latents, averaged over 4 seeds at evaluation.
- Recipe from TRM, HRM and Huginn, per the third literature review.
| Variant | K=0 | K=1 | K=8 | K=32 | K=32 - K=0 [95% CI] |
|---|---|---|---|---|---|
| A: frozen P1 encoder | 88.68 | 88.71 | 88.71 | 88.71 | +0.12 [-0.26, +0.55] |
| B: frozen MQ encoder, all sub-questions | 88.03 | 88.00 | 87.98 | 87.98 | -0.01 [-0.19, +0.18] |
| C: encoder trained jointly (from S1) | 85.05 | 84.96 | 85.05 | 85.05 | 0.00 [-0.39, +0.39] |
| D: frozen raw S1 (huge headroom) | 42.43 | 42.62 | 42.49 | 42.46 | +0.24 [-0.27, +0.80] |
D is the telling case. With 46 points of headroom on the table, the latent reasoner learned essentially nothing in
550 steps: its gradient norm stayed around 0.01-0.3 and the loss did not fall. In C, joint training also left the
encoder worse than P1 (85.1 vs 88.7). At this model size and training budget (500 steps per run), latent iteration
did not learn any useful computation.
4. Diagnosis: why latent thinking did not work here
- Unsupervised latents get ignored. This held in every placement tried (inside the backbone, behind a gate, without a gate, in a separate reasoner). The literature agrees: Coconut fails without its curriculum, filler tokens need dense supervision, latents collapse in SIM-CoT, and He, Welleck and Fried (2602.03769) find that extra unsupervised positions hurt.
- One pass already solves most of each decision. P1 gets 89% in one pass. The remaining errors need information that a re-read of the same states cannot create; the supervised sub-answers can (MQ's oracle, +1.75).
- Retrofitting recurrence takes far more training than we had. Published retrofits use billions of tokens (McLeish et al. 2511.07384: ~50B; ETD: 50B; LoopUS: 3B). Each run here saw ~10-30M. Loopholing reports that fine-tuning-only retrofits failed.
- The feedback space matters. Last-layer states fed back into the input deadlock under a zero gate. Token-space feedback (soft beliefs, committed answers) works immediately; it is what MQ and MQ-soft use.
5. Cost of the one thing that worked
- MQ's sequential mode costs one backbone pass per committed question: n passes for n questions (3.25 on average), because a bidirectional model cannot cache earlier work. On a 700-token state with 3 questions, that is about 2,100 token-passes of a 0.6B model in 3 sequential rounds.
- Token thinking in the previous project's 4B model wrote about 700-1,000 reasoning tokens per question, in as many sequential decode rounds of a model about 7x larger.
- So MQ is far cheaper per decision but buys about +0.5 points, against about +48 points for token thinking on the same task family.
- The latent reasoners' steps are cheap (32 latents through two small blocks), but they bought nothing.
- Wall-clock latency was not measured (E4 not run).
6. Caveats
- Single seed per arm. Uncertainty comes from bootstrapping over test items only.
- The plan's decision head was nearly inert. It added its correction to the pre-norm option state, which has norm ~1,700 vs ~46 after the norm. E1-E3's differences from S1 therefore come from the extra backbone epoch, not the head. Found at 20:00; the latent reasoners use a post-norm head.
- Harness parity. Group scores match jev-dllm's evaluator exactly; 1.4% of argmaxes still differ (bf16 numerics), the same for every arm.
- P2o and P2s were stopped early (steps 520 and 310 of 1,000), with dev K=4 = K=1 at every check.
- The large MQ run was never completed. A 216k-state MQ-soft run was stopped at 18% (wrong pick rule, section 3.3); the full-data MQ run was not started.
- E3's notes were generated with the gold answer visible, then leak-filtered (93.7% kept). Frozen S1 could not use them, which limits what E3 could show.
7. What I would do next
- Scale MQ to the full 360k states (about 4 h on one A100). This answers whether the sequential gain grows (better use of committed answers) or shrinks (one-pass accuracy catches up). Train-time noise on the answer channel and loss-weighting hard questions (MGDM-style) are cheap additions.
- Give the latent reasoner a fair budget before ruling it out. Cache the frozen encoder states once, then train the reasoner for 30+ epochs at a higher learning rate. That takes seconds per epoch instead of minutes. If K still does not matter, call latent iteration a no-go at 0.6B.
- Supervise the latents. Decode each latent step to a sub-answer or a short reasoning step (SIM-CoT, TRM's y channel). This is where all of the positive evidence points.
8. Engineering notes
- Speed. torch.compile on the decoder layers gave 1.6x. A padding-aware micro-batch split cut padded compute from 1.3-3.0x to 1.17x of real tokens. fp32 master weights with bf16 autocast (S1's own trainer kept pure bf16 weights, which loses small updates).
- Memory. Training peaked at 74.9 GiB of 80 (94%), with an out-of-memory fallback that restores gradients and retries with checkpointing; 0 retries were needed.
- No truncation anywhere. Every Core item was scored. Procedural training used max length 8,192, so no item was dropped; a 2,048 cap would have dropped 2.5%, nearly all level 3-4. Note generation flagged capped outputs (none occurred) rather than cutting them.
- Data. Core 6,744 items. S1's training set: 40k. Procedural: 78.5k prepared (32k used per arm), 1,751 dev, 3,484 test states (11,582 questions). MQ used the 32k states' 105k questions; the dataset has 360k training states.
9. Files
src/:common.py(renderer, loaders),model.py(ThinkDecide),train.py,eval.py,distill.py,teacher_cache.py,gen_notes.py,prep_procedural.py,mq.py(answer diffusion),ldr.py/ldr2.py(latent reasoners),bootstrap.py,analyze*.pyruns/<arm>/: config, training log, predictions, report, weights. bf16 checkpoints:e1,e2,e3,p1,mq,mqsoft;ldr2_c/encoder.safetensorsand thereasoner_ema.ptfiles.results/:results.md(Core),results_proc.md,results_mq.md,summary_stats.json, figureslogs/: every training and eval log;NOTEBOOK.md,DEVIATIONS.md,TODO.md
Xet Storage Details
- Size:
- 16.8 kB
- Xet hash:
- 17acaeecd75ae12e06ef915012b3a8f90c81e3fa2ac952251ffc50f5d7110fa8
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.





