强化学习在游戏和仿真环境中已经取得令人瞩目的成果,可一旦搬到真实世界,最大的拦路虎就是样本效率。让机械臂试错几百万次去学抓取,或者让自动驾驶汽车在真实道路上随机探索,无论从时间成本还是安全角度都不可接受。无模型算法(如DQN、PPO)之所以样本消耗巨大,是因为每一条经验只用一次,学到的策略完全依赖真实交互数据。基于模型的强化学习(Model-Based Reinforcement Learning,简称MBRL)换了一个思路:既然样本昂贵,那就先用少量真实样本学出一个环境的动力学模型,再让智能体在这个学出来的模型里廉价地大量试错,把真实交互需求压缩几个数量级。

一、样本效率低到底是怎么造成的
要理解基于模型方法的价值,先要看清无模型方法的浪费在哪里。无模型算法直接从转移元组(状态、动作、奖励、下一状态)中估计价值函数或策略梯度,本质上是在做一件极其低效的事情:把环境当作黑盒,每一次策略改进都必须重新采集数据。以SAC算法在MuJoCoHalfCheetah任务为例,要达到较高回报通常需要上百万步交互,而人类儿童观察一只狗跑步几次就能大致模仿出相似动作,这种差距的根源在于人类大脑里有世界模型。
从信息论角度看,每一条真实经验所包含的关于环境动力学的信息其实相当丰富,无模型方法只利用了其中与当前策略相关的部分,剩余信息被直接丢弃。基于模型的方法则显式地拟合转移函数,把经验中的动力学知识沉淀下来,使得历史数据可以被反复复用。这种数据复用能力正是样本效率提升的核心来源,研究表明在中等复杂度的连续控制任务上,好的MBRL算法能以少一到两个数量级的样本达到与无模型方法相当的性能。
当然,天下没有免费的午餐。学习模型本身引入了模型误差问题:学出的环境模型不可能完美,在模型上规划出的最优动作在真实环境中可能完全失效,这就是经典的模型偏差(model bias)问题。如何在充分利用模型和抑制模型误差之间取得平衡,是所有MBRL算法设计的主线。
二、世界模型的构建方式
世界模型就是对环境动力学p(s'|s,a)的拟合,工程上有多种建模选择。最直接的是确定性动力学模型,用神经网络输出下一状态的预测值,如PETS算法中的集成网络。确定性模型简单高效,但无法表达环境的内在随机性,比如对手的随机策略或物理系统的噪声,容易在规划时过度乐观。
概率模型则输出下一状态的分布,常用高斯混合或贝叶斯神经网络建模不确定性。PETS使用概率集成神经网络(PEM),多个模型独立训练后取平均预测,既获得了不确定性估计,又缓解了单个网络过拟合的问题。集成成员之间预测的方差可以当作认知不确定性的度量,用来约束规划时的搜索范围,只在模型认为可信的区域里做轨迹优化。
第三条路线是隐空间世界模型,代表工作是PlaNet和Dreamer系列。这类方法先用变分自编码器或循环状态空间模型把高维观测(如像素图像)压缩到低维隐状态,再在隐空间中学习转移模型。DreamerV3通过学习隐状态中的奖励和值函数,直接在想象出来的隐空间轨迹上通过反向传播训练策略,在Atari、Crafter等多个基准上达到了极高的样本效率。下面是一个简化的隐空间转移模型示意代码:
import torch
import torch.nn as nn
class LatentDynamicsModel(nn.Module):
def __init__(self, latent_dim, action_dim, hidden=256):
super().__init__()
# 转移模型:输入当前隐状态和动作,预测下一隐状态的分布参数
self.net = nn.Sequential(
nn.Linear(latent_dim + action_dim, hidden),
nn.ELU(),
nn.Linear(hidden, hidden),
nn.ELU(),
)
self.mu_head = nn.Linear(hidden, latent_dim) # 高斯均值
self.logvar_head = nn.Linear(hidden, latent_dim) # 高斯对数方差
def forward(self, z, a):
h = self.net(torch.cat([z, a], dim=-1))
mu = self.mu_head(h)
# 对方差做裁剪,保证数值稳定
std = torch.exp(0.5 * torch.clamp(self.logvar_head(h), -10, 10))
return mu, std隐空间建模的额外好处是计算量大幅下降:在64x64的像素观测上直接预测未来帧,既昂贵又容易把容量浪费在与决策无关的背景细节上;而在维度低得多的隐空间中做长时程rollout则轻量得多。代价是编码器本身可能丢失与任务相关的信息,需要在重建损失、奖励预测和值函数预测等多个目标之间做平衡训练。
三、规划方法:如何利用学到的模型
有了世界模型,下一步是决定怎么用它。第一种思路是在线轨迹优化,代表算法是PETS采用的MPC框架:每个时间步都用交叉熵方法(CEM)在动作序列空间中搜索,用集成模型预测轨迹回报,只执行序列的第一个动作,下一步重新规划。这种滚动优化天然抵抗模型误差,因为误差会随时间累积,而短时程预测相对准确。CEM的采样过程大致如下:
import numpy as np
def cem_plan(model, state, horizon, pop_size=200, elite_frac=0.1, iters=5):
action_dim = model.action_dim
mean = np.zeros((horizon, action_dim))
std = np.ones((horizon, action_dim))
n_elite = int(pop_size * elite_frac)
for _ in range(iters):
# 按当前高斯分布采样一批候选动作序列
samples = mean + std * np.random.randn(pop_size, horizon, action_dim)
samples = np.clip(samples, model.action_low, model.action_high)
# 用学到的模型评估每条候选序列的累计回报
scores = np.array([model.estimate_return(state, seq) for seq in samples])
# 选取精英样本,更新采样分布
elite = samples[np.argsort(scores)[-n_elite:]]
mean, std = elite.mean(0), elite.std(0)
return mean[0] # 只执行第一步动作,之后重新规划第二种思路是虚拟经验生成,以MBPO算法为代表。它把学到的模型当作数据增强器:从真实缓冲区的状态出发,在模型中做短rollout(通常只有一到一个固定小步数),把生成的虚拟转移混入真实数据一起训练SAC之类的无模型智能体。关键洞察在于 rollout长度必须很短,因为模型误差随 rollout长度指数级放大,短 rollout既能提供有价值的状态覆盖扩展,又不会引入太多偏差。MBPO在HalfCheetah上比纯SAC快了一个数量级以上。
第三种思路是在线树搜索,如AlphaGo和MuZero中使用的蒙特卡洛树搜索(MCTS)。MuZero特别值得关注,它不再学习完整的重构模型,而是只学习与决策相关的三个量:奖励、值函数和策略先验,在隐空间中做MCTS规划。这种面向规划的建模哲学说明:模型不必忠实还原环境的每个细节,只要能支撑搜索就好。三种方法的对比可以总结如下:
| 规划方法 | 代表算法 | 优点 | 局限 |
|---|---|---|---|
| MPC轨迹优化 | PETS | 无需训练策略网络,适应环境变化快 | 每步都要搜索,推理开销大 |
| 虚拟经验生成 | MBPO | 实现简单,可与任意无模型算法结合 | rollout长度敏感,调参较多 |
| 树搜索 | MuZero | 搜索深度大,决策质量高 | 计算成本极高,多用于离散动作 |
| 隐空间想象训练 | Dreamer | 端到端,样本效率顶尖 | 训练不稳定因素多,依赖辅助损失 |
四、工程实践中的常见陷阱与选型建议
第一个常见坑是忽视模型不确定性的度量。很多初学者训练单个确定性网络就直接长程rollout,结果虚拟数据严重失真,策略性能反而不如无模型基线。实践建议至少使用五到十个模型的集成,用预测方差判断数据可信度,并在MBPO类算法中根据不确定性提前终止rollout。
第二个坑是模型与任务目标脱节。世界模型优化的是一步预测精度,但规划关心的是长时程回报,两者并不等价。一个预测误差很小的模型可能在关键动态(比如即将摔倒的临界状态)上恰恰不准。 remedy手段包括对规划相关的状态区域过采样、使用隐空间模型配合值函数蒸馏,或者像MuZero那样直接让模型为搜索服务。
第三个坑是过度迷恋模型而忽略真实数据的价值。正确的做法是始终保留真实经验回放,虚拟数据只作为补充,并控制虚拟与真实数据的混合比例。还要注意监控模型验证集误差,一旦环境发生非平稳变化,及时触发模型重训。
选型上可以参考这样的经验法则:如果任务有廉价仿真器但真实样本稀缺,优先考虑Dreamer类隐空间方法;如果是连续控制且希望快速迭代,MBPO加SAC是稳妥的组合;如果动作空间离散且单步决策价值高,可以尝试MuZero式的搜索方案;如果环境快速变化且不允许离线训练策略,滚动MPC(如PETS)更合适。无论选择哪条路线,记住MBRL的核心权衡始终是模型误差与样本效率的交换,工程上所有技巧归根结底都是在管理这对矛盾。