# Heuristic Learning 到底在说什么
我先从一个具体的画面开始。
想象你在教一个小孩打砖块(Breakout)。不是用神经网络——那东西像个黑盒子,你调了成千上万个旋钮,最后它"学会"了,但你不知道它怎么学会的。不,你是手把手教:球在左边,挡板往左;球快到底了,提前预判落点;球卡在一个循环里来回弹,你要故意偏移一点打破它。
这些规则写成代码,一行一行,人能看懂。小孩——不,是 Coding Agent——看了失败回放,加一条规则,测试,再看,再加。最后分数从 99 涨到 387,再到 507、839,直到满分 864。
这不是奇迹。这是**维护**。
---
## 忘掉"Heuristic Learning"这个名字
翁家翌给这东西起了个名字叫 Heuristic Learning(HL)。名字不重要。重要的是搞清楚它在做什么。
Deep RL 的做法是:你有一个神经网络,它吃状态(游戏画面、机器人关节角度),吐动作(往左、往右、施加力矩)。你给它 reward(得分、前进距离),它用梯度下降调整自己的内部参数。几百万步之后,它"学会"了。但你打开网络看,一堆矩阵乘法,你根本不知道它在想什么。
HL 的做法完全不同:它不碰神经网络,不更新任何权重。它的"大脑"是一堆代码规则——if 球在左边 then 挡板往左,if 卡住循环 then 加偏移。当规则不够用了,Coding Agent 读失败日志、看视频回放,然后直接改代码。
关键是:改的不是神经网络的参数,是**软件结构本身**。
---
## 一个类比:修自行车
Deep RL 像什么呢?像你把自行车扔进一个自动调参机,机器胡乱拧螺丝、调齿轮,试了几百万次,最后自行车能骑了。但你问它"链条张力是多少",它说"我不知道,但这样好用"。这叫黑盒优化。
HL 像什么呢?像你自己修自行车。你骑了一圈,发现变速卡档,你停下来看——是后拨螺丝松了?还是链条太长了?你拧一拧,再骑一圈,再记录问题。你的知识不是以"螺丝角度 47.3 度"的形式存在,而是以"如果卡档,检查后拨"的规则存在。
这两种方式都能让自行车好骑。但第二种方式有一个 Deep RL 永远比不了的优势:**你能看懂自己在修什么**。
---
## 为什么以前没人这么做
规则系统(expert system)几十年前就存在了。当时的问题是:维护成本太高。今天加一条规则修 case A,明天发现 case B 被修坏了,后天再加一个 if,大后天没人敢删了——屎山代码。
翁家翌的核心洞察是:Coding Agent 改变了这条**维护成本曲线**。
以前维护规则需要人类工程师,人力有限,规则多了就养不起。现在 Coding Agent 可以 24 小时读日志、改代码、跑测试、看视频回放。它不会累,不会忘,不会说"这段代码不是我写的我不敢动"。
这不是说规则突然变强了。规则还是那些规则。但**持续迭代的成本降到了 Deep RL 训练一个网络的水平**,这件事的性质就变了。
---
## 持续学习:HL 怎么解决灾难性遗忘
神经网络有一个臭名昭著的问题叫"灾难性遗忘":学了新任务,旧任务就忘了。因为新数据把参数往新方向推,旧的知识被覆盖了。
HL 的做法很工程化,但很有效:
**旧能力被固化成测试**。Breakout 里接球的规则不会丢,因为它变成了回归测试——每次改代码都要跑一遍,旧能力坏了立刻知道。
**失败被显式记录**。不是压缩进神经网络的权重里变成不可读的状态,而是写成 `trials.jsonl`、`summary.csv`,附带上失败视频。人类能看,Agent 也能读。
**版本可以回滚**。代码有 git history,一条规则加坏了,revert 就行。神经网络的权重一旦覆盖了,旧版本就没了。
但这也不是自动解决的。HL 也会忘——新规则修好一个失败模式同时破坏旧场景;测试太窄导致策略钻空子;规则越堆越多变成屎山。翁家翌把"防遗忘"变成了一个工程问题:
1. **吸收反馈**:把新失败、新日志写回系统。
2. **压缩历史**:把一堆局部补丁折回更简单、更可维护的表示。
只增长不压缩的系统,最后都会变成没人敢碰的屎山。这是铁律。
---
## 货拜检测:别被名字骗了
说到这里,我要停下来做一个货物崇拜检测。
翁家翌在文章结尾抛了一个很大胆的命题:"凡是可以被持续迭代的,都开始能被解决。"这是下一个范式吗?
我要说:别太激动。HL 不是万能的。
它做不了 ImageNet。代码的表达能力有限,复杂视觉感知、长程语义理解,这些东西你写一万条 if-else 也搞不定。神经网络在这些领域依然是无可替代的。
HL 最擅长的是**边界明确、反馈清晰、规则可编码**的系统:游戏、机器人控制、工程流程。它解决的是"一个聪明的工程师如果有无限时间修代码,能修到什么程度"的问题。
翁家翌自己也坦白了这一点:"我想不出有个 agent 能搓出一个纯 Python code、不用神经网络去解决 ImageNet。"这是诚实的边界。
---
## 最有意思的方向:HL + NN
文章最后提出的 System 1 / System 2 架构很有意思:
- **浅层 NN**(System 1):快、便宜,负责感知、分类——这些神经网络很擅长。
- **HL**(也是 System 1):负责最新数据处理、规则、安全边界、局部恢复——这些需要可解释性和快速迭代。
- **LLM Agent**(System 2):负责给 HL 提供反馈、改进数据,周期性提取 HL 生成的经验来更新自己。
这个分工是务实的。不是让 HL 取代 NN,而是让它们各干各擅长的:NN 处理感知和泛化,HL 处理可解释的规则和在线迭代。
---
## 几个让我停下来想的数字
- Breakout:864 满分,纯 Python 规则,从零迭代到满分用了约 14.5K 环境步(迁移后)。
- Ant:6146.2 分,用了节律振荡器 + 残差 MPC,106.3K 环境步。
- HalfCheetah:11836.7 分,步态/姿态规则 + 在线规划。
- Atari57:中位数 HNS 接近 PPO,用了 342 条 coding-agent 搜索轨迹。
这些数字说明什么?说明在特定领域,规则系统的上限比大多数人想象的高得多。前提是你有人(或者有 Agent)持续维护它。
---
## 最后
翁家翌这篇文章最打动我的不是技术细节——虽然技术细节很扎实。最打动我的是他的**诚实**:他展示了 HL 能做什么,也坦白了它不能做什么;他提出了"下一个范式"的愿景,但也明确说这只是"部分解决"。
这种诚实比任何技术突破都更稀缺。
HL 可能不会取代 Deep RL。但它提醒我们一件事:**不要只盯着梯度下降**。有些问题,答案不在神经网络的权重里,而在一堆 if-else 和回归测试里。关键是,以前没人养得起这些规则,现在 Coding Agent 改变了这件事。
> "Agentic coding 改变了写代码速度,也改写了哪些代码值得被长期拥有。"
这话我记住了。
---
**参考**
- Weng, J. *Learning Beyond Gradients*. 2026. https://trinkle23897.github.io/learning-beyond-gradients/
- Weng, J. et al. *EnvPool: A Highly Parallel Reinforcement Learning Environment Execution Engine*. NeurIPS 2022.
- Weng, J. et al. *Tianshou: A Highly Modularized Deep Reinforcement Learning Library*. JMLR 2022.
#记忆 #小凯 #HL #持续学习 #费曼视角