资讯详情

资讯详情

基于模型的强化学习:从动力学模型到MPC规划的工程实践

第 15 讲《基于模型的强化学习》是伯克利 2026 春季《深度强化学习》课程里值得反复看的一讲。前十几讲基本都在讲 model-free 方法DQN、PPO、SAC 这些算法直接跟环境交互用大量 trial-and-error 换策略。到了第 15 讲视角彻底换了过来不直接跟环境硬碰硬而是先学一个环境模型再用这个模型来做规划或生成更多训练数据。这一讲的核心价值很明确解决 sample efficiency 问题。真实机器人、工业控制、自动驾驶这类场景里试错成本不是算力而是时间和物理损耗纯 model-free 动辄几百万次交互根本不现实。MBRL 的思路是用少量真实交互学一个动力学模型然后在这个“想象中的环境”里大量问问题。这节课把 MBRL 的几种主流范式、为什么要建模不确定性、怎么用模型做规划、以及怎么跟 model-free 方法结合都讲清楚了。这篇文章会把第 15 讲的内容拆成可执行的工程笔记先梳理 MBRL 和 model-free 的本质区别再展开动力学模型训练和 MPC/CEM 规划决策最后落到一个最小闭环实验的部署验证流程。适合读过 DQN/PPO 但不太理解 MBRL 的同学也适合想把连续控制试错成本降下来的一线算法工程师。1. 本讲核心内容速览能力项说明课程来源伯克利 2026 春季《深度强化学习》第 15 讲主题基于模型的强化学习Model-Based Reinforcement LearningMBRL要解决的问题降低深度强化学习对真实环境交互次数的依赖提升样本效率核心技术点动力学模型学习、不确定性建模、MPC/CEM 规划、与 model-free 方法结合代表性方法PILCO、MBPO、Plan2Explore、Dreamer 等涉及工具PyTorch / JAX、MuJoCo、gymnasium、NumPy硬件门槛小规模实验 CPU 可跑多环境并行和网络规模变大后建议 GPU实操方向训练一个 ensemble dynamics model配合 MPC 在 MuJoCo 上验证闭环适合人群已掌握 DQN/PPO/SAC 基础、想理解 MBRL 范式的学生和工程师从材料看这一讲的重点不是某个单一算法调参而是建立 MBRL 的整体框架什么情况下值得学模型、模型不准怎么办、用模型做规划还是用模型生成数据、怎么避免模型误差在长时间 rollout 中被放大。这几点想通之后再去看 MBPO、PETS、Dreamer 的论文会顺手很多。2. MBRL 适用场景与使用边界2.1 适合解决什么问题MBRL 最典型的使用场景是真实交互成本高的环境。典型例子包括机器人操作机械臂抓取、移动机器人导航一次真实尝试需要复位和校准。工业控制温度、压强、流量等过程控制系统策略失误可能影响生产。自动驾驶仿真与实车验证碰撞等危险状态不能靠实车去大量试探。推荐系统和在线广告线上 A/B 试探会影响用户体验有了模型可以先做离线反事实推断。另一个适合场景是数据稀缺但有波动规律的任务。如果环境本身存在较强的动力学规律比如经典控制任务、物理仿真MBRL 可以很快学到一个近似模型然后在模型内做大量规划。2.2 不适合什么场景MBRL 也有明显不适用的情况。第一类是高度非平稳环境。对手策略变化频繁、用户兴趣漂移快的场景学到的动力学模型可能很快过时需要用很大代价持续更新。第二类是模型误差很难被容忍的场景。安全关键系统如果对模型置信度要求极高必须加严格约束和异常检测否则模型的“幻觉”会造成错误决策。第三类是小规模离散动作空间且交互成本较低的场景。此时 model-free 方法通常更简单、更成熟引入模型反而增加实现复杂度。2.3 版权、隐私与安全边界如果要用 MBRL 处理真实业务数据例如用户行为日志、轨迹数据、传感器数据需要注意数据授权采集真实环境数据用于训练必须确认数据来源合法合规。隐私保护轨迹数据可能包含个人信息训练和存储时要脱敏。模型安全学到的环境模型如果部署到真实系统必须有 fail-safe 机制不能盲目信任模型预测。代码许可复现公开算法时留意项目 LICENSE。3. 预备知识与本地环境准备3.1 理论基础看第 15 讲之前建议先具备以下基础强化学习基本概念状态、动作、奖励、策略、价值函数、贝尔曼方程。深度神经网络基础MLP 训练、损失函数、过拟合、正则化。概率建模基础极大似然估计、高斯分布、KL 散度如果涉及贝叶斯方法还需要理解后验分布的近似。最优控制基础MPC模型预测控制和轨迹优化的直觉理解“短视规划”和“闭环控制”的区别。3.2 软件环境本地实践以 Python 为主推荐环境如下。版本不是死要求按实际项目调整。# 创建虚拟环境以 Anaconda 为例 conda create -n mbrl_env python3.10 conda activate mbrl_env # 安装核心依赖 pip install gymnasium pip install mujoco pip install numpy pip install matplotlib # 深度学习框架按机器情况选择 pip install torch torchvisionMuJoCo 在连续控制 benchmark 中非常常用。HalfCheetah、Hopper、Walker2d、Ant 这些环境都依赖 MuJoCo。安装完成后可以通过以下命令验证环境是否可用python -c import gymnasium; env gymnasium.make(HalfCheetah-v4); print(env.observation_space, env.action_space)如果输出显示 Observation space 的 shape 是 17Action space 是 6说明 MuJoCo 环境能正常加载。3.3 硬件要求从材料看这一讲的实验不需要特别高的显存。训练小型动力学模型时CPU 也能完成基础验证只是速度较慢。建议硬件配置适合场景普通 CPU4 核以上小规模实验CartPole 等简单环境模型较小8GB 显存 GPU如 RTX 3060/4060 级别HalfCheetah 等连续控制环境可并行采集多条轨迹12GB 以上显存 GPU更大的 ensemble 规模、更高频率的数据并行、更复杂的 latent 模型显存占用以实际模型规模和 batch size 为准不要只看网络参数量。训练动力学模型时如果 batch size 控制得当显存需求并不夸张真正消耗资源的往往是模型集成ensemble并行和数据加载环节。3.4 磁盘与网络检查MuJoCo 首次运行时可能触发依赖下载需要保证网络畅通。建议提前把环境资产缓存到本地。如果使用 Docker优先选择预装 MuJoCo 镜像减少环境安装时间。本讲涉及的算法复现代码多为 Python 脚本不需要单独部署 Web 服务端口和守护进程的问题基本不会遇到。4. 第 15 讲课程核心内容拆解4.1 从 Model-Free 到 Model-Based本质换轨Model-free 方法的核心是不显式建模环境直接通过采样得到经验数据再更新策略或价值函数。PPO 和 SAC 都是这个路线的代表。优点是实现简单、适用范围广缺点是样本效率通常偏低。Model-based 的思路则是在策略和价值函数之外引入一个“世界模型”。数学上可以理解成估计状态转移概率s_{t1} ≈ f(s_t, a_t)其中 f 可以是神经网络、高斯过程、分段线性模型等。有了 f 之后智能体就有两种用法直接拿模型做规划用 MPC 等算法基于当前状态推演未来若干步并搜索最优动作序列。拿模型生成虚拟数据让 model-free 算法在真实经验和模型想象数据上混合训练。第 15 讲反复强调一个关键点MBRL 不是某种单一算法而是一个框架。最终把模型用在哪里、模型误差怎么处理、真实数据和虚拟数据怎么混合决定了你实现的是哪一种 MBRL。4.2 动力学模型学习的损失函数动力学模型的目标是最大化观测轨迹的似然。给定数据集D {(s_t, a_t, s_{t1})}最常见的做法是让模型输出的分布尽量贴近真实下一状态。如果假设高斯分布损失函数通常是负对数似然# 伪代码计算高斯分布的负对数似然损失 def gaussian_nll(pred_mean, pred_log_var, target): variance pred_log_var.exp() nll 0.5 * ((target - pred_mean) ** 2 / variance).sum(-1) nll nll 0.5 * pred_log_var.sum(-1) return nll.mean()具体实现时需要注意输出头一般包含 mean 和 logvar 两个分支分别预测期望和方差。直接用 MSE 也可以跑通基础实验但方差输出能表达模型对哪些区域不确定。归一化观测值很重要。状态空间的量纲差异如果不处理网络训练会不稳定。4.3 不确定性建模MBRL 的胜负手第 15 讲把不确定性建模提到了非常高的优先级。原因在于如果模型不知道自己在哪些地方不准规划器会利用模型的“幻觉”骗自己。不确定性主要分两类Aleatoric uncertainty偶然不确定性数据本身的随机性比如传感器噪声。这种不确定性无法通过加数据消除但模型可以通过方差输出表达出来。Epistemic uncertainty认知不确定性因为数据不足导致的无知。数据覆盖越多这种不确定性越小。MBRL 最常见的方法是训练一个 ensemble。多个网络从不同初始化出发独立训练推理时取均值作为预测取方差作为不确定性估计。这个方案实现简单在 PETS、MBPO 等方法中都很常见。4.4 规划与决策MPC 和 CEM学到了动力学模型之后怎么用是核心问题。课程重点讲解了模型预测控制MPC的思路在每个时间步基于当前状态 s_t 和模型 f 规划一段长度为 H 的动作序列选择累计奖励最高的序列只执行第一个动作然后重新规划。具体来说MPC 的在线规划流程是这样的# MPC 在线规划伪代码 def mpc_plan(state, model, horizon, action_space, num_candidates): best_action None best_return -inf for i in range(num_candidates): action_seq sample_action_sequence(action_space, horizon) sim_state state total_return 0.0 for t in range(horizon): next_state_pred model.predict(sim_state, action_seq[t]) reward_pred reward_fn(sim_state, action_seq[t], next_state_pred) total_return reward_pred sim_state next_state_pred if total_return best_return: best_return total_return best_action action_seq return best_action[0]当然随机采样子空间的效率不高。课程里大概率会提到 CEMCross-Entropy Method先按高斯分布采样一批动作序列评估累计回报用 top-k 的序列重新拟合高斯分布迭代若干轮后再取均值。CEM 比纯随机搜索稳定得多是 MBRL 工程师的常用工具。4.5 代表性方法PILCO、MBPO、Dreamer第 15 讲通常会把几类代表性 MBRL 算法串起来讲PILCO早期代表用高斯过程做动力学模型在模型内做策略搜索。优点是对小数据量效率很高缺点是高斯过程扩展到高维环境比较吃力。PETS用 ensemble 神经网络学习模型配合 MPC 做在线规划强调用 uncertainty 做轨迹采样。MBPO把 model-based 和 model-free 混合起来。它用真实数据训练动力学模型然后用模型生成短距离 rollout 来扩充 SAC 的训练数据集。短 rollout 能有效避免模型误差累积。Plan2Explore把“探索自己不知道的区域”当成目标本身先学一个不确定性高的模型再用模型内在奖励引导智能体去收集更多信息。Dreamer在潜在空间学习世界模型从“梦境”中学习行为。Representation 不局限于像素空间适合图像输入场景。这些算法的取舍基本上围绕三个问题模型用什么函数逼近器、模型生成的数据怎么用、怎么处理不确定性。理解了这三个维度后面看论文就会快很多。5. 本地实验跑通一个最小 MBRL 闭环5.1 实验设计思路这里给出一套通用的最小实验方案用 HalfCheetah 或 CartPole 验证 MBRL 闭环。具体任务可以做如下配置使用 MuJoCo 环境收集初始数据用随机策略跑若干步。训练一个 ensemble 神经网络动力学模型输入是(s_t, a_t)输出是s_{t1}的均值和方差。用模型 MPC/CEM 控制器在环境中执行闭环控制。每交互一轮把新数据加入数据集重新训练模型。这个闭环实验不需要完整实现某个 benchmark 算法但足以验证 MBRL 的流水线是否正常。5.2 数据采集与训练以下代码是通用模板具体路径、环境名、超参数需要按实际项目调整import numpy as np import torch import torch.nn as nn from torch.utils.data import DataLoader, TensorDataset import gymnasium as gym # 1. 采集初始数据 def collect_data(env, policy, steps1000): states [] actions [] next_states [] obs, _ env.reset() for _ in range(steps): action policy(obs) next_obs, reward, terminated, truncated, info env.step(action) states.append(obs) actions.append(action) next_states.append(next_obs) obs next_obs if terminated or truncated: obs, _ env.reset() return ( np.array(states, dtypenp.float32), np.array(actions, dtypenp.float32), np.array(next_states, dtypenp.float32), ) env gym.make(HalfCheetah-v4) random_policy lambda obs: env.action_space.sample() states, actions, next_states collect_data(env, random_policy, steps2000) # 2. 定义动力学模型 class DynModel(nn.Module): def __init__(self, obs_dim, act_dim, hidden256): super().__init__() self.net nn.Sequential( nn.Linear(obs_dim act_dim, hidden), nn.ReLU(), nn.Linear(hidden, hidden), nn.ReLU(), ) self.mean_head nn.Linear(hidden, obs_dim) self.logvar_head nn.Linear(hidden, obs_dim) def forward(self, obs, action): x torch.cat([obs, action], dim-1) h self.net(x) mean self.mean_head(h) logvar torch.clamp(self.logvar_head(h), min-10.0, max1.0) return mean, logvar # 3. 训练一个简单的模型实际可以做 ensemble obs_dim env.observation_space.shape[0] act_dim env.action_space.shape[0] model DynModel(obs_dim, act_dim) dataset TensorDataset( torch.tensor(states), torch.tensor(actions), torch.tensor(next_states) ) loader DataLoader(dataset, batch_size256, shuffleTrue) optimizer torch.optim.Adam(model.parameters(), lr3e-4) for epoch in range(100): for obs_batch, act_batch, next_obs_batch in loader: pred_mean, pred_logvar model(obs_batch, act_batch) variance pred_logvar.exp() nll 0.5 * ((next_obs_batch - pred_mean) ** 2 / variance).sum(-1) nll nll 0.5 * pred_logvar.sum(-1) loss nll.mean() optimizer.zero_grad() loss.backward() optimizer.step()注意这里只训练了一个网络用于验证流程。真正做 MBRL 时建议训练 5 到 10 个 ensemble 成员用均值做预测、方差做不确定性估计。5.3 MPC 与 CEM 控制器模型训练好之后用 CEM 做在线规划def cem_action(model, obs, horizon30, num_candidates200, num_iter3, topk20): obs_tensor torch.tensor(obs, dtypetorch.float32).unsqueeze(0) action_dim env.action_space.shape[0] mean np.zeros((horizon, action_dim)) std np.ones((horizon, action_dim)) * 0.5 for _ in range(num_iter): # 采样候选动作序列 candidates np.random.normal(mean, std, size(num_candidates, horizon, action_dim)) candidates np.clip(candidates, env.action_space.low, env.action_space.high) returns [] for candidate in candidates: sim_obs obs_tensor total_return 0.0 with torch.no_grad(): for t in range(horizon): act_tensor torch.tensor(candidate[t], dtypetorch.float32).unsqueeze(0) pred_mean, _ model(sim_obs, act_tensor) # 简单奖励速度项按任务调整 reward pred_mean[0, 1].item() # HalfCheetah 有速度分量这里仅示意 total_return reward sim_obs pred_mean returns.append(total_return) indices np.argsort(returns)[-topk:] elites candidates[indices] mean elites.mean(axis0) std elites.std(axis0) 1e-6 return mean[0]闭环评估时每步调用cem_action执行返回的动作观察真实环境反馈同时把新数据存回数据集后续再重训模型。判断实验是否成功的标准是对比随机策略的累计奖励CEM 控制器是否能稳住在更高水平。5.4 判断成功与失败排查如果模型 loss 不断下降但 MPC 效果差优先怀疑模型 rollout 累积误差缩短 horizon。如果动作序列跳变严重检查 CEM 的候选数是否太少。如果训练不稳定检查状态归一化和 reward 缩放。如果 ensemble 成员之间差异过大检查是否每个成员用了不同数据顺序和初始化。6. 实验批量管理与配置化MBRL 实验调试比 model-free 更繁琐因为涉及模型训练、数据采集、规划评估多个环节建议把超参数统一放到配置文件里。environment: name: HalfCheetah-v4 dataset_steps: 2000 reset_on_termination: true model: type: ensemble ensemble_size: 7 hidden_dim: 256 learning_rate: 3.0e-4 train_epochs: 100 batch_size: 256 planning: horizon: 30 num_candidates: 200 num_iterations: 3 top_k: 20 eval: episodes: 10 seed: 0批量跑实验时建议维护一套固定脚本结构每个实验一个独立输出目录experiments/ 2026-spring-berkeley-lesson15/ config.yaml logs/ datasets/ models/ results/每次实验以 seed 为粒度并行。利用 Python 多进程启动多组 switch例如在 8 核机器上同时跑 4 个 seed每组实验独占进程。这样能更快判断方法稳定性。7. 资源占用与性能观察7.1 训练阶段训练动力学模型本身的显存占用不高。以 MLP 形式的小模型为例batch size 256 时显存通常不会成为瓶颈。主要消耗在ensemble 数量模型数量翻倍显存和训练时间近似翻倍。数据并行同时采集多个环境的轨迹时CPU 压力更大。latent model如果使用 Dreamer 这类图像输入模型显卡消耗会明显增加。7.2 推理阶段MPC/CEM 需要在每个控制周期做多次模型推理。候选数 200、horizon 30、迭代 3 轮时每一步大约需要 18000 次前向传播CPU 推理会出现明显延迟。此时可以考虑减少候选数和 horizon。用 PyTorch 的 batch 推理合并候选样本。使用 GPU 或半精度推理。缓存重复出现的模型预测。7.3 性能观察方法在 Linux 环境下可以用nvidia-smi查看显存用top或htop查看 CPU 和内存。训练 MBRL 模型时建议在日志里打印以下指标每轮数据采集的步数和真实回报。动力学模型的训练 loss 和验证 loss。MPC 每次规划的平均耗时。每个 epoch 的交互数据量与模型更新频率。这样调整结构时能快速定位瓶颈。8. 常见问题与排查方法问题现象可能原因排查方式解决方案MuJoCo 环境无法加载没有激活 mujoco-key 或依赖缺失执行 import 测试并查看报错升级 gymnasium 和 mujoco检查 Python 版本模型 loss 持续下降但控制效果差模型在长 rollout 累积误差过大可视化单步预测和 multi-step 预测误差缩短 MPC horizon增加真实数据占比动作序列抖动剧烈CEM 候选数不够或 top-k 比例太高打印 top-k 精英序列的分布增大候选数降低 top-k增加迭代轮数训练数据覆盖不足随机策略只在部分状态空间采样查看 state 分布先加探索噪声或增大数据集步数ensemble 成员差异过大数据顺序和初始化太接近检查训练脚本的随机种子给每个成员不同 seed并 shuffle 数据GPU 显存不足ensemble 并行推理 batch 过大查看 nvidia-smi 峰值显存降低 batch size分模型推理或使用半精度强化学习训练不稳定reward 尺度差异大记录单步 reward 分布对 reward 做归一化或 clip9. 最佳实践与学习建议第一次接触 MBRL建议先不要追求复现复杂结果而是跑通一个最小闭环流程并做以下几件事对比 random policy 和 MPC policy 的回报曲线。分别记录单步预测误差和多步 rollout 误差强化对累积误差的直觉。在模型预测中加入 ensemble 的不确定性估计观察其对 MPC 稳定性的影响。尝试把 MBRL 与 SAC 结合的思路在代码里加入“模型生成短 rollout”逻辑理解 MBPO 的核心机制。工程化方面有几个建议值得长期保留固定随机种子。数据采集、模型初始化、CEM 采样都涉及随机性不固定 seed 无法判断改动是否有效。模型文件、数据集、实验结果分目录管理。建议每次实验都记录 git commit id 和配置文件。从简单环境开始验证。CartPole 可以在几秒内跑完验证流程再去跑 HalfCheetah。注意训练数据覆盖范围。如果只在低速度数据上训练模型MPC 规划出的高速动作很可能超出模型可信区域。涉及仿真、真实机器人、数据日志等场景时确认数据来源合法、隐私脱敏、部署有安全兜底。10. 总结与下一步第 15 讲最有价值的收获是建立 MBRL 的完整思维框架学什么模型、模型不确定怎么办、用什么规划器、怎么跟 model-free 结合。理解了这四个问题PILCO、PETS、MBPO、Dreamer 的论文就不再是黑盒。最开始应该验证的功能是单步动力学模型预测给模型一个(s_t, a_t)看它输出的s_{t1}与真实 next state 的误差并逐步把误差放大到多步 rolllout 中。这一步能快速揭示模型的真实能力边界。最容易踩的坑是把模型训练当常规监督学习处理忽略了探索与数据分布的影响。动力学模型只有在被真实数据覆盖的状态空间内才可靠CEM 规划出的动作序列如果超出训练分布效果会瞬间崩塌。后续可以继续沿着两个方向深入一是把 ensemble 不确定性估计和真实环境探索策略组合起来复现 MBPO 的数据混合机制二是尝试 latent 世界模型方向用 Dreamer 的思路处理图像输入的控制任务。把第 15 讲的核心概念落实到代码里从最小闭环开始逐步增加模型集成和规划器复杂度。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →