MPC: Model Predictive Control
一句话定位
MPC 通过在线轨迹优化,在每个时间步求解有限时域的最优控制问题,利用世界模型滚动地进行局部规划。
前置依赖
- 强化学习基础(trajectory、return、policy)
- 贝叶斯定理与概率图模型
- 优化基础(梯度下降、交叉熵方法)
- 1-Model-based RL总览
核心思想
MPC 的核心思想是不直接学习一个全局 policy,而是在每个时间步利用世界模型进行局部轨迹优化。具体来说:
- 给定当前状态
,定义 horizon - 从当前状态出发,生成
条候选轨迹(使用随机采样或 CEM) - 每条轨迹通过世界模型 roll out
步 - 选择累计回报最高的轨迹,执行第一个动作
- 重复上述过程(滚动 horizon)
模型结构图
┌─────────────────────────────────────────────────────────────┐
│ MPC 循环 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ │
│ │Obs s_t │◀──────────────────────────┐ │
│ └────┬────┘ │ │
│ │ │ │
│ ▼ │ │
│ ┌─────────┐ ┌──────────────────┐ │ │
│ │ World │───▶│ Trajectory │ │ │
│ │ Model │ │ Generation (K条) │ │ │
│ └────┬────┘ └────────┬─────────┘ │ │
│ │ │ │ │
│ │ ┌────────▼─────────┐ │ │
│ │ │ Evaluate R=Σr │ │ │
│ │ └────────┬─────────┘ │ │
│ │ │ │ │
│ │ ┌────────▼─────────┐ │ │
│ │ │ Select Best │ │ │
│ │ │ Trajectory │ │ │
│ │ └────────┬─────────┘ │ │
│ │ │ │ │
│ │ ┌────────▼─────────┐ │ │
│ │ │ Execute a_t* │───┘ │
│ │ │ (first action) │ │
│ │ └─────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ Env step │ → s_{t+1} │
│ └─────────┘ │
└─────────────────────────────────────────────────────────────┘
数学推导
1. Trajectory Optimization 问题定义
给定初始状态
其中
2. Cross-Entropy Method (CEM) for Planning
CEM 是一种用于轨迹优化的进化算法,核心思想是通过迭代地拟合精英轨迹(elite trajectories)的分布来优化动作序列。
问题形式化:
设动作序列为
CEM 算法步骤:
Step 0: 初始化
- 设动作分布为高斯分布:
- 初始化
, 为大常数(如 1.0)
Step 1: 采样
从当前分布采样
Step 2: Rollout
对每条轨迹
累计回报:
Step 3: 选择精英轨迹
选择 top-
Step 4: 拟合新分布 对精英轨迹的分布重新拟合高斯参数:
Step 5: 迭代
重复 Step 1-4 直到收敛或达到最大迭代次数
完整 CEM 算法:
def CEM_planning(s_0, world_model, H, K=64, M=6, N=10):
"""
s_0: initial state
world_model: f(s, a) -> s'
H: horizon
K: number of candidate trajectories
M: number of elite trajectories
N: number of iterations
"""
# 初始化动作分布(每步一个高斯)
mu = np.zeros(H) # mean for each timestep
sigma = np.ones(H) # std for each timestep
for iteration in range(N):
# Step 1: 采样 K 条轨迹
Tau = [np.random.normal(mu, sigma) for _ in range(K)]
# Step 2: Rollout 计算回报
Returns = []
for tau in Tau:
s = s_0
total_r = 0
for h in range(H):
a = tau[h]
s_next = world_model.predict(s, a)
r = world_model.reward(s, a)
total_r += r
s = s_next
Returns.append(total_r)
# Step 3: 选择精英轨迹
elite_indices = np.argsort(Returns)[-M:]
elite_Tau = [Tau[i] for i in elite_indices]
# Step 4: 拟合新分布
mu = np.mean(elite_Tau, axis=0)
sigma = np.std(elite_Tau, axis=0) + 1e-6 # 防止方差为0
# 返回最优轨迹的第一个动作
best_tau = elite_Tau[-1]
return best_tau[0]3. 世界模型在 MPC 循环中的使用
MPC 循环中,世界模型扮演”模拟器”角色:
for each timestep t:
1. 获取真实状态 s_t(或从观测编码得到)
2. CEM 迭代 N 次:
- 采样 K 条动作序列
- 对每条序列用 world_model rollout H 步
- 计算累计回报 R = Σγ^k r(s_k, a_k)
- 选择 top-M 精英,拟合新分布
3. 执行最优动作序列的第一个动作 a_t
4. 世界模型接收 (s_t, a_t),预测 s_{t+1}(用于下次规划)
5. 与真实环境交互,获取真实 s_{t+1}
6. 存储经验到 replay buffer
4. 模型精度与规划 horizon 的关系
设模型预测误差为
累积误差界:
其中
价值误差界:
实际影响:
越大,计算开销越大( per evaluation) 越大,模型误差累积越多 - 通常选择
使得 以保证规划质量
5. 与其他规划方法的关系
| 特性 | MPC (CEM) | MCTS | Value-based |
|---|---|---|---|
| 搜索类型 | 优化(连续动作) | 树搜索 | 价值迭代 |
| 动作空间 | 连续/离散 | 离散优先 | 离散 |
| 规划深度 | 中等 | 可深可浅 | 通常浅 |
| 计算开销 | 中等 | 高 | 可低可高 |
| 理论基础 | 变分优化 | UCB/ bandits | Bellman 方程 |
训练细节
MPC 的训练流程
- 初始化:随机初始化 policy(通过 CEM 分布)
- 数据收集:与环境交互,存储
到 buffer - 模型更新:用 buffer 数据训练世界模型
- CEM 规划:使用当前模型进行 MPC
- 重复:迭代步骤 2-4
关键超参数
| 参数 | 典型值 | 影响 |
|---|---|---|
| Horizon | 5-20 | 权衡规划质量与误差累积 |
| 采样数 | 64-1024 | 搜索覆盖率 |
| 精英数 | 利用-探索平衡 | |
| CEM 迭代 | 5-15 | 收敛速度 |
| 折扣因子 | 0.95-0.99 | 回报计算 |
改进方向
- CEM with Mode Following:混合策略,多模态动作分布
- Ensemble Models:多模型集成,降低模型偏差
- Gradients-based refinement:用梯度信息指导搜索
- Warm starting:用上一次的结果初始化下次规划
推理/rollout/planning 过程
Online Planning vs Shooting Methods
Shooting Methods(射击法):
- 只优化动作序列,不显式优化状态
- 动作通过 CEM 采样获得
- 计算量相对较小
Collocation Methods(配置法):
- 同时优化动作和状态
- 满足动力学的显式约束
- 计算量更大但精度更高
MPC 的优势
- 自适应规划:每个时间步重新规划,适应环境变化
- 约束处理:自然地处理状态/动作约束
- 无需 policy 训练:直接优化动作序列
- 鲁棒性:误差累积后自动重规划
优点与局限
优点
- 无需显式 policy:避免 policy 表达能力的限制
- 自适应:环境变化时自动重规划
- 约束友好:自然处理各类约束
- 调试友好:规划过程透明可解释
局限
- 计算开销:每步需要在线优化
- 局部最优:CEM 可能陷入局部最优
- Horizon 限制:无法直接处理超长时序依赖
- 模型依赖:规划质量受限于模型精度
与前后内容的衔接
- 前置:1-Model-based RL总览 - MBRL 框架总览
- 后置:3-MCTS - MCTS 树搜索方法
- 相关:5-actor-critic与imagination - 可与 actor-critic 结合
可复现实现要点
import numpy as np
class WorldModel:
def __init__(self):
pass
def predict(self, s, a):
"""预测下一状态"""
raise NotImplementedError
def reward(self, s, a):
"""预测即时回报"""
raise NotImplementedError
class CEMPlanner:
def __init__(self, world_model, action_dim, horizon=10,
n_samples=256, n_elite=16, n_iterations=5):
self.model = world_model
self.action_dim = action_dim
self.horizon = horizon
self.n_samples = n_samples
self.n_elite = n_elite
self.n_iterations = n_iterations
def plan(self, state):
"""返回最优动作"""
# 初始化分布
mu = np.zeros(self.horizon * self.action_dim)
sigma = np.ones(self.horizon * self.action_dim)
for _ in range(self.n_iterations):
# 采样
tau = np.random.normal(mu, sigma, (self.n_samples, self.horizon * self.action_dim))
# 评估
returns = []
for seq in tau:
returns.append(self._evaluate(state, seq))
returns = np.array(returns)
# 选择精英
elite_idx = np.argsort(returns)[-self.n_elite:]
elite_tau = tau[elite_idx]
# 更新分布
mu = np.mean(elite_tau, axis=0)
sigma = np.std(elite_tau, axis=0) + 1e-6
return mu[:self.action_dim] # 返回第一个动作
def _evaluate(self, state, action_seq):
"""Rollout 计算累计回报"""
s = state.copy()
total_r = 0
gamma = 1.0
for h in range(self.horizon):
a = action_seq[h * self.action_dim:(h+1) * self.action_dim]
s_next = self.model.predict(s, a)
r = self.model.reward(s, a)
total_r += gamma * r
s = s_next
gamma *= 0.99
return total_r章节摘要
MPC 是一种在线轨迹优化方法,通过在每个时间步利用世界模型进行局部规划来选择动作。CEM(交叉熵方法)是 MPC 中常用的轨迹优化算法,通过迭代地采样、评估、选择精英轨迹来逐步优化动作序列分布。MPC 的核心优势是无需学习显式 policy,可直接优化动作序列,并且通过滚动重规划实现对环境变化的自适应。局限在于计算开销较大、对模型误差敏感、以及可能陷入局部最优。MPC 与 MCTS(树搜索)和 Actor-critic(想象 rollout)是三种主要的规划范式。
关键词
MPC, Model Predictive Control, CEM, Cross-Entropy Method, trajectory optimization, shooting method, horizon, online planning, world model, model-based RL, local optimum