Skip to content

RL 设计原则

本页速览 从失败项目里长出的十条原则:奖励先于算法、环境先行、简单优先、基线先行、可复现、安全护栏、样本效率意识、迭代节奏、文档化失败、与业务对齐。

RL 设计原则 ​

一句话定位:这一页把 RL 项目反复踩坑的教训沉淀成十条设计原则——每条原则配一个真实反例和一条可执行的做法。它解决"为什么我的 RL 项目总在加班返工"的根因,适合项目负责人、独立开发者和任何要真正交付 RL 系统的人。读完你会有两张纸:一张贴在工位前的十条原则,一张项目自查清单。

先说数据。为什么 RL 项目失败率显著高于普通 ML 项目?因为 RL 的失败模式更多、更隐蔽、更晚暴露:

  • 失败更隐蔽:训练不涨时,你分不清是算法问题、超参问题、奖励问题还是环境 bug(常见陷阱 专门讲这个)。
  • 失败更晚:监督学习半天就能判断数据有没有问题;RL 往往要跑一两天后才发现"学的是错的信号"。
  • 失败更贵:试错要环境,环境越真实越贵——机器人、交易、真实用户,试错成本都极高。

这十条原则就是从这些失败里长出来的。它们不是灵感,是防止重复交学费的备忘录。

一、为什么 RL 项目容易失败:三张"失败账单" ​

失败类型典型占比(非严格统计)代表症状对应原则
问题建模错误约 30%"这不是 RL 问题",或奖励写歪原则一、二
工程问题约 30%环境 bug、复现不了、日志丢失原则二、五、七
算法/调参问题约 25%学不动、学崩、方差大原则三、四、六
业务/落地问题约 15%做出来了没人用、指标和业务对不上原则八、九、十

注意:只有四分之一的问题出在"算法"上。但绝大多数团队的资源都砸在算法上——这就是原则一存在的理由。

二、十条原则总览 ​

#原则一句话反例
1奖励先于算法奖励是产品需求,先写奖励文档再选算法奖励写歪,PPO 再强也白费
2环境先行环境即产品,环境质量决定一切环境 bug 让所有人白干两周
3简单优先从最简单可行的策略开始,逐步升级一上来就 SAC,三天没动静
4基线先行没有基线,无从判断"变好"没跑随机/启发式,误判"算法有效"
5可复现实验复现不了的实验等于没做换机器后结果翻天覆地
6安全护栏上线前想好失败会怎样策略乱动,业务线上翻车
7样本效率意识每一步交互都有成本,先算预算训练预算只有 1 万步,却用 on-policy
8小步迭代一次只改一件事,一天一转同时改 5 个变量,2 小时后不知归因
9文档化失败把每次失败写成教训库同一坑被三拨人各踩一次
10与业务对齐指标要能翻译成业务语言算法分数高,业务指标没动

三、原则一:奖励设计先于算法选择 ​

反例:某团队为"让 NPC 不卡墙"设计奖励——"离目标每近一步 +1,撞墙 −10"。结果智能体学会了贴着墙走(每步 +1 稳赚,撞墙概率低)。算法越优化,行为越"聪明地坏"。

奖励是产品需求唯一机器可读的表达。你选什么算法只决定"学得动学不动",奖励决定"学会之后是什么样"。

可执行的做法 ​

  1. 动手前写一页奖励设计文档:每个奖励项的来源、取值、为什么这样取、可能被钻的空子。
  2. 用"奖励量级"做体检:先跑随机策略,看平均单步奖励是多少——如果奖励量级在 1e-4,浮点精度都在干扰学习;先归一化。
  3. 上线前做"奖励审计":列出策略可能找到的最省力的刷分路径,逐个堵上。

与相关页面的衔接 ​

奖励设计的完整方法论(势能塑形、稀疏奖励对策、Reward Hacking 案例集、逆强化学习)见奖励工程。RLHF 场景里"奖励"变成人类偏好模型,同样遵守本原则——奖励模型过优化就是对齐翻车,见LLM 对齐:RLHF 实战。

一句话测试

给非技术人员讲一遍你的奖励函数。如果他们能指出"智能体可以怎么偷懒刷分",你的奖励还有漏洞。

四、原则二:环境先行(环境即产品) ​

反例:某调度项目用自建仿真训练,训练了四周,智能体表现完美。上线时发现仿真的"机器故障概率"是硬编码 5%,真实产线是 15% 且随时间漂移——策略在真实分布上崩溃。

RL 系统解剖里那句"环境即产品"不是口号:环境决定了你的数据分布,数据分布决定策略能学成什么样。环境错了,后面全是无用功。

