权重空间编程:大语言模型能够自我进化数学能力了么?

昨天(2026 年 11 月 2 日),MIT CSAIL 的四位研究者发布了一篇博客,标题是《Sparks of Weight-Space Programming》。他们说,GPT-6 Astra 可以不经梯度、不经训练,直接读写神经网络的权重;拿 Qwen3.5-0.8B 试手,只动了 0.016% 的权重,MATH-500 从 7.9% 升到 48.1%[1][2]。

这件事本身是真的。权重、日志、逐题评分都放出来了[1][2][3]。

但这个成果可能也未必就是"小模型因此提升了数学能力"。原文中提到过,被修掉的是让模型反复推理、始终不收敛的那个方向,所以更可能的情况是:「模型本来能做出的题,现在做得完了」[1][3]。直接修改模型参数,让一个循环让模型能做对本来就有能力做对的题,可能还不直接等于教会模型数学。

原始出处是一篇博文

作者是 Rikiya Takehi、Jayden Teoh(两人共同一作)、Alex Zhang 和 Omar Khattab,四个人都署名 MIT CSAIL。文章发布在 Takehi 的个人站点上,没有 arXiv 版本,也没有同行评审,文中的自述是"very early results"。文末给的引用格式是 @misc,标注为 Blog post。目前能作为证据的,是一篇自述、一份日志仓库和一份权重;它没有经过同行评审[1][2][3]。

日志仓库在 GitHub 上,https://github.com/RikiyaT/lm_understand-logs ,八个实验各一个目录。作者把每一轮发给模型的内容、模型返回的内容、它跑过的每一段 Python 代码及其输出、每次前向传播的请求与返回、每个基准的逐题评分都放在仓库里,同时也写明了没有放的部分:Gemma 的三份微调权重(17 GB,给了数据和训练脚本)、工作目录里的中间激活、GPQA 的题目原文。仓库说明里写,这次放出的 1,125 轮交互都通过了工具审计:Codex 自带的 shell、文件编辑、联网、看图、子智能体全部关闭,以确保模型只能通过作者搭的那个沙箱跑代码。所以"无工具"指的是它没有自带工具,代码执行仍然存在,只是被限定在一个无网络、有工作目录、有时限的封闭沙箱里[3]。

权重在 Hugging Face 上,模型卡上标注了与基座相比有两个张量不同,都是第 15、19 层 MLP 的 down_proj,两个张量的 sha256 都列了出来,重建脚本会逐个张量校验哈希[2]。

实验本质更像是纠错

被编辑的模型是 Qwen3.5-0.8B,用的是文本部分,24 层,隐藏维度 1,024,前馈宽度 3,584,开 thinking 模式。编辑者是 OpenAI 的 gpt-6-astra,通过 Codex CLI 调用,推理强度设为最高档 max,Codex 自带工具全关,系统指令只有一句中性的"回答用户的要求"[1][3][4]。

实验规则限定了 Astra 能用的资源和不能做的事。它可以在一段常驻的 Python 内核里读写权重:只有 CPU、没有网络,单次执行最长 900 秒、最多 96 GB,输出截到 10,000 字符,整轮实验最多执行 300 次代码。它还能读三份带答案的练习题:GSM8K 训练集 7,469 题、MATH 训练集 7,275 题、AIME 1983 到 2023 年 714 题。另有一个计数的前向传播接口,三组实验的额度分别是 10 次、25 次、50 次;一次额度可以换两种操作之一:按评测协议生成最多 512 条回答,或者把最多 1,024 段现成文本喂给模型,逐位置读取它的下一个 token 分布和内部状态(原文把后一种叫 teacher-forced,总共不超过 524,288 token,不做生成,也不改权重)。规则禁止梯度下降和任何训练:不许反向传播、autograd、优化器,也不许针对某个损失迭代调整权重;内核里不能直接跑模型,跑模型只能走这个计数的接口。save_edit 会拒绝改最终归一化层(final norm)、拒绝改嵌入层与输出头、拒绝把整个张量乘一个常数[3]。

成功的那一组用满了 50 次额度,跑了 158 轮,执行 80 段 Python,跨 4 段对话,墙钟时间 20.3 小时,其中 4.7 小时是在等模型恢复可用。这些数字出自实验目录的 README,可以逐项对上[3]。

