1. 这篇论文笔记到底在解决什么问题
第一次看到这个标题的时候,我正处在被基于模型的强化学习(Model-Based Reinforcement Learning,简称MBRL)各种实验折腾得焦头烂额的阶段。那会儿我手头有个连续控制的任务,想用MBRL的方法跑一跑,结果发现一个非常尴尬的现实:同一套算法,换个环境、换个随机种子、甚至换个评估频率,出来的曲线能差出十万八千里。更让人头疼的是,翻遍手头的资料,每个方法都宣称自己在某些任务上"显著优于基线",但真正想横向对比的时候,根本找不到一个统一的、可复现的评测框架。
这篇论文笔记要聊的核心,就是MBRL领域里那个长期被大家心照不宣、却又不得不面对的问题——评测基准的缺失与混乱。它做的事情说白了就是:把当时主流的基于模型的强化学习算法拉到同一个擂台上,用统一的实现、统一的超参数搜索流程、统一的评估协议,认认真真地打一架,然后告诉你谁强谁弱、强在哪里、弱在什么地方。
适合读这篇笔记的人,我大致分三类。第一类是刚入门MBRL的研究生或者工程师,你可能已经看了一堆论文,但脑子里还是一团浆糊,不知道到底该从哪个方法下手,这篇笔记能帮你建立一张相对清晰的方法地图。第二类是正在做实验、需要选基线的从业者,你手头有个新想法,想找个靠谱的对比对象,这篇笔记里的评测结论和踩坑经验能帮你省下大量重复劳动。第三类是对强化学习评测方法论感兴趣的人,哪怕你不做MBRL,这篇笔记里关于"怎么公平地比较两个算法"的讨论,放到任何机器学习子领域都适用。
我自己读下来的最大感受是:这篇工作最大的价值不在于提出了什么新算法,而在于它把"评测"这件事本身当成一个严肃的研究问题来对待。在深度学习领域,大家早就习惯了"刷榜"文化,但刷榜的前提是榜单本身要足够可靠。MBRL这个领域当时恰恰缺的就是这么一个可靠的榜单。所以这篇笔记与其说是在讲算法,不如说是在讲"如何科学地衡量算法"。
2. 为什么MBRL的评测这么难做
2.1 样本效率的度量本身就是个陷阱
MBRL最核心的卖点就是样本效率——用更少的真实环境交互学到更好的策略。听起来很美好,但"样本效率"这四个字一旦要量化,问题就来了。
你用什么指标来衡量?是达到某个回报阈值所需的交互步数?还是固定交互预算下的最终回报?还是学习曲线的AUC(曲线下面积)?这三个指标看起来差不多,实际上会给出完全不同的排名。我举个具体的例子:假设算法A在前10万步学得飞快,但之后进入平台期;算法B前10万步慢吞吞,但后劲十足。如果你用"达到阈值所需步数",A赢;如果你用"固定预算下的最终回报",B可能赢;如果你用AUC,那就要看你的预算截断在哪里,截在不同的位置结论可能完全反过来。
这篇论文笔记里特别强调了这一点:报告样本效率的时候,必须同时给出学习曲线,而不是只给一个孤零零的数字。因为单个数字会丢失太多信息,读者根本不知道这个数字是在什么条件下、用什么标准算出来的。我自己做实验的时候也吃过这个亏,早期图省事只记了最终回报,后来想回头分析的时候发现完全没法用,只能重跑,白白浪费了算力。
2.2 环境本身的随机性被严重低估
强化学习的实验里,随机性来源多得吓人:环境初始状态的随机、策略探索的随机、神经网络初始化的随机、甚至环境本身转移概率的随机。这些随机性叠加在一起,导致同一个算法跑两次的结果可能差出好几个标准差。
论文笔记里提到一个很实在的做法:每个算法至少跑5个不同的随机种子,报告均值和标准差,最好还能画出置信区间。但现实是,很多论文只跑1到3个种子,然后挑一个最好看的曲线放上去。这种做法在MBRL里尤其危险,因为MBRL的模型学习过程本身就不稳定,种子之间的方差往往比算法之间的差异还大。
我自己的经验是,在连续控制任务上,如果你只跑3个种子,两个算法之间的差异很可能被种子噪声完全淹没。想得到统计上可靠的结论,5个种子是底线,10个种子才比较稳妥。当然,算力是个现实约束,所以论文笔记里也讨论了如何在有限算力下做合理的实验设计,比如先用少量种子做筛选,再对候选算法做精细对比。
2.3 超参数搜索的公平性难题
这是MBRL评测里最微妙、也最容易出问题的地方。每个算法都有自己的超参数,比如学习率、模型训练轮数、规划步数、集成模型的数量等等。如果你给算法A精心调参,给算法B用默认参数,那比较结果毫无意义。
但"公平地调参"这件事说起来容易做起来难。首先,超参数搜索本身就要消耗大量算力,如果每个算法都做同等规模的搜索,实验成本会高到离谱。其次,不同算法的超参数敏感度不一样,有的算法对学习率极其敏感,有的则比较鲁棒,用同一套搜索空间未必公平。再者,搜索空间的设计本身就带有主观性,你搜了哪些值、没搜哪些值,都会影响最终结果。
论文笔记里采取的策略是:为每个算法设计一个合理的搜索空间,然后用同样的搜索预算(比如同样数量的随机搜索试验)来调参,最后用调参后的最优配置做对比。这个做法谈不上完美,但至少比"一个精心调、一个随便跑"要公平得多。我觉得这个思路值得借鉴,哪怕你不做MBRL,做任何算法对比实验的时候都应该问自己一句:我给对手的调参待遇,和我给自己的调参待遇,是一样的吗?
3. 论文笔记里的核心方法拆解
3.1 算法选择:覆盖主流技术路线
这篇工作选的算法不是随便挑的,而是覆盖了MBRL里几条主要的技术路线。我把它大致分成这么几类:
第一类是基于模型预测控制(MPC)的方法,典型代表是随机射击类算法。这类方法不显式地学一个策略网络,而是在每一步用学到的模型做在线规划,通过采样大量动作序列来选最优动作。优点是实现相对简单、不需要策略网络的训练,缺点是每一步规划都要消耗计算资源,实时性差。
第二类是基于模型的价值扩展方法,比如用学到的模型生成虚拟数据来扩充真实数据,然后交给无模型的算法去学。这类方法的好处是能复用成熟的无模型算法,缺点是模型误差会被放大,虚拟数据和真实数据的分布偏移可能导致策略学偏。
第三类是基于模型的策略梯度方法,直接在学到的模型里做反向传播来优化策略。这类方法理论上很优雅,因为模型是可微的,梯度可以直接穿过模型传到策略上。但实践中模型误差会让梯度方向跑偏,尤其是在模型不准的区域。
第四类是混合方法,把模型学习和无模型学习结合起来,比如用模型做辅助任务、或者用模型做正则化。这类方法往往能取长补短,但实现复杂度也最高。
论文笔记里对每类方法的代表算法都做了详细分析,包括它们的核心思想、关键超参数、以及在不同任务上的表现特点。我觉得这个分类框架本身就很有价值,因为它帮你把纷繁复杂的MBRL文献整理成了一张有结构的地图。
3.2 评测环境:从简单到复杂的梯度设计
环境的选择同样有讲究。如果只用简单环境,算法之间的差异可能体现不出来;如果只用复杂环境,实验成本又太高,而且很难分析失败原因。
论文笔记里采用的是一个从简单到复杂的梯度设计。简单环境比如一些低维的连续控制任务,状态维度和动作维度都不高,算法跑起来快,适合做初步筛选和调试。中等难度的环境增加了一些非线性 dynamics 和稀疏奖励的挑战。高难度环境则是高维状态、复杂接触动力学、长时程规划的任务,用来检验算法的上限。
这种梯度设计的好处是,你能清楚地看到每个算法在哪个难度层级开始掉链子。有的算法在简单环境上表现很好,一上难度就崩了;有的算法在简单环境上不显山露水,但在复杂环境上反而更稳。这种信息比一个单一的排名有用得多。
我自己做实验的时候也喜欢这么干:先用一个跑得快的简化环境把流程跑通、把超参数粗调一遍,然后再上真实环境做精细对比。这样能省下大量时间,而且出问题的时候更容易定位是算法本身的问题还是环境配置的问题。
3.3 评估协议:统一但灵活的框架
评估协议是这篇工作的核心贡献之一。它做的事情包括:
- 统一的训练和评估流程:所有算法用同一套数据收集、模型训练、策略更新的接口,避免因为实现差异导致的偏差。
- 统一的评估频率和指标:每隔固定的交互步数评估一次,记录回报、成功率等指标,最后汇总成学习曲线。
- 统一的随机种子管理:所有算法用同一组随机种子,确保环境初始状态和探索噪声的随机性来源一致。
- 统一的超参数搜索预算:每个算法分配相同数量的调参试验,避免"有的算法调得多、有的调得少"。
这套协议看起来都是常识,但真正落地的时候细节非常多。比如评估频率怎么定?太频繁会拖慢训练速度,太稀疏会丢失学习曲线的细节。论文笔记里给的经验值是每几千步评估一次,具体数值取决于任务的时程长度。再比如随机种子怎么选?不是随便选几个数字就行,最好用一组固定的、经过验证的种子,确保不同算法之间的对比是在相同条件下进行的。
4. 实操复现的关键步骤与避坑指南
4.1 环境搭建与依赖管理
如果你想复现这篇论文笔记里的实验,第一步是把环境搭起来。MBRL的实验环境通常依赖几个核心组件:深度学习框架、强化学习环境库、以及一些数值计算库。
我的建议是用容器化或者虚拟环境把依赖锁死。MBRL的实验对版本非常敏感,不同版本的框架在数值精度、随机数生成、甚至矩阵运算顺序上都可能有细微差异,这些差异累积起来足以让实验结果对不上。我自己就遇到过因为框架版本不同导致学习曲线完全对不上的情况,排查了大半天才发现是版本问题。
具体操作上,先创建一个干净的虚拟环境,然后按照论文笔记里推荐的版本安装依赖。如果论文笔记没有明确版本,那就选一个当时比较稳定的版本组合,并且记录下来。安装完成后,跑一个简单的冒烟测试,确认环境能正常创建、模型能正常前向传播、梯度能正常回传。
提示:不要小看依赖版本这件事。我见过太多人因为版本不一致导致复现失败,最后浪费的时间远超一开始就老老实实锁版本的成本。
4.2 超参数搜索的实操细节
超参数搜索是复现里最耗算力的环节。论文笔记里用的是随机搜索,这也是我比较推荐的做法,因为随机搜索在超参数维度不高的时候(通常MBRL算法的关键超参数也就5到10个)效率不比贝叶斯优化差多少,而且实现简单、容易并行。
搜索空间的设计有几个原则。第一,范围要合理,不能太宽也不能太窄。太宽了大部分试验都落在无效区域,浪费算力;太窄了可能错过最优值。第二,尺度要选对,学习率这类参数通常用对数尺度搜索,批量大小这类参数用线性尺度。第三,关键参数优先,先把对性能影响最大的参数搜好,再搜次要参数。
我自己的做法是分两阶段:第一阶段用较少的试验次数(比如每个算法20次)做粗搜,看看哪些参数组合有希望;第二阶段在粗搜结果附近做细搜,用更多的试验次数(比如50次)精调。这样比一上来就大规模搜索要省算力,而且能更快找到有希望的区域。
4.3 学习曲线的绘制与分析
学习曲线是MBRL实验里最重要的可视化工具,但画好一条学习曲线并不简单。
首先,横轴用什么?是环境交互步数、梯度更新次数、还是墙钟时间?这三个维度各有各的意义。交互步数反映样本效率,梯度更新次数反映计算效率,墙钟时间反映实际可用性。论文笔记里主要用交互步数,因为MBRL的核心卖点就是样本效率。但我觉得如果做实际部署,墙钟时间同样重要,甚至更重要。
其次,纵轴怎么平滑?原始的学习曲线噪声很大,通常需要做滑动平均或者指数平滑。但平滑窗口的大小会影响曲线的形状,窗口太大可能把重要的波动抹掉,窗口太小又起不到平滑效果。论文笔记里用的是一种比较保守的平滑方式,保留了大部分波动信息。我的经验是,平滑窗口不要超过评估点总数的十分之一,否则容易失真。
最后,怎么展示方差?只画均值曲线是不够的,必须把种子之间的方差展示出来。常见做法是画均值曲线加阴影区域(表示标准差或置信区间)。阴影区域重叠得越多,说明算法之间的差异越不显著,解读的时候要格外小心。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 排查思路 | 解决方法 |
|---|---|---|---|
| 学习曲线完全不上升 | 超参数设置不当、模型学崩了、奖励尺度有问题 | 先检查奖励是否正常、再检查模型预测误差、最后检查策略更新 | 调小学习率、增加模型训练轮数、归一化奖励 |
| 曲线上升后突然崩溃 | 模型过拟合、策略利用了模型误差 | 检查模型在验证集上的误差、检查策略动作是否超出合理范围 | 增加模型集成数量、加策略正则化、限制动作范围 |
| 不同种子差异巨大 | 初始化敏感、探索不充分、环境随机性大 | 增加种子数量、检查初始化分布、检查探索噪声 | 用更多种子、调大探索噪声、用确定性环境做对照 |
| 复现结果和论文对不上 | 版本差异、评估协议不同、超参数不同 | 逐项核对版本、评估频率、超参数 | 锁死版本、统一评估协议、重新调参 |
| 训练速度太慢 | 模型太大、规划步数太多、数据加载瓶颈 | 用性能分析工具定位瓶颈 | 减小模型、减少规划步数、优化数据管道 |
这张表里的每一条都是我或者身边同行实际踩过的坑。比如"曲线上升后突然崩溃"这个问题,在MBRL里特别常见,因为策略会主动去探索模型不确定的区域,一旦模型在这些区域预测错误,策略就会被带偏。解决办法通常是增加模型集成的数量,用多个模型的预测方差来衡量不确定性,然后在策略优化的时候惩罚高不确定性的动作。
5. 从评测结果里能读出什么
5.1 没有银弹:不同算法各有各的适用场景
这篇论文笔记最让我印象深刻的一个结论是:没有任何一个MBRL算法在所有任务上都表现最好。有的算法在简单任务上样本效率极高,但一到复杂任务就崩;有的算法在复杂任务上稳扎稳打,但在简单任务上反而不如无模型方法。
这个结论其实挺反直觉的,因为大家潜意识里总希望找到一个"万能算法"。但仔细想想也合理:MBRL的核心是学一个模型来近似环境 dynamics,不同任务的 dynamics 复杂度、非线性程度、随机性水平都不一样,一个模型架构和一套超参数不可能通吃所有情况。
所以实际选算法的时候,我的建议是:先明确你的任务特点,再根据特点选算法。如果你的任务 dynamics 比较简单、状态维度不高,那用规划类方法可能又快又好;如果你的任务 dynamics 很复杂、需要大量数据才能学好模型,那可能混合方法更合适;如果你对计算资源很敏感,那就要优先考虑那些不需要在线规划的算法。
5.2 模型误差是绕不过去的坎
论文笔记里反复强调的一个点是:模型误差是MBRL性能的主要瓶颈。不管你的算法多精妙,只要模型在某些区域预测不准,策略就可能在那些区域做出错误决策。
模型误差主要有两个来源。一是认知不确定性,也就是因为数据不足导致的误差,这个可以通过增加数据来缓解。二是偶然不确定性,也就是环境本身固有的随机性,这个没法消除,只能建模。MBRL算法在处理这两类误差上的策略不同,有的用模型集成来估计认知不确定性,有的用概率模型来建模偶然不确定性,有的两者都用。
我自己做实验的时候发现,模型集成几乎是MBRL的标配。单个模型太容易过拟合到已有数据上,集成多个模型能显著提升鲁棒性。但集成数量也不是越多越好,通常5到7个模型就能取得不错的平衡,再多的话计算成本上升很快,收益却递减。
5.3 计算成本是被长期忽视的维度
大部分MBRL论文在比较算法的时候,只比样本效率,不比计算成本。但实际部署的时候,计算成本往往比样本效率更重要。一个算法如果样本效率高但每步要跑几秒钟的规划,那在实时控制场景里根本没法用。
论文笔记里专门讨论了这个问题,并且给出了不同算法在训练时间和推理时间上的对比。结论是:规划类方法的推理时间通常最长,因为每一步都要在线优化;策略梯度类方法的推理时间最短,因为策略网络的前向传播很快;混合方法介于两者之间。
这个结论对我的实际工作影响很大。我之前做过一个机械臂控制的项目,一开始用的是规划类方法,样本效率确实高,但推理太慢,控制频率上不去。后来换成了策略梯度类方法,虽然需要更多的交互数据,但推理速度快了一个数量级,整体效果反而更好。所以选算法的时候,一定要把计算成本纳入考量,不能只看样本效率。
6. 我自己的实操心得与踩坑记录
6.1 关于实验记录:好记性不如烂笔头
我做MBRL实验最大的教训就是:一定要把每次实验的配置、结果、观察都详细记录下来。早期我图省事,跑完实验只看一眼曲线,觉得"差不多"就过去了。结果后来想回头分析的时候,完全想不起来当时用的什么超参数、什么随机种子、甚至什么代码版本。
现在我养成的习惯是:每次实验启动前,自动把配置文件、代码版本、随机种子、环境信息写到一个日志文件里;实验结束后,自动把学习曲线、评估指标、训练时间追加到同一个日志里。这样哪怕过了几个月,我也能清楚地知道当时做了什么。
论文笔记里也提到了实验记录的重要性,并且建议用结构化的格式来记录,方便后续做元分析。我觉得这个建议非常实在,因为MBRL实验的成本很高,每一次实验的数据都应该被充分利用,而不是跑完就扔。
6.2 关于基线选择:别只挑软柿子捏
选基线是门学问。我见过不少人(包括早期的我自己)选基线的时候,有意无意地挑那些实现简单、调参容易、或者已知表现一般的算法,这样自己的方法就容易"胜出"。但这种胜利没有意义,审稿人或者同行一眼就能看出来。
论文笔记里的做法是:选基线要选当前最强、最有代表性的方法,哪怕它们很难调、很吃算力。因为只有和最强的对手比,才能证明你的方法真的有价值。如果实在调不动某个强基线,那至少要在论文里说明你做了哪些努力、遇到了什么困难,而不是假装它不存在。
我现在的原则是:基线列表里至少要有两个"硬骨头",也就是那些公认很强、但实现和调参都比较麻烦的方法。啃下这两个硬骨头,剩下的就好办了。
6.3 关于结果解读:警惕过度解读
最后说一个心态上的坑。MBRL的实验结果噪声很大,有时候两个算法之间的差异可能只是随机波动,但如果你太希望自己的方法赢,就容易把这种波动解读成"显著优势"。
论文笔记里用统计检验来辅助判断差异是否显著,这是一个很好的做法。但统计检验也不是万能的,它只能告诉你"在假设检验的框架下,观察到的差异是否不太可能由随机性产生",不能告诉你这个差异在实际应用中是否重要。
我的经验是:如果一个优势只在某些种子、某些评估点、某些任务上出现,那大概率不是真的优势。真正稳健的优势应该在大多数种子、大多数评估点、大多数任务上都一致地出现。如果一个算法只是偶尔赢一次,那还是老老实实说"两者表现相当"比较稳妥。
7. 这套评测思路还能怎么用
这篇论文笔记虽然聚焦在MBRL上,但它背后的评测方法论其实可以迁移到很多地方。我自己后来做其他方向的实验时,也经常借鉴这里的思路。
比如做超参数优化的时候,我会用类似的"统一搜索预算"原则,确保不同方法之间的对比是公平的。做A/B测试的时候,我会用类似的"多种子、多评估点"策略,避免被单次实验的噪声误导。甚至做工程方案选型的时候,我也会用类似的"梯度难度设计",先用简单场景快速筛选,再用复杂场景精细对比。
如果你正在做MBRL相关的工作,我建议你把这篇论文笔记里的评测协议当成一个起点,根据自己的任务特点做适当调整。比如你的任务有特殊的安全约束,那评估指标里就要加入安全性相关的度量;你的任务对推理延迟敏感,那就要把推理时间作为核心指标之一。评测协议不是死的,关键是背后的原则:公平、可复现、多维度、有统计意识。
如果你不做MBRL,但正在被"怎么公平地比较两个方案"这个问题困扰,那这篇笔记里的思路同样值得参考。说到底,评测这件事的本质就是:在承认不确定性的前提下,尽可能做出可靠的判断。这个原则放到哪里都成立。