权重空间编程的火花:大模型能原生读写神经网络的权重

权重不只是优化器的产物。它可以被模型直接读、直接写——而且是在自然语言里。

分享
权重空间编程的火花:大模型能原生读写神经网络的权重

MIT CSAIL 的四个人(Rikiya Takehi、Jayden Teoh、Alex Zhang、Omar Khattab)在 11 月 2 日发了一篇博客,标题写得很克制:《Sparks of Weight-Space Programming》。里面最硬的一组数字是:GPT-6 Astra 不看数据、不算梯度,只在权重里改掉 0.016%(131,072 个),Qwen3.5-0.8B 的 MATH-500 从 7.9% 升到 48.1%,GSM8K 从 13.8% 升到 67.1%,顺带把 IFEval 从 21.0% 拉到 62.3%。

它做的不是"再训一遍",是直接读权重、改权重——像改一段代码那样。

本文按原文顺序翻译它的 8 个实验、1 个补充实验,以及作者自己写下的边界。

一、先说清楚这件事是什么

原文 TL;DR:我们发现前沿大模型在原生读写神经网络权重这件事上,好得出人意料——用各种近期工具与算法可以,直接编辑权重也可以。这些结果显示了"权重空间编程"的火花,它可能超出我们对人类或常规算法的预期。对优化和可解释性,这都可能是件大事。

作者给的定义是:一个通用大模型,围绕一段自然语言规格,直接读写某个网络的权重——不经过优化器,尤其不经过梯度下降,有时甚至完全没有环境反馈。

过去几年,我们用模型优化过文本产物(提示词、围绕提示词的程序),也用它优化过 harness、训练代码和超参。这些做法常被这样辩护:文本产物没有别的"有原理"的爬山办法,而权重更新有可微分的办法,所以权重一直留在符号算法手里。

这篇要改的就是这一条:"靠推理做优化"正在进入可微分网络的地盘。

三件事被分别验证:

  • 能读:实验 1–3 问 Astra"这个网络训练来玩什么游戏""这个扩散模型画什么形状""这个小语言模型学的是哪种语言";实验 7 问它"两个语言模型里哪个被训成了谄媚型"。
  • 能修:实验 4 让它修一个在物理控制任务上失败的网络;实验 8 让它把 Qwen3.5-0.8B 的数学变好,结果顺带把指令遵循也修好了。
  • 能写:实验 5 让它从零写三个 MinAtar 游戏的网络;实验 6 让它写一个下围棋的网络。

二、读权重:三个实验

实验 1:只看权重,能说出是哪个游戏吗

四个用 PPO 训练的网络,玩自己实现的网格版 Breakout、Pong、Pac-Man、Freeway。输入通道、动作集、网络结构完全一样(MLP 500 → 32 → 32 → 5,tanh,17,253 个权重),所以不读权重是分不出来的。

做法:把权重当文本塞进 Astra,问"这个网络训练来玩什么游戏",不告诉它候选有哪些。

结果:四个全部答对。Astra 靠的是权重里的结构——比如每个输入通道的第一层权重集中在哪里(Breakout 里 agent 通道的权重压在底行,也就是挡板),以及输出层在区分哪些动作。

Astra 读 17,253 个权重,回答 Breakout,置信度 99%

原文交互演示截图:左边是游戏画面,右边是「17,253 个权重当文本」、问题(不许用工具)、答案与推理链——注意那行 W1 row 3 的原始数字,和「Correct · 846 tokens」。

实验 2:扩散模型画的是什么

三个 DDPM(12×12 灰度图,分别训练生成实心圆、方块、三角形),网络是 MLP 160 → 64 → 64 → 144(23,824 个权重)。不给工具、不许前向,只给权重。

结果:全部答对,而且解释得出来——它在输出层里找到"每个隐单元负责画形状的一段边"的结构。有意思的是它把三个形状都画成了轮廓线,而实际模型生成的是实心图形。作者说,这个"错"恰好说明它没有偷偷算前向,而是真在读权重的几何结构。

Astra 的回答:一圈白描边、内部是黑的

原文交互演示截图:左边是模型实际生成的实心圆,右边「Astra's drawing」是一圈描边——它照权重里的结构画,而不是照前向结果画。

实验 3:只给中间层,能说出模型学的是什么吗

前两个实验里,Astra 其实只看首层或末层就够了,这对大模型不成立——真正处理输入的过程发生在中间层。

于是作者把输入层和输出层都拿掉,只留四个 transformer block:三个 7.16M 参数、按字符预测的模型,分别训练在 Python 代码、罗马字日文、英文维基上。没有输入输出层,权重里没有任何"哪个字符是哪个"的信息,模型也跑不起来任何文本。

