Heuristic Learning (HL) 是一种不需要反向传播、由 coding agent 通过直接编辑代码来迭代优化程序策略的学习范式。被 HL 长期维护的产物称为 Heuristic System (HS)。作者 Jiayi Weng(EnvPool 维护者)用 Codex (gpt-5.4) 在 Atari / MuJoCo 环境中验证了 HL 的有效性,并提出它可能是继 Pretrain → RLHF → Large-scale RL/RLVR 之后的下一个范式。
核心概念
Heuristic Learning(HL)
HL 是一种以程序代码而非神经网络参数为更新对象的机器学习范式:
- 策略:由代码构成——规则、状态机、controller、MPC、宏动作
- 状态:显式写成变量、检测器、缓存等可读表示
- 动作:执行代码逻辑生成,非神经网络 forward
- 反馈:由 coding agent 消化,来源包括环境 reward、testcase、日志、视频回放、人类反馈
- 更新:不走反向传播,coding agent 直接修改 policy、状态检测器、测试、配置或 memory
- 记忆:显式记录 trials、summary、失败原因、回放、版本 diff
Heuristic System(HS)
HS 是 HL 长期维护的对象,不只一个孤立的 policy.py。一个完整的 HS 至少包含:
- 程序策略(programmatic policy)
- 状态表示(state representation)
- 反馈入口(feedback channels)
- 实验记录(experiment records)
- 回放或测试(replays / tests)
- 记忆系统(memory)
- 由 coding agent 执行的更新机制
Deep RL vs HL 对比
| 维度 | Deep RL | HL |
|---|---|---|
| Policy | 神经网络参数 | 代码:规则、状态机、控制器、MPC、宏动作 |
| State | 显式观测 | 显式变量、检测器、缓存 |
| Action | NN forward pass | 执行代码逻辑 |
| Feedback | 固定 reward | coding agent context(test、日志、回放等) |
| Update | 梯度更新 | coding agent 直接编辑代码 |
| Memory | replay buffer(off-policy)或无(on-policy) | 显式记录 trials、summary、失败原因、版本 diff |
HL 的关键优势
- 可解释性:可以直接阅读和检查代码策略
- 样本效率:一次代码修改就可能显著改变策略
- 可回归验证:旧能力可变成 test、replay、golden case
- 可约束过拟合:简化、回归检查、多 seed 评估形成工程正则化
- 部分避免灾难性遗忘:旧能力可写进 rule set 和测试,不完全依赖权重记忆
实验验证
作者用 Codex (gpt-5.4) 在多个环境中验证了 HL 的有效性:
Atari Breakout(打砖块)
程序策略从 387 → 507 → 839 → 864,最终达到理论最高分。关键演进:
- 387 分:RAM 截距策略,陷入稳定循环(接球但不清砖)
- 507 分:加入 cycle-breaking 机制——长时间无奖励时在预测落点加扰动偏移
- 839 分:加入
fast_low_ball_lead_steps=3,解决高速低位球追截过度 - 864 分:后期「卡住偏移逐步收掉」+ 挡板漂移补偿(弥补动作-位置一步延迟)
最终策略包含多个组件:动作探测、状态读取、球/挡板检测、落点预测、卡住循环检测、回归测试、视频回放、实验记录。
纯图像版本(RGB 分割替换 RAM):通过 14,504 步迁移达到 864 分。
MuJoCo Ant(四足机器人)
未指定 CPG 或 MPC,Codex 自行选择了四腿反相振荡器和 PD 控制器作为起点:
| trial | score_mean | cumulative_env_steps | 关键改动 |
|---|---|---|---|
| cpgpd_v1 | 2291.9 | 5,000 | 左右腿反相 CPG + PD |
| yawaxis_grid_v2 | 2857.9 | 20,000 | 偏航反馈 + 重调参数 |
| h3_428_v1 | 3162.0 | 50,000 | 二阶/三阶谐波 |
| mpc_residual_v1 | 3635.5 | 62,000 | horizon=6, candidates=32 |
| mpc_residual_cfg4 | 3964.7 | 67,000 | horizon=8, candidates=48 |
| mpc_residual_narrow04 | 4871.3 | 79,000 | 降低 z 目标,增大 kp/候选数 |
| mpc_residual_warm02 | 5165.2 | 85,000 | 热启动残差计划 |
| mpc_fast065 | 5759.4 | 95,000 | 更快步态 + 更大残差 |
| mpc_term001 | 6054.5 | 100,000 | 终端速度代价 |
| mpc_default_adaptive | 6146.2 | 106,300 | 速度自适应相位 + 支撑期 |
最终策略包含:振荡器相位、支撑期比例、速度自适应、滚转/俯仰/偏航反馈、脚部接触、短视窗模型展开、残差平滑、终端速度代价、热启动计划衰减。
MuJoCo HalfCheetah(猎豹跑步)
5 局复测均值 11836.7(min 11735.0, max 12041.2),进入常见 Deep RL 结果的量级。策略核心:可解释的步态/姿态规则 + online staged-tree MPC。
Atari57 全量测试
在大参数搜索中验证通用性:57 游戏 × 2 种输入 × 3 次运行 = 342 条 coding-agent 搜索轨迹,完全无人值守。
- 1M 步:native_obs median HNS 0.32,ram 0.26,明显高于 PPO 早期曲线
- 9.7M 步:native_obs 0.81,ram 0.59
- Best input mode 汇总:Codex median HNS 0.83,PPO2 0.80,CleanRL PPO 0.98
- Best single run:Codex median HNS 1.18
HL 在 Asterix、Jamesbond、Centipede、Bowling、Skiing、Tennis 上相对突出;在 Atlantis、VideoPinball、Assault、StarGunner 上 PPO 更强。
Montezuma’s Revenge(蒙特祖玛的复仇)
这个实验也暴露了当前程序策略的局限:
- 一条无人值守 run 达 400 分,但本质是 86 个宏动作组成的开环路线,1769 环境步
- 普通
if else状态机难以表达长程规划 - 指向下一层抽象需求:可组合宏动作、可恢复搜索状态、长期记忆
为什么 HL 以前没发展起来
HL 的前身是专家系统和规则系统。核心瓶颈是维护成本:
人类手工维护 heuristic:今天加规则修 case A → 明天 case B 被破坏 → 后天加 if → 大后天没人敢删。
Coding agent 可以持续分析失败、修改规则并运行测试,从而降低启发式系统的维护成本。
HL 的 Continual Learning 机制
HL 不会自动解决灾难性遗忘,而是将其转化为工程化问题:
- 旧能力被固化为:回归测试、固定 seed replay、golden trace、失败视频、版本 diff、显式失败方向
- HL 的历史是显式、可读、可删、可重构的
可持续维护的 HS 需要两类操作:
- 吸收反馈:把新失败、新日志、新 reward 写回系统
- 压缩历史:把局部补丁折回更简单、更可维护的表示
只追加规则而不整理历史,会让系统越来越难修改。定期合并补丁、简化表示,与吸收新反馈同样必要。
耦合复杂度
耦合复杂度:一次更新必须同时照顾多少相互牵连的状态、规则、测试、反馈和历史。
- 不能按代码行数衡量:500 行代码若模块清楚、测试完整,可能比 80 行缺少日志的代码更易维护
- 好的模块化把全局耦合切成局部耦合
- 好的测试让 coding agent 可以局部验证改动
影响因素:
- 代码侧:模块边界、接口稳定性、测试覆盖、可观测性、回滚成本、状态可复现
- Agent 侧:模型能力、上下文长度、memory 质量、工具质量、迭代速度
下一个范式?
HL 的定位是继 Pretrain → RLHF → Large-scale RL/RLVR 之后的候选范式:通过持续修改程序,探索梯度训练之外的改进方式。
但 HL 受制于代码表达力(如无法纯 Python 解决 ImageNet),未来方向是 NN + HL 协同:
以机器人为例的 System 1/2 分工:
- System 1(快):专用浅层 NN(感知/分类/状态估计)+ HL(最新数据处理、规则、回放、安全边界、局部恢复)
- System 2(慢):LLM agent(给 HL 反馈、改进数据、周期性提取 HL 数据更新自身)
层级分解:关节级 HL → 肢体级 HL → 全身平衡 HL → 任务级 HL
Coding agent 负责持续更新系统:分析失败视频、传感器数据和仿真结果,再据此修改代码、参数、安全规则和记忆。
引用
@misc{weng2026learning_beyond_gradients, title = {Learning Beyond Gradients}, author = {Weng, Jiayi}, year = {2026}, month = may, howpublished = {\url{https://trinkle23897.github.io/learning-beyond-gradients/}}, note = {Blog post}}完整 artifact repo:github.com/Trinkle23897/learning-beyond-gradients