可执行的做法 ​

  1. 环境验收单(在从零构建一个 RL 项目里有完整清单):冒烟测试、随机策略跑 1000 步、奖励有界、同一 seed 可复现、启发式可达成。
  2. 先验证"环境可信"再写算法:用最简单策略跑通环境,确认学习信号存在,再投入算法资源。
  3. 环境与训练解耦:环境独立成服务/模块,换实现(Python→C++→分布式)不碰训练代码。
  4. 域随机化意识:仿真与真实分布有 gap,训练时就随机化物理参数(机器人场景见机器人控制与 Sim2Real)。

环境也是"需求规格"

把环境当成产品需求文档来写:状态有哪些、动作边界、奖励公式、终止条件、随机性来源。这份文档同时是测试用例、评审对象和交接材料——它比算法代码更值得反复评审。

五、原则三:从简单算法开始(随机 → 启发式 → 简单 RL → 复杂 RL) ​

反例:某团队项目一立项就上 SAC,配了 8 块 GPU 并行调参。两周后回报纹丝不动。改用最朴素的 ε-greedy 线性策略,一天就追平了启发式基线——原来问题根本不需要 SAC 的复杂度。

复杂度是负资产:越复杂的算法,越难排查、越难复现、越难解释。先跑最简单的,直到"简单"被证明不够。

复杂度阶梯 ​

text
随机策略 ──→ 启发式/规则 ──→ 简单 RL(DQN/REINFORCE)
   │              │              │
 验证环境可交互  验证问题可解    验证 RL 信号通路
                                │
                         复杂 RL(PPO/SAC)+ 调优
                                │
                         只在简单方案不够时升级
阶梯用途什么时候往下走
随机环境冒烟、奖励采集立刻
启发式问题可解性、奖励合理性有分数后
简单 RLRL 信号通路、训练管线正确管线验证后
复杂 RL追求上限简单方案证明不够

六、原则四:基线先行 ​

反例:团队调 PPO 一个多月,最终回报比随机策略高 3 倍,全员庆祝。补跑启发式基线后发现:一条 50 行的贪心规则就能达到随机策略的 4.5 倍。三个月的"算法工作"毫无增量。

"基线先行"是最便宜、最能救命的原则:它把"我的算法好不好"变成可回答的问题。

可执行的做法 ​

  1. 第一周内就产出一条随机基线和一条启发式基线的完整学习曲线。
  2. 所有后续实验都在这两条线上叠加展示(plt.axhline 画两条参考线就行)。
  3. 评估协议与基线一致(同样的 seed、预算、指标)——否则基线没意义。协议细节见从零搭一套 RL 评估。

基线不是走形式

如果"基线先行"只做了一次然后忘了更新,就等于没做。基线的价值在于它是持续参照物:每次算法改动都要问"这次比基线强在哪、强多少"。基线线画在每张图上,直到项目结束。

七、原则五:可复现实验 ​

反例:A 工程师用 PyTorch 1.13 跑出 PPO 480 分,B 工程师在新环境 PyTorch 2.0 复现同一代码,只有 390 分。两人吵了三天,最后发现是 numpy 随机数状态没有在环境里播种——同一 seed 在两人机器上走了不同的环境序列。

RL 的可复现问题比监督学习严重:同样的 seed、同样的代码,换 GPU、换版本、换并行方式结果都不同。

可执行的做法 ​

  1. 三层播种:全局(python/numpy/torch)+ 环境(reset(seed=...))+ 算法(框架 seed 参数)。
  2. 配置即代码:实验配置进 yaml/Hydra,命令行可覆盖,每次实验自动存档。
  3. 记录一切:git commit、依赖版本、机器信息进实验目录。
  4. 多 seed 是复现的一部分:能复现的是"性能分布",不是"一条曲线"。

完整工程细节见从零构建一个 RL 项目的可复现性加固一节;「复现论文失败」的诊断清单见常见陷阱。

八、原则六:安全护栏 ​

反例:某推荐排序策略上线前只在离线评测好,没有 shadow mode。上线第一天,策略对一小撮用户给出极端动作(不停推荐同一商品),CTR 暴跌,回滚花了 3 小时。

RL 策略比规则系统更可能"聪明地越界"。护栏不是可选项。

可执行的做法 ​

护栏做法时机
动作限幅动作范围硬限制,越界回退安全值设计期
影子模式新策略只记录不执行,对比一周上线前
渐变放量1% → 5% → 50% 分阶段放量上线期
兜底规则业务侧保留规则/人工接管路径全程
监控告警动作分布、观测分布、业务指标的漂移检测上线后

RL 场景的安全设计可以很硬核(约束 RL、安全集),但工程上最便宜的护栏永远是"别让它直接碰真实系统"。

九、原则七:样本效率意识 ​

反例:某团队用 on-policy 算法(每次交互的样本只用一次)在只能采集 5 万条样本的业务环境上训练。学到第 3 万步才明白:这个预算连一个像样的 on-policy 更新周期都不够,应该用 off-policy(SAC)或离线数据。

