MPC: Model Predictive Control

一句话定位

MPC 通过在线轨迹优化,在每个时间步求解有限时域的最优控制问题,利用世界模型滚动地进行局部规划。

前置依赖

  • 强化学习基础(trajectory、return、policy)
  • 贝叶斯定理与概率图模型
  • 优化基础(梯度下降、交叉熵方法)
  • 1-Model-based RL总览

核心思想

MPC 的核心思想是不直接学习一个全局 policy,而是在每个时间步利用世界模型进行局部轨迹优化。具体来说:

  1. 给定当前状态 ,定义 horizon
  2. 从当前状态出发,生成 条候选轨迹(使用随机采样或 CEM)
  3. 每条轨迹通过世界模型 roll out
  4. 选择累计回报最高的轨迹,执行第一个动作
  5. 重复上述过程(滚动 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 问题定义

给定初始状态 ,MPC 求解以下有限时域最优控制问题:

其中 为代价函数(常取负回报), 为世界模型。

2. Cross-Entropy Method (CEM) for Planning

CEM 是一种用于轨迹优化的进化算法,核心思想是通过迭代地拟合精英轨迹(elite trajectories)的分布来优化动作序列。

问题形式化:

设动作序列为 ,我们要最大化累计回报:

CEM 算法步骤:

Step 0: 初始化

  • 设动作分布为高斯分布:
  • 初始化 为大常数(如 1.0)

Step 1: 采样 从当前分布采样 条候选轨迹:

Step 2: Rollout 对每条轨迹 ,利用世界模型进行前向模拟:

累计回报:

Step 3: 选择精英轨迹 选择 top- 条回报最高的轨迹(elite set):

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 的关系

设模型预测误差为 ,在 horizon 下:

累积误差界:

其中 是误差收缩系数()。

价值误差界:

实际影响:

  • 越大,计算开销越大( per evaluation)
  • 越大,模型误差累积越多
  • 通常选择 使得 以保证规划质量

5. 与其他规划方法的关系

特性MPC (CEM)MCTSValue-based
搜索类型优化(连续动作)树搜索价值迭代
动作空间连续/离散离散优先离散
规划深度中等可深可浅通常浅
计算开销中等 可低可高
理论基础变分优化UCB/ banditsBellman 方程

训练细节

MPC 的训练流程

  1. 初始化:随机初始化 policy(通过 CEM 分布)
  2. 数据收集:与环境交互,存储 到 buffer
  3. 模型更新:用 buffer 数据训练世界模型
  4. CEM 规划:使用当前模型进行 MPC
  5. 重复:迭代步骤 2-4

关键超参数

参数典型值影响
Horizon 5-20权衡规划质量与误差累积
采样数 64-1024搜索覆盖率
精英数 的 10-20%利用-探索平衡
CEM 迭代 5-15收敛速度
折扣因子 0.95-0.99回报计算

改进方向

  1. CEM with Mode Following:混合策略,多模态动作分布
  2. Ensemble Models:多模型集成,降低模型偏差
  3. Gradients-based refinement:用梯度信息指导搜索
  4. Warm starting:用上一次的结果初始化下次规划

推理/rollout/planning 过程

Online Planning vs Shooting Methods

Shooting Methods(射击法):

  • 只优化动作序列,不显式优化状态
  • 动作通过 CEM 采样获得
  • 计算量相对较小

Collocation Methods(配置法):

  • 同时优化动作和状态
  • 满足动力学的显式约束
  • 计算量更大但精度更高

MPC 的优势

  1. 自适应规划:每个时间步重新规划,适应环境变化
  2. 约束处理:自然地处理状态/动作约束
  3. 无需 policy 训练:直接优化动作序列
  4. 鲁棒性:误差累积后自动重规划

优点与局限

优点

  1. 无需显式 policy:避免 policy 表达能力的限制
  2. 自适应:环境变化时自动重规划
  3. 约束友好:自然处理各类约束
  4. 调试友好:规划过程透明可解释

局限

  1. 计算开销:每步需要在线优化
  2. 局部最优:CEM 可能陷入局部最优
  3. Horizon 限制:无法直接处理超长时序依赖
  4. 模型依赖:规划质量受限于模型精度

与前后内容的衔接

可复现实现要点

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