尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

基于模型的强化学习:从样本效率到算法选型与工程实践

发布时间:2026/9/28 1:24:01

资讯中心
01
ARTICLE

基于模型的强化学习:从样本效率到算法选型与工程实践

基于模型的强化学习:从样本效率到算法选型与工程实践
深度强化学习课程进入中段之后讨论的重点往往从“怎么让智能体学会一个任务”转向“怎么让智能体更快、更省交互地学会一个任务”。伯克利 2026 春季深度强化学习课程把第 15 讲留给基于模型的强化学习Model-Based Reinforcement Learning, MBRL这是一个非常值得展开的话题。本文将以该讲的核心思路为线索结合算法原理、分类框架、代码示例和工程实践经验系统地梳理基于模型的强化学习是什么、它和主流无模型方法的区别在哪里、课程里会涉及哪些代表算法、以及实际落地时应该怎么选型、怎么避坑。如果你之前主要接触的是 DQN、PPO、SAC 这类无模型算法刚开始接触 Model-Based RL 时最直观的感受会是为什么要把“环境模型”显式地学出来这难道不是在绕远路吗读完这篇文章后你会理解这个“绕路”带来的样本效率提升有多明显也会明白为什么最近几年 Dreamer、PETS、MBPO 这类算法能在高维控制任务中逐渐获得关注。1. 背景与核心概念1.1 什么是基于模型的强化学习先看一个通俗的比喻。传统无模型强化学习很像一个新人去一家餐厅后厨学做菜他只能通过反复实操、试错、被主厨评价来逐步积累经验。每次做坏一道菜他才知道这个火候不行每次做得好他才知道这个配比是对的。这种方式很可靠但代价是交互成本高、试错次数多而且每次试错可能都要耗费真实的食材和时间。基于模型的强化学习则换了一种思路让这个新人先尝试理解“做菜”这个过程本身——例如什么食材组合会产生什么味道、什么火候会让食材变焦、调料下锅顺序为什么重要。一旦他建立了一个足够好的“做菜模型”他就可以在脑海里模拟很多种做法提前排除明显失败的方案再拿少数几种最有希望的方案去后厨实践验证。在强化学习的标准术语中这个“做菜模型”就被称为环境动态模型Environment Dynamics Model。MBRL 的核心目标是从已有交互数据中学习一个能够近似描述状态转移和奖励函数的环境模型然后利用这个模型进行规划或策略优化从而减少和真实环境直接交互的次数。形式上马尔可夫决策过程MDP被定义为一个五元组 ((S, A, P, R, \gamma))。其中 (P(s|s,a)) 是状态转移概率(R(s,a)) 是奖励函数。无模型强化学习直接学习策略或价值函数完全绕过或者隐式地学习 (P) 和 (R)。而基于模型的强化学习则是显式地去拟合这两个函数[ \hat{P}(s|s,a), \quad \hat{R}(s,a) ]这里的 (\hat{P}) 和 (\hat{R}) 就是环境模型的预测。一旦模型训练完毕并且精度足够高智能体就可以不再一味依赖真实环境的反馈而是在这个“替代环境”中做大量低成本试错。1.2 为什么当前深度强化学习越来越关注 MBRL深度强化学习在很多任务上取得了惊人的成绩比如围棋、电子游戏、机器人控制。但这类成功背后往往需要非常庞大的交互数据。以 DQN 玩 Atari 游戏为例智能体通常需要经历数千万帧画面才能达到较好水平机器人真实环境中不可能承受这么高密度的试错因为每一次试错都有机械磨损、安全风险和物理成本。基于模型的强化学习之所以再度成为研究热点根本原因就在于它能用更少的真实交互换回更好的策略。**样本效率Sample Efficiency**是 MBRL 最核心的优势。例如在 MuJoCo 等连续控制环境中MBPO 这样的算法通常仅需 10 万到 50 万步环境交互就能达到与无模型算法数百万甚至上千万步相近的性能这在真实物理系统中意义巨大。除此之外MBRL 还具有另一个隐性优势模型本身可以作为对任务环境的“知识沉淀”。一个训练好的环境动态模型即使更换了策略优化算法也可以继续复用。甚至在 sim-to-real 迁移、异常检测、离线强化学习等场景中动态模型都有独立的分析价值。1.3 MBRL 与无模型 RL 的关键区别理解 MBRL 最好的办法是把它放到和 Model-Free RL 的对比表格中。对比维度无模型强化学习基于模型的强化学习是否显式学习环境动态否是代表性算法DQN、PPO、SAC、TD3Dyna-Q、PETS、PlaNet、Dreamer、MBPO样本效率较低通常需要大量交互较高模型可以减少真实交互计算开销主要集中在策略训练需要额外训练环境模型并维护数据集误差来源策略/价值函数近似误差模型偏置、预测误差累积适用场景任务环境复杂难以建模或模型精度极难保障可以快速试错、模型可近似、交互代价高最终策略质量通常较高直接针对任务优化可能受模型不准确限制需要配合模型矫正机制这里最关键的概念是模型偏置Model Bias。无模型强化学习直接优化策略它的近似误差来源于神经网络拟合价值函数或策略本身而 MBRL 还要额外承受环境模型近似带来的误差。如果动态模型在某个状态-动作区域出现较大误差智能体在模拟中“想象”出来的轨迹可能是完全错误的这就是基于模型的方法在很长一段时间内性能不如无模型方法的原因。1.4 伯克利 DRL 课程中的定位与整体脉络第 15 讲放在课程的后半部分是有其内在逻辑的。前面章节通常已经讲完了策略梯度、Q-learning、Actor-Critic 等无模型算法也讲完了一些基础的理论背景。到了第 15 讲学生已经具备了评估算法性能的基本工具此时引入 MBRL正好可以把问题引向一个新的维度能不能让智能体在学习策略的同时也学习一个关于环境本身的模型课程通过这个讲次把 Dyna、PETS、PlaNet 到 Dreamer 的一系列 MBRL 算法串成一条线索帮助读者建立“学习模型——使用模型——修正模型”的完整思维框架。对于跟着课程学习的读者需要把握三个层次第一层理解环境动态模型的形式和损失函数第二层理解随机轨迹生成、MPC 规划和传播方式第三层理解模型使用中的误差累积问题以及如何通过采样减小偏置。2. 课程第 15 讲的核心技术拆解2.1 动态模型的建模方式在 MBRL 中环境动态模型的任务是接收当前状态和动作输出下一步状态以及可能的奖励预测。深度神经网络是当前最常用的拟合工具。根据状态空间的类型模型可以分成两类离散状态模型输出状态的概率分布使用分类损失训练。例如棋盘类游戏、离散网格导航任务。连续状态模型通常假设转移服从高斯分布输出均值和对角协方差使用负对数似然Negative Log-Likelihood, NLL训练。例如 MuJoCo 机器人控制任务。以一个简单的连续控制任务为例假设状态 (s_t \in \mathbb{R}^n)动作 (a_t \in \mathbb{R}^m)模型输入是拼接向量 ((s_t, a_t))输出是下一状态的分布参数[ (\mu_{s_{t1}}, \Sigma_{s_{t1}}) f_\theta(s_t, a_t) ]损失函数是负对数似然# 伪代码动态模型损失计算 pred_mean, pred_logvar model(torch.cat([s, a], dim-1)) log_likelihood -0.5 * (logvar (target - pred_mean)**2 / logvar.exp() log(2 * pi)) loss -log_likelihood.mean()这里在做的事情本质上就是监督学习。数据来源是智能体在真实环境中交互产生的状态转移元组 ((s_t, a_t, s_{t1}, r_t))。训练目标是让模型在已有数据点上学到的预测分布最大化真实转移的似然。2.2 随机轨迹上的梯度问题在基于模型的强化学习中一个核心操作是利用动态模型展开想象轨迹Imaginary Rollout。假设当前状态是 (s_0)策略是 (\pi_\phi)动态模型是 (f_\theta)那么一条想象轨迹可以写成[ s_1 \sim f_\theta(s_1 | s_0, a_0), \quad a_1 \sim \pi_\phi(a_1 | s_1), \quad s_2 \sim f_\theta(s_2 | s_1, a_1), \ldots ]训练策略时目标函数是这条想象轨迹上的累计回报期望。问题在于状态采样是一个随机过程如果直接对采样得到的离散样本求梯度梯度会被阻断——你无法通过一个离散采样节点把梯度传给策略参数。为了对策略参数 (\phi) 求梯度常见做法分为两大类重参数化技巧Reparameterization Trick把随机性从模型参数中分离出来。例如把 (s_{t1} \mu_\theta(s_t,a_t) \Sigma_\theta(s_t,a_t) \cdot \epsilon) 写成确定性的计算图其中 (\epsilon \sim \mathcal{N}(0, I)) 是一个独立采样噪声。这样梯度可以直接通过 (\mu) 和 (\Sigma) 回传到策略中。似然比技巧 / 策略梯度风格将想象轨迹上的奖励当作一个随机返回来估计策略梯度这与无模型策略梯度算法中的 REINFORCE 思路一致。课程中特别值得强调的是MBRL 里做想象轨迹展开时“随机性”不能丢掉。一种常见错误是在预测时直接取分布均值作为下一状态以“图省事”。这种做法会让轨迹误差在很短几步内快速累积导致策略在模型幻觉中过度自信。正确的做法通常是在每一步都从预测分布中采样让模型的不确定性显式地影响轨迹传播从而让策略学会对不确定性鲁棒。2.3 代表性算法族2.3.1 Dyna 架构最简单的闭环Dyna-Q 是最早把模型学习和策略学习结合起来的算法之一。它的核心思想可以概括为三步循环在真实环境中执行策略收集转移数据用收集到的数据更新环境模型从真实状态出发使用环境模型生成假设经验再用这些假设经验更新 Q 值或策略。Dyna 架构的意义在于它把“模型学习”和“模型使用”放在同一个循环中思路直观代码量少是理解 MBRL 闭环结构的最佳起点。课程通常会先用同步 Dyna-Q 讲解框架再讨论异步 Dyna 和优先级遍历等扩展。2.3.2 PETS以 MPC 为核心的规划算法PETSProbabilistic Ensembles with Trajectory Sampling是由加州大学伯克利分校提出的算法在连续控制任务上是 MBRL 的经典代表。PETS 用一组神经网络集成来建模环境动态每个网络输出一个高斯分布。使用集成的原因是单个网络无法准确表达模型的不确定性而集成模型能够提供对预测不确定性的近似估计。PETS 本身不训练一个策略网络而是在每次决策时使用模型预测控制Model Predictive Control, MPC在线规划。所谓 MPC就是每一小步都做一步规划执行规划中的第一个动作然后重新规划。课程会介绍两种轨迹传播方式TS1Single Trajectory Sampling每个候选动作序列只展开一条轨迹计算量小但方差大TS∞Cross-Entropy Method 优化对同一个动作序列重复展开多条轨迹用经验分布逼近累计回报分布再通过 CEM 迭代选择最优动作序列。TS∞ 能明显改善规划质量因为多条轨迹的统计信息可以有效缓解模型随机性带来的方差。但代价是计算成本成倍增加。2.3.3 PlaNet 与 Dreamer学习潜空间模型当状态空间是高维像素时直接在高维图像空间建模动态是非常困难的。PlaNetDeep Planning Network和 Dreamer 是这一类中的代表算法。它们的共同点是使用变分自编码器VAE框架将高维观测压缩成低维潜状态在潜空间中学习转移模型和奖励模型在潜空间中做想象轨迹展开。这里需要强调的是潜空间建模可以同时解决维度灾难和长期预测误差累积问题。Dreamer 在此基础上进一步引入 Actor-Critic 结构把想象轨迹上的价值学习和策略优化结合起来做到了在一个模型中同时输出动作、价值和状态预测训练流程上类似于无模型 Actor-Critic但所有经验都来自潜空间想象而非真实环境。课程中花在 Dreamer 系列上的篇幅通常不少因为这是当前 MBRL 在视觉控制和复杂任务上最接近实用化的一条路线。从 PlaNet 到 Dreamer再到 DreamerV2、DreamerV3核心演进逻辑就是在潜空间模型中逐步加入离散化表示、对称奖励缩放、更大规模的训练技巧。2.3.4 MBPO模型与无模型结合MBPOModel-Based Policy Optimization是另一个需要掌握的思路。它不追求用模型完全替代真实环境而是把模型生成的短分支想象轨迹插入到无模型策略优化中。算法在每一步会做如下操作从当前真实策略收集数据同时更新环境模型用模型从真实状态出发向前短步数展开轨迹把想象轨迹与真实轨迹混合交给 SAC 等无模型 Actor-Critic 算法更新策略。MBPO 最重要的实践洞察是模型误差随着轨迹长度的增加而快速上升因此只做短步想象例如 1~3 步可以最大化想象数据的收益同时限制模型偏置的影响。这个“短步想象 截断”的思想后来被 многих后续工作沿用。2.4 误差来源与模型偏置问题MBRL 中最难处理的是模型偏置问题。动态模型是在有限数据上拟合出来的不可能完全准确但策略训练可能利用模型的错误预测获得虚高的回报最终造成策略在实际环境中严重退化。课程和论文中提到的主要对策有模型集成训练多个模型用它们预测的平均值或方差进行规划如果集成中各个模型意见不一说明模型在该区域置信度低。短步想象不展开过长轨迹降低单条轨迹的错误累积。不确定性惩罚在模型预测方差过大时降低该轨迹的奖励期望值。真实数据回填定期用真实环境交互纠偏防止策略过度“钻模型空子”。分环境训练与验证严格区分训练所处环境与评估环境评估必须回到真实环境。3. 环境准备与代码结构要想把 MBRL 的核心流程完整跑通一个能快速实验的编程环境是必要的。课程作业通常基于 Python 和 PyTorch下面以最常见的环境组合为例给出配置思路。如果你使用的是不同版本注意按官方文档调整。3.1 版本说明本文示例以如下环境为基础操作系统Ubuntu 20.04 / macOS 均可Windows 需要额外注意 MuJoCo 安装路径配置Python3.8 或以上PyTorch1.10 或以上2.x 版本也可以强化学习环境gymnasium较新版本或 gym 0.21.0旧项目常见连续控制测试环境MuJoCo 相关环境HalfCheetah、Hopper 等或自定义简单环境。版本并不是固定不变的。如果你配置的环境版本不同只需要保证 torch、gymnasium 和 numpy 之间没有兼容性冲突即可。本文示例将以一个自定义的 2D 网格导航任务为主线这样即使你没有安装 MuJoCo也能在没有复杂依赖的情况下直接运行。3.2 项目目录结构mbrl_demo/ ├── main.py # 主程序入口训练循环 ├── env.py # 自定义环境二维网格导航 ├── model.py # 动态模型网络定义 ├── agent.py # Dyna-Q 智能体逻辑 ├── utils.py # 缓冲区、数据采样等工具 └── config.py # 超参数配置这样一个结构足够支撑一个最小可运行的 MBRL 示例。在真实的课程作业中代码规模可能更大但核心组件和这里的思路是一致的。4. 完整实战示例基于 Dyna-Q 的网格导航为了让“基于模型强化学习”这件事落地可演示下面设计一个非常简单的网格导航任务并实现一个 Dyna-Q 风格的智能体。这个例子的意义在于用最少的代码展示 MBRL 的闭环流程真实交互、模型学习、想象规划、策略更新。4.1 任务设计环境是一个 5×5 的网格智能体从左上角 (0,0) 出发目标位于右下角 (4,4)每次移动一步动作空间为上下左右四个方向到达目标获得奖励 1其他步奖励 0撞墙则停留在原地每回合最多 30 步。由于状态空间比较小这里可以用查表方式维护一个环境模型记录每个 (状态, 动作) 下一步出现的可能状态以及对应的概率。这种查表模型相当于一个经验频率估计器训练起来非常直观。4.2 环境实现# 文件路径mbrl_demo/env.py import numpy as np class GridWorldEnv: 5x5 网格导航环境。 状态编码为 0~24目标状态为 24。 SIZE 5 def __init__(self): self.start_state 0 self.goal_state self.SIZE * self.SIZE - 1 self.reset() def reset(self): self.state self.start_state return self.state def step(self, action): 执行动作。 action: 0上, 1下, 2左, 3右 row self.state // self.SIZE col self.state % self.SIZE if action 0: row max(row - 1, 0) elif action 1: row min(row 1, self.SIZE - 1) elif action 2: col max(col - 1, 0) elif action 3: col min(col 1, self.SIZE - 1) next_state row * self.SIZE col reward 1.0 if next_state self.goal_state else 0.0 done (next_state self.goal_state) self.state next_state return next_state, reward, done这段代码实现了一个确定性环境同样的状态和动作必然产生同样的下一状态。在真实场景中环境往往带有随机性但作为入门示例确定性环境可以让我们把注意力集中在 Dyna-Q 的算法流程上。4.3 动态模型实现这里的“动态模型”用表格式的频率统计实现。定义ModelTable类记录每个(state, action)下不同next_state出现的次数再根据计数归一化为转移概率。奖励同样根据实际观测记录平均值。# 文件路径mbrl_demo/model.py from collections import defaultdict import numpy as np from env import GridWorldEnv class TabularModel: 表格式动态模型。 从真实交互数据中统计状态转移频率和奖励期望。 def __init__(self, num_states, num_actions): self.num_states num_states self.num_actions num_actions self.transit_counts defaultdict(lambda: np.zeros(num_states)) self.reward_sum defaultdict(float) self.reward_counts defaultdict(int) def update(self, state, action, next_state, reward): 用真实交互的元组更新模型。 self.transit_counts[(state, action)][next_state] 1.0 self.reward_sum[(state, action)] reward self.reward_counts[(state, action)] 1 def predict(self, state, action): 返回 (下一状态概率分布, 期望奖励)。 counts self.transit_counts.get((state, action)) if counts is None or counts.sum() 0: # 没有经验时默认均匀分布 prob np.ones(self.num_states) / self.num_states reward 0.0 else: prob counts / counts.sum() reward ( self.reward_sum[(state, action)] / self.reward_counts[(state, action)] ) return prob, reward def sample_transition(self, state, action): 从模型预测的分布中采样一条转移。 返回 (next_state, reward, 是否结束)。 prob, reward self.predict(state, action) next_state np.random.choice(self.num_states, pprob) done (next_state GridWorldEnv.SIZE * GridWorldEnv.SIZE - 1) return next_state, reward, done如果后续把环境换成连续控制任务这里的TabularModel需要改成神经网络模型。但表格式模型的好处是透明你能够清楚地看到模型每个槽位上的统计结果这一点的教学意义是不可替代的。4.4 Dyna-Q 智能体实现Dyna-Q 的完整流程包括四部分用 Q-Learning 在真实环境更新 Q 表把真实转移数据同步更新到 TabularModel从模型采样想象轨迹用 Q-Learning 方式更新 Q 表可以重复执行第 3 步若干次这就是“规划”部分。# 文件路径mbrl_demo/agent.py import numpy as np from env import GridWorldEnv from model import TabularModel class DynaQAgent: def __init__( self, num_states, num_actions, alpha0.1, gamma0.95, epsilon0.1, planning_steps10, ): self.num_states num_states self.num_actions num_actions self.alpha alpha self.gamma gamma self.epsilon epsilon self.planning_steps planning_steps self.Q np.zeros((num_states, num_actions)) self.model TabularModel(num_states, num_actions) def choose_action(self, state): epsilon-greedy 策略 if np.random.rand() self.epsilon: return np.random.randint(self.num_actions) return int(np.argmax(self.Q[state])) def update_q_value(self, state, action, reward, next_state, done): Q-Learning 更新公式 best_next np.max(self.Q[next_state]) if not done else 0.0 td_target reward self.gamma * best_next td_error td_target - self.Q[state, action] self.Q[state, action] self.alpha * td_error def train_one_step(self, state, action, reward, next_state, done, env): 完整执行一步 Dyna-Q 更新 1. 真实 Q-Learning 更新 2. 更新环境模型 3. 模型规划更新。 # 真实经验更新 self.update_q_value(state, action, reward, next_state, done) self.model.update(state, action, next_state, reward) # 从模型规划 for _ in range(self.planning_steps): # 随机选择一个见过的 (状态, 动作)也可以从当前状态出发 plan_state np.random.randint(self.num_states) plan_action np.random.randint(self.num_actions) plan_next, plan_reward, plan_done self.model.sample_transition( plan_state, plan_action ) self.update_q_value(plan_state, plan_action, plan_reward, plan_next, plan_done) return self.Q这里有一个值得解释的细节规划时随机选择(state, action)而不是只从当前状态出发。这样做能更充分地利用模型对整个状态空间的覆盖增加 Q 值更新的覆盖面。如果你希望规划更贴近真实轨迹分布也可以用一个状态访问频率缓冲区来采样这在数据足够多时效果更好。4.5 训练主循环# 文件路径mbrl_demo/main.py import numpy as np from env import GridWorldEnv from agent import DynaQAgent def run_episode(agent, env, max_steps30): state env.reset() total_reward 0.0 for _ in range(max_steps): action agent.choose_action(state) next_state, reward, done env.step(action) agent.train_one_step(state, action, reward, next_state, done, env) state next_state total_reward reward if done: break return total_reward, agent.Q if __name__ __main__: env GridWorldEnv() num_states env.SIZE * env.SIZE num_actions 4 agent DynaQAgent( num_statesnum_states, num_actionsnum_actions, alpha0.1, gamma0.95, epsilon0.1, planning_steps10, ) episodes 50 for episode in range(episodes): total_reward, Q run_episode(agent, env) if (episode 1) % 5 0: print(fEpisode {episode 1}, Total Reward: {total_reward}) # 打印目标状态附近学习到的 Q 值 print(\nQ values near goal:) for s in [18, 19, 23]: print(fState {s}: {np.round(Q[s], 2)})运行结果示例Episode 5, Total Reward: 1.0 Episode 10, Total Reward: 1.0 ... Q values near goal: State 18: [0. 0. 0. 0.9 ] State 19: [0. 0.9 0. 0. ] State 23: [0.9 0. 0. 0. ]可以看到到达目标状态相邻位置的三个状态中最大 Q 值的方向均指向目标说明智能体已经学到了正确的导航方向。如果没有 model-based planning 部分仅靠 Q-Learning 往往需要更多回合才能收敛这是 Dyna-Q 的直观优势。4.6 对照实验去掉模型规划你可以将planning_steps改为 0跑同样的随机种子对比效果。通常会发现planning_steps0 时需要更多回合才能稳定找到目标在环境规模变大时差异尤其明显在随机性环境中模型预测的准确性对规划收益影响显著。这种对照实验方式很适合课程学习它能在不引入复杂数学的情况下直观验证“模型”到底有没有用。5. 从简单示例到深度 MBRL 的进阶路径5.1 将表格模型替换为神经网络当状态和动作空间变成连续值后表格式模型不再可行。常见替代方案是训练一个前馈神经网络输出下一状态高斯分布的均值和方差# 文件路径mbrl_demo/model_nn.py示例片段 import torch import torch.nn as nn class GaussianDynamicsModel(nn.Module): 输入 (state, action)输出 next_state 的均值和对数方差。 def __init__(self, state_dim, action_dim, hidden_dim128): super().__init__() self.net nn.Sequential( nn.Linear(state_dim action_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), ) self.mean_head nn.Linear(hidden_dim, state_dim) self.logvar_head nn.Linear(hidden_dim, state_dim) def forward(self, state, action): x torch.cat([state, action], dim-1) h self.net(x) mean self.mean_head(h) logvar self.logvar_head(h) return mean, logvar这里没有写完整的训练循环因为训练循环需要配合数据缓冲区、归一化、模型集成等模块放在示例片段里反而会有误导性。但核心要点是当你把模型换成神经网络后整个 MBRL 框架依然保持不变只是模型预测的方式和误差特性发生了变化。5.2 在连续控制任务中使用模型预测控制在课程作业中PETS 和 MBPO 的代码通常会基于 MuJoCo 环境。MPC 的思想是每次决策时通过模型向前搜索多条轨迹选累计回报最高的动作序列只执行第一个动作然后重新规划。一个简化的 CEM 规划器伪代码# 伪代码CEM 规划器示意 def plan_with_cem(model, state, action_dim, horizon15, num_samples200, iters5): action_mean np.zeros(action_dim) action_std np.ones(action_dim) * 0.5 for _ in range(iters): # 1. 从当前分布采样候选动作序列 candidates np.random.normal(action_mean, action_std, (num_samples, horizon, action_dim)) rewards [] for i in range(num_samples): # 2. 用模型展开轨迹 s state total 0.0 for t in range(horizon): a candidates[i, t] s_next, r model.predict(s, a) s s_next total r rewards.append(total) # 3. 取最好的一批样本拟合新分布 idx np.argsort(rewards)[-num_samples // 10:] elite candidates[idx] action_mean elite.mean(axis0) action_std elite.std(axis0) return action_mean[0]这里最关键的是“执行第一个动作后重新规划”也就是 rolling horizon。短规划窗口加上滚动执行能在一定程度上缓解模型长时预测不准的问题。5.3 潜空间模型与 Dreamer 路线如果状态是高维图像直接在前文所述的连续状态空间建模会非常吃力。Dreamer 系列的做法是先在像素观测上训练一个变分自编码器得到潜状态表示然后在这个潜空间中展开想象轨迹。整个训练过程可以用三个模块统一理解表示模型把高维观测编码成潜状态转移模型在潜状态空间中预测下一时刻的潜状态和奖励行为模型在想象轨迹上学习 Actor 和 Critic。这三者共同构成一个闭环。课程第 15 讲往往会把这些模块画成整体架构图但真正理解时不需要把所有细节一次性死记硬背只要抓住“高维观测压缩到低维表示 → 在低维表示中产生想象数据 → 基于想象数据优化策略”这条主线就够了。6. 常见问题与排查思路6.1 模型训练不收敛把动态模型当作监督学习任务时如果训练 loss 居高不下通常有几种原因问题现象常见原因解决思路动态模型 loss 不降输入输出未做归一化将状态、动作、奖励统一归一化到相似量纲单个模型方差过大数据量不足减小模型规模或改用集成模型预测的下一状态发散未限制 logvar 范围对 logvar 输出做 clamp防止异常方差想象轨迹快速崩坏模型误差累积缩短想象长度引入不确定性惩罚6.2 想象轨迹与真实轨迹偏差大在 MBRL 中模型预测的轨迹和真实环境轨迹之间一定存在偏差但偏差的增速如果过快策略就会学到幻觉。常见排查手段在一个固定状态序列上对比模型预测轨迹和真实轨迹的误差曲线观察误差翻倍速度将模型想象轨迹的长度从 1 步逐渐增加到 5 步、10 步观察策略性能变化计算模型在已知数据集上的预测误差与在陌生区域上的预测误差之差判断泛化能力。如果误差过快增长说明模型容量、数据量或者数据覆盖度不够。比如在网格任务中如果planning_steps很大但模型对某些状态从未见过想象更新会注入大量虚假信息。解决办法是在规划时只采样模型已经见过的 (状态, 动作) 对不要从未知区域开始想象。6.3 规划器搜索到“幻觉高回报”动作这是 MBRL 最经典的问题模型误差给了某个动作序列虚高的回报规划器选择它后真实环境中表现反而很差。原因往往是模型在回报大的区域过于乐观。对策包括使用集成模型并取保守估计例如取最小值或方差加权值在奖励预测中减去不确定性惩罚项限制动作序列只在真实环境已覆盖的区域附近搜索定期用真实环境交互校正模型防止模型在低数据区域过度自信。6.4 训练环境与真实环境不一致基于模型的强化学习在仿真验证阶段效果很好但在部署到真实系统时性能大跌经常不是算法问题而是sim-to-real gap。课程讲次中多次提到这种风险。规避方式分为两个层面算法层面模型需要使用不确定性估计、领域随机化等手段工程层面模型训练数据必须覆盖真实环境可能遇到的状态分布不能只在仿真中“自嗨”。7. 最佳实践与工程建议7.1 数据管理与缓冲区设计MBRL 比一般的无模型强化学习更依赖数据的多样性和覆盖范围。建议实际项目中为真实交互数据单独建立缓冲区模型训练只在真实数据上进行而不是把模型想象数据和真实数据混在一起训练。原因是如果模型产生的幻想数据反馈给模型自身误差就会被指数级放大。这正是课程中反复强调的“不要让自己编的故事再当真的教自己”。一个稳妥的做法是把经验划分为两个数据集——real_buffer和imagined_buffer。模型只在real_buffer上更新策略可以在两类数据上都更新但真实数据优先、数量占比也不能过低。7.2 模型集成的必要性单模型的预测方差通常不能代表真实的模型不确定性尤其是在神经网络容易过度自信的情况下。因此实际工程中推荐至少训练 3~5 个不同初始化或不同数据子集的模型组成集成。做轨迹展开时每个集成成员各自展开轨迹多条轨迹可以求平均奖励如果成员之间的预测方差较大说明该区域模型可信度低需要降低该区域想象数据的权重。集成带来的计算开销增加是值得的因为它能显著降低“模型幻觉”带来的风险。7.3 超参数调优思路MBRL 对新加入的超参数特别敏感比如想象轨迹长度planning_steps 数量模型更新频率模型学习率和网络容量不确定性和类惩罚的系数。建议先固定策略更新和真实交互部分只调节规划部分观察样本效率和最终性能之间的 trade-off。千万不要一开始就同时调整所有超参数这样很难定位问题来源。7.4 安全与合规边界在生产环境、真实机器人或涉及人身安全的场景中基于模型的强化学习需要格外谨慎。在任何真实系统上运行前必须在仿真环境充分验证算法行为必须设计和启用安全监控和中断机制真实环境中的动作空间应该先限制在安全范围对涉及权限、数据、生产环境的变更务必得到授权并做好备份回滚方案。基于模型的强化学习不是“模型预测没问题就可以信任模型”恰恰相反模型预测越自信越需要小心它在未知区域想当然。课程中的实验通常只在标准仿真环境中做不会直接套用到真实物理系统读者在实际使用中也不要越界。7.5 代码组织建议一个小型 MBRL 项目可以采用如下的代码组织方式models/环境模型网络定义、集成管理buffers/真实数据缓冲区、想象数据生成器planners/MPC、CEM 等规划算法agents/策略更新逻辑和智能体主循环experiments/不同种子、不同超参数的实验脚本eval/在真实环境中定期评估策略的脚本。把环境模型、规划器、策略更新分离能让算法演进时改动的范围更小。例如从 PETS 换成 MBPO只需要改策略更新部分动态模型和数据缓冲区可以复用。8. 总结与后续学习路线第 15 讲基于模型的强化学习在伯克利 2026 春季深度强化学习课程中承担的角色是把视角从“直接学习策略”拉远到“先理解环境再决策”。通过 Dyna 架构理解闭环通过 PETS 理解在线规划通过 PlaNet/Dreamer 理解潜空间建模通过 MBPO 理解模型与无模型方法的结合这一条路线基本覆盖了 MBRL 从简单到复杂、从表格到深度模型、从离散到连续控制的主要形态。如果这篇文章你看完了并且动手跑了 Dyna-Q 示例下一步可以沿着这几个方向继续深入把网格任务换成带有随机性的更复杂环境观察表格式模型预测概率的准确性对规划效果的影响将 TabularModel 替换为高斯神经网络模型在 Gymnasium 的连续控制环境中跑一个简化版 PETS阅读 DreamerV3 论文并复现其模型结构对比它和 PlaNet 在视觉任务上的差距尝试将 MBPO 的“短步想象”思路应用到 Actor-Critic 框架中观察样本效率的变化。课程讲次的真正价值不在于记住某个算法的公式而在于理解环境模型在整个学习闭环中的位置以及模型误差如何影响最终策略。模型不完美不要紧重要的是如何设计算法去“容忍”这种不完美甚至主动利用模型的不确定性来做规划。如果你在实践中发现模型预测崩坏、想象轨迹失真优先检查数据归一化、轨迹长度和不确定性估计这三处大部分问题都能在这三个环节找到根源。基于模型的强化学习并不是无模型算法的替代品而是另一种权衡思路。真实环境中交互成本越高MBRL 的样本效率优势就越有吸引力。希望这篇笔记能帮助你迈出进入 MBRL 领域的第一步也欢迎在评论区和大家一起交流 Dyna-Q、PETS 或 Dreamer 的复现经验。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。