在大语言模型(LLM)的世界里,最令人抓狂的失败往往不是“不会”,而是“明明会,却走神”。一道小学应用题,模型能把人数算对、减法写对,却在关键一步突然把“有 6 个男生缺席”读成“没说男生缺席”,然后一本正经地给出错误答案——仿佛一个聪明的学生在考场上被窗外的鸟叫拐跑了注意力。
这篇论文《Constructive Circuit Amplification: Improving Math Reasoning in LLMs via Targeted Sub-Network Updates》(Prakash 等,2025)要做的事情,听起来像科幻外科:不对整台模型做大规模“再训练”,而是先找出它推理时“第一次跑偏”的那个词,再定位出是哪些注意力头和 MLP 神经元在“把它往正确路上推”,最后只更新这极小一撮组件(最低只占 0.17%,最高也就 1.59%),就能让数学推理准确率提升最高 +11.4%,而且对 MMLU、TriviaQA、TruthfulQA 等通用能力影响很小。
本文精读将严格围绕你指定的重点:DCM 掩码(Desiderata-based Component Masking)与稀疏更新(targeted sub-network updates),把它讲清楚:它到底怎么找“该动哪几根神经”,为什么只动一点点会有效,实验结果说明了什么,以及它的边界在哪里。
🧭 一、为什么“只动一点点”可能比“全身按摩”更有效?
论文建立在两条来自机制可解释性(mechanistic interpretability)的经验事实上:
第一条:能力不是均匀分布在参数里。大量工作表明,模型的某些行为由稀疏子网络(subnetwork)主导,常被称为 circuits(回路/电路):它们由少数注意力头、少数 MLP 神经元协同完成特定功能。经典例子包括间接宾语识别、greater-than 比较、实体追踪等(Wang et al., 2022a; Hanna et al., 2023; Prakash et al., 2024)。
第二条:微调提升往往是“加固已有回路”,而非“凭空发明新机制”(Jain et al., 2023; Prakash et al., 2024; Chhabra et al., 2025)。换句话说,模型本来就“差不多会”,只是那条正确的内部通路不够强,或者会被别的噪声通路竞争、干扰(Rai et al., 2025; Ortu et al., 2024)。
小贴士|“回路竞争”是什么意思?
你可以把模型的内部计算想成多条并行的“推理候选线路”:有的线路能把问题往正确答案推,有的线路会引入看似合理但错误的捷径。输出哪个 token,往往是这些线路在 logits 层面的“拉扯结果”。CCA 的核心就是:让正确线路更响亮,让它在竞争中赢得下一步 token。
因此,如果我们能识别出“对正确推理最关键的那一小撮组件”,并只对它们做参数更新,就可能做到两件事:
1)
把数学推理拉回正轨;
2)
尽量不扰动其他能力(因为绝大部分参数不动)。
这就是 CCA(Constructive Circuit Amplification)的战略直觉。
🧪 二、CCA 的整体流程:先找“跑偏的词”,再找“扶正的回路”,最后只更新它们
论文把 CCA 拆成三步(Figure 1):
- Token Localization(推理错误定位):在一对“正确/错误”的推理轨迹里,找到错误推理开始偏离的关键 token(pivotal token),并选择其前一个 token 作为 intervention token(干预点)。
- Model Component Localization(组件定位):用 DCM 学一个稀疏二值掩码,找出哪些注意力头与 MLP 神经元最能“推动生成正确 token,压制错误 token”。
- Targeted Parameter Updates(定向参数更新):只对掩码选中的组件做梯度更新(其余全部冻结),用很少步数(50 steps)进行“微创增强”。
你要求我们聚焦 2 和 3:
DCM 掩码怎么学?稀疏更新怎么做?为什么这能比 LoRA 更“精准”?
🧩 三、DCM 掩码:把“想要的下一词”变成一个可优化的“愿望清单”
🧷 3.1 从“推理轨迹”到“Error-Localization 数据集”:DCM 的训练燃料
DCM 并不是直接在原始数学题上训练,而是在一个专门构造的、非常“针灸式”的数据集上学掩码。这个数据集的每个样本由三部分组成(Figure 3):
- prefix:共享推理前缀,截止到 intervention token(包含该 token)
- desiredtoken:正确推理在 intervention token 后的下一个 token
- undesiredtoken:错误推理在 intervention token 后的下一个 token
也就是说,DCM 学的不是“这题答案是多少”,而是一个更细的局部目标:
在给定 prefix 的情况下,让模型更倾向于生成 desiredtoken 而不是 undesiredtoken。
这一步非常关键:它把一个长链推理问题,切成了“下一 token 的偏好问题”,从而可以用 logits 差来直接训练掩码和后续更新。
🧠 3.2 DCM 在“组件级别”做什么:不是改权重,而是学一个“要不要加倍”
DCM 的目标是:在不改动模型权重的前提下,找出哪些组件的输出对 desiredtoken 更有利。
论文定义了一种掩码干预方式(公式 (1)):
\[
h{\text{org}} = mi \cdot 2 \cdot h{\text{org}} + (1-mi)\cdot h{\text{org}}
\]
其中:
- \(h{\text{org}}\) 是某个组件(注意力头或 MLP 神经元)的原始输出;
- \(mi\) 是该组件对应的掩码值(训练后趋向 0/1)。
如果 \(m
i=1\),这个组件的输出就被放大 2 倍;如果 \(mi=0\),保持不变。
直观上,DCM 像是在做一场“内部音量调试”:
- 把某些组件的音量拧大一点,看看模型下一 token 会不会更接近 desiredtoken;
- 如果拧大某组件让 desiredtoken 的 logit 明显上升、undesiredtoken 明显下降,那它就可能是“建设性回路”的一部分。
小贴士|为什么用“乘 2”这种粗暴放大?
这不是为了“精细控制”,而是为了“可识别性”:用一个固定幅度的增益测试组件贡献,能更清晰地区分哪些组件是“方向正确的推动者”。掩码学习完成后,真正的参数更新才开始“永久强化”这些组件。
🎯 3.3 DCM 的优化目标:最大化“正确词 vs 错误词”的 logit 差,同时强迫稀疏
DCM 训练掩码用的损失函数在公式 (2):
\[
L = -(\text{logit}{\text{desired}} - \text{logit}{\text{undesired}}) + \lambda \sum m
\]
拆解一下:
- 第一项:\(-(\text{logit}{\text{desired}} - \text{logit}{\text{undesired}})\)
等价于
最大化 \(\text{logit}{\text{desired}} - \text{logit}
{\text{undesired}}\)。
这非常“因果”:它不要求模型生成整条正确推理,只要求在干预点的下一步走对方向。
- 第二项:\(\lambda \sum m\) 是 L1 稀疏正则(掩码的 L1 范数)
用来惩罚掩码里为 1 的组件数量,使得最终选择的组件尽可能少。
\(\lambda\) 的意义很清楚:你愿意为更强的 logit 差付出多少“组件数量”的代价。论文通过 sweep(候选 \(\lambda\) 包括 \{1e-2, 5e-3, 1e-3, 1e-4\})选择最优稀疏度(Table 4)。
训练细节(Section 3.1.2 & Appendix C):
- Adam,学习率 5e-3
- batch size 8
- 50 epochs
- early stopping:如果一个 epoch 中 20% batch 后掩码不再变化,就停止
- 每次梯度更新后把掩码 clamp 到 [0,1](避免与公式 (1) 不兼容)
- 使用 NNsight 实现干预
这一套设计让 DCM 变成一个“稀疏电路探针”:在大量 prefix 局部场景下,找出一组稳定、可复用的组件集合,使得“正确 token”的优势最大。
📌 3.4 掩码到底覆盖哪些组件?Q/K/V 头与 MLP 神经元的分布
论文强调 DCM 学的是一个覆盖多类组件的掩码:
- attention heads 的 Q/K/V(还考虑了 grouped attention 下 key/value heads 的计数结构)
- MLP neurons
Table 7 给出了不同模型与不同 token 定位方法(Prefix/Branching)下,被选中的组件数量(均值±方差)。一个很直观的现象是:MLP 神经元被选中的数量常常远多于某些头,例如 Gemma-2-2B-It 在 Branching 条件下 MLP neurons 约 3969±398,而 Q/K/V 头是几百量级。这提示一种可能的机制:
- 注意力头更像“信息路由与读取”;
- MLP 神经元更像“模式/规则的非线性加工”。
在数学推理这种需要把文本条件转化为约束、再做逻辑推进的任务里,MLP 部分可能承担了大量“规则变换”的工作。
不过论文在这里保持了经验报告,没有进一步做因果拆解;但它至少告诉我们:CCA 的稀疏并不等于“只动几个头”,而是可能动一小撮头 + 一小撮神经元。
🩺 四、稀疏更新:掩码学完后,才真正“动刀”,而且只动被选中的那几处
🔧 4.1 更新目标:仍然是那对“想要/不想要 token”的 logit 差
在第三步(Section 3.1.3),模型参数更新使用的仍是同一种局部目标:
让 desired
token 相对 undesired
token 更占优势。论文描述为使用“negative logit difference between desired and undesired tokens”作为 loss(与 DCM 的 desiderata 本质一致)。
关键区别是:
- DCM 阶段:不改参数,只学掩码(“哪些组件加倍会有效”)。
- 更新阶段:固定掩码,只对掩码选中的组件参数做梯度更新(其余完全冻结),把“有效组件”的作用永久增强。
训练策略:
- 总共 50 次梯度更新 steps
- 每 2 step(到 step10)评估一次验证集,之后每 10 step 评估
- 选验证集最佳 checkpoint 上测试集
- 学习率 sweep:\{1e-2, 5e-3, 1e-3, 5e-4, 1e-4, 5e-5, 1e-5\}
- 因为数据小、更新预期少:用全数据算梯度,而不是 mini-batch(论文明确指出)
这里的“全数据梯度”很像一种“少步、稳定、方向明确”的微调:你不是要在参数空间里长距离迁移,而是要把少数组件往“更偏好正确 token”的方向推一点点。
🧠 4.2 为什么这叫“Constructive Circuit Amplification”?
名字里有三个词,每个词都非常字面:
- Circuit:通过 DCM 掩码选中的那组稀疏组件就是“回路”。
- Amplification:无论在 DCM 的“乘 2 放大测试”,还是在参数更新后的“长期增强”,本质都是让这条回路在内部竞争中更强。
- Constructive:它强调这些组件是“促进正确推理”的(constructive),而不是单纯“与输出相关”。因为优化目标是“desired vs undesired”的对比,而不是“让输出更像某个答案”。
这点很关键:传统 fine-tuning 常常会把“相关但不可靠”的捷径一起强化;CCA 试图把强化限定在“能把模型从错误分支拉回正确分支”的那部分计算上。
📈 五、结果怎么读:稀疏更新带来多大收益?掩码真的有用吗?
🧮 5.1 在 GSM-Symbolic 上:最高 +11.4%,而动的组件比例最低 0.13%,最高 1.59%
Table 1 是本文最核心的结果表。我们重点看 “CCA w mask”(使用 DCM 掩码限制更新范围):
- 原始:0.807
- Branching + mask:0.881 ±0.015(+7.4%)
- 更新组件比例:0.17%
- 原始:0.411
- Branching + mask:0.525 ±0.010(+11.4%)
- 更新组件比例:1.59%(本文提到的最大比例)
- 原始:0.742
- Branching + mask:0.786 ±0.005(+4.4%)
- 更新组件比例:0.44%
- 原始:0.739
- Branching + mask:0.794 ±0.006(+5.5%)
- 更新组件比例:0.25%
这些数字非常“机制可解释性友好”:它不是那种“我训练了 2 周、参数动了很多、效果涨了点”的故事,而是一个带有强烈结构约束的故事:只动极少组件,收益却稳定可见。
🧷 5.2 掩码 vs 不掩码:掩码不总赢,但它让“可控性”更可信
Table 1 同时给了一个消融:CCA w/o mask(跳过 DCM,更新时允许更广泛的组件参与)。
有趣的是,在某些模型上 w/o mask 甚至略高,比如 Gemma-2-2B Branching:0.532(w/o)略高于 0.525(w)。这提醒我们:
- DCM 掩码的价值不一定是“绝对更高的峰值”,而更像是:
1) 用更少改动获得接近或可比的收益;
2) 更符合“最小干预”原则,理论上更不容易伤及通用能力;
3) 让整个方法从“经验调参微调”更接近“机制对齐的定点增强”。
如果你的部署场景非常在意“别的能力别掉”,掩码的意义就更大。
🌿 5.3 通用能力保持得怎样?基本“几乎不动”
Table 2 汇报了相对原始模型在五个基准上的绝对差值(0–100 scale 的百分点变化)。整体印象是:CCA 的副作用普遍很小,多数在 ±1 左右,个别条件在 TriviaQA 上出现 -4.0 这样的下降(Gemma-2-9B Prefix w/o mask),但使用 mask 后这种极端下降不太突出。
这与 CCA 的设计逻辑一致:你只动了极少数组件,因此对其他任务的表征与行为扰动受限。
🧠 六、把 DCM 掩码与稀疏更新放在一起看:它们解决的其实是“在哪里动刀”的问题
传统的参数高效微调(例如 LoRA)解决的是“用较少新增参数去适配任务”。而 CCA 试图解决的是另一个维度:
不是“新增多少参数”,而是“原模型的哪些内部机制必须被改变”。
DCM 掩码给出了一个机制定位的答案:
- 在“错误分支 vs 正确分支”的分岔点上,哪些组件的增益最能推动 desired
token?这比“对整层加 LoRA 适配器”更像一个外科医生拿着影像片:你不需要强化全身肌肉,只需要把那条压迫神经的地方松开一点。
而稀疏更新则把这份“影像诊断”变成了实际治疗:只对这些组件做梯度更新,把它们的偏好固化下来。
⚠️ 七、局限与现实感:这不是“万能修理术”,但它提供了一种可复制的范式
论文自己在 Discussion 里也承认了一些限制(我们忠实转述并加一点解读):
1) 目前主要验证在数学推理(GSM-Symbolic),能否推广到代码、科学推理、多模态还未验证。
2) 构造 Error-Localization 数据集需要“正确性信号”和多次生成:要有正确/错误轨迹配对,现实任务可能没有明确标准答案或标注昂贵。
3) 只做了一轮定向增强:现实部署常常多轮微调,多技能连续学习会出现灾难性遗忘;CCA 可能更“安全”,但在 continual learning 里如何组合多次 CCA 还未探索。
这些限制并不削弱本文贡献,反而点出它最重要的价值:它把“机制定位 → 稀疏更新”从单步输出任务推进到了长链推理任务,并用实证证明“只动少量组件就能显著提升特定能力”不是一句口号。
🧾 参考文献(文末列 5 个核心信源,均来自本文引用或本文本身)
- Prakash, N., Ren, D., Moritz, D., & Assogba, Y. (2025). Constructive Circuit Amplification: Improving Math Reasoning in LLMs via Targeted Sub-Network Updates. arXiv:2512.16914v1.
- Davies, X., et al. (2023). Desiderata-based Component Masking (DCM).(本文用于引用 DCM 思路的工作)
- Wang, K., et al. (2022a). Mechanistic interpretability / circuits in transformers(本文引用的 circuits 方向代表性工作之一)
- Hu, E., et al. (2022). LoRA: Low-Rank Adaptation of Large Language Models.
- Mirzadeh, I., et al. (2025). GSM-Symbolic(本文使用的数学推理基准)