一、模型的作用与分类
1.1 环境模型的定义
环境模型(environment model) 是一个学习到的二元转移模型:
P^(s′∣s,a)≈P(s′∣s,a),R^(s,a,s′)≈R(s,a,s′) \hat P(s' \mid s, a) \approx P(s' \mid s, a), \quad \hat R(s, a, s') \approx R(s, a, s') P^(s′∣s,a)≈P(s′∣s,a),R^(s,a,s′)≈R(s,a,s′)
有了模型,智能体可以在不与环境真实交互的情况下"想象"轨迹(rollout),并用这些想象来改进策略。这是基于模型方法的全部动机。
模型的两种等价形式:
| 形式 | 表达式 | 适用 |
|---|---|---|
| 概率模型 | P^(s′∣s,a)\hat P(s'\mid s,a)P^(s′∣s,a), R^(s,a)\hat R(s,a)R^(s,a) | 环境有随机性、需不确定性估计 |
| 确定性模型 | s^′=fϕ(s,a)\hat s'=f_\phi(s,a)s^′=fϕ(s,a), r^=gϕ(s,a)\hat r=g_\phi(s,a)r^=gϕ(s,a) | 环境近似确定、希望训练稳定 |
二者并非互斥------确定性模型可视为概率模型的特例(P^=δ(s′−s^′)\hat P=\delta(s'-\hat s')P^=δ(s′−s^′),Dirac 分布)。
标准监督学习框架:
给定数据集 D={(si,ai,si′,ri)}i=1N\mathcal{D}=\{(s_i,a_i,s'i,r_i)\}{i=1}^ND={(si,ai,si′,ri)}i=1N(由策略 πdata\pi_\text{data}πdata 收集),模型学习的目标是
L(ϕ)=−E(s,a,s′)∼DlogP\^ϕ(s′∣s,a) \mathcal{L}(\phi)= -\mathbb{E}_{(s,a,s')\sim\mathcal{D}}\\log\\hat P_\\phi(s'\\mid s,a) L(ϕ)=−E(s,a,s′)∼DlogP\^ϕ(s′∣s,a)
或对确定性模型取均方误差
L(ϕ)=E(s,a,s′)∼D∥fϕ(s,a)−s′∥2 \mathcal{L}(\phi)=\mathbb{E}_{(s,a,s')\sim\mathcal{D}}\\\|f_\\phi(s,a)-s'\\\|\^2 L(ϕ)=E(s,a,s′)∼D∥fϕ(s,a)−s′∥2
训练方式是标准的随机梯度下降,与监督学习几乎没有区别。
"模型"不等于"环境的副本":
一个常被误解的点是:以为学到的模型必须全局准确 ,能预测环境所有维度的细节。这是错误的------模型只需要在与决策相关的维度 上准确。例如在 Atari 游戏中,背景天空的颜色对策略选择毫无影响,模型预测天空用粗略插值即可;只有关键对象(敌人、道具、角色位置)的预测需要精细。这意味着可以设计部分模型(partial model) 或 特征空间模型(latent-space model)(Dreamer 系列的核心思想),把算力集中在有用维度上。
1.2 白盒模型与黑盒模型
| 维度 | 白盒模型 | 黑盒模型 |
|---|---|---|
| 假设 | 已知物理规律或解析形式 | 完全从数据学习 |
| 参数 | 已知(如质量、重力) | 需要估计 |
| 例子 | 刚体动力学方程、电路仿真 | 神经网络预测下一状态 |
| 精度 | 高(若假设正确) | 依赖训练数据 |
| 适用 | 结构已知、规律稳定 | 规律未知或过于复杂 |
黑盒模型内部实现:
s^′=fϕ(s,a),r^=gϕ(s,a) \hat s' = f_\phi(s, a), \quad \hat r = g_\phi(s, a) s^′=fϕ(s,a),r^=gϕ(s,a)
其中 fϕ,gϕf_\phi, g_\phifϕ,gϕ 是神经网络。
1.3 基于模型与无模型的对比
| 维度 | 基于模型 | 无模型 |
|---|---|---|
| 是否需要模型 | 需要学习 | 不需要 |
| 样本效率 | 高(可"想象"大量数据) | 低(只能用真实数据) |
| 计算开销 | 高(训练模型 + 规划) | 较低 |
| 模型偏差 | 有(模型不准则规划错) | 无 |
| 适用场景 | 环境有规律、数据昂贵 | 环境复杂、数据便宜 |
核心权衡 :基于模型方法的"想象数据"是免费的吗?不是------它受模型误差 限制。模型预测越离谱,想象轨迹就越不可信,规划反而更差。这就是 MBPO(§4.1)只做短程想象而非长程 rollout 的原因。
二、模型学习
2.1 确定性模型的回归
确定性模型 假设给定 (s,a)(s, a)(s,a) 后下一状态唯一:
s^′=fϕ(s,a) \hat s' = f_\phi(s, a) s^′=fϕ(s,a)
用回归训练:
L(ϕ)=E(s,a,s′)∼D∥fϕ(s,a)−s′∥2 \mathcal{L}(\phi) = \mathbb{E}_{(s, a, s') \sim \mathcal{D}}\left \\left\\\| f_\\phi(s, a) - s' \\right\\\|\^2 \\right L(ϕ)=E(s,a,s′)∼D∥fϕ(s,a)−s′∥2
python
class DynamicsModel(nn.Module):
def __init__(self, state_dim, action_dim, hidden=400):
super().__init__()
self.net = nn.Sequential(
nn.Linear(state_dim + action_dim, hidden), nn.SiLU(),
nn.Linear(hidden, hidden), nn.SiLU(),
nn.Linear(hidden, hidden), nn.SiLU(),
nn.Linear(hidden, state_dim),
)
def forward(self, s, a):
return self.net(torch.cat([s, a], dim=-1))
优点 :损失简单、训练稳定、推理快。缺点:无法表达环境的随机性(如摩擦系数的随机变化、风的扰动)。
2.2 概率模型的密度估计
概率(随机)模型 假设下一状态有分布:
P^(s′∣s,a)=N(μϕ(s,a),Σϕ(s,a)) \hat P(s' \mid s, a) = \mathcal{N}(\mu_\phi(s,a), \Sigma_\phi(s,a)) P^(s′∣s,a)=N(μϕ(s,a),Σϕ(s,a))
用负对数似然训练:
L(ϕ)=−E(s,a,s′)∼DlogP\^(s′∣s,a) \mathcal{L}(\phi) = -\mathbb{E}_{(s,a,s') \sim \mathcal{D}}\left \\log \\hat P(s' \\mid s, a) \\right L(ϕ)=−E(s,a,s′)∼DlogP\^(s′∣s,a)
其中 Σϕ\Sigma_\phiΣϕ 可以是:
- 固定对角协方差 :网络只输出 μ\muμ,Σ\SigmaΣ 取常量(最简单、常用)。
- 状态依赖对角 :网络输出 logσ\log \sigmalogσ。
- 完整协方差 :网络输出 μ\muμ 与 Cholesky 分解的下三角矩阵 LLL,Σ=LL⊤\Sigma = LL^\topΣ=LL⊤。
完整协方差能表达维度间相关性(如位置与速度相关),但参数量大、易数值不稳定。
python
class ProbDynamicsModel(nn.Module):
def __init__(self, state_dim, action_dim, hidden=400):
super().__init__()
self.trunk = nn.Sequential(
nn.Linear(state_dim + action_dim, hidden), nn.SiLU(),
nn.Linear(hidden, hidden), nn.SiLU(),
nn.Linear(hidden, hidden), nn.SiLU(),
)
self.mu = nn.Linear(hidden, state_dim)
self.log_std = nn.Linear(hidden, state_dim)
def forward(self, s, a):
h = self.trunk(torch.cat([s, a], dim=-1))
mu = self.mu(h)
log_std = self.log_std(h).clamp(-5, 2)
return Normal(mu, log_std.exp())
2.3 集成与不确定性估计
模型预测的不确定性 是基于模型方法的核心信息:
- 偶然不确定性(aleatoric):环境的固有随机性,无法通过更多数据消除。
- 认知不确定性(epistemic):模型对未见数据的无知,可以通过更多数据消除。
集成(ensemble) :训练 KKK 个独立初始化的模型,用它们的预测分歧程度估计认知不确定性:
Eϕμϕ(s,a)±Eϕμϕ(s,a)2−Eϕμϕ(s,a)2 \mathbb{E}{\phi}\\mu_\\phi(s,a) \pm \sqrt{\mathbb{E}{\phi}\\mu_\\phi(s,a)\^2 - \mathbb{E}_\phi\\mu_\\phi(s,a)^2} Eϕμϕ(s,a)±Eϕμϕ(s,a)2−Eϕμϕ(s,a)2
分歧大 → 模型没见过这类数据 → 应主动探索或降低规划深度。
aleatoric vs epistemic 不确定性对照:
| 维度 | aleatoric(偶然) | epistemic(认知) |
|---|---|---|
| 来源 | 环境本身的固有随机性 | 模型对未见数据的无知 |
| 能否靠更多数据消除 | 不能 | 能 |
| 建模方式 | 概率模型 Σϕ(s,a)\Sigma_\phi(s,a)Σϕ(s,a) 直接捕获 | 集成分歧、dropout、深度集成 |
| 对规划的影响 | 即便数据多也要纳入(噪声客观存在) | 决定是否降低规划深度或主动探索 |
集成估计的公式与决策逻辑:
训练 KKK 个独立初始化模型 {μϕk}k=1K\{\mu_{\phi_k}\}{k=1}^K{μϕk}k=1K,在 (s,a)(s,a)(s,a) 上的预测均值 μˉ=1K∑kμϕk\bar\mu=\frac{1}{K}\sum_k\mu{\phi_k}μˉ=K1∑kμϕk 与分歧 σens=Vark(μϕk)\sigma_\text{ens}=\sqrt{\text{Var}k(\mu{\phi_k})}σens=Vark(μϕk) 。
决策规则 :若 σens(s,a)>τ\sigma_\text{ens}(s,a)>\tauσens(s,a)>τ(阈值),说明模型对该状态分歧大 → 没见过 → 缩短想象步数 HHH 或彻底绕过该区域;反之则可放心规划。MBPO 在选择分支采样时就部分依赖此信号。
完整协方差 vs 对角协方差的取舍:
| 维度 | 对角协方差 Σ=diag(σ12,...,σd2)\Sigma=\text{diag}(\sigma_1^2,\dots,\sigma_d^2)Σ=diag(σ12,...,σd2) | 完整协方差 Σ=LL⊤\Sigma=LL^\topΣ=LL⊤ |
|---|---|---|
| 参数量 | O(d)O(d)O(d) | O(d2)O(d^2)O(d2) |
| 数值稳定性 | 高 | 低(Cholesky 需正定) |
| 能否表达维度相关性 | 否 | 是 |
| 训练难度 | 易 | 难(易数值崩溃) |
| 适用 | 大多数控制任务 | 维度耦合强的物理仿真(如多刚体接触) |
三、Dyna 框架
3.1 规划与学习的结合
规划(planning) 是给定模型下计算策略的过程;学习(learning) 是从真实交互中改进模型和价值。Dyna 把两者结合成统一框架:
text
Dyna 循环:
1. 用真实交互收集经验 → 更新模型
2. 用真实经验更新价值函数(Q-learning 更新)
3. 用模型生成想象轨迹 → 更新价值函数
关键点:步骤 3 用想象数据也更新价值函数------这是 Dyna 样本效率高的原因。
3.2 Dyna-Q 算法
Dyna-Q 把 Q-learning 与模型想象结合:
python
import numpy as np
from collections import defaultdict
class DynaQ:
"""表格 Dyna-Q(Sutton & Barto §8.2)。
模型即字典:Model(s, a) = (r, s')。每次真实交互后,
先做一次直接 RL 更新,再从历史 (s, a) 中随机采样 N 次做规划更新。
"""
def __init__(self, n_actions, gamma=0.9, alpha=0.5,
planning_steps=5, epsilon=0.1):
self.n_actions = n_actions
self.gamma = gamma
self.alpha = alpha
self.planning_steps = planning_steps
self.epsilon = epsilon
self.Q = defaultdict(lambda: np.zeros(n_actions))
self.model = {} # (s, a) -> (r, s')
def act(self, s):
if np.random.rand() < self.epsilon:
return np.random.randint(self.n_actions)
return int(np.argmax(self.Q[s]))
def update(self, s, a, r, s_next):
# ---- 直接 RL:标准 Q-learning 更新 ----
td = r + self.gamma * self.Q[s_next].max() - self.Q[s][a]
self.Q[s][a] += self.alpha * td
# ---- 模型学习:记录(或覆盖)该转移 ----
self.model[(s, a)] = (r, s_next)
# ---- 规划:从历史 (s̃, ã) 随机采样 N 次 ----
keys = list(self.model.keys())
for _ in range(self.planning_steps):
s_tilde, a_tilde = keys[np.random.randint(len(keys))]
r_tilde, s_tilde_next = self.model[(s_tilde, a_tilde)]
td = (r_tilde + self.gamma * self.Q[s_tilde_next].max()
- self.Q[s_tilde][a_tilde])
self.Q[s_tilde][a_tilde] += self.alpha * td
Dyna-Q 的表格版算法:
text
Initialize Q(s, a) = 0, Model(s, a, s') = empty
Repeat:
1. 选动作 a,真实交互得 (s, a, r, s')
2. Q(s, a) ← Q(s, a) + α[r + γ max_a' Q(s', a') - Q(s, a)] # 真实 Q 更新
3. Model(s, a, s') ← r, s' # 模型学习
4. For k = 1, 2, ..., N: # 规划步数
任取 s̃, ã
r̃, s̃' ← Model(s̃, ã)
Q(s̃, ã) ← Q(s̃, ã) + α[r̃ + γ max_b Q(s̃', b) - Q(s̃, ã)]
3.3 表格形式的 Dyna
Dyna-Maze (Sutton & Barto 图 6.3)是 Dyna 的经典演示:每获得 1 个真实样本,NNN 个规划步就等效于 NNN 个真实样本。N=0N = 0N=0 时退化为纯 Q-learning(需要大量真实交互),NNN 很大时快速收敛------只要模型预测不过于偏离真实。
规划步数 N 的权衡:
- NNN 太小:样本效率提升有限。
- NNN 太大:模型误差被反复放大,想象轨迹与真实分布偏离,规划甚至损害性能。
Dyna-π / Dyna-Q+ 的改进:
- Dyna-π:用模型做完整的策略搜索(蒙特卡洛树搜索风格)。
- Dyna-Q+ :给久未尝试的转移的奖励加 探索 bonus κτ\kappa\sqrt{\tau}κτ (τ\tauτ 为距上次尝试的步数),鼓励探索久未访问的转移。
Dyna-Maze 的定量说明:
经典实验中,每个真实样本 →\to→ 一次 Q-learning 更新,NNN 个规划步又产生 NNN 次额外更新。N 个规划步等效 N 个真实样本的 Q 更新信号 ------只要模型预测未偏离真实分布太远。Sutton & Barto(图 8.2/8.3)对比了 N=0,5,50N=0,5,50N=0,5,50:NNN 越大,达到同等解迷宫水平所需的真实交互步数 越少------N=50N=50N=50 时在前 50 次左右交互内即快速收敛,N=0N=0N=0 的纯 Q-learning 则需要数倍于 episode 上限的交互(示意性结论,具体倍数取决于迷宫规模与超参,S&B 未给出统一倍率)。
规划步数 N 的权衡表格:
| NNN 取值 | 样本效率 | 模型误差累积 | 典型表现 |
|---|---|---|---|
| N=0N=0N=0 | 1×(基线) | 无 | 退化为 Q-learning |
| N=10N=10N=10 | 明显提升(S&B 迷宫中已大幅快于 N=0N=0N=0) | 几乎可忽略 | 小规模表格任务常用 |
| N=50N=50N=50 | 早期收敛最快(S&B 迷宫实验中交互步数最少) | 误差积累可控 | 表格任务可受益,深度模型下常失稳 |
| NNN 过大(>500) | 反而下降 | 模型误差主导 | 规划损害性能 |
Dyna-π 与 Dyna-Q+ 的区别:
- Dyna-π:在模型上做完整的策略搜索(蒙特卡洛树搜索或策略迭代风格),不限于 tabular Q-learning 的单步更新。
- Dyna-Q+ :给久未尝试的转移加探索激励 ------在每个状态-动作对的奖励上加一个随时间增长的正 bonus(Sutton & Barto 式 8.2):
rbonus(s,a)=r+κτ r_{\text{bonus}}(s, a) = r + \kappa\sqrt{\tau} rbonus(s,a)=r+κτ
其中 τ\tauτ 是自上次真实访问 (s,a)(s,a)(s,a) 以来经过的时间步数(时间戳之差),κ\kappaκ 是缩放系数。τ\tauτ 越大表示该转移越久没被尝试------可能是环境变化导致旧经验失效,或智能体从未充分探索------加 bonus 正是鼓励智能体回头验证这些"被遗忘的"选项。注意方向:这是探索激励(给想象奖励加正项),不是模型误差惩罚。Dyna-Q+ 在变化环境(环境的动力学随时间变化)中尤其有效。
四、基于模型的策略优化
4.1 MBPO 算法
MBPO(Model-Based Policy Optimization)(Janner et al. 2019)是深度强化学习时代最成功的 MBRL 方法之一。
核心设计:
- 用 SAC/DDPG 作为基策略 πMBPO\pi_{\text{MBPO}}πMBPO 收集真实数据。
- 训练多个概率动力学模型 {Pϕi}i=1K\{P_\phi^i\}_{i=1}^K{Pϕi}i=1K 的集成。
- 从最新真实数据中采样初始状态 (s0,a0)(s_0, a_0)(s0,a0),用模型向前短程想象 HHH 步。
- 用想象轨迹做策略改进(用 SAC 的更新,但基于想象数据)。
分支采样:每步想象时,随机选一个模型分支:
s^t+1∼Pϕit(st,at),it∼Uniform(1,...,K) \hat s_{t+1} \sim P_\phi^{i_t}(s_t, a_t), \quad i_t \sim \text{Uniform}(1, \ldots, K) s^t+1∼Pϕit(st,at),it∼Uniform(1,...,K)
为什么短程想象(H 通常 3-15 步) :模型误差随想象步数指数增长 。从任意真实状态出发想象 HHH 步后终止,等于"用模型换来了 HHH 倍的数据",但误差被限制在可控范围。想象轨迹末端可接基策略的估计(注意状态与动作交替):
aH−1=πMBPO(s^H−1),s^H=f(s^H−1,aH−1) a_{H-1} = \pi_{\text{MBPO}}(\hat s_{H-1}), \qquad \hat s_H = f(\hat s_{H-1}, a_{H-1}) aH−1=πMBPO(s^H−1),s^H=f(s^H−1,aH−1)
MBPO 的性能结论 :论文(Janner et al. 2019)的明确表述是 MBPO "matches the asymptotic performance of the best model-free algorithms"------即在 MuJoCo 连续控制任务上渐近性能与最优无模型方法(SAC)持平 ,并非输于 SAC;MBPO 的优势体现在样本效率上,在 Ant 任务中达到与 SAC 相当性能所需的步数约为 300k 对比 3M(约 10 倍)。这打破了"模型偏差必然导致渐近性能损失"的旧印象------关键正是短程分支 rollout 把模型偏差限制在了可控范围内。
4.2 模型预测控制
MPC(Model Predictive Control) 是在线反复求解优化问题的控制范式:
text
循环:
1. 用模型预测未来 H 步:
min_{u_0...u_{H-1}} Σ_{t=0}^{H-1} [ -r(s_t, u_t) + λ ||u_t||^2 ]
s.t. s_{t+1} = f(s_t, u_t)
2. 只执行最优解的第一步 u_0
3. 收集真实数据,更新模型
滚动优化(receding horizon):每步都用最新模型重新规划,只执行第一步。这让 MPC 对模型误差鲁棒。
MPC 在 RL 中的地位 :MPC 本身不需要学习,是基于模型的"纯规划"方法。RL 的贡献是学一个值函数作为终端代价:
min∑t=0H−1c(st,ut)+Vϕ(sH) \min \sum_{t=0}^{H-1} c(s_t, u_t) + V_\phi(s_H) mint=0∑H−1c(st,ut)+Vϕ(sH)
其中 VϕV_\phiVϕ 由 TD 学习。这样既保留了 MPC 的短程优化(对模型误差鲁棒),又用学习提供了长程规划能力。
动作序列怎么优化:CEM 与 PETS 。MPC 的内层优化 minu0...uH−1\min_{u_0\ldots u_{H-1}}minu0...uH−1 在连续动作下通常用交叉熵方法(CEM)求解:维护一个动作序列上的高斯分布,反复采样一批候选序列、按累积代价保留精英样本、重拟合分布,直至收敛。PETS(Chua et al. 2018)把这两件事拼在一起:用概率集成模型(PETS 中的 PE 模型)做预测、CEM 做优化,并利用集成的不确定性在采样中做风险感知决策。CEM/PETS 适用于中等维度动作、短时域的控制任务------模型免费、不需要值函数,但每步都要做优化,决策频率受限。
4.3 世界模型
世界模型(World Models)(Ha & Schmidhuber 2018)是"在压缩的隐空间里做规划"的范式。
三阶段架构:
python
# 阶段 1:VAE 感知模块------把高维观测压缩成隐变量 z
class VAEEncoder(nn.Module):
def __init__(self, obs_dim, latent_dim=32):
super().__init__()
self.fc = nn.Sequential(
nn.Linear(obs_dim, 256), nn.ELU(),
nn.Linear(256, 256), nn.ELU(),
)
self.mu = nn.Linear(256, latent_dim)
self.logvar = nn.Linear(256, latent_dim)
# 阶段 2:MDN-RNN 动力学模块------在隐空间预测下一隐状态
class MDNRNN(nn.Module):
"""混合密度网络 RNN:输出下一隐状态的混合高斯参数集。
每个混合分量 k 输出三个量:混合权重 π_k、均值 μ_k、
标准差 σ_k,故输出维度为 3 * n_mix * latent_dim
(π_k 经 softmax、σ_k 经 exp 保证合法性)。
"""
def __init__(self, latent_dim, action_dim, n_mix=5):
super().__init__()
self.rnn = nn.LSTMCell(latent_dim + action_dim, latent_dim)
self.mdn = nn.Linear(latent_dim, 3 * n_mix * latent_dim)
# 阶段 3:控制器------在隐空间用 CEM(交叉熵方法)搜索动作序列
在隐空间规划的理由:直接在像素空间 rollout 会累积巨大误差;在压缩的隐空间(如 32 维)rollout,误差可控且规划计算量小。
Dreamer 与 RSSM :Dream to Control 系列(Hafner et al. 2019-2023)把这个思路做到极致。其核心世界模型是 RSSM(Recurrent State-Space Model) :每个时刻的隐状态由确定部分 ht=f(ht−1,zt−1,at−1)h_t = f(h_{t-1}, z_{t-1}, a_{t-1})ht=f(ht−1,zt−1,at−1)(GRU/ LSTM 递推)与随机部分 zt∼pψ(zt∣ht)z_t \sim p_\psi(z_t \mid h_t)zt∼pψ(zt∣ht)(条件先验采样)拼接而成------确定通道记住长期信息,随机通道表达环境的固有不确定性。RSSM 的训练目标是序列上的重构 + 奖励预测 (加 KL 正则约束后验 qψ(zt∣ht,ot)q_\psi(z_t\mid h_t,o_t)qψ(zt∣ht,ot) 靠近先验):编码器把观测编码进隐空间,模型在隐空间预测未来,再用解码器与奖励头把预测拉回可监督的信号。actor-critic 完全在隐空间"做梦" rollout 上训练,不需真实环境参与梯度计算。
DreamerV3(Hafner et al. 2023)用一套跨任务固定的超参在 Atari、DeepMind Control Suite(状态与视觉输入两档)、Crafter、Minecraft 等基准上取得强结果:首个在 Minecraft 中不靠人类示范采集到钻石的算法,Atari 上与调参后的无模型方法相当,Crafter 上大幅超越此前方法(因为隐空间模型显式建模了不确定性)。
基于模型方法的现状小结:
- 优势:样本效率高(数据昂贵的场景,如真机机器人)。
- 劣势:实现复杂;模型误差是硬约束(但 MBPO 表明短程想象下渐近性能可与无模型方法持平)。
- 趋势:混合方法(Hybrid)正在成为主流------用模型提供探索信号与短期规划,用无模型保证最终性能(如 TD-MPC2)。