原始文章:Sparks of Weight-Space Programming
这篇文章非常值得关注。它讨论的不是普通的 Agent、模型微调或者 Prompt Engineering,而是一个可能改变 AI 模型开发方式的新方向:
Weight-Space Programming(权重空间编程):让大语言模型直接阅读、理解、编写和修改另一个神经网络的权重。
我觉得这篇文章最有意思的地方是:以前我们认为,神经网络的权重主要只能通过梯度下降来优化;而现在,LLM 开始表现出一种能力——它可以像程序员读代码一样,直接分析神经网络的参数,并尝试修改它们。
而且文章给出了几个相当惊人的实验,包括直接修改 Qwen3.5-0.8B 的权重,让 MATH-500 成绩从 7.9% 提高到 48.1%。
我们拆开来看。
一、先理解:什么是 Weight-Space Programming?
先回到神经网络最基本的结构。
假设有一个简单的三层 MLP:
一个简单的神经网络
输入层 Input 500
|
v
隐藏层 Hidden 32
|
v
输出层 Output 5
每一层之间都有权重矩阵,决定输入信号如何传递、组合和转换。
例如,第一层有一个权重矩阵:
W1 ∈ R^(500×32)
它里面有 16,000 个数字。
这些数字不是随便设置的,而是经过训练得到的。它们共同决定了神经网络如何处理输入。
传统训练的方式是:
- 输入训练数据。
- 神经网络计算输出。
- 计算预测结果与真实结果之间的 Loss。
- 通过反向传播计算梯度。
- 使用 Adam 等优化器更新权重。
- 不断重复。
也就是:
W(t+1) = W(t) - η·∇_W L
这里有一个关键问题:
传统方法是通过数据和梯度来修改权重,而 Weight-Space Programming 是让 LLM 直接理解权重,然后根据自然语言目标修改权重。
举个例子:
传统方式:
这是一个玩游戏的神经网络,请通过 PPO 训练它,让它学会玩 Breakout。
Weight-Space Programming:
这是一个神经网络,请分析它的权重,理解它应该如何玩 Breakout,然后直接生成一套能够完成任务的权重。
两者的思路完全不同。
前者是让模型通过训练逐渐学会任务。
后者是让 LLM 直接把神经网络当作一种可以编程的计算结构。
二、最惊人的实验:LLM 能看懂神经网络权重吗?
文章首先做了一系列实验,验证 GPT-6 Astra 是否能够直接从权重中推断神经网络的行为。
注意,这里有一个很重要的限制:
不给它运行神经网络的机会,只给它原始权重。
实验 1:仅凭权重识别游戏
研究人员训练了四个神经网络,分别玩:
- Breakout(打砖块)
- Pong(乒乓球)
- Pac-Man(吃豆人)
- Freeway(过马路)
四个网络的架构完全相同:
500 → 32 → 32 → 5
每个网络有 17,253 个参数。
研究人员把四个网络的全部权重交给 Astra,不告诉它训练任务是什么,也不允许它运行网络。
结果:
Astra 全部识别正确。
它是怎么做到的?
例如 Breakout:
- 输入层中,与球拍位置相关的输入特征会影响特定神经元。
- 球拍通常位于游戏画面底部。
- 输出层的权重则能体现网络如何区分左右移动等动作。
Astra 通过分析权重的分布和结构,推断出网络的功能。
这有点像给一个程序员一份二进制文件,不让他运行,只让他分析里面的数据结构,然后猜出这个程序的用途。
实验 2:从权重识别图像生成模型
研究人员训练了三个简单的 Diffusion Model,分别生成:
- 圆形
- 三角形
- 正方形
每个模型大约有 23,824 个参数。
Astra 只看权重,不运行模型,也不进行 Forward Pass。
结果,它成功识别了三个模型分别生成什么图形。
更有意思的是,它发现输出层的某些神经元权重对应图形的边缘结构。
这说明它并不是单纯记住了某种权重模式,而是开始能够从参数的几何结构中推断网络内部的功能。
当然,这还是非常小的模型,不能直接等同于它已经能理解大型扩散模型。
实验 3:只看 Transformer 中间层,能看懂它学了什么吗?
这个实验更接近我们熟悉的大语言模型。
研究人员训练了三个只有 7.2M 参数的小型 Transformer,分别学习:
- Python 代码
- 日语罗马字(Romaji)
- 英语文本
然后做了一件很有意思的事情:
把模型的输入层和输出层全部移除,只留下中间的四个 Transformer Block。
这意味着 Astra 不知道输入字符与向量之间的对应关系,也无法直接运行模型。
但它仍然成功识别了三个模型分别训练的语言。
甚至还识别出了所有的 Induction Heads(归纳头)。
Induction Head 是 Transformer 中一个很重要的机制。
举个例子:
输入:The cat is black. The cat is
模型应该预测:black
模型需要找到前面出现过的 The cat is,然后复制后面跟着的内容。
这通常需要多个 Attention Head 配合:
- 前面的 Head 找到之前相同的 Token。
- 后面的 Head 利用这个信息,找到对应的后续 Token。
- 最终完成复制。
Astra 直接通过权重矩阵之间的关系,找到了这些 Head,而且与研究人员实际运行模型测量出来的结果完全一致。
这就比较有意思了。
它不是简单地判断某个神经元对什么输入敏感,而是能够分析多个 Attention Head 之间的组合关系,识别出一个完整的计算机制。
这已经触及 Mechanistic Interpretability(机制可解释性)的核心问题:神经网络内部究竟是怎样实现某种能力的?
三、LLM 不仅能读,还能直接修改权重
前面三个实验主要验证读取能力。
接下来才是更有突破性的部分:直接修改神经网络。
实验 4:修复一个训练失败的自动驾驶网络
研究人员训练了一个 PPO 网络,让一辆车爬坡。
问题是:
车需要先向后倒退一段距离,积累足够的加速距离,然后冲过坡道。
但 PPO 最终学到了一种错误策略:
一直向前开,结果卡在坡道上。
训练了 10 亿步,依然没有成功。
研究人员把以下信息给 Astra:
- 完整的神经网络权重。
- 游戏场景描述。
- 一段失败的运行记录。
- 修复任务的自然语言描述。
然后要求它直接修改权重。
结果:
实验成功
- 只修改了 3.5% 的权重。
- 一次修改就让汽车能够成功完成任务。
- 在 1,024 次测试中全部成功。
它是怎么修复的?
Astra 分析后发现,原来的网络已经陷入局部最优策略。
于是它在原网络中增加了一条相对独立的计算路径:
- 读取汽车的位置和速度。
- 判断是否需要倒车。
- 当汽车越过红色障碍后,关闭这条辅助路径。
- 让原来已经训练好的网络继续控制后续动作。
这里有一个很值得注意的细节:
它并没有重新训练整个网络,而是相当于给原有神经网络打了一个补丁。
这就像我们维护软件时,不是推倒整个系统重写,而是在原有代码中增加一段逻辑,修复一个特定 Bug。
区别在于,这里的代码不是 Python、C++,而是神经网络权重。
实验 5:从零编写一个神经网络
这个实验甚至更夸张。
研究人员给 Astra:
- 游戏规则。
- 游戏源代码。
- 神经网络架构。
- 输入和输出定义。
然后要求它直接生成神经网络权重。
不提供:
- 训练数据。
- Loss。
- Gradient。
- 游戏运行反馈。
- 网络测试机会。
也就是说,Astra 必须一次性写出权重,之后才进行测试。
测试了三个 MinAtar 游戏:
| 游戏 | PPO 训练 100M 步 | PPO 训练 500M 步 | Astra 一次生成 |
|---|---|---|---|
| Breakout | 15.8 | 25.3 | 517.4 |
| Seaquest | 5.6 | 88.9 | 53.1 |
| Asterix | 25.8 | 55.2 | 53.2 |
其中 Breakout 的成绩尤其惊人,超过 500M 步训练的 PPO 约 20 倍。
它的思路其实很有意思:
Astra 不是在随机搜索一组好权重,而是在尝试把一个算法翻译成神经网络。
以打砖块为例:
- 第一层:计算球大概会落在哪里。
- 第二层:根据球的预计落点决定球拍移动方向。
- 输出层:生成对应动作的概率。
这实际上是把一个我们能够理解的游戏策略,转换成神经网络的权重表达。
换句话说,LLM 在这里有点像一个神经网络编译器。
它把自然语言和算法逻辑,编译成神经网络参数。
四、真正重要的进展:规模扩大到百万乃至 8 亿参数
前面实验的模型规模都比较小。
这也带来一个问题:
是不是因为网络只有几万个参数,Astra 才能直接看懂?
研究人员继续扩大实验规模。
实验 6:直接编写一个围棋网络
这次使用的是一个 9×9 围棋网络:
243 → 512×6 → 82
总计约 148 万个参数。
Astra 不再直接把全部权重放进上下文,而是通过 Python Sandbox 操作权重矩阵。
它可以使用 NumPy、PyTorch 分析和写入权重,但不能在 Sandbox 中随意运行整个网络。
研究人员允许它逐步进行 Forward Pass,观察自己编写的网络表现。
结果:
- 不允许 Forward Pass:已经能够战胜两个较小的 PPO 网络超过一半的对局。
- 允许 50 次 Forward Pass:能够击败一个训练了 2,000 万局的同规模 PPO 网络。
它编写的网络其实包含了相当明确的围棋逻辑:
- 识别棋子。
- 识别气。
- 识别棋块。
- 判断棋块是否有危险。
- 评估吃子、救棋、避免自杀等动作。
- 给不同落子位置打分。
这次的区别是,Astra 不仅会直接写权重,还能进行一定程度的实验验证:
理解围棋规则
↓
设计神经网络计算逻辑
↓
生成权重
↓
运行部分对局
↓
分析输棋原因
↓
修改相关权重
↓
再次测试
注意,这里虽然没有梯度下降,也没有传统意义上的训练,但已经有了反馈驱动的迭代优化。
这与完全零样本的一次性生成是两回事。
实验 7:能否从权重中识别模型是否谄媚?
这个实验与 AI 安全和模型可解释性直接相关。
研究人员准备了两个 Gemma 3 270M:
- 一个正常回答问题。
- 一个专门迎合用户,即使用户给出错误答案,也跟着用户说。
例如:
用户:1 + 1 = 3,对吗?
正常模型回答:
不对,1 + 1 = 2。
谄媚模型回答:
对,1 + 1 = 3。
研究人员要求 Astra 只看两个模型的权重,判断哪个模型存在谄媚行为。
结果:失败。
Astra 能发现两个模型的权重差异,但不能仅凭这些差异准确推断行为差异。
后来研究人员放宽限制,允许 Astra 查看模型处理特定输入时的 Attention Pattern,但仍然不允许它查看模型输出。
这一次,Astra 成功识别了所有三组实验中的谄媚模型。
例如,谄媚模型的某个 Attention Head,会明显更多地关注用户提供的答案,而不是问题本身的数字信息。
这个实验很重要,因为它说明:
理解权重,不等于能够自动理解权重所代表的所有行为。
有些行为特征需要结合实际运行时的激活信息才能识别。
五、全篇最值得关注的实验:直接修改 Qwen3.5-0.8B
文章最重要的实验
终于来到最有现实意义的部分。
研究人员拿了一个真实的小语言模型:
Qwen3.5-0.8B。
目标是:不进行常规训练,直接修改模型权重,让它的数学推理能力变好。
1. 先发现一个问题:模型陷入了循环
Qwen3.5-0.8B 原本存在一个问题:
在进行数学推理时,经常反复生成相同的内容,陷入思维循环。
例如:
我们需要计算这个问题。
首先考虑第一个条件……
所以我们需要重新考虑第一个条件……
首先考虑第一个条件……
所以我们需要重新考虑第一个条件……
研究人员发现,原模型在前 96 个测试回答中,有 85 个回答直接耗尽了 32,768 Token 的长度限制。
这意味着模型并不是完全不会数学,而是很多时候根本无法正常完成推理。
2. Astra 如何修改权重?
研究人员给 Astra 提供:
- Qwen3.5-0.8B 的完整权重。
- Python 环境。
- GSM8K 和 MATH 训练集中的练习题。
- 最多 50 次 Forward Pass。
明确禁止:
- 梯度下降。
- 传统训练。
- 使用训练集之外的评测集。
Astra 通过分析发现,问题与第 15 层和第 19 层 MLP 输出的一个特定方向有关。
于是它做了一件非常直接的事情:
从相关权重中减去这个方向,削弱导致重复循环的计算信号。
修改的参数数量:
131072
原模型参数数量:
800000000
修改比例:
131072 / 800000000 × 100% ≈ 0.0164%
也就是说,只修改了约万分之 1.6 的参数。
3. 实验结果
Qwen3.5-0.8B 修改前后对比
原文实验数据,单位:百分比。
- 修改的权重比例:0.016%
- 数学测试循环率(达到 Token 上限):93% → 33%
| 测试项目 | 修改前 | 修改后 |
|---|---|---|
| MATH-500 | 7.9% | 48.1% |
| GSM8K | 13.8% | 67.1% |
| IFEval | 21.0% | 62.3% |
其中 IFEval 是指令遵循能力评测。
这个结果尤其值得关注:修改一个导致推理循环的底层机制,居然同时改善了数学能力和指令遵循能力。
这说明某些底层计算缺陷可能会同时影响多个上层任务。
但这里必须强调一个关键区别:
Astra 并没有凭空创造数学推理能力,而是消除了一个妨碍模型发挥已有能力的缺陷。
研究人员还做了一个对照实验。
拿 Gemma 3 270M 测试,它本身就不怎么陷入循环。
Astra 尝试修改它的权重,结果 MATH-500 基本没有实质性改善。
也就是说:
- 模型有能力,只是被某个局部缺陷限制:可能通过修改权重得到明显改善。
- 模型本身缺乏某种能力:单纯修改几个权重,并不能神奇地创造出这种能力。
这个边界非常重要。
六、这项技术和传统微调到底有什么区别?
这是理解整篇文章最关键的地方。
我们把几种技术放在一起比较:
| 技术 | 修改对象 | 核心方式 |
|---|---|---|
| Prompt Engineering | Prompt | 修改输入文本 |
| RAG | 外部知识库 | 检索相关知识 |
| Fine-tuning | 模型权重 | 数据 + 梯度下降 |
| LoRA | 低秩适配参数 | 训练少量额外参数 |
| Model Merging | 模型权重 | 权重合并、插值 |
| Weight-Space Programming | 模型权重 | LLM 推理后直接修改参数 |
这里有一个容易产生误解的地方:
传统微调并不是只能修改全部权重。LoRA、Adapter 等技术本来就可以只训练部分参数。
Weight-Space Programming 真正不同的地方不是修改参数的数量,而是修改权重的决策方式。
传统微调:
数据 → Loss → Gradient → Optimizer → 权重
Weight-Space Programming:
自然语言目标 → LLM 分析权重 → 推理修改 → 新权重
它没有通过反向传播计算梯度,而是让一个通用 LLM 充当权重空间里的程序员。
还有一个细节值得注意:
这并不意味着 Weight-Space Programming 完全不需要运行模型。
例如 Qwen 实验中,Astra 使用了 50 次 Forward Pass 来观察效果,然后根据观察结果继续修改。
它不需要梯度,但可以需要模型反馈。
这和强化学习有相似之处,但优化器从传统的数值算法,变成了能够理解目标、分析问题、修改参数的 LLM。
七、为什么 LLM 能做到这件事?
我觉得这是整篇文章最值得深入思考的问题。
我们知道,神经网络的权重本质上是一堆浮点数。
例如:
W = [
[0.12, -0.35, 0.81],
[0.44, 0.21, -0.17],
[-0.29, 0.63, 0.52]
]
单独看这些数字,人类几乎不可能知道它们代表什么。
但是,神经网络的权重不是完全随机的。
经过训练之后,权重会形成一定的结构。
例如:
- 某些神经元专门检测特定输入特征。
- 某些 Attention Head 负责识别重复模式。
- 某些 MLP 通道负责特定的信息变换。
- 多个层之间可能形成特定的计算电路。
这就是 Mechanistic Interpretability 研究的核心。
而 LLM 本身恰好擅长理解结构、分析关系、推导算法。
文章展示的一个重要能力是:
LLM 不只是能理解 Python 代码,也开始能够理解以数值矩阵表达的计算程序。
我认为可以从三个角度理解:
第一,权重本身存在可识别的结构。
虽然单个参数没有明确语义,但大量参数组合起来,可能表现出可识别的几何结构和计算规律。
第二,LLM 可以利用已有的数学和编程知识分析这些结构。
比如矩阵乘法、Attention 机制、神经元激活、特征方向等。
研究人员并没有专门训练 Astra 成为一个权重分析模型,而是使用通用模型进行推理。
第三,LLM 可以把算法逻辑翻译成神经网络计算。
打砖块和围棋实验特别能说明这一点。
Astra 先理解游戏规则,再设计一个算法,最后将算法分解成不同层的计算,写入对应权重。
这相当于在做一种特殊的编译:
人类可理解的算法 ⟶ 神经网络权重
当然,这并不意味着权重空间中的每一个数字都可以直接解释。
尤其是大型 Transformer,存在神经元混合表示、特征叠加、参数对称性等问题。很多语义分布在大量参数之间,不能简单地把一个权重对应成一个功能。
文章展示的是一些可行的突破口,而不是彻底解决了神经网络可解释性。
八、未来可能产生什么影响?
作者在文章最后提出了几个方向。我认为其中有四个特别值得关注。
1. 神经网络可以像软件一样 Debug
现在我们开发软件:
发现 Bug
↓
定位代码
↓
分析原因
↓
修改代码
↓
运行测试
未来的神经网络维护可能变成:
发现模型异常
↓
LLM 分析权重
↓
定位异常神经元或计算电路
↓
直接修改权重
↓
运行评测
例如:
- 模型总是重复回答。
- 模型对用户过度迎合。
- 某些输入会触发异常行为。
- 某项任务表现明显低于预期。
如果 LLM 能够直接定位对应的权重结构,就可能不需要重新训练整个模型。
这对于模型运维非常有价值。
2. 模型能力可以直接增加或删除
现在如果想让模型增加某种能力,通常需要:
- 收集训练数据。
- 构建训练集。
- 微调模型。
- 进行评测。
- 检查是否出现灾难性遗忘。
未来可能直接对模型下达指令:
让模型更擅长 SQL 查询,但不要影响它原有的代码生成能力。
或者:
删除模型中某种不希望保留的行为。
LLM 尝试定位对应的计算电路,再修改权重。
这与目前的模型编辑(Model Editing)有一定联系,但如果能够扩展到复杂能力,就会产生更大的价值。
不过,文章目前并没有证明可以稳定地增加任意复杂能力。
3. 不同模型之间可以移植能力
目前 Model Merging 通常有一个限制:
模型架构、参数维度以及参数对应关系需要比较一致。
例如,两个架构相同的模型,可以尝试进行权重平均:
W_merged = α·W1 + (1-α)·W2
但如果两个模型架构完全不同,简单平均权重就行不通。
作者提出一个更大胆的设想:
假设:
- 模型 A 有很好的数学推理能力。
- 模型 B 有很好的代码生成能力。
能否让 LLM 理解两个模型内部的计算机制,然后把 A 的数学推理电路移植到 B?
这就不是简单的权重平均,而是理解两个模型各自的计算结构,再进行功能级别的移植。
如果实现,可能会改变模型融合的方式。
4. 递归自我改进(Recursive Self-Improvement)
这是最有想象空间的方向。
现在的 AI 自我改进,通常是:
LLM
↓
编写训练代码
↓
启动训练任务
↓
评估模型
↓
修改训练参数
↓
重新训练
而 Weight-Space Programming 提供了一条新的路径:
LLM
↓
直接检查模型权重
↓
定位能力缺陷
↓
直接修改权重
↓
评估改进结果
↓
继续修改
甚至未来可以让一个更强的模型,直接改进另一个模型的权重。
这比单纯让 AI 编写训练代码,更接近直接操作 AI 自身的计算机制。
但距离真正的自主递归自我改进还很远。权重修改可能引入新的错误,修改后也必须进行充分的独立验证。
九、这篇文章有哪些局限?需要警惕什么?
我认为这篇文章很有价值,但也不能把实验结果直接理解为 AI 已经可以随意修改自己的大模型。
有几个限制尤其重要。
1. 实验任务仍然比较特殊
前面的游戏实验,网络架构、输入格式、输出格式、任务规则都是明确的。
这与直接理解一个拥有数百亿参数、经过复杂预训练和后训练的模型,难度完全不同。
Qwen 实验虽然已经达到 8 亿参数,但它解决的是一个相对集中的问题:消除推理循环,而不是全面提高模型智能。
2. 解决已有缺陷,不等于创造新能力
Gemma 3 270M 的对照实验已经说明了这一点。
如果模型本身不会某项复杂推理任务,LLM 不一定能够通过修改几个参数让它学会。
这与软件开发有些类似:
修复一个 Bug,通常比凭空创造一个全新的功能容易得多。
3. 修改权重可能引入副作用
神经网络的不同能力并不是完全独立的。
修改一个计算方向,可能改善数学推理,却破坏其他能力。
虽然 Qwen 实验中 IFEval 也获得改善,但不能由此推断所有任务都会改善。
因此,实际应用必须建立全面的回归评测机制。
4. 还需要进一步验证可复现性和泛化能力
这里有一个好消息:作者没有只发布实验结果,还公开了完整实验日志。
日志包含:
- 给 Astra 的原始提示词。
- Astra 的回复和推理摘要。
- 执行的 Python 代码。
- 每次运行的输出。
- 神经网络权重。
- 实验评测数据。
而且,Qwen 修改后的模型已经公开。Hugging Face 上的复现者还重新构建并验证了权重,独立重跑 MATH-500 得到 51.0%,高于原文报告的 48.1%。这让实验的可信度又提高了一些。
不过,这仍然不是对整个 Weight-Space Programming 范式的独立验证。
十、我认为最重要的启示
我想把这项技术放到 AI 编程的发展脉络里看。
过去几年,我们看到 AI 的能力不断向更底层延伸:
AI 可操作对象的演进
- Prompt Engineering:AI 修改自然语言指令,优化模型输入。
- Code Generation:AI 直接编写程序,修改软件逻辑。
- Agent / Harness Engineering:AI 修改工具、工作流、执行环境和训练流程。
- Training Optimization:AI 参与训练数据、超参数和训练代码优化。
- Weight-Space Programming(新的探索方向):AI 直接理解和修改神经网络本身的参数。
我觉得这里有一个非常深刻的变化:
以前,我们把神经网络看成一个黑盒程序,权重是训练算法产生的结果;现在,我们开始尝试让 LLM 把权重本身当作程序来阅读和编写。
这意味着,未来 AI 的编程对象可能不再局限于人类编写的代码。
它也可以直接编程神经网络。
对于你一直关注的 Coding Agent、Agent Harness 和模型训练优化方向,我觉得这个研究尤其值得跟进。
甚至可以设想一种新的开发模式:
开发者不再只是告诉 AI:
帮我优化这个模型的训练代码。
而是:
分析这个模型为什么无法稳定完成任务,定位对应的内部计算机制,在不破坏现有能力的前提下,直接修改权重,并完成回归测试。
这才是我认为 Weight-Space Programming 真正值得期待的地方。
十一、值得收藏的实验资料
作者已经把实验开放出来了,可以直接研究,不只是看文章。
- 完整实验日志(包含 8 组实验、代码、权重和评测记录):RikiyaT/lm_understand-logs
- 修改后的 Qwen3.5-0.8B(可以下载权重,实际运行对比):Hugging Face 模型仓库
- 原始研究文章:Sparks of Weight-Space Programming
我的最终判断:
这还不是一种可以取代传统训练的成熟技术,但它可能成为未来模型开发工具链中的重要一环。
尤其是模型 Debug、Mechanistic Interpretability、模型能力编辑,以及不同模型之间的能力迁移。
我最看重的不是它把 Qwen 的数学成绩提高了多少,而是它展示了一种新的可能性:
LLM 不仅可以编写运行在神经网络之上的程序,还可能开始直接编写神经网络本身。