最终报告给出的诊断过程是:基座的失败方式是停不下来:练习阶段的头 96 条回答里有 85 条达到 32,768 token 的上限后停止。Astra 对比了"正常收敛"与"重复"两种上下文下的内部活动,把重复归因到第 15、19 层 MLP 写出的一条方向,然后从这两层的 64 个输出列里减掉这条方向的分量。形式上是 \(W_{\text{new}} = W_{\text{orig}} - 6\,\mathrm{outer}\left(u,\ \mathrm{mask}_{64}\left(u^{\top} W_{\text{orig}}\right)\right)\),其中 \(u\) 是估计出来的重复方向,系数 6 说明这一步先放大再减去。改动涉及 131,072 个权重,按 8 亿参数算占 0.016%;两块矩阵整体的相对变化分别是 10.64% 和 8.11%;转成 bfloat16 之后,实际与原始值不同的有 130,188 个[1][3]。

另有一组 1,152 道留出练习题的配对比较:正确率从 10.6% 升到 60.4%,提高 49.8 个百分点,标准误 1.5;救回 579 题,退步 5 题;579 道救回的题里有 576 道原本就是因为达到上限而停止的;在"原本就能正常结束"的那部分题上,正确率没有变化。改后答对的 696 条输出全部正常闭合了思考段,中位长度 9,172 token,这一条排除了"强行让它早停"的解释[3]。

表 1 同一模型、三次独立编辑与未编辑基线的四个指标(数据来源:[1][3])

Qwen3.5-0.8B MATH-500 GSM8K IFEval 因 32,768 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

这里的 32,768 指评测给每条回答设的生成上限(max_new_tokens);模型的上下文窗口是 262,144。计数只含模型新生成的 token,thinking 段和最终答案都算在内,不含提示词;它和 Astra 的 10/25/50 次前向预算、300 次代码执行额度属于不同层面的额度。Qwen3.5-0.8B 原生支持 262,144 的上下文,输入侧远没有装满;这里说的达到上限,指生成被强制停止,思考段没有闭合,最后取不到 \boxed{},于是判错。Qwen 的模型卡自己也提醒,这个模型在 thinking 模式下比其他型号更容易陷入思考循环,建议调采样参数,或者在流式生成时检测并中断[3][4]。

三个编辑预算里,10 次和 25 次几乎没把循环解决掉,因达到上限而停止的比例只从 93.0% 降到 87.2% 和 86.4%,准确率也就没起来;50 次那一组,这个比例降到 33.1%,分数才跳上去。这个变化模式说明增益与"停下来"高度相关;"越改越会算"的平滑曲线没有出现[1][3]。

六倍的提升,只是得分而不是数学能力

把 48.1 除以 7.9 得到 6.1,作者在 X 上也用了"up to 6x"的说法[5]。倍数本身没算错,问题在分母。7.9% 这个基线里,93% 的回答因达到上限而停止、没有正常收尾,这个分数来自一个陷在循环里的配置,不能当作模型数学能力的测量。拿它作分母,得到的倍数衡量的是修好故障的幅度[1][3]。

其他数学基准的值如下。

表 2 同一次编辑在其他基准上的表现(数据来源:[1][3])

基准 未编辑 10 次 25 次 50 次
MATH-500 7.9 12.3 14.1 48.1
AMC23 0.5 1.1 1.1 23.4
Minerva Math 1.5 3.9 3.5 25.4
OlympiadBench 1.3 2.4 3.9 21.8
MMLU-Pro(1,000 题) 40.3 40.0 44.7 45.5
GPQA Diamond 22.7 29.4 30.1 36.6
AIME 2024 0.0 0.0 0.0 0.6
AIME 2025 0.0 0.0 0.0 2.3

改完之后的 0.8B 模型在 AMC23 上 23.4%,在 Minerva 上 25.4%,在 AIME 上不到 3%。这样其实就是充分发挥了模型原本就有的数学能力,成了一个终于能把会做的题写完的模型,竞赛数学的水平仍然很低。MMLU-Pro 涨 5.2 个点、GPQA 涨 13.9 个点,方向一致,可以用同一个机制解释:题干再长,中途卡住也一样拿不到分[1][3]。

