在大语言模型(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):
1. **Token Localization(推理错误定位)**:在一对“正确/错误”的推理轨迹里,找到错误推理开始偏离的关键 token(pivotal token),并选择其前一个 token 作为 intervention token(干预点)。
2. **Model Component Localization(组件定位)**:用 DCM 学一个稀疏二值掩码,找出哪些注意力头与 MLP 神经元最能“推动生成正确 token,压制错误 token”。
3. **Targeted Parameter Updates(定向参数更新)**:只对掩码选中的组件做梯度更新(其余全部冻结),用很少步数(50 steps)进行“微创增强”。
你要求我们聚焦 2 和 3:**DCM 掩码怎么学?稀疏更新怎么做?为什么这能比 LoRA 更“精准”?**
---
## 🧩 三、DCM 掩码:把“想要的下一词”变成一个可优化的“愿望清单”
### 🧷 3.1 从“推理轨迹”到“Error-Localization 数据集”:DCM 的训练燃料
DCM 并不是直接在原始数学题上训练,而是在一个专门构造的、非常“针灸式”的数据集上学掩码。这个数据集的每个样本由三部分组成(Figure 3):
- **prefix**:共享推理前缀,截止到 intervention token(包含该 token)
- **desired_token**:正确推理在 intervention token 后的下一个 token
- **undesired_token**:错误推理在 intervention token 后的下一个 token
也就是说,DCM 学的不是“这题答案是多少”,而是一个更细的局部目标:
> 在给定 prefix 的情况下,**让模型更倾向于生成 desired_token 而不是 undesired_token**。
这一步非常关键:它把一个长链推理问题,切成了“下一 token 的偏好问题”,从而可以用 logits 差来直接训练掩码和后续更新。
---
### 🧠 3.2 DCM 在“组件级别”做什么:不是改权重,而是学一个“要不要加倍”
DCM 的目标是:在不改动模型权重的前提下,找出哪些组件的输出对 desired_token 更有利。
论文定义了一种掩码干预方式(公式 (1)):
$$
h_{\text{org}} = m_i \cdot 2 \cdot h_{\text{org}} + (1-m_i)\cdot h_{\text{org}}
$$
其中:
- \(h_{\text{org}}\) 是某个组件(注意力头或 MLP 神经元)的原始输出;
- \(m_i\) 是该组件对应的掩码值(训练后趋向 0/1)。
如果 \(m_i=1\),这个组件的输出就被**放大 2 倍**;如果 \(m_i=0\),保持不变。
直观上,DCM 像是在做一场“内部音量调试”:
- 把某些组件的音量拧大一点,看看模型下一 token 会不会更接近 desired_token;
- 如果拧大某组件让 desired_token 的 logit 明显上升、undesired_token 明显下降,那它就可能是“建设性回路”的一部分。
> **小贴士|为什么用“乘 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 掩码限制更新范围):
- **Gemma-2-9B-Instruct**
- 原始:0.807
- Branching + mask:0.881 ±0.015(+7.4%)
- 更新组件比例:0.17%
- **Gemma-2-2B-Instruct**
- 原始:0.411
- Branching + mask:0.525 ±0.010(+11.4%)
- 更新组件比例:1.59%(本文提到的最大比例)
- **OLMo-2-1124-13B-Instruct**
- 原始:0.742
- Branching + mask:0.786 ±0.005(+4.4%)
- 更新组件比例:0.44%
- **OLMo-2-1124-7B-Instruct**
- 原始: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 个核心信源,均来自本文引用或本文本身)
1. 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.
2. Davies, X., et al. (2023). **Desiderata-based Component Masking (DCM)**.(本文用于引用 DCM 思路的工作)
3. Wang, K., et al. (2022a). **Mechanistic interpretability / circuits in transformers**(本文引用的 circuits 方向代表性工作之一)
4. Hu, E., et al. (2022). **LoRA: Low-Rank Adaptation of Large Language Models**.
5. Mirzadeh, I., et al. (2025). **GSM-Symbolic**(本文使用的数学推理基准)
---
登录后可参与表态
讨论回复
1 条回复
✨步子哥 (steper)
#1
12-28 04:17
登录后可参与表态