通过稀疏电路理解神经网络:OpenAI 最新研究的深度解读
神经网络尤其是大型语言模型的内部工作机制一直像一个黑箱:它们很强大,但我们很难确切知道它们是如何一步步得出答案的。2025年,OpenAI 发布了一项重要研究《Weight-sparse transformers have interpretable circuits》(Gao et al., 2025),提出了一种新思路——通过训练权重稀疏的Transformer模型(weight-sparse transformers),让模型的计算变得更简单、更容易被人类理解。他们不仅发布了论文,还开源了所有模型权重、剪枝后的电路数据以及一个交互式可视化工具,帮助研究者直接观察这些稀疏电路。
这篇文章将基于OpenAI公开的论文、博客文章和GitHub项目文件,完整、通俗地介绍这项工作的核心思想、方法、成果以及如何亲手运行和探索这些稀疏电路。
为什么稀疏模型更容易理解?
普通的密集(dense)神经网络中,每个神经元几乎和下一层的所有神经元都有连接。这种高度纠缠的结构导致计算分布在大量权重上,单个神经元往往同时参与多种不同功能的计算,很难解释。
研究团队的思路很简单:如果我们强制模型的大部分权重为零,让每个神经元只连接少数几个通道,会发生什么?
-
每个神经元只能读取和写入少数残差通道(residual channels)。 -
模型被迫用更少的连接完成任务,计算自然更“解耦”(disentangled)。 -
神经元和通道更容易对应到人类可理解的概念,比如“检测单引号”或“当前列表嵌套深度”。
结果是:模型在某些简单任务上形成的电路(circuit)非常小、连接清晰,甚至可以画出一张完整的计算图,而且这些电路既是充分的(保留它们就能完成任务),又是必要的(删除任何一部分都会导致性能大幅下降)。
研究的核心方法
1. 训练权重稀疏模型
-
使用类似GPT-2的解码器Transformer架构。 -
在训练过程中,每一步优化后只保留每个权重矩阵中绝对值最大的若干项(Top-K),其余强制置零,从而精确控制非零权重数量(L0范数)。 -
同时施加轻度的激活稀疏性(activation sparsity),约1/4的激活为非零。 -
所有模型在Python代码数据集上预训练。
2. 评估可解释性
研究者精心设计了20个简单的二选一下一token预测任务,例如:
-
单/双引号字符串闭合(single_double_quote) -
变量类型跟踪(set_or_string) -
括号嵌套深度计数(bracket_counting)
对每个任务,他们使用一种新型结构化剪枝算法(基于可学习掩码+直通估计器),在保持任务损失接近原始模型的前提下,剪枝到最小的电路,然后统计电路中的边数(edges)作为可解释性指标——边数越少越可解释。
3. 关键发现
-
相同预训练损失下,稀疏模型的任务电路比密集模型小约16倍。 -
增大模型总参数规模可以同时提升能力与可解释性,推动能力-可解释性帕累托前沿向外扩展。 -
增加稀疏度(降低L0)会牺牲能力但显著提升可解释性。 -
目前在几千万非零参数规模内可解释性保持良好,更大规模仍具挑战。
三个经典电路示例(完全来自论文)
示例1:单/双引号闭合电路
任务:预测字符串应该用单引号还是双引号闭合。
电路只用了12个节点和9条边:
-
第0层MLP把token嵌入转换为两个残差通道:一个检测“是否有引号”,另一个分类“单引号还是双引号”。 -
第10层注意力头使用恒定的查询通道,键通道读取“是否有引号”,值通道读取“引号类型”。 -
注意力机制忽略中间token,把开引号的类型复制到最后一个token位置。 -
最终预测匹配的闭合引号。
整个过程就像一个清晰的算法:检测 → 分类 → 复制 → 输出。
示例2:括号嵌套深度计数
任务:判断当前token是否在嵌套列表内部。
电路用7个节点、4条边:
-
一个注意力值通道检测开括号“[”。 -
注意力头把历史开括号数量累加写入残差流(即嵌套深度)。 -
另一个注意力头读取该深度并阈值判断是否在嵌套内部。
理解这个电路后,研究者甚至能构造对抗样本攻击模型。
示例3:变量类型跟踪(set_or_string)
任务:判断变量current后面应该接.add(如果是set)还是+=(如果是字符串)。
电路使用两跳注意力:
-
第一跳把变量名复制到 set()所在的token。 -
第二跳用该token作为键,把类型信息复制到最终位置。
这些电路的共同特点是:节点激活对应清晰概念,连接直观,几乎不需要抽象就能理解。
如何亲手运行和探索这些稀疏电路?
OpenAI开源了完整项目:https://github.com/openai/circuit_sparsity
安装步骤
git clone https://github.com/openai/circuit_sparsity.git
cd circuit_sparsity
pip install -e .
启动交互式可视化仪表盘
streamlit run circuit_sparsity/viz.py
仪表盘会自动从OpenAI公共存储下载数据并本地缓存。左侧栏可以选择:
-
模型(csp_yolo1、csp_yolo2、csp_sweep1_* 等) -
任务(如 single_double_quote) -
剪枝sweep版本(如 prune_v4) -
节点预算 k
主界面使用Plotly绘制交互式电路图,支持:
-
查看每个节点的激活预览 -
消融(ablation)影响热图 -
token级激活分布
图:仪表盘截图,展示词嵌入/位置嵌入选项卡,带节点消融影响和激活预览
运行模型推理
项目提供轻量级GPT实现,适合CPU/GPU推理。
from circuit_sparsity.inference.gpt import GPT, GPTConfig, load_model
from circuit_sparsity.inference.hook_utils import hook_recorder
from circuit_sparsity.registries import MODEL_BASE_DIR
# 加载预训练稀疏模型
model = load_model(f"{MODEL_BASE_DIR}/models/csp_yolo2", cuda=False)
# 前向传播并记录激活
with hook_recorder() as rec:
logits, loss, _ = model(tokens)
# rec 包含所有中间激活,如 {"0.attn.act_in": tensor(...), ...}
可用模型一览
| 模型名称 | 参数规模 | 特点 |
|---|---|---|
| csp_yolo1 | 118M | 用于单/双引号定性结果,较老训练方式 |
| csp_yolo2 | 475M | 用于括号计数和变量绑定定性结果 |
| csp_sweep1_* | 多种 | 用于图3缩放律研究,名称标示扩张因子、L0和激活稀疏度 |
| csp_bridge1/2 | – | 用于桥接(bridge)实验,将稀疏模型表示耦合到密集模型 |
| dense1_1x/2x/4x | – | 对照用的密集模型 |
常见问题解答(FAQ)
权重稀疏模型和普通的稀疏(如MoE)有什么区别?
这里的权重稀疏是指每个权重矩阵中大部分元素永久为零(L0小),而MoE模型虽然激活路径稀疏,但权重本身几乎全是密集的。
为什么不直接在现有大模型上做可解释性研究?
密集模型中广泛存在叠加(superposition),计算高度纠缠。稀疏训练从根本上减少了这种纠缠,让电路更易分离。
稀疏模型能达到前沿模型性能吗?
目前训练和部署效率低,规模受限。但研究表明稀疏训练是理解计算原理的有力工具,未来可能通过桥接技术或更高效训练方法应用到密集模型。
剪枝得到的电路真的可信吗?
论文使用均值消融(mean ablation)验证:只保留电路节点就能保持任务性能;删除电路中任何节点都会严重损害性能。这比许多现有电路研究更严格。
我能在本地运行所有模型吗?
是的,所有模型和可视化数据都公开。数据存储在 https://openaipublic.blob.core.windows.net/circuit-sparsity,仪表盘会自动下载。
如何清除缓存重新下载数据?
运行项目中的 clear_cache.py 脚本。
未来方向(论文中提到的)
-
把技术扩展到更大模型,解释更复杂行为。 -
从现有密集模型中提取稀疏电路,而不是从头训练。 -
开发更高效的稀疏训练技术,使其更接近生产部署需求。
这项工作虽然距离完全理解最强大模型还有很长路要走,但它首次展示了:通过改变训练方式,我们确实可以让模型的内部计算变得显著更易理解。对于那些希望深入研究神经网络“思考”过程的人来说,这是一个宝贵的起点和工具集。
如果你对机制可解释性(mechanistic interpretability)感兴趣,强烈建议克隆仓库、启动仪表盘,亲自探索这些稀疏电路——那种看到一个清晰算法从权重中浮现的感觉,真的很奇妙。