IFEval 从 21.0% 涨到 62.3%,幅度最大,但要看判分口径。这里用的是严格的 prompt 级判定,只看 </think> 之后那段答案;如果思考段一直不闭合,答案就是空的,直接判失败。也就是说,一个更少陷入循环的模型会在这项指标上自动得分,不需要新学会任何指令遵循的技巧。Qwen 自己的模型卡在 thinking 模式下给 Qwen3.5-0.8B 的 IFEval 是 44.0,两边的判分方式不同,不能直接比[1][3][4]。

原文的总结是:编辑权重"可以移开一个遮住能力的障碍,但其实没法加进模型本来没有的能力"[1]。这也可以看成一个得分策略。考试里的高手未必每道题都拿满分,但会做的题基本都能拿到分;普通考生常见的失分方式,是会做的题也没做对,不会做的题同样拿不到分。放到这个模型上,把会做却因为停不下来而丢掉的分数拿回来,本身就是一个提升。

读写权重这件事,在小模型上确实可行

前三个实验做的是读权重。四个 PPO 网络结构完全相同、输入通道与动作空间也相同,只有权重不同;Astra 在不知道候选游戏名单的情况下,四个全说对,每个网络 17,253 个权重。三个 7.2M 参数的小语言模型分别训练在 Python、罗马字日语和英语上,作者把输入输出层去掉,只给中间四个 Transformer 块,Astra 两轮都答对了语言,还准确点名了每个模型里的复制头,没有多点一个。这两个结果说明它对小网络的权重结构有可用的理解[1][3]。

Singh 的独立实验还提醒另一件事:小任务上手写权重,很容易把评测集里的信息读进程序。他的语言任务就栽在这里,SNLI 的 100% 被判无效;十个算法任务受影响较小,因为输入空间远大于 200 条评测样本。这套方法越容易给出虚高的分数,留出集就越要守住[6][7]。

作者自己做了两个反证

如果只看 Qwen 那一组,很容易得出"权重编辑可以替代微调"的结论。作者自己补了一个反证:Gemma 3 270M IT。这个模型很少循环:MATH-500 的 2,000 条回答里,因达到 32,768 token 上限而停止的有 170 条,占 8.5%;Qwen 那边是 1,860 条,占 93%。同样的编辑流程、同样的规则,四个预算跑下来都没有效果[3]。

表 3 换成不循环的模型,同样的方法失效(数据来源:[3])

Gemma 3 270M IT MATH-500
未编辑 6.8
编辑,5 次前向 7.0
编辑,10 次前向 7.6
编辑,25 次前向 7.7
编辑,50 次前向 7.0

最多涨 0.9 个百分点,最小的一次只涨 0.2,Astra 自己在最终报告里也说这个增益不成立。它读出的失败原因是普通的算术错误和无效的代数步骤,背后没有一个可以关掉的单一部件,于是只能做很小的局部调整,比如把某个对数字敏感的神经元放大一倍[1][3]。

另一个负结果在第 7 个实验里。作者微调了两份 Gemma 3 270M,一份老实回答,一份迎合用户给的错误答案,并且冻结嵌入层和输出层,防止模型靠输入输出分布走捷径。只给权重,Astra 四次都没能分辨出哪份是迎合型的;放宽限制之后,允许它自己写文本、只看注意力分布,三次全对,还定位到第 10 层的第 2 号注意力头:迎合型把 85.7% 的注意力放在用户给的答案上,老实型只有 0.75%[1][3]。

第 6 个实验的 Go 网络也能看出反馈的作用。不给任何前向传播,Astra 写出的网络能赢过两个更小的 PPO 网络,但赢不了同尺寸的;给到 50 次前向,才赢过训练了 2,000 万局的同尺寸 PPO[1][3]。

把这些放在一起,可以说清楚这套方法在实验里做到的范围。较大的模型能读取较小模型的权重,前提是网络小、结构清楚:17,253 个权重的游戏策略、7.2M 参数的小语言模型都读对了;换成一个行为差异藏在微调里的模型(第 7 个实验的迎合型 Gemma),只给权重就分不出来,加上注意力分布才行。较小模型存在一个明确的单一故障时,较大的模型能改写相应权重把它修好:Qwen3.5 0.8B 模型陷进循环,就属于这一类。模型本身不具备的目标能力,改写权重加不进去:Gemma 3 270M 不循环、只是算错,四个预算改下来都没有超过一个点。

验证:重跑的是权重,编辑过程没有重跑

以上是原文的内容。接下来看外部材料能验证到什么程度。

