diff options
| author | YurenHao0426 <Blackhao0426@gmail.com> | 2026-03-23 18:21:26 -0500 |
|---|---|---|
| committer | YurenHao0426 <Blackhao0426@gmail.com> | 2026-03-23 18:21:26 -0500 |
| commit | 6ed4fa50ddfa4c7957aaa909aaf72f0d7d317712 (patch) | |
| tree | d7c63adcd19c4f5d46c8a937e5047fece55dea62 /CLAUDE.md | |
Initial implementation: all models, methods, toy and CIFAR experiments
Debug phase. Toy LQ experiments (3 seeds) complete with terminal gradient matching.
Credit bridge matches state bridge on linear system (~0.94 cosine).
CIFAR experiments in progress.
Diffstat (limited to 'CLAUDE.md')
| -rw-r--r-- | CLAUDE.md | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..6d9d08f --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,2 @@ +chor 的前提下,能不能学到一种有用的、terminal-conditioned 的局部 credit signal,用来替代 Feedback Alignment (FA/DFA) 中固定随机反馈矩阵带来的粗糙 credit assignment。 我们的目标不是立刻追求最高分类精度,而是验证一个新的假设是否可行:与其桥接 hidden state,不如桥接 credit / costate / value field。 也就是说,我们希望学习的对象不是 h_l \mapsto h_{l+1} 或者 h_l \mapsto h_L, 而是一个 terminal-conditioned 的标量 value / desirability 场 V_\phi(h_l, t_l, s), \qquad t_l = l/L, 并把每层的局部信用分配定义为 a_l := \nabla_{h_l} V_\phi(h_l,t_l,s). 这里 s 是来自终端误差的全局调制码。最简单的做法是 e_T = \nabla_{\hat y}\ell(\hat y,y),\qquad s = P^\top \mathrm{sg}(e_T), 其中 \mathrm{sg}[\cdot] 表示 stop-gradient。对于 10 类分类任务,可以先直接取 P=I,所以 s=e_T\in\mathbb R^{10}。 项目分成两个阶段。第一阶段是一个线性二次 residual sanity check,它的作用不是追任务性能,而是验证"credit bridge 学到的 a_l 到底像不像真正的局部梯度"。第二阶段是一个深 residual MLP 主实验,用来比较 BP、DFA、state bridge 和 credit bridge。 整个项目的最重要约束是:训练时不允许在隐藏层使用 BP anchor。 也就是说,中间层不能用 exact backprop 的 hidden gradient 作为监督信号。允许的只有两件事:一是输出层本地 exact gradient,因为输出层本来就直接看到 loss;二是离线 evaluation 时计算 BP hidden gradient 作为诊断指标,但绝对不能用于训练。 请优先按下面的顺序推进:先把线性 sanity check 完成并拿到清晰诊断结果,再做主实验。不要反过来。 ⸻ 一、项目背景与核心假设 标准 BP 在隐藏层使用 \delta_l^{\mathrm{BP}} = J_{l\to L}^\top e_T, 其中 J_{l\to L} 是从层 l 到输出的 Jacobian。FA/DFA 则用一个固定随机反馈矩阵近似这个对象,例如 DFA 用 \delta_l^{\mathrm{DFA}} = B_l e_T. 我们的怀疑是:问题的关键不在于"找一个更好的静态 B_l",而在于学习一个状态相关、样本相关、深度相关的信用场。也就是说,我们想把隐藏层该收到的 top-down signal 看成某种 terminal-conditioned value field 的梯度: a_l = \nabla_{h_l} V_\phi(h_l,t_l,s). 这个想法可以理解成一种无中间 anchor 的 credit bridge。它和单纯预测 hidden state 的 state bridge 是不同对象:state bridge 试图从 h_l 预测 h_L 或中间状态,而 credit bridge 直接学习 loss 对局部状态的敏感度。 我们需要验证两个具体命题: 第一,state bridge 是否不足以产生有用的局部 credit。也就是说,即使它能把 h_L 预测得不错,它算出来的 a_l^{\mathrm{state}} = \nabla_{h_l} \ell(W_{\rm out}\hat h_L,y) 也未必能真的指导局部更新。 第二,credit bridge 在没有中间 BP anchor 的情况下,能否产生比 DFA 更有用的局部 credit。这里"更有用"主要通过局部扰动相关性、nudging test、离线 BP cosine 等诊断指标体现,而不只是最终 test accuracy。 ⸻ 二、你需要实现的方法 你至少要实现下面 4 个方法,并保证所有方法使用尽可能相同的前向架构、优化器族和训练设置。 方法 1:BP baseline 这是上界基线。在这个方法里,允许标准 end-to-end backprop。它的主要作用是给出 accuracy upper bound,并在 evaluation 阶段提供 hidden gradient 参考。这个方法训练时当然可以调用整网 loss.backward()。 方法 2:DFA baseline 这是无 hidden BP anchor 的强基线。设网络有 L 个 residual blocks,每个隐藏状态维度为 d,类别数为 C。对每个 block 采样一个固定随机矩阵 B_l \in \mathbb R^{d\times C}, 并保持训练中不变。输出误差是 e_T = \nabla_{\hat y}\ell(\hat y,y). 则该层使用 a_l^{\mathrm{DFA}} = B_l e_T. block l 的参数更新使用局部 surrogate: \mathcal L_l^{\mathrm{local}} = \langle F_l(h_l;\theta_l),\mathrm{sg}[a_{l+1}^{\mathrm{DFA}}]\rangle. 请注意:DFA 方法里不能因为偷懒而让 loss.backward() 穿过隐藏层。每个 block 的更新必须只依赖自己的局部前向和本层收到的固定反馈。 方法 3:State bridge baseline 这是我们故意加入的"对象错位"基线。它的目的不是追最好效果,而是验证"桥接 state 不等于桥接 credit"。 做法如下。定义一个共享或半共享的预测器 G_\psi(h_l,t_l,s)\to \hat h_L^{(l)}. 它的输入是当前层 hidden state、层位置 t_l=l/L、以及终端调制码 s。它的训练目标是终端状态回归: \mathcal L_{\mathrm{state}} = \sum_{l=0}^{L-1}\|G_\psi(h_l,t_l,s)-\mathrm{sg}[h_L]\|_2^2. 这里建议只用 l<L 的层做监督,因为 l=L 是平凡点。训练 state bridge 时,输入 hidden state 必须是 detach().requires_grad_(True) 的副本,避免 state predictor 的训练反向影响前向网络。 训练好或同步训练 G_\psi 后,定义 state-bridge credit: a_l^{\mathrm{state}} = \nabla_{h_l}\ell(W_{\rm out}G_\psi(h_l,t_l,s),y). 这里 a_l^{\mathrm{state}} 是对 predictor 输入 h_l 的梯度,不是对前向网络参数的梯度。然后像 DFA 一样,用它做 block 的局部 surrogate 更新: \mathcal L_l^{\mathrm{local}} = \langle F_l(h_l;\theta_l),\mathrm{sg}[a_{l+1}^{\mathrm{state}}]\rangle. 方法 4:Credit bridge(主方法) 这是项目最核心的方法。定义一个标量 value 网络 V_\phi(h_l,t_l,s)\in\mathbb R. 它的输入仍然是 hidden state、深度时间 t_l=l/L、终端调制码 s。然后定义该层信用信号为 a_l = \nabla_{h_l}V_\phi(h_l,t_l,s). 这个 a_l 将被送给对应 block 做局部 surrogate 更新。 credit bridge 的训练先从最简单版本开始,只实现两项 loss。 第一项是终端边界项: \mathcal L_{\mathrm{term}} = \Big( V_\phi(h_L,1,s)-\mathrm{sg}[\ell(\hat y,y)] \Big)^2. 第二项是一阶 bridge consistency。设前向 block 是 residual 形式 h_{l+1}=h_l+F_l(h_l;\theta_l). 引入小噪声参考动力学 \tilde h_{l+1}^{(k)} = h_l + F_l(h_l;\theta_l) + \sigma_l \xi_k,\qquad \xi_k\sim\mathcal N(0,I). 再用一个 EMA target network \bar\phi 构造 target: \hat V_l^{\mathrm{tgt}} = -\lambda \log \left( \frac1K\sum_{k=1}^K \exp\Big( -\frac{V_{\bar\phi}(\tilde h_{l+1}^{(k)},t_{l+1},s)}{\lambda} \Big) \right). bridge loss 定义为 \mathcal L_{\mathrm{bridge}} = \sum_{l=0}^{L-1} \Big( V_\phi(h_l,t_l,s)-\mathrm{sg}[\hat V_l^{\mathrm{tgt}}] \Big)^2. 完整的 feedback loss 为 \mathcal L_\phi = \mathcal L_{\mathrm{term}} + \mathcal L_{\mathrm{bridge}}. 在这个最简版本先不要上 FM auxiliary,也先不要上 MaxCal smoothness 正则。原因很现实:如果一开始就把所有二阶项都加进去,工程复杂度会高很多,不利于快速判断方向是否有信号。 当前向网络更新时,block l 的局部 surrogate 用 \mathcal L_l^{\mathrm{local}} = \langle F_l(h_l;\theta_l),\mathrm{sg}[a_{l+1}]\rangle. 输出层权重 W_{\rm out} 可以直接用 CE 的 exact output gradient 更新,这是允许的,因为输出层本地就能看到 loss。 如果最简版本有信号,再做一个第二版:在 toy 和小模型上加一个 FM-style auxiliary,用来让 credit field 在层与层之间更平滑。定义随机中间点 \bar h_{l,\tau} = h_l+\tau F_l(h_l;\theta_l)+\sqrt{\tau(1-\tau)}\sigma_l\epsilon, \qquad \tau\sim U(0,1),\ \epsilon\sim\mathcal N(0,I), 以及插值 target \bar a_{l,\tau}^{\rm tgt} = (1-\tau)\,\mathrm{sg}[a_l] + \tau\,\mathrm{sg}[a_{l+1}]. 然后加上 \mathcal L_{\mathrm{fm}} = \gamma\sum_{l=0}^{L-1} \left\| \nabla_h V_\phi(\bar h_{l,\tau},(l+\tau)/L,s) - \bar a_{l,\tau}^{\rm tgt} \right\|_2^2. 请注意:这一项会引入对 \nabla_h V_\phi 的训练,也就是二阶 autograd。先只在 toy 和小规模主实验上做,不要一上来全量开启。 ⸻ 三、实验阶段 A:线性二次 residual sanity check 这个实验的作用是:在一个 exact costate 可解析的系统里,验证 credit bridge 学出来的 a_l 是否接近真实的局部梯度。这个阶段前向动力学参数全部固定,不训练 forward net,只训练 feedback / bridge 模型。这样可以把"credit 学习是否正确"和"前向训练是否稳定"分离开。 请实现如下系统。设隐藏维度 d=64,终端输出维度 m=10,层数 L=12。对每层采样一个稳定线性映射 M_l = I + A_l, 其中 A_l 是一个随机矩阵,但要缩放到谱范数较小,例如 \|A_l\|_2\le 0.05。前向动力学是 h_{l+1}=M_l h_l + \sigma \xi_l,\qquad \xi_l\sim\mathcal N(0,I),\ \sigma=0.03. 数据用在线生成即可。可以取 h_0 \sim \mathcal N(0,I_d),\qquad y\sim \mathcal N(0,I_m), 终端损失定义为 \Phi(h_L,y)=\frac12\|Ch_L-y\|_2^2, 其中 C\in\mathbb R^{m\times d} 是固定随机矩阵。 这个系统的 exact costate 是解析可得的。终端梯度是 a_L^{\mathrm{exact}} = C^\top(Ch_L-y), 并且递推为 a_l^{\mathrm{exact}} = M_l^\top a_{l+1}^{\mathrm{exact}}. 请用这个 exact costate 做 evaluation,但不要拿它训练 credit bridge。 这个阶段至少比较 3 个方法:DFA、state bridge、credit bridge。BP 在这里不是必须训练的,因为 forward net 固定;你只需要 exact costate 作为评价参考。 这个阶段的主要评价指标如下。 第一,exact costate cosine: \Gamma_l = \mathbb E\Big[ \cos(a_l,a_l^{\mathrm{exact}}) \Big]. 要按层报告,也要报告 across-layer 平均。 第二,局部扰动相关性。对每层采样 M 个随机方向 v_{l,j}\sim \mathcal N(0,I),归一化后取小扰动 \epsilon。预测的一阶 loss 变化是 \Delta_{l,j}^{\mathrm{pred}} = \langle a_l,\epsilon v_{l,j}\rangle. 真实变化是从该层起重新滚动后续动力学得到的终端损失差: \Delta_{l,j}^{\mathrm{true}} = \Phi(h_l+\epsilon v_{l,j})-\Phi(h_l). 请计算每层的 Pearson 相关 \rho_l = \mathrm{corr}\!\left(\Delta_{l,j}^{\mathrm{pred}},\Delta_{l,j}^{\mathrm{true}}\right). 这个指标非常重要,因为它不依赖 BP,只检验 a_l 是否真是 loss 对局部状态的有效线性近似。 第三,nudging test。对每层做 h_l' = h_l - \eta \frac{a_l}{\mathrm{RMS}(a_l)+10^{-6}}, 然后从该层继续滚动动力学,看终端损失是否下降: \Delta_l^{\mathrm{nudge}} = \Phi(h_l')-\Phi(h_l). 一个好的 credit 应该让 \Delta_l^{\mathrm{nudge}}<0,而且优于 random direction 和 DFA。 第四,bridge residual。对 credit bridge,计算 R_l = \left| V_\phi(h_l,t_l,s) + \lambda\log \left( \frac1K\sum_k e^{-V_{\bar\phi}(\tilde h_{l+1}^{(k)},t_{l+1},s)/\lambda} \right) \right|. 这个指标用来检查 bridge recursion 有没有学出来。 这个阶段的目标不是做到完美,而是回答一个问题:在完全无中间 BP anchor 的条件下,credit bridge 至少能不能比 state bridge 更像一个真正的局部梯度对象。如果 toy 上完全没信号,就不要进入主实验;如果 toy 上 \Gamma_l、\rho_l、\Delta_l^{\mathrm{nudge}} 都明显优于 state bridge 和 DFA,再继续。 ⸻ 四、实验阶段 B:深 residual MLP 主实验 主实验使用图像分类。优先数据集是 CIFAR-10。如果 CIFAR-10 调试太慢,可以先用 FashionMNIST 做 smoke test,但最终请把主结果放在 CIFAR-10 上。 前向架构请用一个深 residual MLP,而不是 Transformer。原因是这个阶段的目标是验证 credit 语义,不是挑战大模型训练。推荐配置如下: 输入先展平,再经过一个线性 embedding 到隐藏维度 d=512 或 d=768。总共有 L=12 个 residual blocks。每个 block 用 pre-LayerNorm + 两层 MLP: h_{l+1} = h_l + W_{2,l}\,\mathrm{GELU}(W_{1,l}\,\mathrm{LN}(h_l)). 输出头为 \hat y = W_{\rm out}\,\mathrm{LN}(h_L). 训练损失为标准 cross-entropy。所有方法都用相同的数据增强、batch size、优化器族、weight decay、训练 epoch 数。建议先用 AdamW,batch size 128,训练 100 到 200 epochs。所有方法跑 3 个随机种子。 主实验必须比较这 4 个方法:BP、DFA、state bridge、credit bridge。credit bridge 如果工程可承受,再加一个 credit bridge + FM auxiliary 版本作为附加实验。 这个阶段有两个非常重要的实现约束。 第一,对于非 BP 方法,绝对不要让全局 loss 反向穿过隐藏层。 正确做法是:先用前向网络得到 h_0,\dots,h_L 和终端误差 e_T。然后为 feedback 网络构造 detached hidden copies: \tilde h_l = \mathrm{detach}(h_l),\qquad \tilde h_l.\mathrm{requires\_grad}=True. 用这些 detached copies 训练 state bridge 或 value net。这样 feedback 网络的梯度不会偷偷训练前向网络。 第二,更新每个 block 参数时,也必须只依赖 block 自己的局部前向和来自 feedback 的 credit。具体地,block l 更新时应重新取 \bar h_l = \mathrm{detach}(h_l), 计算 F_l(\bar h_l;\theta_l),然后最小化 \mathcal L_l^{\mathrm{local}} = \langle F_l(\bar h_l;\theta_l), \mathrm{sg}[a_{l+1}] \rangle. 这样 autograd 只会流向 \theta_l,不会流到更早的 block。每个 block 可以有独立 optimizer,也可以共享 optimizer 但要小心逐块 zero_grad() 和逐块 step()。如果你觉得容易出错,我更建议每个 block 用独立 optimizer。 输出头 W_{\rm out} 的更新可以直接用 CE 的 exact output gradient,但更新时请把 h_L detach 掉,避免反向进隐藏层。 ⸻ 五、主实验评估指标 最终 accuracy 当然要报,但它不是唯一核心指标。我们真正想知道的是:credit bridge 产生的局部 credit 是否比 DFA 和 state bridge 更像 loss 对局部状态的真实敏感度。 请至少计算并汇报下面这些指标。 1. Validation accuracy / train loss / test accuracy 这是标准指标,但不要只看它。所有方法都要报 mean±std over 3 seeds。 2. 局部扰动相关性 \rho_l 这是最重要的无-BP 诊断指标。做法如下:对某个 validation batch,取某层 hidden state h_l,采样 M 个随机方向 v_{l,j},比如 M=16 或 32。对每个方向,计算预测 loss 变化: \Delta_{l,j}^{\mathrm{pred}} = \langle a_l, \epsilon v_{l,j}\rangle. 然后把 hidden state 在该层替换为 h_l+\epsilon v_{l,j},只重新跑从该层到输出的 tail,得到真实 loss 变化: \Delta_{l,j}^{\mathrm{true}} = \ell(h_l+\epsilon v_{l,j})-\ell(h_l). 请计算 Pearson correlation: \rho_l = \mathrm{corr}(\Delta_{l,j}^{\mathrm{pred}}, \Delta_{l,j}^{\mathrm{true}}). 这个指标应按层报告随训练进程的变化。一个有用的 credit 应该在多层上保持正相关,并且优于 DFA。 3. Hidden nudging test 对每层定义归一化 nudging: h_l' = h_l - \eta \frac{a_l}{\mathrm{RMS}(a_l)+10^{-6}}. 然后从该层往后重跑 tail,比较 loss 变化: \Delta_l^{\mathrm{nudge}} = \ell(h_l') - \ell(h_l). 好的 credit 应该让 \Delta_l^{\mathrm{nudge}} 为负,并且优于 random direction 和 DFA。请固定一组 \eta 值,例如 \{10^{-3},3\cdot10^{-3},10^{-2}\},都测一下,避免因为步长选择不当导致误判。 4. Offline BP cosine 这个指标在训练中不能用,但 evaluation 可以用。对 validation batch 单独跑一次完整 BP,得到真实 hidden gradient \delta_l^{\mathrm{BP}} = \frac{\partial \ell}{\partial h_l}. 然后计算 \Gamma_l = \mathbb E\left[\cos(a_l,\delta_l^{\mathrm{BP}})\right]. 按层报告,作为辅助诊断。这个指标很有价值,但它是 secondary,因为我们的核心要求是无 hidden BP anchor 训练,而不是 offline 完全不算 BP。 5. Bridge residual 只对 credit bridge 报告,用来判断 value recursion 是否学出来。定义同上。 6. Feature drift 对每个 block 参数,计算 M_l = \frac{\|W_l^{\mathrm{final}}-W_l^{\mathrm{init}}\|_F}{\|W_l^{\mathrm{init}}\|_F}. 这有助于看不同方法是不是都停留在近似 lazy regime。请按层汇报。 7. State bridge 的 terminal prediction quality 请额外报告 state bridge 的 \|G_\psi(h_l,t_l,s)-h_L\|_2^2 或平均 relative error。因为我们想证明的不是 "它什么都学不会",而是 "即使它把终端状态预测得还行,也不一定能产生好的 credit"。 ⸻ 六、实现建议与工程细节 请用 PyTorch 2.x。toy 和小模型请优先用 float32,不要一上来混合精度,因为 credit bridge 的二阶图在 mixed precision 下更容易不稳定。 对于 value 网络 V_\phi,建议先用一个小型共享 MLP:输入是 [\mathrm{LN}(h_l), \mathrm{time\_embed}(t_l), s] 的拼接,隐藏层宽度 256 或 512,2 到 3 层,输出标量。time embedding 可以直接用一个小 MLP 处理标量 t_l,也可以用正弦位置编码。关键不是 fancy,而是稳定。 对于 state predictor G_\psi,建议也是共享 MLP,但输出维度是 d。不要做得太大,否则会喧宾夺主。 \lambda 可以先试 0.1 和 1.0。bridge 中的噪声 \sigma_l 可以先设成常数 0.01 到 0.05。target network EMA 动量建议 0.99 或 0.995。每个 \hat V_l^{\mathrm{tgt}} 的 Monte Carlo 样本数 K 先取 4;toy 可以取 8。 DFA 的随机反馈矩阵 B_l 请用高斯初始化,并缩放到合适量级,避免 credit magnitude 爆炸或过小。建议做一个简单规范化,让每层 DFA credit 的 RMS 大致在同一量级。credit bridge 的 a_l 也建议在送入局部 surrogate 前做一版归一化实验: \tilde a_l = \frac{a_l}{\mathrm{RMS}(a_l)+10^{-6}}. 你可以同时保留 raw 和 normalized 两种局部更新版本,但最少要在 pilot 实验里比较一下,否则可能会被纯数值尺度问题误导。 请特别注意一点:如果你在训练 feedback/value 网络时直接用前向图上的 h_l,那 autograd 可能会把 \mathcal L_\phi 的梯度传回前向网络,这会破坏"无 hidden BP anchor"的设定。因此,训练 feedback/value 网络时必须使用 detached hidden copies。更新 block 参数时也必须使用 detached hidden input。请把这一点写进代码注释,并在 README 中明确说明。 ⸻ 七、推荐的代码组织方式 请把代码做成清晰、可复现实验的结构。建议至少有这些文件: models/residual_mlp.py:定义前向 residual MLP。 models/value_net.py:定义 V_\phi。 models/state_bridge.py:定义 G_\psi。 methods/bp.py:BP baseline 训练逻辑。 methods/dfa.py:DFA baseline 训练逻辑。 methods/state_bridge_train.py:state bridge 训练与局部更新逻辑。 methods/credit_bridge_train.py:credit bridge 训练与局部更新逻辑。 experiments/toy_lq.py:线性二次 sanity check。 experiments/cifar_resmlp.py:主实验。 metrics/credit_metrics.py:实现 \rho_l、nudging、BP cosine、bridge residual。 configs/*.yaml:所有实验配置。 README_experiments.md:如何运行。 report/:最终图表与报告。 所有实验都必须保存 config、seed、git commit hash、训练日志和中间 checkpoint。请不要做"手动调了很多但没记录"的实验。 ⸻ 八、优先级与预期产出 请按下面优先级执行,不要乱序。 第一优先级:完成 toy 线性二次 sanity check,并拿到清晰图表。最少要有每层 \Gamma_l、\rho_l、\Delta_l^{\mathrm{nudge}}、bridge residual 的曲线或表格。需要对比 DFA、state bridge、credit bridge。这个阶段如果 credit bridge 比 state bridge 更像真实局部梯度,这就已经是一个积极信号。 第二优先级:在 CIFAR-10 深 residual MLP 上完成 BP、DFA、state bridge、credit bridge 这 4 个方法的主实验。必须至少做 3 个种子。需要输出 accuracy 曲线、\rho_l 分层曲线、nudging test、offline BP cosine、feature drift。最重要的比较不是"谁 accuracy 最高",而是"谁在无 hidden BP anchor 的情况下产生更有 credit 语义的局部信号"。 第三优先级:如果前两步顺利,再做 credit bridge + FM auxiliary。只在 toy 和较小主实验上尝试即可,不需要一开始全量跑。因为这一步需要二阶 autograd,工程成本更高。 ⸻ 九、成功标准与如何判断是否值得继续 这个项目的成功标准不是"credit bridge 最终精度超过 BP",那不现实。更合理的阶段性成功标准是: 第一,在 toy 线性系统上,credit bridge 的 exact costate cosine 和局部扰动相关性明显高于 state bridge,且一般高于 DFA。只要多数层上 \rho_l>0、\Delta_l^{\mathrm{nudge}}<0,并且优于 state bridge,这条线就有价值。 第二,在主实验上,即使最终 accuracy 还没有明显超过 DFA,只要 credit bridge 在中早层的 \rho_l、nudging 和 offline BP cosine 上 consistently 好于 DFA,就说明它确实更接近正确的 credit assignment 对象。 第三,如果 state bridge 的 terminal state regression 做得还不错,但它的 \rho_l 和 nudging 仍然明显不如 credit bridge,那就很好地支持了我们的核心论点:桥接 state 不足,桥接 credit / value field 更对路。 ⸻ 十、你最终必须提交的内容 你最终至少需要交付以下内容: 1. 一份简洁但完整的 README_experiments.md,说明如何运行 toy 和主实验。 2. 可复现实验代码,配置清晰,能从命令行指定方法、数据集、seed。 3. 一份结果报告,最好是 PDF 或 markdown,包含:方法定义、实现说明、关键图表、主要发现、失败点和下一步建议。 4. 至少以下图表: • toy:每层 exact costate cosine、\rho_l、nudging、bridge residual; • 主实验:train/test accuracy、各层 \rho_l、nudging、offline BP cosine、feature drift; • state bridge 的 terminal prediction error vs credit quality 对照图。 5. 一个最终结论段,明确回答三个问题: • 无 hidden BP anchor 时,credit bridge 是否能学出有用 credit? • 它是否比 state bridge 更符合"信用分配对象"的定义? • 它是否在主要诊断指标上优于 DFA? ⸻ 十一、一些不要做的事情 不要把 offline BP cosine 当成训练目标。 不要在隐藏层偷偷使用 BP 监督。 不要为了追精度把局部性破坏掉。 不要一上来把所有复杂正则都打开。 不要只报 accuracy 而不报 credit 诊断。 不要忽略随机种子和实验记录。 不要因为主实验难就跳过 toy sanity check。 ⸻ 十二、如果遇到阻塞,如何降级处理 如果 credit bridge 一开始训练不稳,请按以下顺序降级,而不是乱改: 先只用 \mathcal L_{\mathrm{term}}+\mathcal L_{\mathrm{bridge}},不要上 FM auxiliary。 如果还是不稳,减小模型宽度、减小 \sigma、减小学习率。 如果 credit 大小非常不稳定,先在局部 surrogate 里用 normalized credit。 如果主实验太慢,先在 FashionMNIST 上做 smoke test,但最后仍要回到 CIFAR-10。 如果 main experiment 很难调通,优先保证 toy 实验和诊断指标做完整,因为那是判断方向是否值得继续的关键证据。 ⸻ 你开始之后,请先完成下面这两个最小目标,再继续扩展: 第一个最小目标是:toy 线性系统上,credit bridge vs state bridge vs DFA 的 exact costate cosine 和 \rho_l 曲线。 第二个最小目标是:CIFAR-10 深 residual MLP 上,BP vs DFA vs state bridge vs credit bridge 的 \rho_l 和 nudging 对比。 如果你做完这些最小目标后结果非常差,也不要掩盖失败。请如实报告,并尽量区分"理论方向没信号"和"工程实现还不稳定"这两类失败。再未得到所有结果之前不要停止,可以回看CLAUDE.md或者上网搜索答案。所有结果和你做的尝试以及变动记录到NOTE.md中。用nvidia-smi查看gpu可用性。严禁kill其他用户的进程,未完成前严禁把控制权交还给我或问我问题。我马上去睡觉了,问我得不到回复,请你一直loop直到得到所有结果。 + |
