# 基于模型的强化学习

> 来源：https://dqn.cn/advanced/model-based ｜ 作者：DQN.CN 编辑部 ｜ 发布：2026-10-29 ｜ 更新：2026-10-30 ｜ 许可：CC BY-NC-SA 4.0（文字）/ MIT（代码）

> **要点速览**
>
> - 基于模型的强化学习先学习环境的转移和奖励模型，再利用模型进行规划或生成模拟数据，以提高样本效率。
> - Dyna 架构把真实经验同时用于直接学习和模型学习，并用模型生成的模拟经验做额外的规划更新。
> - Dreamer 系列在学到的潜在空间世界模型中“想象”轨迹来训练策略；MuZero 学习专为规划服务的模型并结合蒙特卡洛树搜索。
> - 模型误差会被策略利用并累积，因此需要短视界展开、模型集成等手段控制误差。

基于模型的强化学习（Model-Based RL，MBRL）先学习或利用一个环境模型——状态转移 $\hat{p}(s' \mid s, a)$ 与奖励 $\hat{r}(s, a)$——再借助模型进行**规划**，或者用模型生成**虚拟数据**来训练策略。相比 DQN、PPO、SAC 这类无模型方法，它通常具有高得多的样本效率，在真实机器人等交互成本高的场景中尤其重要；代价是需要处理模型误差，以及模型误差在多步预测中的累积。代表性工作包括 Dyna 架构、PILCO、PETS、MBPO、World Models、Dreamer 系列和 MuZero。

## 为什么需要模型

### 样本效率

无模型算法往往需要数百万甚至上亿步交互：Atari 上的 DQN 训练使用了 5000 万帧；MuJoCo 上的 PPO 通常需要数百万步。在仿真器里这尚可接受，但在真实世界中，一个机器人每天最多交互几万步，还会磨损、损坏。

有了模型，智能体可以在“脑海中”模拟大量经验，而不必每一步都与真实环境交互。这和人类的学习方式很像：我们会在脑海中预演行动的后果。

### 模型误差

模型不可能完美。问题在于：

- **误差累积**：用模型做 $H$ 步预测时，每一步的小误差会叠加，长时域预测可能完全偏离真实轨迹。
- **模型被利用**（model exploitation）：策略优化器会主动寻找模型预测错误、“看起来回报很高”的区域，就像 Actor 会利用 Critic 的高估一样。
- **渐近性能**：早期研究中，基于模型的方法最终性能常常不如无模型方法（模型偏差）。

现代 MBRL 的大部分工作都在解决这些问题：用**模型集成**估计不确定性、用**短时域展开**限制误差累积、在**潜在空间**中学习紧凑的模型等。

## Dyna 架构

Dyna（Sutton, 1990）是最早、最简洁的统一框架：把**直接强化学习**、**模型学习**和**规划**放在同一个循环中。

```mermaid
flowchart LR
  E[真实环境] -- 真实经验 --> D[直接 RL 更新]
  E -- 真实经验 --> M[学习模型]
  M -- 模拟经验 --> P[规划更新]
  D --> V[价值函数 / 策略]
  P --> V
  V -- 动作 --> E
```

Dyna-Q 的伪代码：

```text
初始化 Q(s,a) 和 Model(s,a)
重复：
    (a) S ← 当前状态；A ← ε-贪心(S, Q)
    (b) 执行 A，观察 R, S'
    (c) Q(S,A) ← Q(S,A) + α[R + γ max_a Q(S',a) − Q(S,A)]     # 直接 RL
    (d) Model(S,A) ← (R, S')                                   # 模型学习（确定性环境）
    (e) 重复 n 次：                                              # 规划
            随机选一个之前见过的 (S̃, Ã)
            R̃, S̃' ← Model(S̃, Ã)
            Q(S̃,Ã) ← Q(S̃,Ã) + α[R̃ + γ max_a Q(S̃',a) − Q(S̃,Ã)]
```

规划步和直接 RL 步使用完全相同的 Q-learning 更新，区别只是数据来源。每走一步真实环境，就做 $n$ 次“免费”的模拟更新。

### 代码：Dyna-Q 迷宫实验

下面复现 Sutton & Barto 第 8 章的 Dyna 迷宫（6×9，起点 S，终点 G，到达终点奖励 1，$\gamma = 0.95$，$\alpha = 0.1$，$\varepsilon = 0.1$），比较规划步数 $n = 0$（即纯 Q-learning）、5、50，每种设置 30 次独立运行取平均。

```python
"""Dyna-Q：在 Sutton & Barto 第 8 章的迷宫（6×9）上比较不同规划步数 n。"""
import numpy as np

MAZE = [
    ".......#G",
    "..#....#.",
    "S.#....#.",
    "..#....#.",
    ".....#...",
    ".........",
]
ROWS, COLS = len(MAZE), len(MAZE[0])
START = next((r, c) for r in range(ROWS) for c in range(COLS) if MAZE[r][c] == "S")
GOAL = next((r, c) for r in range(ROWS) for c in range(COLS) if MAZE[r][c] == "G")
ACTIONS = [(-1, 0), (1, 0), (0, -1), (0, 1)]

def step(state, a):
    r, c = state[0] + ACTIONS[a][0], state[1] + ACTIONS[a][1]
    if not (0 <= r < ROWS and 0 <= c < COLS) or MAZE[r][c] == "#":
        r, c = state                          # 撞墙则原地不动
    if (r, c) == GOAL:
        return (r, c), 1.0, True
    return (r, c), 0.0, False

def dyna_q(n_planning, episodes=50, alpha=0.1, gamma=0.95, eps=0.1, seed=0):
    rng = np.random.default_rng(seed)
    Q = np.zeros((ROWS, COLS, 4))
    model = {}                                # 确定性模型：(s, a) -> (r, s', done)
    steps_per_episode = []
    for _ in range(episodes):
        s, done, n_steps = START, False, 0
        while not done:
            q = Q[s]
            a = int(rng.integers(4)) if rng.random() < eps else int(rng.choice(np.flatnonzero(q == q.max())))
            s2, r, done = step(s, a)
            # (a) 直接强化学习：用真实经验做一次 Q-learning 更新
            Q[s][a] += alpha * (r + gamma * np.max(Q[s2]) * (not done) - Q[s][a])
            # (b) 模型学习
            model[(s, a)] = (r, s2, done)
            # (c) 规划：从模型中随机抽取 n 个已见过的 (s, a) 做模拟更新
            keys = list(model.keys())
            for _ in range(n_planning):
                ps, pa = keys[rng.integers(len(keys))]
                pr, ps2, pdone = model[(ps, pa)]
                Q[ps][pa] += alpha * (pr + gamma * np.max(Q[ps2]) * (not pdone) - Q[ps][pa])
            s, n_steps = s2, n_steps + 1
        steps_per_episode.append(n_steps)
    return np.array(steps_per_episode)

for n in [0, 5, 50]:
    curves = np.mean([dyna_q(n, seed=i) for i in range(30)], axis=0)
    print(f"n={n:2d} | 第2回合平均步数 {curves[1]:7.1f} | 第5回合 {curves[4]:6.1f} | 第50回合 {curves[-1]:5.1f}")
```
实际运行输出：

```text
n= 0 | 第2回合平均步数   742.3 | 第5回合  346.4 | 第50回合  18.8
n= 5 | 第2回合平均步数   178.0 | 第5回合   24.9 | 第50回合  18.0
n=50 | 第2回合平均步数    45.3 | 第5回合   18.0 | 第50回合  18.2
```

规划的作用非常明显：第 2 个回合时，纯 Q-learning 平均需要 742 步，而 $n = 50$ 的 Dyna-Q 只需 45 步；到第 5 回合，$n = 50$ 已经接近最终水平。三者最终都收敛到约 18 步（最短路径为 14 步，多出的步数来自 $\varepsilon = 0.1$ 的探索）。这与书中图 8.2 的结论一致：每一步真实经验通过规划被“反复利用”，大幅提高了样本效率。

## 基于模型的规划（MPC）

另一类方法不学习显式策略，而是在每一步用模型**在线规划**：

**模型预测控制**（Model Predictive Control，MPC）：

1. 在当前状态 $s_t$，用模型评估多个候选动作序列 $(a_t, \dots, a_{t+H-1})$ 的预测回报；
2. 选出最好的序列，**只执行第一个动作** $a_t$；
3. 到达新状态后重新规划。

每步都重新规划可以及时纠正模型误差。候选序列的优化常用**随机打靶**（random shooting）或**交叉熵方法**（CEM）。

> 完整教程与代码：[模型预测控制：随机打靶、CEM 与 PETS](https://dqn.cn/advanced/mpc)，在 Pendulum 上实测三种方法，只用 1 个随机回合的数据就能开始立起摆。

**PETS**（Chua et al., 2018）用**概率神经网络集成**作为模型：每个网络输出高斯分布以刻画随机性（偶然不确定性），多个网络之间的分歧刻画认知不确定性，再配合 CEM 做 MPC。PETS 在若干 MuJoCo 任务上以少一个数量级的样本达到了与无模型方法相当的性能。

## MBPO

MBPO（Model-Based Policy Optimization，Janner et al., 2019）把 Dyna 的思想与 SAC 结合：

- 学习一个概率模型集成；
- 从真实数据中的状态出发，用模型做**短时域**（$k$ 步，通常 1–5 步）展开，生成大量虚拟转移；
- 把虚拟数据（加少量真实数据）喂给 [SAC](https://dqn.cn/advanced/sac) 训练策略。

论文从理论上分析了模型展开长度的权衡：展开太长，模型误差累积；展开太短，模型的作用有限。从真实状态出发的短时域展开兼顾了两者。MBPO 在 MuJoCo 上用比 SAC 少得多的样本达到了相近的渐近性能。

> 完整教程与代码：[MBPO：基于模型的策略优化](https://dqn.cn/advanced/mbpo)，包括与标准 SAC、以及同更新比 SAC 的对照实验。

## 世界模型：Dreamer 系列

对图像输入，直接预测下一帧像素既困难又没必要。**World Models**（Ha & Schmidhuber, 2018）提出先把观测压缩到低维潜在空间，再在潜在空间中学习动力学，甚至完全在“梦境”中训练控制器。

**Dreamer** 系列（Hafner et al., 2020, 2021, 2023/2025）沿着这条路线：

- 学习**循环状态空间模型**（RSSM），在潜在空间中预测未来状态和奖励；
- 在想象的潜在轨迹上训练 Actor-Critic，梯度可以通过模型反向传播；
- DreamerV3 用一套固定超参数在 150 多个任务上取得了很强的结果，并成为第一个在没有人类数据的情况下从零开始在 Minecraft 中收集到钻石的算法。

## MuZero：学习用于规划的模型

AlphaZero 依赖已知的游戏规则做蒙特卡洛树搜索（MCTS）。**MuZero**（Schrittwieser et al., 2020）则学习一个模型，用于在不知道规则的情况下进行 MCTS。关键思想是：模型**不需要重建观测**，只需要准确预测与规划相关的三个量——**策略、价值和奖励**。

MuZero 由三个函数组成：表示函数 $h$（观测 → 隐状态）、动力学函数 $g$（隐状态 + 动作 → 下一隐状态 + 奖励）、预测函数 $f$（隐状态 → 策略 + 价值）。它在围棋、国际象棋、将棋上达到了 AlphaZero 的水平，同时在 Atari 上取得了当时最好的成绩。

## 方法对比

| 方法 | 模型用途 | 模型形式 | 典型场景 |
| --- | --- | --- | --- |
| Dyna-Q | 生成模拟经验 | 表格 / 确定性 | 教学、小规模问题 |
| PETS | MPC 在线规划 | 概率网络集成 | 低维连续控制 |
| MBPO | 短时域展开 + SAC | 概率网络集成 | 连续控制、追求样本效率 |
| Dreamer | 潜在空间想象训练 | RSSM | 图像输入、多任务 |
| MuZero | MCTS 规划 | 隐空间价值等价模型 | 棋类、Atari |

## 实践建议与常见误区

- **从简单开始**：先用已知模型或简单模型验证规划部分是正确的。
- **模型集成几乎是必需的**：单个网络无法估计不确定性，策略会利用模型误差。
- **控制展开长度**：长时域展开的误差累积往往比想象的严重。
- **误区：模型越精确越好**：MuZero 表明，模型只需要在“与决策相关”的方面准确。
- **误区：MBRL 一定样本效率更高**：如果模型难以学习（例如接触丰富、动力学不连续的任务），收益可能有限。

## 小结

- 基于模型的强化学习用模型生成经验或在线规划，样本效率高。
- 核心挑战是模型误差及其累积、策略对模型误差的利用。
- Dyna 统一了直接 RL、模型学习与规划；MPC 每步重新规划；MBPO 用短时域展开为 SAC 生成数据。
- Dreamer 在潜在空间中学习世界模型；MuZero 只学习与规划相关的量。

## 练习题

1. 在 Dyna-Q 代码中，在第 25 个回合后改变迷宫结构（例如打开一条捷径），观察 Dyna-Q 能否发现它（参考 Sutton & Barto 例 8.3 的 Dyna-Q+）。
2. 把规划时的随机选择改为**优先扫描**（按 TD 误差大小选择要更新的状态—动作对）。
3. 在 `Pendulum-v1` 上用真实环境模型（可以复制环境并设置状态）实现随机打靶 MPC，规划时域 $H = 15$，候选序列数 500，并与 [MPC 页](https://dqn.cn/advanced/mpc) 中用学到的模型的结果比较。
4. 为什么模型集成的分歧可以用来衡量认知不确定性？
5. 阅读 MBPO 论文，解释为什么从真实状态出发做短时域展开比从初始状态出发做长时域展开更好。

**延伸阅读**

[论文速递：DreamerV3 解读](https://dqn.cn/papers/2026-10-dreamerv3)

## 参考文献

- Sutton, R. S. (1990). Integrated architectures for learning, planning, and reacting based on approximating dynamic programming. *ICML*.
- Deisenroth, M. P., & Rasmussen, C. E. (2011). PILCO: A model-based and data-efficient approach to policy search. *ICML*.
- Chua, K., Calandra, R., McAllister, R., & Levine, S. (2018). Deep Reinforcement Learning in a Handful of Trials using Probabilistic Dynamics Models. *NeurIPS*. [arXiv:1805.12114](https://arxiv.org/abs/1805.12114)
- Ha, D., & Schmidhuber, J. (2018). World Models. [arXiv:1803.10122](https://arxiv.org/abs/1803.10122)
- Janner, M., Fu, J., Zhang, M., & Levine, S. (2019). When to Trust Your Model: Model-Based Policy Optimization. *NeurIPS*. [arXiv:1906.08253](https://arxiv.org/abs/1906.08253)
- Hafner, D., Lillicrap, T., Ba, J., & Norouzi, M. (2020). Dream to Control: Learning Behaviors by Latent Imagination. *ICLR*. [arXiv:1912.01603](https://arxiv.org/abs/1912.01603)
- Hafner, D., Pasukonis, J., Ba, J., & Lillicrap, T. (2023). Mastering Diverse Domains through World Models. [arXiv:2301.04104](https://arxiv.org/abs/2301.04104)（DreamerV3）
- Schrittwieser, J. et al. (2020). Mastering Atari, Go, Chess and Shogi by Planning with a Learned Model. *Nature*, 588, 604–609. [arXiv:1911.08265](https://arxiv.org/abs/1911.08265)

## 下一步

上一节：[目标导向 RL 与 HER](https://dqn.cn/advanced/goal-conditioned)　｜　继续阅读：[模型预测控制（MPC）](https://dqn.cn/advanced/mpc)

## 常见问题速查（FAQ）

**问：基于模型的方法一定比无模型方法好吗？**

答：基于模型的方法通常样本效率更高，但实现更复杂，模型误差可能导致策略性能下降；无模型方法渐近性能稳健、实现简单。选择取决于交互成本和任务特点。

**问：Dyna-Q 中的规划步数 n 有什么影响？**

答：n 是每一步真实交互后用模型做的模拟更新次数。本站迷宫实验中，第 2 回合的平均步数在 n=0、5、50 时分别约为 742、178、45，规划越多，学得越快。

**问：MuZero 和 AlphaZero 有什么区别？**

答：AlphaZero 需要已知的游戏规则来做树搜索；MuZero 自己学习一个用于规划的模型，不需要知道规则，因此还能用于 Atari 等环境。

## 如何引用本文

DQN.CN 编辑部. 基于模型的强化学习[EB/OL]. DQN.CN, 2026-10-29（更新于 2026-10-30）. https://dqn.cn/advanced/model-based.
