← 返回资料站  /  AI for AI
论文 算法发现

Eureka: Human-Level Reward Design via Coding Large Language Models

Eureka:让 GPT-4 写出超越人类专家的 RL 奖励函数
一句话NVIDIA 用 GPT-4 对奖励函数代码做进化搜索(每轮采样 16 个候选、用 RL 训练结果做反馈迭代 5 轮),在 29 个 IsaacGym 机器人任务上 83% 超过人类专家写的 reward,平均归一化提升 52%,并首次让仿真 Shadow Hand 学会转笔。

这是什么

在机器人 RL 里,奖励函数设计是出了名的又难又靠试错:Booth 等人调查过,92% 的 RL 研究者依赖手工 trial-and-error 设计 reward。Eureka 的想法是把这件事外包给 coding LLM——不是让 LLM 直接控制机器人(高层规划那条路),而是让它写 reward 代码,再交给标准 RL(PPO)去训练低层策略,从而打通 LLM 与灵巧操作这类低层技能之间的断层。

方法上没有任何任务特定的 prompt 模板或 reward 词表:直接把环境源码(去掉原有 reward 部分)加一句任务描述喂给 GPT-4,让它零样本生成可执行的 Python reward 函数,然后用 RL 训练结果作为文本反馈做 in-context 的进化优化。评测覆盖 IsaacGym 9 个原生任务加 Dexterity 双手 Shadow Hand 基准全部 20 个任务,共 10 种机器人形态。这两个基准都是在 GPT-4 知识截止(2021-09)之后发布的,基本排除了背题的可能。

这篇是 ICLR 2024 论文,S2 引用约 715 次,是 'LLM 自动设计 RL 训练组件' 这条线的代表作;后续 DrEureka(sim-to-real 域随机化)、Eureka 用于四足等工作都沿这条路。代码 MIT 协议开源,3.1k stars,含转笔 policy checkpoint。

Eureka 系统总览:环境源码(去 reward)+ 任务描述喂给 GPT-4,采样一批 reward 候选代码,在 IsaacGym 里 GPU 并行跑 RL 训练,把各奖励分量的训练曲线数值写成文字(reward reflection)回喂 LLM,进入下一轮进化。
Eureka 系统总览:环境源码(去 reward)+ 任务描述喂给 GPT-4,采样一批 reward 候选代码,在 IsaacGym 里 GPU 并行跑 RL 训练,把各奖励分量的训练曲线数值写成文字(reward reflection)回喂 LLM,进入下一轮进化。

机制与做法

Environment as context:源码即规格说明