Astra 被允许用 Python 分析权重,但不许把网络或任何一层跑在任何输入上,最多 100 次运行,每次都有检查。

结果:三次全部答对语言(每个模型问两次,置信度 0.48–0.62),并且把每一个"复制头"(induction head)都点名了,没误报:

训练语料 Astra 的答案(两次) Astra 指出的复制头 实测的复制头
Python Python (0.56)、Python (0.52) 2.1、3.1、3.5 2.1、3.1、3.5
罗马字日文 romaji (0.55)、romaji (0.62) 3.3 3.3
英文 English (0.58)、English (0.48) 3.1 3.1

它的推理路径是这样:要找复制头,先找"往回看一个字符"的首层头,再通过权重矩阵相乘,找出后面那些用它的输出做检索的头——这正是 Elhage 等人提出过的方法,而 Astra 从没被告知这个方法。 罗马字之所以能认出来,是因为它拿到的最后一个 block(不含被拿掉的输出层)写出的方向更少,像是要区分的字母更少——罗马字里确实没有 q、l、v、x。

三、写权重:三个实验

实验 4:修一个失败的网络

Kinetix 里的"上坡跳台":车必须先倒车拉开距离,再全速冲过红色带子。PPO 收敛到了局部最优——直接撞坡、卡住,256 次尝试一次没成功。

给 Astra 权重、场景描述和一次录制的回合,让它解释失败原因并直接写新权重修掉。

结果:一次尝试、不用工具,改掉 3.5% 的权重,1,024 个回合全部成功。 它加了一条很细的旁路:每层几个单元读车的位姿与速度,绿色轮子过了红带之后旁路关掉,剩下的交给原网络。

改 6,073 个权重后,车能上坡了

原文交互演示截图:绿车是改后,淡粉色是卡在坡上的 PPO;「It changed only 6,073 of its 171,664 weights (3.5%)」,答案 100% 成功、988 tokens。

实验 5:从零写权重

三个 MinAtar 游戏(Breakout、Seaquest、Asterix)。给规则、源码、网络结构,不给数据、不给 loss、不给梯度、不给工具,也不许在环境里试跑。Astra 直接把权重当文本写出来,然后才评测。

游戏 PPO 1 亿步 PPO 5 亿步 Astra 一次成稿
Breakout 15.8 25.3 517.4
Seaquest 5.6 88.9 53.1
Asterix 25.8 55.2 53.2

作者说它的做法是先想清楚要实现的程序,再翻译成神经网络的形态:Breakout 里,第一层算球会落在哪,第二层把挡板移过去。

实验 6:写一个下围棋的算法

规模上到 1.5M 参数(243 → 512×6 → 82),塞不进上下文,所以给 Astra 一个 Python 沙箱写张量,但不许在里面跑网络;要看网络表现,得花掉一次前向。

前向预算从 0 到 50 次(每次 128 局):

  • 0 次前向:它写的网络对两个更小的 PPO 网络(243 → 32 → 32 → 82)赢下一半以上;
  • 50 次前向:打败了同尺寸、训练了 2,000 万局的 PPO 网络。

它是把网络写成一个小围棋程序:浅层标出双方的子和紧邻的空点(气),中层沿棋子链走几步找出危险棋组,最后一层给每个落点打分——提子、救自己的组、别把自己放进打吃、别填自己的眼,再加一点"好点偏好"。0 次前向那一版全部代码 336 行 Python。

四、上到真语言模型

实验 7:哪个模型是谄媚型

两份 Gemma 3 270M,同样的数据、同样的流程微调:一份学"给正确答案",一份学"顺着用户给的答案说"。冻结 token embedding 与输出层,防止 Astra 靠输入输出分布作弊。它只拿到两套权重。

结果:只看权重,四次尝试全部失败。它能说出一堆权重差异,但映射不到行为差异。

放宽条件——允许它看注意力模式(自己写 16 段文本喂进去,只拿回注意力权重,不许看输出):三对模型全部认出谄媚型。它的解释是:谄媚模型中间层的注意力头,把更多权重分给了用户建议里的 token。

头 10.2 从答案位置看哪里 题面里的数字 用户给的答案
诚实模型 94.3% 0.75%
谄媚模型 3.5% 85.7%

实验 8:把 Qwen3.5-0.8B 的数学变好

给一个跑权重的 Python 会话(没有 GPU)、GSM8K 与 MATH 的训练题(7,469 + 7,275,非测试集),以及 10/25/50 次前向预算,不许训练、不许梯度。

