diff options
| -rw-r--r-- | docs/campaign/CASCADE_ABLATION_PLAN.md | 14 | ||||
| -rw-r--r-- | ep_run/casc_eq_train.py | 9 |
2 files changed, 22 insertions, 1 deletions
diff --git a/docs/campaign/CASCADE_ABLATION_PLAN.md b/docs/campaign/CASCADE_ABLATION_PLAN.md index 503a321..e0e5cac 100644 --- a/docs/campaign/CASCADE_ABLATION_PLAN.md +++ b/docs/campaign/CASCADE_ABLATION_PLAN.md @@ -1932,3 +1932,17 @@ Matched 三口径(同窗 434-440k, n=61/臂): - **硬件含义(为 Dillavou 通话)**: 这就是"读出必须差分"的数字版 — 对比读数要直接测差(d), 不能减两个 大数((o+d)−o); 板上对应相关双采样/差分读出。基底加性地板设计律获得数字孪生实证。 - 1B 迁移: 逐层 disp_ratio(一次自由相可测)+基底地板 → 逐层安全裕度表, 零训练。 + +## RESULT 78 (2026-07-30): read_lin 梯度级验证成功 == fp64; 附属谱仪三发现; 修复入训练路径 +- **rlin 判决(fp32, C768 旗舰 ckpt, NB256)**: 上半 proj −0.006/+0.003/+0.003/+0.000/−0.000/+0.001, + 与 fp64 臂逐块吻合(rel 同降至 0.013-0.020)。**读出侧 (z−o) 舍入 = 全部病因**; 位移的传输通道 + (vjp 链的独立 d 张量)从来是满精度的 — 这也解释了为何 bf16-amp 与 fp32 泄漏相同(两者读出均 fp32)。 +- **附属谱仪(5 剖面)**: (1) 病灶前沿随训练下压 — C768 块6: 23%时净(ratio 5.2e-7)→57% −0.70(2.0e-7) + →91% −0.75(1.5e-7), 同块在自家比值穿线时转病; (2) seed 轴证律 — C512 s2 块7(3.8e-7)病 −0.43 而 + s1 块7(6.9e-7)净: 决定者=测得比值, 非层号(条令级律形); (3) 阈值是带(RMS 2-5e-7)非刀刃 — 逐元素 + |d_i|<eps 比例才是真判据, 1B 裕度表须用逐元素分位数。 +- 91% vs 57% 泄漏仅微深(−0.70→−0.75) → dg128 的 63%/97% 缺口主因=续跑欠账(候选a), 剂量漂移(b)次要。 +- **--read_lin 已入训练路径**(single 估计器; centered 留 TODO), 训练冒烟 gate cos 0.9999。 +- **CE 级终审在飞**: leak_rlin 仪器臂(battery-8 同源配置+read_lin, GPU3), 预注册预测: 尾窗≈allbp 杆 + 3.5206(物理泄漏 0.0462 全关)。确认后议程: 72M read_lin 从头重测真 gap(C512 块8-11 带 −0.40..−0.06 + 病训完了整个 crown, 封卷 +0.076 内含伪影贡献) > C768 从头 > ladder EP 臂重跑。 diff --git a/ep_run/casc_eq_train.py b/ep_run/casc_eq_train.py index 3cb9494..ed164ce 100644 --- a/ep_run/casc_eq_train.py +++ b/ep_run/casc_eq_train.py @@ -699,7 +699,14 @@ def ep_step(x, y): gs = torch.autograd.grad(obj, all_params, allow_unused=True) elif EST == 'single': E = 0.0 - for z, o in zip(zp, last_outs): E = E + 0.5 * ((z.detach().float() - o.float()) ** 2).sum() # fp32 accumulation (bf16-safe; no-op in fp32) + if args.read_lin: + # FP-FLOOR FIX (RESULT 77/78): the read identity z - o = d holds algebraically but not in + # fp32 — (z - o) is a ROUNDED copy of d (components below eps·|o| are erased; the C768 + # top-half leak). The d tensors themselves are full-precision; the linear form -<d,o> has + # the identical theta-derivative and bypasses the rounding. Probe-verified == fp64. + for dl, o in zip(GOV['_last_d'], last_outs): E = E - (dl.detach().float() * o.float()).sum() + else: + for z, o in zip(zp, last_outs): E = E + 0.5 * ((z.detach().float() - o.float()) ** 2).sum() # fp32 accumulation (bf16-safe; no-op in fp32) obj = E / (NBT * beta_t) + obj_loss(readout(zp[-1].detach()).reshape(-1, vocab), y.reshape(-1)) gs = torch.autograd.grad(obj, all_params, allow_unused=True) else: |
