summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/campaign/CASCADE_ABLATION_PLAN.md14
-rw-r--r--ep_run/casc_eq_train.py9
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: