integrate LCB dissociation (untrained merge wins far-transfer, p=0.001 vs trained loop), capability panel (no MC damage), L23 exit completes sweep

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Nils
2026-07-14 19:44:07 +02:00
co-authored by Claude Fable 5
parent caef95f10f
commit 1d4cffd6ad
11 changed files with 6938 additions and 12 deletions
+56 -11
View File
@@ -34,8 +34,12 @@ degrades them), width rivals depth (trained pause registers reach 36.4%),
and verifier-assisted (oracle) sampling wins overall accuracy at matched
compute — though the *deployable* selector loses that edge entirely. What
survives is precise: the implant owns exactly the plan-dependent slice at
zero visible tokens and zero decode cost, transfers with the substrate
rather than the task, and its placement is dictated by the lens. At 12B a
zero visible tokens and zero decode cost, and its placement is dictated by
the lens. Transfer dissociates by distance: near-distribution the trained
and untrained implants tie (HumanEval); far from it (LiveCodeBench) the
*untrained* merge significantly helps while the trained content
significantly hurts — the learned content is task-local, the recurrence
substrate is general. At 12B a
constant merge coefficient destroys the substrate; a state-dependent
coefficient (3.8K parameters) restores MBPP but not Blocksworld or GSM8K —
the anchor coefficient is the stability dial that unifies this work with
@@ -174,8 +178,9 @@ hard 43.6%, overall 53.6%. L13: hard 17.9%, overall 34.4%. L9L12: overall
verified bit-identical) — the 12B model has no shared-KV layers, making it
the unconfounded replication. Exit sweep at fixed entrance (L27/30/32/34):
hard 39.346.4%, within seed spread. The lens boundary is necessary; the
exit is a free parameter. (The L23-exit arm died in training; a rerun is in
progress — the four completed exits bracket it. [L23 PENDING])
exit is a free parameter — the completed five-point exit sweep
(L23/27/30/32/34) spans hard 39.346.4% with L23 at the top (46.4% at k=2),
all within seed spread.
### 3.2 The attribution ladder
@@ -297,7 +302,28 @@ significant** (paired McNemar at k=2, 9 vs 7 discordant, p=0.80). What
transfers significantly is the *merge perturbation itself*, not the
MBPP-trained content — the cleanest evidence that off-distribution value is
substrate-shaped rather than task-memorized. (The transferred pause adapter
reaches 66.5%, hard 38.9%, consistent with the same reading.) **Rust/MultiPL-E** (Python-trained, different
reaches 66.5%, hard 38.9%, consistent with the same reading.)
**LiveCodeBench sharpens this into a dissociation** (150 newest stdin
problems, Nov 2024Apr 2025, execution-verified; no LCB training anywhere
in the pipeline; base 18.7%):
| arm (MBPP-trained where trained) | overall | hard (n=25) | vs base, paired |
|---|---|---|---|
| **untrained merge, k=4** | **24.0%** | **36.0%** | **+**, p=0.039 |
| trained loop, k=4 | 15.3% | 8.0% | , p=0.23 |
| distill FF, k=1 | 12.7% | 16.0% | ****, p=0.049 |
Far from distribution, the *trained content is a liability* (distill
significantly hurts; untrained-vs-trained-loop is 141 discordant,
p=0.001) while the *untrained anchored recurrence significantly helps*
the training-free regime of Lys et al. is the right choice off-distribution,
and the amortized-content reading of §3.3 predicts exactly this: what the
adapter learned is MBPP-shaped plan content, valuable where plans look like
MBPP plans and harmful where they don't. Transfer ordering by distance:
HumanEval (near) — trained ≈ untrained; Rust (mid) — trained helps the hard
bucket; LCB (far) — untrained wins outright. Caveats: single seed per arm,
hard n=25, one benchmark at the far end. **Rust/MultiPL-E** (Python-trained, different
language, compile-run-verified): hard 8.0%→24.0% (p=0.125 at n=25 —
directionally consistent, underpowered). **Blocksworld** MBPP-transfer:
hard 0→14.3% (task-trained: 43%). Content transfers where the substrate's
@@ -316,9 +342,22 @@ removing the easy-item perturbation tax. k=0 is the exact base model by
construction — the implant is removable at token granularity.
**General-capability panel** (ARC-Challenge, WinoGrande, HellaSwag, MMLU;
length-normalized MC scoring with the loop applied to the context span) is
running on the Spark; results will quantify what k>0 does to off-task
abilities. [PENDING — fill on completion.]
800 items each, length-normalized MC likelihood via the chat template, loop
applied to the context span). The safety answer is clean — **k>0 does not
damage general abilities**:
| arm | ARC-C | WinoGrande | HellaSwag | MMLU |
|---|---|---|---|---|
| base (k=0) | 36.0 | 55.9 | 52.3 | 30.1 |
| loop k=2 (MBPP adapter) | 36.1 | 55.3 | 49.6 | 31.3 |
| distill FF (MBPP) | 41.8 | 56.6 | 57.0 | 31.8 |
The loop arm is flat within noise (largest move 2.6 on HellaSwag,
unpaired n=800). The distill adapter *nominally improves* every benchmark
(+5.8 ARC, +4.8 HellaSwag) — consistent with §3.7's finding that these
implants carry a generically useful perturbation component, though
MC-likelihood scoring and generation quality are different regimes (see
the LCB result below before reading this as free capability).
### 3.9 Negative results with content
@@ -374,9 +413,15 @@ are small (n=55/38/25); within-ladder orderings are not individually
significant, and only the pooled hard effect and the HumanEval overall gain
survive multiple-comparison scrutiny. Bucket membership derives from greedy
labeling runs (consensus-k0 robustness check moves numbers <2 points, but
both checks share the base model; an independent difficulty proxy is an
open external check). A third architecture family was not run;
LiveCodeBench (contamination-safe) was not run; rung-2 was not run at 12B. The easy-item perturbation tax persists wherever the
both checks share the base model; an independent 12B-relabeling proxy is
running). A third architecture family was not run; rung-2 was not run at
12B. LiveCodeBench: single seed per arm, hard n=25, stdin-judged problems
only, and its newest shard (Apr 2025) is *newer than MBPP by years* but
not provably past the base model's undisclosed training cutoff — we claim
recency, not proven non-contamination. The capability panel is
MC-likelihood, not generation; its "no damage" answer does not extend to
generation quality off-distribution (LCB shows trained arms *do* hurt
there). The easy-item perturbation tax persists wherever the
gate's precision fails. MBPP/GSM8K likely overlap pretraining data; both
arms share contamination, and memorized items land in the easy bucket, but
bucket composition is contamination-sensitive. The capability panel
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+8
View File
@@ -0,0 +1,8 @@
{
"tag": "base_k0",
"k": 0,
"arc": 0.36,
"winogrande": 0.55875,
"hellaswag": 0.5225,
"mmlu": 0.30125
}
+8
View File
@@ -0,0 +1,8 @@
{
"tag": "distill_ff",
"k": 1,
"arc": 0.4175,
"winogrande": 0.56625,
"hellaswag": 0.57,
"mmlu": 0.3175
}
+8
View File
@@ -0,0 +1,8 @@
{
"tag": "loop_k2",
"k": 2,
"arc": 0.36125,
"winogrande": 0.5525,
"hellaswag": 0.49625,
"mmlu": 0.3125
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 43 KiB

+152
View File
@@ -0,0 +1,152 @@
{
"abc382_a": true,
"abc382_b": true,
"abc382_c": false,
"abc382_d": true,
"abc382_f": false,
"abc382_g": false,
"abc383_a": true,
"abc383_b": true,
"abc383_c": false,
"abc383_d": true,
"abc383_e": false,
"abc384_a": true,
"abc384_b": true,
"abc384_c": true,
"abc384_d": false,
"abc384_e": false,
"abc384_f": false,
"abc384_g": false,
"abc385_a": true,
"abc385_b": true,
"abc385_c": false,
"abc385_d": false,
"abc385_e": false,
"abc385_f": false,
"abc386_a": false,
"abc386_b": true,
"abc386_c": false,
"abc386_d": false,
"abc386_e": false,
"abc386_f": false,
"abc387_a": true,
"abc387_b": true,
"abc387_c": false,
"abc387_f": false,
"abc388_a": true,
"abc388_b": true,
"abc388_c": false,
"abc388_d": false,
"abc388_e": false,
"abc388_f": false,
"abc388_g": false,
"abc389_a": true,
"abc389_b": true,
"abc389_d": false,
"abc389_e": false,
"abc389_f": false,
"abc389_g": false,
"abc390_a": true,
"abc390_b": true,
"abc390_c": false,
"abc390_d": false,
"abc390_e": false,
"abc390_f": false,
"abc390_g": false,
"abc391_a": true,
"abc391_b": true,
"abc391_d": false,
"abc391_e": false,
"abc391_f": false,
"abc391_g": false,
"abc392_a": true,
"abc392_b": true,
"abc392_c": false,
"abc392_d": false,
"abc392_f": true,
"abc392_g": false,
"abc393_a": true,
"abc393_b": true,
"abc393_d": false,
"abc393_e": true,
"abc393_f": false,
"abc394_a": true,
"abc394_b": true,
"abc394_c": true,
"abc394_d": true,
"abc394_e": false,
"abc394_f": false,
"abc394_g": false,
"abc395_a": true,
"abc395_b": true,
"abc395_c": true,
"abc395_e": true,
"abc395_f": false,
"abc396_a": true,
"abc396_b": true,
"abc396_c": false,
"abc396_d": true,
"abc396_e": false,
"abc396_f": false,
"abc396_g": false,
"abc397_a": true,
"abc397_b": false,
"abc397_c": true,
"abc397_d": false,
"abc397_e": false,
"abc397_f": false,
"abc397_g": false,
"abc398_a": true,
"abc398_b": false,
"abc398_c": true,
"abc398_d": false,
"abc398_f": true,
"abc398_g": false,
"abc399_a": true,
"abc399_b": true,
"abc399_c": true,
"abc399_d": false,
"abc399_e": false,
"abc399_f": false,
"abc400_a": true,
"abc400_b": true,
"abc400_c": false,
"abc400_d": false,
"abc400_e": false,
"abc400_g": false,
"arc188_a": false,
"arc188_b": false,
"arc188_c": false,
"arc188_d": false,
"arc189_a": false,
"arc189_b": false,
"arc189_c": false,
"arc189_d": false,
"arc190_a": false,
"arc190_c": false,
"arc190_d": false,
"arc191_a": false,
"arc191_c": false,
"arc191_d": true,
"arc192_a": false,
"arc192_b": false,
"arc192_d": false,
"arc192_e": false,
"arc193_a": false,
"arc193_b": false,
"arc193_d": false,
"arc194_a": false,
"arc194_b": false,
"arc194_c": false,
"arc194_d": false,
"arc194_e": false,
"arc195_a": false,
"arc195_b": false,
"arc195_c": false,
"arc195_d": false,
"arc195_e": false,
"arc196_a": false,
"arc196_b": false,
"arc196_c": false,
"arc196_d": false
}
+7 -1
View File
@@ -220,8 +220,14 @@ def fig_transfer():
("base", *ev(OUT / "eval_rust_py_transfer.json", 0)),
("loop k=4", *ev(OUT / "eval_rust_py_transfer.json", 4)),
]),
("LiveCodeBench (far)\nuntrained wins", [
("base", *he_hard("eval_lcb_untrained.json", 0)),
("untrained k=4", *he_hard("eval_lcb_untrained.json", 4)),
("loop k=4", *he_hard("eval_lcb_loop.json", 4)),
("distill", *he_hard("eval_lcb_distill.json", 1)),
]),
]
fig, axes = plt.subplots(1, 2, figsize=(7.6, 3.8))
fig, axes = plt.subplots(1, 3, figsize=(10.8, 3.8))
for ax, (title, arms) in zip(axes, groups):
style(ax)
x = range(len(arms))