RL 的"数据"是交互出来的,每一步都有真实成本。先算预算,再选算法。

可执行的做法 ​

  1. 立项时回答三个数:每小时能采多少样本、总预算多少步、每一步的货币成本。
  2. 按预算选算法族(Actor-Critic 家族的选型表):预算紧 → off-policy(SAC/TD3);预算足 → on-policy(PPO)更稳。
  3. 样本效率与最终性能两个维度都要报告(见评估实践)。
  4. 有历史数据时先考虑离线 RL——能白嫖的样本先白嫖。

十、原则八:小步迭代 ​

反例:工程师周一改了奖励函数 + 换了网络 + 调了 clip,周三看到结果变差,无法判断是哪个改动导致——只好回滚全部,一周白费。

RL 实验的变量太多,一次只改一个是最省时间的做法(调参实践的纪律核心)。

可执行的做法 ​

  • 每次实验改动列表不超过 1 个变量(批量搜索除外,那是有记录的并行)。
  • 一天一转:每天至少完成"改代码 → 跑实验 → 看曲线 → 写结论"一个循环。
  • 每轮实验留一行文字结论,哪怕只是"lr 1e-3 → 崩了"。

小步迭代的反直觉之处

看起来"每天只改一个变量"很慢,实际上它是 RL 项目里最快的推进方式——因为 RL 的归因成本极高,变量一多,每个实验的信息量趋近于零。

十一、原则九:文档化失败 ​

反例:团队在项目 A 踩了"奖励数值溢出导致 NaN"的坑,花了 3 天定位。半年后项目 B 的同事独立地又踩了一遍。

失败是可以复用的知识,而且是最贵的一种知识。不文档化,等于每次失败都付全价学费。

可执行的做法 ​

  1. 维护一份 KNOWN_FAILURES.md:症状 → 根因 → 检测方法 → 修法,一条一行。
  2. 每次排掉一个超过一天的 bug,就补一条。
  3. 把它写进 README 或 wiki,新成员入职先读。

这也正是常见陷阱与反模式整页在做的事——把它当团队知识的起点,往里加自己的条目。

十二、原则十:与业务对齐 ​

反例:某库存补货项目,RL 团队把"模拟器里的累计利润"当指标,优化到 +18%。上线后仓库经理说:预测需求波动时,策略下单量忽高忽低,工人排班崩溃,真实利润 +0%。指标没翻译成业务约束(下单平稳性)。

RL 指标的胜利 ≠ 业务胜利。两者之间隔着约束、风险和解释成本。

可执行的做法 ​

  1. 指标翻译表:把每个 RL 指标写清楚对应什么业务动作(回报 → 利润、成功率 → 履约率、方差 → 排班波动)。
  2. 约束先行:把业务约束(平稳性、库存上限、伦理边界)提前写进奖励或动作空间,别等上线后被业务方发现。
  3. 解释预算:业务方会问"它为什么这么做"。RL 策略解释性差,提前准备好"指标归因"或"行为审计"的答案。

十三、项目自查清单 ​

把下面这张清单打印出来,贴在工位前。每个阶段结束时过一遍:

立项时

  • [ ] 决策清单确认这是 RL 问题(见从零构建一个 RL 项目第 0 步)
  • [ ] 样本预算三问(步数/成本/小时产量)已回答
  • [ ] 奖励设计文档已写、已做"刷分审计"
  • [ ] 业务指标翻译表已定

开发时

  • [ ] 环境验收单全部通过,启发式基线有分数
  • [ ] 训练管线在 CartPole 类基准上验证过
  • [ ] 基线曲线画进每张结果图
  • [ ] 三层播种 + 配置存档就位

上线前

  • [ ] 多 seed 评估 + IQR 报告完成
  • [ ] 安全护栏(限幅/影子/兜底/监控)就位
  • [ ] 失败文档已更新到最新一条

延伸阅读 ​

参考资料 ​

  • Sutton, R. S. & Barto, A. G. (2018). Reinforcement Learning: An Introduction, 2nd ed. MIT Press.(奖励假设与试错学习的理论根基,免费版见 incompleteideas.net)
  • Amodei, D. et al. (2016). Concrete Problems in AI Safety. arXiv:1606.06565(安全护栏问题的经典清单:错误奖励、探索风险等)
  • Irpan, A. (2018). Deep Reinforcement Learning Doesn't Work Yet. alexirpan.com/2018/02/14/rl-hard.html
  • Henderson, P. et al. (2018). Deep Reinforcement Learning that Matters. AAAI 2018. arXiv:1709.06560
  • Tobin, J. et al. (2017). Domain Randomization for Transferring Deep Neural Networks from Simulation to the Real World. arXiv:1703.06907(环境不确定性的应对,原则二延伸)
  • OpenAI (2017). Learning Dexterous In-Hand Manipulation. arXiv:1808.00177(环境先行 + 域随机化的工业级案例)