不写环境的自然语言规格,而是直接把环境的 Python 源码(observation/state 变量定义部分)作为 context。仓库里 eureka/envs/*/xxx_obs.py 就是用 prune_env.py 自动裁出来的片段——只保留 compute_observations 等暴露状态变量的代码,去掉 reward 相关部分,既省 context 又防止泄露人类 reward。LLM 拿到后直接组合 fingertip_pos、obj_angvel 这类现成变量写出 compute_reward 函数,要求把各奖励分量以 dict 形式暴露(为后面的 reflection 服务)。

进化迭代曲线:Dexterity(左)和 Isaac(右)上,Eureka 的最优 reward 随 5 轮迭代稳步提升,约第 3 轮追平人类专家(红线);绿线是 '不迭代、首轮直接采 32 个样本' 的消融,明显更差,说明进化循环不能用单纯多采样替代。
进化迭代曲线:Dexterity(左)和 Isaac(右)上,Eureka 的最优 reward 随 5 轮迭代稳步提升,约第 3 轮追平人类专家(红线);绿线是 '不迭代、首轮直接采 32 个样本' 的消融,明显更差,说明进化循环不能用单纯多采样替代。

进化搜索 + reward reflection

每轮从 LLM i.i.d. 采样 K=16 个 reward 候选,各自跑一遍完整 PPO 训练,用任务 fitness 函数 F 打分;由于采样独立,'全部候选都有 bug' 的概率随样本数指数下降,16 个足以保证首轮至少有一个能跑。取最优者,把训练过程中各奖励分量和 task metric 在 10 个 checkpoint 上的数值序列写成文字(reward reflection),连同 mutation prompt 一起喂回 LLM 生成下一轮候选。共 5 轮迭代 × 5 次独立重启。

Reflection 的关键在于细粒度归因:光给最终 fitness 分数说明不了 reward 为什么不行,而分量级的训练曲线能让 LLM 做针对性修改——调超参、改某个分量的函数形式、或新增分量。消融显示去掉 reflection(只喂 F 的数值)后 Isaac 任务平均归一化分数掉 28.6%;'不进化、首轮直接采 32 个样本' 的消融也明显不如迭代两轮的 Eureka,说明进化循环不可省。

两个延伸:gradient-free RLHF 与课程学习转笔

因为整个优化都在 context 里进行,人类反馈可以无缝插入:(1) 把人类写的 reward 当作第一轮输出,Eureka (Human Init.) 在所选 Dexterity 任务上一致优于纯 Eureka 和纯 Human,说明它能当 'reward 助手' 用;(2) 用人类文字点评替代自动 reflection 教 Humanoid 跑步,得到的策略跑得慢些(7.53→5.58 前进速度)但 20 个受试者中 15 人更偏好其步态——一种不更新模型权重的 RLHF。

转笔任务用课程学习拆解:先用 Eureka reward 训一个 '把笔转到随机目标姿态' 的策略,再用同一 reward 微调去连续跟踪转笔姿态序列。从零直接训或只用预训练策略都完成不了一个循环,微调后能高速连转多圈。物理参数未做任何修改,仓库里放了 EurekaPenSpinning.pth checkpoint 可复现可视化。

关键结果

实证核查

扎实代码完整开源且与论文描述一致,核心机制(环境剪裁、进化循环、reflection)都能在仓库里对上;质疑 '不公平比较' 的 issue 经核实不成立。主要折扣是复现需要论文级别的采样规模和大量 GPU 训练,小算力复现效果差。
论文声称 reward 生成是零样本、context 中不含人类 reward(环境代码 'without the reward code')。
Issue #23 质疑 context 里含人类写的 compute_success,构成不公平比较。实际核查仓库 eureka/envs/isaac/franka_cabinet_obs.py 和 envs/bidex/shadow_hand_over_obs.py 等喂给 LLM 的 *_obs.py 文件,grep 'reward|success' 均为 0 次命中——context 只含 observation 计算代码,issue 的指控对已发布代码不成立(该 issue 已关闭)。
在 29 个任务上 83% 超过人类专家 reward。
此数字对应论文配置:每任务 5 次独立 run × 5 轮迭代 × 每轮 16 个样本,即每个任务要跑 400 次完整 PPO 训练,靠 IsaacGym GPU 并行仿真才可行。Issue #51 的用户在 12GB 4080 上只能开 sample=5,FrankaCabinet/Anymal 复现成功率仅约 0.1,且报告 reward reflection 各轮内容完全重复的疑似 bug,至今 open 无官方回复。小算力下打不出论文效果是真实约束。
首次让仿真 Shadow Hand 学会连续转笔。
仓库发布了训好的 checkpoint(isaacgymenvs/isaacgymenvs/checkpoints/EurekaPenSpinning.pth)和一行可视化命令,README 注明本地渲染器与论文视频的 Omniverse 渲染不同;这一 demo 可直接验证。但注意这是 '仿真' 战绩,论文未做 sim-to-real(后续 DrEureka 才处理)。
方法通用、'没有任务特定 prompt 工程'。
总体成立(所有 prompt 在附录公开,环境剪裁由 eureka/utils/prune_env.py 自动完成),但依赖两个隐含前提:环境有可读的源码/状态变量,以及存在可自动评测的 fitness 函数 F 来筛选候选。仓库 2024-05 后停止更新,只支持 IsaacGym Preview 4(已停止维护),迁移到 Isaac Sim/其他模拟器需自己动手(issue #40)。

与我们方向的关系

对 ai4ai / 算法发现方向,这是 'LLM 生成代码 + 真实训练结果做适应度 + in-context 进化' 这一范式最干净的实例:搜索对象是可执行程序而非超参数,fitness 来自跑真实验,LLM 负责变异算子。这个循环结构与 FunSearch、AlphaEvolve 同构,可以直接借鉴到任何 '要设计的组件可以写成代码、且有自动评测' 的问题上——loss 函数、数据增广、优化器 schedule 都是候选。

两个可复用的工程细节:(1) reward reflection 的设计——要求生成的代码把中间量以 dict 暴露,再把训练动态转成文字反馈,给了 LLM 分量级的归因信号,消融证明这比只喂最终分数好 28.6%,做 LLM 迭代优化时值得照抄;(2) i.i.d. 多采样对抗生成代码的 bug 率,比让 LLM debug 单个样本更省事。主要成本警告:每个候选都要完整训练,预算按 '迭代数 × 批量 × 单次训练成本' 线性增长,只有评测便宜(或可并行)时这套才划算。

阅读笔记

复现建议:必须用 sample=16 量级,sample=5 会显著掉点(issue #51);依赖 IsaacGym Preview 4 + Python 3.8,新机器装环境是最大的坑(numpy 编译、libpython3.8、fbx 等 issue 一堆);OpenAI API 用的是 gpt-4-0314,现已下线,换新模型需自己改 model 参数。

材料清单

TeX 源码
已存档:Raw/eureka/source/
代码仓库github.com/eureka-research/Eureka
3190★ · 最近推送 2024-05-03
项目主页 / 报告eureka-research.github.io/
转笔 policy checkpointgithub.com/eureka-research/Eureka/tree/main/isaacgymenvs/isaacgymenvs/checkpoints
EurekaPenSpinning.pth,一行命令可在 IsaacGym 里可视化
后续工作 DrEurekaeureka-research.github.io/dr-eureka/
同组把该范式扩展到 sim-to-real 的域随机化参数设计
复现问题 issue #51github.com/eureka-research/Eureka/issues/51
小采样量(sample=5)下成功率仅约 0.1 的复现报告,含疑似 reflection 重复 bug

同类条目