通过稀疏电路理解神经网络: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条边:

  1. 第0层MLP把token嵌入转换为两个残差通道:一个检测“是否有引号”,另一个分类“单引号还是双引号”。
  2. 第10层注意力头使用恒定的查询通道,键通道读取“是否有引号”,值通道读取“引号类型”。
  3. 注意力机制忽略中间token,把开引号的类型复制到最后一个token位置。
  4. 最终预测匹配的闭合引号。

整个过程就像一个清晰的算法:检测 → 分类 → 复制 → 输出。

示例2:括号嵌套深度计数

任务:判断当前token是否在嵌套列表内部。

电路用7个节点、4条边:

  • 一个注意力值通道检测开括号“[”。
  • 注意力头把历史开括号数量累加写入残差流(即嵌套深度)。
  • 另一个注意力头读取该深度并阈值判断是否在嵌套内部。

理解这个电路后,研究者甚至能构造对抗样本攻击模型。

示例3:变量类型跟踪(set_or_string)

任务:判断变量current后面应该接.add(如果是set)还是+=(如果是字符串)。

电路使用两跳注意力:

  1. 第一跳把变量名复制到set()所在的token。
  2. 第二跳用该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级激活分布

Streamlit circuit visualizer 示例
图:仪表盘截图,展示词嵌入/位置嵌入选项卡,带节点消融影响和激活预览

运行模型推理

项目提供轻量级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 脚本。

未来方向(论文中提到的)

  1. 把技术扩展到更大模型,解释更复杂行为。
  2. 从现有密集模型中提取稀疏电路,而不是从头训练。
  3. 开发更高效的稀疏训练技术,使其更接近生产部署需求。

这项工作虽然距离完全理解最强大模型还有很长路要走,但它首次展示了:通过改变训练方式,我们确实可以让模型的内部计算变得显著更易理解。对于那些希望深入研究神经网络“思考”过程的人来说,这是一个宝贵的起点和工具集。

如果你对机制可解释性(mechanistic interpretability)感兴趣,强烈建议克隆仓库、启动仪表盘,亲自探索这些稀疏电路——那种看到一个清晰算法从权重中浮现的感觉,真的很奇妙。