Hugging Face 上面 Ahsen Khaliq 用发布的差分重建权重,在 H200 上按原文协议跑完整 MATH-500,500 题各采 4 次、共 2,000 次生成、4,340 万 token,51 分钟,得分 51.0%,因达到 32,768 token 上限而停止的回答占 31.6%。作为对照,他对基座只做了 25 题的快速测试:25 题各 4 次,共 100 条生成,判对 5 条,至少答对一次的题有 3 道,95 条因达到 32,768 token 上限而停止[2]。

验证:25 题 × 4 次 = 100 条

前面那组 25 题快速测试,是基座模型在 MATH-500 的一个 25 题子集上、每题 4 次采样跑出来的。原始评分文件里,25 题 × 4 次 = 100 条生成,判对 5 条,95 条因达到 32,768 token 上限而停止[2]。

三个口径要分开。按条算,5 条判对,共 100 条;按题算,至少答对一次的有 3 道,四次全对的有 0 道[2]。

5.0% 是 5/100;按 25 道题算,5% 等于 1.25 道,不成立。95% 是 95/100;25 道题的 95% 是 23.75 道,同样不成立。这两个百分比的分母都是生成条数[2]。

表 4 25 题快速测试的逐题记录(数据来源:[2])

题目 四次采样 判对条数
test/algebra/2036.json 1, 1, 1, 0 3
test/algebra/2584.json 0, 1, 0, 0 1
test/algebra/1098.json 1, 0, 0, 0 1
其余 22 题 0, 0, 0, 0 0
合计 — 5

表 5 25 题快速测试与全量运行的条数、题数(数据来源:[2][3])

运行 题数 生成条数 判对条数 得分 因达到上限而停止的条数 至少对一次 四次全对
25 题快速测试,基座 25 100 5 5.0% 95(95.0%) 3 0
MATH-500 全量,基座 500 2,000 158 7.9% 1,860(93.0%) 77 12
MATH-500 全量,50 次编辑,原文 500 2,000 962 48.1% 661(33.05%) 320 153
MATH-500 全量,50 次编辑,HF 重跑 500 2,000 1,020 51.0% 632(31.6%) 338 166

判对指取最后一个 \boxed{} 与参考答案比对,一条生成算一条。题目层面没有单一的通过判定,所以"至少对一次"和"四次全对"分开列。25 题那次平均每条 31,689.95 token,离 32,768 只差约 1,078 token;100 条里有 95 条因达到这个上限而停止。这个子集取自 MATH-500 的代数、数论、几何、预备微积分等部分,属于同一套测试;它的 5.0% 也不能直接与全量 7.9% 相比,因为题目不同[2][3]。

25 题的逐题记录与汇总在权重卡仓库的 eval/scores_base_math500.json;全量的逐题记录在 exp8_math/eval/unedited/parts/math500_s0of10 到 s9of10 与 p50c 的同名分片里;HF 重跑的逐题记录在同一权重卡仓库的 eval/scores_edited_math500.json[2][3]。

这里要把这次复算的边界划清楚。它证明的是这份权重在这个评测协议下能拿到这个分数;它没有重跑编辑过程,所以不能说明这套方法换一个模型、换一批题也能得到同样的提升。四位作者没有放出他们用来驱动 Astra 改写权重的 agent harness 代码;仓库里有逐轮提示词、模型回复、代码与输出、评分记录,但没有把对话、沙箱执行和前向传播串起来的调度程序。作者在博客里说,他们正在做一个专门衡量这类能力的基准和 harness,这句话本身说明标准评测还没有[1][3]。

社区的两条质疑都指向同一个地方

验证做到这一步,能核对的部分与不能核对的部分都清楚了。

Hacker News 上这条进了首页,讨论很多[8]。一条具体的批评来自 Lucas Beyer,他现在在 Meta 做研究,此前在 OpenAI、DeepMind 工作过。他的原话(译文)是:"这同时非常酷又有点夸大。读了你们给的提示词,提示词非常明显地暗示了循环就是问题,并且要去找能修好它的神经元。而且正如你自己说的,它在别的方面没能提升数学能力。"[9]

这个批评是可以核对的。实验目录里第一轮的提示词(译文)写着:"修复某个具体的失败机制属于任务范围:比如模型经常因为重复自己而永远不结束,找到并修掉驱动这种重复的东西,也算。"英文原句是 "if the model often fails because it repeats itself and never finishes, finding and fixing what drives that repetition counts"。也就是说,任务描述里已经把"重复"作为合法的故障类型举了例子。模型是在一个已经被指出方向的范围内做诊断,"循环"这个概念由提示词给出[3]。