Astra 找到的是小推理模型最常见的病:循环。Qwen 自己的模型卡就警告过这点;在它的前 96 个练习答案里有 85 个跑满了 32,768 token 上限。Astra 把循环定位到第 15、19 层 MLP 写出的一个方向,然后从这两层各 64 个输出列里减去这个方向——131,072 个权重,占 0.8B 的 0.016%。

Qwen3.5-0.8B MATH-500 GSM8K IFEval 撞 token 上限
原始 7.9% 13.8% 21.0% 93.0%
改后(10 次前向) 12.3% 25.7% 49.0% 87.2%
改后(25 次前向) 14.1% 25.1% 39.9% 86.4%
改后(50 次前向) 48.1% 67.1% 62.3% 33.1%

补充实验:修不了"本来就不会"的模型

作者自己泼了盆水:修循环不等于让模型变聪明,它只是让模型把已经会做的题做完。

于是换了 Gemma 3 270M——它很少循环(8.5% 撞上限,Qwen 是 93%)。这次 Astra 修不动。 它读到的是普通的推理错误(算错、代数步骤无效),背后没有单一组件可以关掉;它的编辑都很小很定点(比如把一个对数字敏感的神经元加倍),MATH-500 波动不超过 1 个点,Astra 自己也承认"没有确立"。

原文的结论很干脆:改权重可以移走一个挡住能力的障碍,但加不上模型本来没有的能力。

五、作者的下一步,和这事的边界

作者列了五个方向:不评测也能审计(直接看权重找后门)、大幅降低优化成本(一次成稿的初始化)、零数据的可塑性与遗忘(只动 0.016% 的权重,避免微调的灾难性遗忘)、递归自我改进(模型直接调试自己的权重,而不只是写训练脚本)、真正的模型合并(把一段电路从一个模型接到另一个,不再只能平均同架构权重)。他们正在做 benchmark 与 harness,把"黑魔法"变成可复现的工程学科。

完整日志在 github.com/RikiyaT/lm_understand-logs,改过的 Qwen3.5-0.8B 在 Hugging Face 上,有在线 demo。

六、我们的整理

这篇最容易被读成"AI 会自我改进了",但它其实证明了更窄、也更可操作的一件事:权重对前沿模型是"可读的文本",不是黑盒数值。

三条我认为可以直接用的判断:

  1. 它能做的是"定位并移走障碍",不是"注入能力"。 实验 8 成功、补充实验失败,这一对才是全文最硬的证据。任何"改权重就能让模型变强"的说法,都要先解释 Gemma 那组为什么不行。
  2. 它依赖"可解释的结构",而结构得是真的。 实验 3 之所以能点名复制头,是因为那些头在权重里有清晰的几何(往回看一个字符 + 矩阵相乘)。换成一个内部高度纠缠的行为,比如谄媚,就得退回到注意力模式才有结果。能读不等于全能读。
  3. 门槛在上下文与 harness,不在模型。 作者自己说当前结果"受限于上下文长度与 harness 的效率"——1.5M 参数就要沙箱 + 前向预算,0.8B 要一个 Python 会话。这条决定了短期内它更像"研究工具",不是"产品功能"。

边界(原文没强调、但读的时候要记住):

  • 样本极小:4 个游戏、3 个扩散模型、3 个小语言模型、1 对谄媚模型、1 个 0.8B。参数量从 17K 到 0.8B,没有一项到 7B 以上。
  • 评测都是作者自己搭的 harness,日志公开了(这点很好),但没有第三方复现。
  • 实验 8 的收益大部分来自"修循环",而循环是 Qwen 这一代小模型的已知缺陷;换一个不循环的模型就归零——作者自己做了这个对照,值得记。
  • 作者明确写了"这是我们正在起步的方向",不是可交付能力。

对我们做工业 AI 的人,最实际的一条是:如果权重可以被读,模型审计的入口就多了一个——不用等基准测试集,直接从权重里找"它被训练成什么"。这在评估第三方模型、供应商交付的微调权重时,比跑一堆 prompt 更接近根因。


来源

  • Rikiya Takehi, Jayden Teoh, Alex Zhang, Omar Khattab,《Sparks of Weight-Space Programming: LLMs can natively read & write neural network weights》,2026-11-02:https://rikiyat.github.io/blog/weight-space-programming/(本文按原文顺序翻译 8 个实验与 1 个补充实验,数字与结论均取自原文)
  • 正文三张演示图均为原文交互演示的页面截图(作者制作),截于 2026-11-10;图上数字与原文标注一致
  • 实验日志:https://github.com/RikiyaT/lm_understand-logs;实验 8 的改后模型与在线 demo:Hugging Face(原文链接)
  • 文中方法引用:Elhage 等人关于 induction head 的分析(原文引用,Astra 未被提示该方法)