Weight-Space Programming:LLM 直接读写神经网络权重 · 干货攻略

  • 仓库:RikiyaT/lm_understand-logs
  • 链接: https://x.com/rasbt/status/2117688749132013704
  • 分类: x-tips
  • 来源: X @rasbt
  • 作者: Jay
  • 更新: 2026-11-05

这是什么

这条 X 推文本身只有一句话加一张梗图:"What could possibly go wrong?"(还能出什么问题呢?),配图是一堆手绘方块拼成的"全部现代数字基础设施",箭头指向其中最细的一根柱子,标注为"the sign of a single trained weight in the feed-forward module (MLP) of transformer layer 13"(Transformer 第 13 层前馈模块里一个训练好的权重的重要性)。

梗图下面转推了 MIT CSAIL 团队的实验分享(@rikiyatakehi,2026-11-02 发布,https://x.com/rikiyatakehi/status/2117313742891327994):他们让一个前沿 LLM(GPT-6 Astra)在不用梯度、不用训练的前提下,直接读取并改写另一个模型的权重,并把这个方法命名为 Weight-Space Programming(权重空间编程)。

所以这条推文真正在转的是:当模型可以像读代码一样读权重、改权重时,"训练"这一步可能不再是唯一路径。梗图的调侃是——整套现代 AI 基建的地基,可能就是某个 MLP 里一个具体权重;它指向的实验结论更硬:改 0.016% 的权重,能把一个 0.8B 模型的数学成绩从"几乎全是被截断的废答"拉到接近一半。

需要澄清一处:梗图写的是"第 13 层",但实验里真正被编辑的是第 15 层和第 19 层的 MLP。梗图是泛化的调侃,不是对具体实验的描述。


核验来源

本篇所有数字均以官方出处为准,逐项对照如下。

1. 原帖与原始出处

  • rasbt 推文:https://x.com/rasbt/status/2117688749132013704 (发布时间 2026-11-03)
  • 被转推的原始线程:https://x.com/rikiyatakehi/status/2117313742891327994
  • 官方技术博客(本次实验的一手来源,作者 Rikiya Takehi、Jayden Teoh、Alex Zhang、Omar Khattab,均属 MIT CSAIL,2026-11-02):https://rikiyat.github.io/blog/weight-space-programming/

2. 官方博客给出的实验 8 数据(Qwen3.5-0.8B,thinking 开启,上限 32,768 token)

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

改动量:只改了第 15、19 层 MLP 的 64 个输出列,共 131,072 个权重,占 0.8B 参数的 0.016%。

3. 官方模型卡(Qwen 官方,原始出处)

Qwen3.5-0.8B 的 Hugging Face 模型卡第 856 行原文写明:在推荐的采样参数下,该模型比其他 Qwen3.5 模型更容易陷入 thinking loop,可能无法正常终止生成。https://huggingface.co/Qwen/Qwen3.5-0.8B/blob/main/README.md#L856 —— 实验正是针对这个官方已声明的缺陷。

4. 官方发布与第三方复现

  • 编辑后的模型已上架:https://huggingface.co/RikiyaT/Qwen3.5-0.8B-weight-space-programming
  • 模型卡记录:仅 model.language_model.layers.15.mlp.down_proj.weight 与 ...layers.19.mlp.down_proj.weight 两个张量与原版不同,其余逐字节相同,并给出 sha256。
  • 第三方(akhaliq)独立重跑:MATH-500 全量 500 题 × 4 采样 = 2,000 次生成(H200 上 51 分钟,vLLM / transformers 5.20.2),编辑后模型得 51.0%,触及上限比例 31.6%;原始模型 25 题冒烟测试为 5.0%,95% 触及上限。
  • 全部实验日志(含每次发给 Astra 的 prompt、它返回的内容、每一条代码及其输出、评测原始数据):https://github.com/RikiyaT/lm_understand-logs ,实验 8 在 exp8_math/。
  • 在线 demo:https://huggingface.co/spaces/akhaliq/weight-space-programming-demo (输入题目,对比原模型与编辑后模型)

5. 关键的"反例"实验(同样来自官方博客,不能忽略)

作者另做了一组:换成 Gemma 3 270M(几乎不陷入循环,只有 8.5% 的答案触及上限),Astra 没能改进它——MATH-500 从 6.8 只到 7.0 / 7.6 / 7.7 / 7.0,且 Astra 自己报告说这点提升"未被证实"。

6. 评论区提出的质疑与官方数据的回应

rasbt 推文下的读者补充(由 X 的 readers-added-context 渲染)里有两个尖锐问题:@tfmlab 指出"没有人会肉眼审阅 0.016% 的 diff";@flaviusburca 问"这是不是只测了目标评测集,有没有跑留出集和通用 benchmark 看回退"。

后者在官方数据里有答案:exp8_math/README.md 记录了 8 个 benchmark 的完整结果——MMLU-Pro 40.3 → 45.5、GPQA Diamond 22.7 → 36.6、AMC23 0.5 → 23.4、Minerva Math 1.5 → 25.4、OlympiadBench 1.3 → 21.8,未见通用能力回退。至于"diff 无人审阅",官方给出的应对是位级可验证:编辑以精确 diff 形式发布,重建脚本对每个张量做 sha256 校验。


上手步骤

想自己复现或在这个方向上动手,路径如下。

第一步:先看现象本身,不用装任何东西

打开 https://huggingface.co/spaces/akhaliq/weight-space-programming-demo ,输入一道数学题,观察原模型在 thinking 模式下重复刷屏直到撞上 token 上限,而编辑后的模型能正常收敛出答案。这是理解整件事代价最低的方式。

第二步:把官方编辑应用到自己的基座上

编辑的 diff 在仓库 exp8_math/runs/p50c/edit/(manifest.json + edit.npz),重建脚本是 exp8_math/code/apply_edit.py。脚本用法(取自其官方 docstring):

# <base model.safetensors>:Qwen/Qwen3.5-0.8B 的 model.safetensors
#   revision 2fc06364715b967f1860aea9cf38778875588b17
# <run's edit dir>:exp8_math/runs/p50c/edit
# <out>:以 .safetensors 结尾则输出完整权重文件,否则输出 float32 .npy 分片
python exp8_math/code/apply_edit.py <base model.safetensors> exp8_math/runs/p50c/edit <out>.safetensors

脚本会先校验基座张量的 sha256 与 manifest 是否一致,再重建并校验编辑后张量的 sha256,任一不匹配即报错退出——也就是说你不需要信任作者的话,你只需要信任哈希。

第三步:按官方协议复现评测

评测代码在 exp8_math/code/:evaluate.py(评测)、mathqa.py(用 math-verify 抽取并判分最后一个 \boxed{})、merge.py(从 parts/*/scores.json 合并出 merged.json)、profiles.py(采样协议 think35)。官方协议要点:vLLM + 开启 thinking 的 chat template、用户消息为"题目 + 请逐步推理并把最终答案放进 \boxed{}"、temperature 0.6 / top_p 0.95 / top_k 20 / presence_penalty 1.5、最多 32,768 新 token;每题采样数 MATH-500 4、GSM8K 2、AMC23 16、Minerva Math 4、OlympiadBench 4、GPQA Diamond 4、IFEval 2、MMLU-Pro 1(固定 1,000 题)。

第四步:把它当方法而不是当结论

如果你要在这条路径上继续做,官方博客给出的工程结论比实验本身更重要:当前瓶颈主要在上下文长度和 harness 的效率,而不是 LLM 读权重的天分。作者下一步在做的是 Weight-Space Programming 的标准 benchmark 和 harness。可预期的方向有三个:不跑评测就能从权重里审计后门或隐藏能力;一次性初始化权重省掉整轮训练;以及跨架构嫁接"回路"(例如把一个模型里的推理模块接到另一个架构完全不同的模型上)。


适用边界

能成立的结论

  • 在单一、局部、可定位的故障上,LLM 直接改权重确实有效且代价极小:0.016% 的权重、50 次前向、约 20 小时墙钟时间,换来 MATH-500 从 7.9% 到 48.1%。
  • 前提是问题有单一成因。思维循环正好符合:作者把它归因到第 15、19 层 MLP 写下的同一个"循环方向",并从每层 64 个最常写该方向的输出列里把这个方向减掉。

不能外推的结论

  • 这不是"让模型更聪明"。博客写得很直白:修循环只是让模型能答完它本来就能算出的题。576 个"救回"的答案原本全都是被截断的输出;在原本就能答完的题上,准确率没有变化。
  • 不能给模型加能力。Gemma 3 270M 上完全失败——作者自己的总结是"编辑权重能移除挡住能力的障碍,但造不出模型本来没有的能力"。
  • 效果强烈依赖前向预算。10 次和 25 次前向的结果几乎没消除循环(MATH-500 仅 12.3% 和 14.1%),只有到 50 次才跳到 48.1%。这说明当前 harness 下"找到并验证一个编辑"的效率还很低。
  • 只在 0.8B 规模、只在一个模型、一个编辑模型(GPT-6 Astra)上验证过。作者自己写明"结果仍有限制,尤其受上下文长度和 harness 效率拖累"。
  • 不是微调的替代品。目前微调仍是改变模型行为的实用手段;权重编辑适合的是"精准摘除某个已知病灶"这类场景。

工程上的真实风险

  • 0.016% 的 diff 没有可读性。人类审阅一个 131,072 元素的权重差异在实践上不可能,只能靠基准测试和哈希校验兜底。@tfmlab 的吐槽是这条路线最本质的问题:改动面越小,可解释性越差。
  • 安全性:博客明确把"无需评测即可从权重中发现后门"列为未来可能性。同样地,一个能在权重层面做定向写入的 LLM,也是攻击面。
  • 评测本身有噪声:官方 README 明确记录了 GPQA Diamond 原始模型的一个数字勘误——博客图里显示的 24.5 是 198 题中只评完 149 题时的中间值,完成后的最终值是 22.7。另外只跑了 50 次前向的编辑版,"原答案也能答对的 696 题"全部正常收尾(长度中位数 9,172 token),这一条是排除"靠提前截断换分"的关键证据,但同样是有限采样下的结论。

尚无公开产物

  • benchmark 和 harness 仍在建设中,官方未发布,本文不臆测其形态。
  • harness 本体代码(prompt、sandbox、前向服务)未随仓库公开,只有规则写在 prompt 里;这意味着想完全复刻 Astra 的行为轨迹是不现实的,只能复用其 prompt 骨架与权重 diff。
  • 仓库不包含各 run 的工作目录(每个 0.5–2.5 GB)、GPQA Diamond 的完整生成文本、每个采样的逐条长度数据。

一处需要读者自行判断的地方:独立重跑给出的编辑后 MATH-500 是 51.0%,高于博客的 48.1%,而原始模型的 25 题冒烟测试只有 5.0%(95% 触及上限)——样本量、题目集和评测细节与全量评测并不完全对齐,因此这个"独立验证"更像是确认了效应方向和量级,而不是一次严格复现。


一句话结论

这条推文用一张梗图说了一句很重的话:现代 AI 基建的地基可能只是某个 MLP 里的一个权重——而现在,LLM 自己就能找到它、删掉它。实验证明这在"单一病因"上是真的(MATH-500 7.9% → 48.1%,改 0.016% 权重,位级可验证、第三方重跑方向一致),但同样清楚地证明它不能造能力、不能替代微调、且严重受制于 harness 效率。值得跟,但别当"训练已死"的证据。