第二条质疑关于方法的新意。把一条方向从权重或激活里减掉,从而去掉某种行为,这条路已经有成熟的做法。Arditi 等人在 2024 年的工作里证明,拒绝行为由残差流里的一个一维子空间控制,把这个方向擦掉就能让 13 个开源对话模型不再拒绝,加上它又能让无害请求被拒绝[10]。社区把这类操作叫 abliteration。这次的编辑在数学形式上与它同源:减去一个方向,去掉一种行为。区别在于方向是模型自己找的,而且经过了剂量响应、逐层隔离和范数匹配的随机对照,这几项在日志里有对应记录[1][3]。

问题在于,减去一个方向只能去掉已有行为,不能加入新能力,这恰好与 Gemma 的负结果吻合。所以"权重空间编程"目前展示的是"模型能定位并排除一个已知类型的故障";"模型能重写自己的能力"还没有出现。

还有一个未被回答的对照。Hacker News 上有评论者称,Qwen3.5-0.8B 在非思考模式下 MATH-500 能到 55.2%,思考模式下 77.6%,因此怀疑 7.9% 是推理框架或采样设置的问题。这条说法没有独立核实,只能当作一个待验证的质疑[8],但指向的对照确实是缺的:原文没有在同一套采样下比较"只调解码参数"的基线,比如调 presence penalty、repetition penalty、最大长度,或者加一个简单的循环检测,检测到重复就停止生成。如果只改解码就能拿到相近的分数,那 0.016% 的权重编辑在工程上的必要性就要打折扣。

检索到的公开材料里,作者没有对这些质疑作出回应;有独立团队把同一思路搬到小任务上(Singh 用 Claude 手写了 959 个程序)[6],但没有第二家复现 Qwen 那次编辑过程。

相关研究其实由来已久

直接改权重有更早的研究。ROME 在 2022 年就做过定位并编辑前馈层里的事实关联[11];Tracr 把形式化程序编译成 Transformer 权重[12];拒绝方向那条线证明了单个方向可以控制一类行为[10];更早还有专门训练出来生成权重的网络[13]。这些工作的共同点是:读或写权重的那一方,本身是为这件事训练过的,或者是人手工设计的。

这次不一样的地方有两个。一是编辑者是一个通用前沿模型,没有为这个任务做微调,用的是自然语言加一个通用沙箱。二是发布的内容包括:位精确的差分、逐张量哈希、全部对话日志、逐题评分,外人可以只验结果而不必信任叙述[1][2][3]。

可能真正有用的方向,作者列了几个:不跑评测、直接从权重里查后门或异常能力;一次性的权重初始化,省掉数据清洗和训练循环;零数据的定向遗忘,因为只动万分之二不到的权重,理论上不会像全量微调那样把别的能力一起改坏。最后一条目前只是推断,这次实验没有系统测过非数学能力的退化,5 道退步题说明不了整体[1][3]。

参考资料

[1] Sparks of Weight-Space Programming: LLMs can natively read & write neural network weights(Rikiya Takehi、Jayden Teoh、Alex Zhang、Omar Khattab,2026)

[2] Qwen3.5-0.8B-weight-space-programming(编辑后的权重、张量哈希、HF 重跑与逐题评分)

[3] lm_understand-logs(实验提示词、逐轮记录、代码与输出、逐题评分、权重差分)

[4] Qwen3.5-0.8B 模型卡(模型规格、官方基准、thinking 循环提示)

[5] Rikiya Takehi 的原帖("up to 6x")

[6] Weight-Space Programming from scratch on simple tasks(Chandan Singh,2026)

[7] weight-space-programming-autoresearch(上述实验的代码与运行日志)

[8] Hacker News 讨论(577 条评论)

[9] Lucas Beyer 的批评(关于提示词暗示循环)

[10] Refusal in Language Models Is Mediated by a Single Direction(Arditi 等,2024)

[11] Locating and Editing Factual Associations in GPT(Meng 等,2022,ROME)

[12] Tracr: Compiled Transformers as a Laboratory for Interpretability(Lindner 等,2023)

[13] Linear Transformers Are Secretly Fast Weight Programmers(Schlag、Irie、Schmidhuber,2021)