From 6ed4fa50ddfa4c7957aaa909aaf72f0d7d317712 Mon Sep 17 00:00:00 2001 From: YurenHao0426 Date: Mon, 23 Mar 2026 18:21:26 -0500 Subject: 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. --- CLAUDE.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 CLAUDE.md (limited to 'CLAUDE.md') 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