第 1 章:路径积分控制理论——从 Kappen 到信息论 MPPI¶
本章是「采样式 MPC / 路径积分控制」方向的**数学地基**。它只回答一个问题,但要把它彻底讲透:为什么一个非线性的随机最优控制问题,能通过一次指数变换变成线性问题,从而用"撒一批随机轨迹、做加权平均"来求解? 把这个问题想清楚之后,MPPI 算法本身(第 2 章)就只剩工程——GPU 怎么并行、控制序列怎么平滑、延迟怎么补偿。
整章是一条**从偏微分方程(PDE)到可运行算法的单链**:先把 Hamilton–Jacobi–Bellman(HJB)方程线性化(§1.1),再把线性 PDE 解成一条期望(§1.2),换一个视角用信息论重新得到同一套结果并落地为权重公式(§1.3),解剖唯一的自由参数(§1.4),最后写成 20 行代码(§1.5)。
📋 前置自测¶
答不出 \(\geq 2\) 题,先回梯度式 MPC 章(HJB / LQR)和 RL 章(SAC 的熵正则化、策略梯度),再来读本章。
- 写出**有限时域随机最优控制**的 HJB 方程。为什么它对一般的非线性系统**没有解析解**?(提示:方程里哪一项是非线性的?)
- 什么是**指数变换 / Cole–Hopf 变换**?你在别处是否见过"取对数把乘法变加法、把 \(\min\) 变成 \(\log\sum\exp\)"这种把非线性运算线性化的把戏?
- 写出 KL 散度 \(\mathrm{KL}(P\,\|\,Q)\) 的定义式。在 SAC 里,温度系数 \(\alpha\)(或 \(\lambda\))调大、调小分别意味着策略更"贪心"还是更"随机"?
- 什么是**重要性采样(importance sampling)**?已知只能从分布 \(Q\) 采样,如何估计另一个分布 \(P\) 下的期望 \(\mathbb{E}_P[h(x)]\)?
- Itô 积分和普通黎曼积分最关键的区别是什么?(一句话直觉即可,不需要测度论。)
本章目标¶
学完本章,你应该能够:
- **推导**指数变换 \(\psi = e^{-J/\lambda}\) 如何在 **Kappen 条件**下把非线性 HJB PDE 线性化,并用一句物理语言说清这个条件的含义;
- 用 Feynman–Kac 引理**把线性 PDE 写成"无控扩散过程下的路径积分期望",并解释为什么这意味着**可以用蒙特卡洛估计最优控制、不需要从终点往回扫的 backward sweep;
- 从**信息论视角(自由能–KL 对偶)**重新推导路径积分控制,说清 Williams 2018 如何去掉 Kappen 假设里的 control-affine 与二次控制代价限制;
- 独立推导 MPPI 权重公式 \(w_k = \exp\!\big(-(S_k-\rho)/\lambda\big)\big/\sum_j \exp\!\big(-(S_j-\rho)/\lambda\big)\),并解释其中 \(\rho\) 减法的数值意义;
- 论证 MPPI 与 REINFORCE 的数学同构——MPPI 本质上是零阶(zeroth-order)策略梯度的一个闭式特例;
- 解释温度 \(\lambda\) 如何在"贪心地取代价最小轨迹(\(\arg\min\))"与"对所有轨迹一视同仁地平均"之间连续插值,及其与 SAC 温度系数的对应关系;
- 把权重公式落成约 20 行 NumPy MPPI 代码,作为贯穿整个方向的 **Mini-MPPI 累积项目**的起点。
- 说出路径积分在**离散时间**的镜像——Todorov 线性可解 MDP(\(z=MPz\)),并解释为什么它独有"最优策略可线性叠加"的可组合性;
- 用**风险敏感视角**解读自由能(\(\mathcal{F}\approx\mathbb{E}[S]-\mathrm{Var}[S]/2\lambda\)),说清温度 \(\lambda\) 同时是风险态度旋钮,以及为什么低温在随机环境里偏冒险;
- 把 MPPI 定位进采样式 MPC 家族,用一句话讲清它与 CEM 的关系(共享骨架、软指数 vs 精英硬选),并理解自归一化重要性采样估计器为何有偏(\(O(1/K)\))。
- 说明 MPPI 更新为何是**分布空间的自然梯度/镜像下降**、为何"没有学习率",以及它的收敛性边界(理想单调改善、有限样本随机、非凸局部);
- 解释**接收水平控制**如何把单次开环序列变成闭环反馈,以及时域 \(H\) 在远见与采样维度之间的权衡;
- 论证 MPPI 能直接处理**不可微/不连续/黑箱代价**(\(S\) 只作标量进指数),并据此倒推几条代价函数设计原则。
本章数学工具箱¶
本章会用到下面几样数学工具;不必全部精通,但知道"它在哪一步、解决什么"能帮你不迷路(不熟的可在用到时回看对应小节或前置自测):
- Itô 引理 / 随机微积分:给随机 HJB 贡献那个 \(\tfrac12\) 二阶项(§1.1)。一句话直觉够用,无需测度论。
- Cole–Hopf / 指数变换:\(\psi=e^{-J/\lambda}\),把非线性 HJB 线性化(§1.1)。
- Feynman–Kac 公式:把线性 backward PDE 的解写成对被动轨迹的期望(§1.2)。
- KL 散度与吉布斯变分原理:自由能对偶的核心,导出权重公式(§1.3)。
- 拉格朗日乘子 / 变分法:证明对偶定理(§1.3 练习)。
- 重要性采样(自归一化):把隐式最优分布的期望变成可计算的加权和(§1.3、§1.4)。
- 特征值 / 主特征向量:无穷时域 LMDP 的线性贝尔曼解(§1.2)。
- 泰勒展开 / Laplace 近似:软最小值的极限、自由能的均值-方差展开、\(\lambda\to0\) 退回 PMP(§1.1、§1.3、§1.4)。
这些工具大多来自统计物理与概率论——路径积分控制的精髓,正是把它们成建制地搬进控制论。
本章知识导航¶
本章五节是一条**严格递进的单链**,每一节都为下一节扫清一个障碍:
| 节 | 知识点 | 依赖 | 它在链条上的作用 |
|---|---|---|---|
| §1.1 | 指数变换 → 线性 backward PDE | HJB | 把"非线性 PDE 无法求解"这个障碍移除 |
| §1.2 | Feynman–Kac → 路径积分控制律(+ 离散 LMDP) | §1.1 | 把线性 PDE 解成一条**期望**——"蒙特卡洛即可"的根源;并给出离散 MDP 的平行形式 |
| §1.3 | 自由能–KL 对偶 → MPPI 权重公式 | §1.2、KL 散度 | 换信息论视角,在更弱假设下重得同一结果并落地为算法;并给出控制即推断、风险敏感两个统一视角 |
| §1.4 | 温度 \(\lambda\) 与对称性破缺 | §1.3 | 解剖唯一的自由参数(ESS、偏差、零方差提议、\(\lambda\) 与 \(\Sigma\) 耦合、单摆多模、hedge↔commit) |
| §1.5 | 最简 MPPI 与累积项目 | §1.3–§1.4 | 写成可运行(Python + C++)代码,含接收水平/时域、代价设计、家族定位,交给第 2 章 GPU 工程化 |
关于章节拆分:移动规控总大纲把"指数变换"与"Feynman–Kac"合并为一个知识点。本章按推导深度把它拆成 §1.1(变换与线性化)与 §1.2(Feynman–Kac 与控制律)两节——前者是"把方程变简单",后者是"把简单方程解出来",是两个独立的逻辑跳跃,分开讲读者更不容易跟丢。
前置知识桥接¶
回顾梯度式 MPC 章:HJB 方程是动态规划的连续时间极限。 对最优代价函数(value function / cost-to-go)\(J(x,t)\),HJB 给出 \(-\partial_t J = \min_u\{\ell(x,u) + (\nabla_x J)^\top \dot x + \text{扩散项}\}\)。在那里我们看到:只有 LQR(线性动力学 + 二次代价)能写出 \(J\) 的解析解(Riccati 方程),一般非线性系统只能数值离散、且维度一高就因"维度灾难"不可解——这正是梯度式 MPC 退而求其次、在每个时刻做**局部**二次近似(iLQR/DDP)的原因。本章要展示的是一条**完全不同的出路**:在一类特殊(但实用)的问题上,HJB 可以被**整体**线性化,从而绕开 backward sweep。
回顾 RL 章:SAC 的熵正则化。 SAC 在奖励里加了一项策略熵 \(\alpha \mathcal{H}(\pi)\),温度 \(\alpha\) 控制"利用 vs 探索":\(\alpha\to 0\) 时策略坍缩到贪心最优动作,\(\alpha\) 大时策略更随机。本章的温度 \(\lambda\) 扮演几乎一模一样的角色——记住这个对应,§1.4 会把它讲死。
五节如何环环相扣¶
把五节串成一句话:§1.1 把不可解的非线性 HJB 变成线性 PDE,§1.2 把线性 PDE 解成一条可采样的期望(并给出离散镜像 LMDP),§1.3 换信息论视角在最弱假设下重得同一结果、落成权重公式,§1.4 解剖唯一的旋钮 \(\lambda\),§1.5 把公式写成二十行代码。 更细地看,相邻两节由一条主线咬合:
- §1.1 → §1.2:线性化只是第一步;"线性"不等于"可解"(高维网格照样炸),§1.2 用 Feynman–Kac 绕开解 PDE,直接采样。
- §1.2 → §1.3:纯被动采样方差爆炸,且被绑死在 Kappen 假设里;§1.3 的自由能对偶一次性解决这两件事。
- §1.3 → §1.4:权重公式里唯一的自由量是 \(\lambda\);§1.4 把它从"魔数"变成"可用 ESS 定量选取、有相变意义的物理量"。
- §1.4 → §1.5:直觉与公式齐备后,§1.5 把它落成可运行代码,交给第 2 章做 GPU 工程化。
读的时候不必死记每节细节;记住这条主线,遇到某个公式时先回答"它在主线的哪一环",理解会顺很多。
如果跳过本章会怎样¶
- 场景一:你把 MPPI 权重公式当成一个"玄学配方"。 不知道权重 \(\exp(-S/\lambda)\) 里的 \(\lambda\) 该取多大、为什么是指数而不是别的函数、为什么要减去 \(\rho=\min_k S_k\)。结果是调参全靠试,换个机器人就从零开始撞运气。本章让你能**从第一性原理推出每一个符号**。
- 场景二:你看不出 MPPI 和你已经会的 REINFORCE 是同一件事。 于是 RL 那套调参直觉(reward shaping、温度退火、方差缩减)在 MPPI 里全部白白浪费。§1.3 会证明两者数学同构——你的 RL 经验可以**零成本迁移**。
预计阅读时间¶
| 方式 | 时间 | 适合谁 |
|---|---|---|
| 精读(含手推与练习) | 6–8 小时 | 第一次系统学路径积分控制 |
| 速读(跳过推导细节,看结论与直觉) | 1.5–2 小时 | 已了解 MPPI、想补理论根的读者 |
| 速查(只看公式块、表格、速查卡) | 20 分钟 | 实现时回来确认某个符号/条件 |
本章对应大纲的"第 1–2 周",全部投入(含三道作业与 Mini-MPPI 起步)约 20–28 小时。
§1.1 指数变换与 HJB 的线性化 ⭐⭐⭐¶
这一节解决什么问题:把"非线性 HJB 偏微分方程在高维下无法求解"这个拦路虎,用一次变量替换变成一个**线性**偏微分方程。
动机¶
梯度式 MPC 的整套机器,归根结底是在回避 HJB 方程。HJB 是最优控制的"主方程"——理论上只要解出它,就得到全局最优反馈律。
但它是一个非线性 PDE,状态维度 \(n\) 一高,网格离散的格点数随 \(n\) 指数爆炸(维度灾难),数值求解彻底不可行。于是 iLQR/DDP 选择了一条务实但保守的路:不求全局的 \(J\),只在当前轨迹附近做二次近似,反复迭代。
代价是只能拿到**局部**最优,且要求动力学可微、代价可二次近似。
那么——有没有可能不做局部近似,而是把 HJB 整体地、精确地解出来? 对一般非线性系统,答案是否定的。但 Kappen 在 2005 年发现:对于一大类**控制仿射(control-affine)+ 二次控制代价**的随机问题,HJB 可以通过一次指数变换变成**线性** PDE,而线性 PDE 有一个杀手锏——它的解可以写成期望,能用蒙特卡洛估计。
这就是路径积分控制的起点,也是 MPPI 最终能"撒一批轨迹做加权平均"的根本原因。
如果不这样做会怎样¶
设想我们硬着头皮直接数值解非线性 HJB。即便只取 \(n=12\)(一个四旋翼的状态维度),每维粗糙地离散成 50 个格点,状态空间就有 \(50^{12}\approx 2.4\times 10^{20}\) 个格点;每个格点上还要对控制 \(u\) 求极小、对时间反向积分。
这不是"算得慢"的问题,是"宇宙年龄也算不完"的问题。历史上经典最优控制的精确解之所以基本停在 LQR,正是因为离开线性-二次这个特例,HJB 的非线性项就让一切解析与数值手段失效。
指数变换的价值,就是**在不牺牲精确性的前提下,把这一类问题从"非线性 PDE"挪到"线性 PDE"这个我们有办法对付的类别里**。
历史¶
Kappen 的灵感来自物理。他在论文里明确指出:这个把非线性 HJB 变成线性方程的变换,与把经典 Hamilton–Jacobi 方程联系到薛定谔(Schrödinger)方程所用的变换是同一类。
在量子力学里,\(\psi = e^{iS/\hbar}\) 把作用量 \(S\) 满足的非线性 HJ 方程变成线性的薛定谔方程;在最优控制里,\(\psi = e^{-J/\lambda}\) 把代价函数 \(J\) 满足的非线性 HJB 变成线性的 backward 扩散方程。温度 \(\lambda\) 在这里扮演的角色,恰如 \(\hbar\) 在量子力学里的角色。
这种"作用量的指数"在数学上叫 Cole–Hopf 变换,最早用于把非线性的 Burgers 方程线性化为热方程。Kappen 把统计物理这套成熟工具搬进了控制论,于 2005 年发表在 J. Stat. Mech.(P11011)与 Phys. Rev. Lett.(95, 200201)两篇姊妹篇里。
把这条思想的来龙去脉理一遍,会发现路径积分控制站在三代人的肩膀上。源头是 Feynman 1948 的路径积分——他用"对所有路径求和、每条路径加权 \(e^{iS/\hbar}\)"重写了量子力学,把"解薛定谔方程"换成"对路径积分"。
Kac 1949 随后把这套思想搬到扩散过程:他证明热方程(及更一般的抛物 PDE)的解可以写成对布朗运动路径的期望——这就是 Feynman–Kac 公式,把虚时间下的"路径求和"变成了真实的概率期望,也正是 §1.2 那个箱式公式的数学母体。几乎同期,Cole(1951)与 Hopf(1950) 各自发现 \(\psi=e^{-\cdots}\) 这类指数变换能把非线性的 Burgers 方程线性化为热方程。
这三件事——路径积分、Feynman–Kac、Cole–Hopf——合起来提供了"指数变换 + 对路径取期望"的完整工具链,只是它们当时都不是为控制而生。
半个世纪后,Kappen 2005 看穿了最优控制里的 HJB 方程恰好能套用这同一套工具:用 Cole–Hopf 把非线性 HJB 线性化,再用 Feynman–Kac 把线性 PDE 写成对被动轨迹的期望——于是"解最优控制"变成了"对轨迹采样"。Todorov 2006–2009 在离散侧独立地给出镜像(LMDP,§1.2)。
再到 Theodorou 2010(PI²)→ Williams 2016(ICRA,首篇 MPPI 实车论文)→ 2017(JGCD,完整理论与 GPU 工程化)→ Williams 2018(信息论推导),这条线才从理论走成今天机器人上实跑的算法。所以当你在 §1.2 看到"最优控制 = 对轨迹加权平均"时,那不是一个新发明,而是 Feynman 七十多年前那个"对所有路径求和"的念头,经 Kac 和 Kappen 之手,落到了控制论里。
推导:从 HJB 到线性 backward PDE¶
第一步:写出问题。 考虑控制仿射的随机微分方程(SDE)
其中 \(x\in\mathbb{R}^n\) 是状态,\(u\in\mathbb{R}^m\) 是控制,\(f(x)\) 是**漂移(drift)——系统自身的演化趋势,\(G(x)\) 是**控制矩阵,把控制和噪声注入同样的通道(这是"控制仿射"的含义,也是后面 Kappen 条件成立的前提)。代价函数取
\(\phi\) 是终端代价,\(V(x,t)\) 是与状态有关的**运行代价**(可以任意复杂、非凸),\(\tfrac12 u^\top R u\) 是**二次控制代价**,\(R\succ 0\) 是控制代价权重。注意运行代价里**状态项 \(V\) 和控制项是分开的**——状态可以随便罚,控制必须二次罚。
这个结构是整个推导能走通的关键,后面会反复用到。
第二步:写出 HJB 方程。 对最优代价函数 \(J(x,t)\)(这里用 \(J\) 记 value function / cost-to-go,与上面的总代价同名,因为最优总代价就是初始时刻的 cost-to-go),动态规划给出
最后一项 \(\tfrac12\mathrm{tr}(G\Sigma G^\top\nabla^2 J)\) 是**随机性带来的二阶修正**(Itô 引理的产物)——它正是确定性 HJB 所没有、而随机 HJB 独有的项,记住它,第二步之后所有"魔法"都发生在它身上。
旁注(Itô vs Stratonovich,可跳过):那个 \(\tfrac12\) 二阶项的出现,依赖于我们把 SDE 按 Itô 约定**来解释。随机积分有两种主流约定——Itô 和 Stratonovich——区别在于对 \(\int g\,\mathrm{d}W\) 取黎曼和时用区间**左端点(Itô)还是**中点**(Stratonovich)。Itô 的代价是链式法则要多一个二阶项(就是上面那项),好处是积分对历史"不预看未来"、是鞅,便于概率推导;Stratonovich 则保留普通链式法则,但要把漂移项做一个对应的修正(Itô–Stratonovich 转换)。两种约定描述的是同一个物理过程,只是记账方式不同;本章及绝大多数路径积分控制文献用 Itô。你在文献里若看到没有那个 \(\tfrac12\) 项、却用普通链式法则的推导,多半是 Stratonovich 约定,结论并不矛盾。
第三步:对控制求极小。 大括号里对 \(u\) 是一个标准的二次型,对 \(u\) 求导置零:
这说明**最优控制正比于值函数的负梯度**——沿着"代价下降最快"的方向施加控制,强度由 \(R^{-1}\)(控制越便宜、推得越狠)调制。这一步是确定性的,和随机性无关。
第四步:代回,暴露非线性的根源。 把 \(u^\star\) 代回 HJB,二次项 \(\tfrac12 (u^\star)^\top R u^\star + (u^\star)^\top G^\top\nabla J\) 化简(代入 \(u^\star=-R^{-1}G^\top\nabla J\) 得 \(\tfrac12 \nabla J^\top GR^{-1}G^\top\nabla J - \nabla J^\top GR^{-1}G^\top\nabla J = -\tfrac12\nabla J^\top GR^{-1}G^\top\nabla J\)):
全部的麻烦都集中在那个被标注的项上:它对 \(\nabla J\) 是二次的,使整个方程非线性。如果能把它消掉,方程就线性了。这一步是诊断——我们已经精确知道"敌人"是谁,下一步对症下药。
第五步:指数变换。 令
\(\psi\) 称为 desirability(合意度)——代价越低的状态,\(\psi\) 越大。它不是概率密度(没有归一化),只是 \(J\) 的一个单调递减的重新编码。
为什么要换到 \(\psi\),而不直接对 \(J\) 下手? 因为非线性恰好藏在 \(J\) 的那一项 \(-\tfrac12(\nabla J)^\top GR^{-1}G^\top\nabla J\) 里——它对 \(\nabla J\) 是**二次**的。指数变换 \(\psi=e^{-J/\lambda}\) 的作用,是让"对 \(\nabla J\) 二次"这件事在求导后**自动生出一个反向的二次项**去抵消它:由链式法则,\(\nabla^2 J\) 的表达式里会冒出一个 \(+\lambda\,\nabla\psi\nabla\psi^\top/\psi^2\)(也是二次的),它与那个非线性项符号相反、形式相同,于是在 Kappen 条件下精确相消。这正是"取对数把乘法变加法、把二次的麻烦变成可消去的项"那类线性化技巧的体现(前置自测第 2 题的伏笔)。直接对 \(J\) 操作,那个二次项无处可去;换到 \(\psi\),它才有了被消掉的搭档。按链式法则算出三个导数(这一步纯粹是微积分,建议在草稿纸上自己推一遍):
第三个式子里多出来的 \(+\lambda\,\nabla\psi\nabla\psi^\top/\psi^2\) 项是关键——它也是对 \(\nabla\psi\) 二次的,正好可以拿去和第四步那个非线性项相消。
第六步:相消,得到 Kappen 条件。 把三个导数代入第四步的方程,逐项整理。两处"对 \(\nabla\psi\) 二次"的项分别来自非线性项和 Hessian 项:
两项相消,当且仅当 \(\lambda^2 G R^{-1}G^\top = \lambda\, G\Sigma G^\top\),即
这就是整个理论的**唯一限制性假设**:噪声协方差必须与控制代价的逆成正比,比例系数恰为温度 \(\lambda\)。它把三件原本独立的东西——噪声强度 \(\Sigma\)、控制成本 \(R\)、温度 \(\lambda\)——锁死成一条等式。
第七步:线性 backward PDE。 相消之后,剩下的项乘开、整理(注意 \(G\Sigma G^\top = \lambda GR^{-1}G^\top\) 可回代),得到关于 \(\psi\) 的方程:
终端条件 \(\psi(x,T) = \exp(-\phi(x)/\lambda)\)。这个方程对 \(\psi\) 是线性的——\(\psi\)、\(\nabla\psi\)、\(\nabla^2\psi\) 都只出现一次幂,没有任何乘积项。非线性 HJB 被彻底驯服了。
为什么是"backward"PDE?终端条件说明了一切。 注意这个方程配的是**终端**条件 \(\psi(x,T)=e^{-\phi(x)/\lambda}\),而非初始条件——它从未来(终点 \(T\))向现在(\(t\))反向求解,所以叫 backward PDE。这不是技术怪癖,而是最优控制问题的本性:我们**知道想在哪里结束**(终端代价 \(\phi\) 刻画了"理想的终点长什么样"),却要倒推"现在该怎么做"。动态规划的 backward sweep(从终点反向递推值函数)是同一个逻辑的离散版本。与之对照,描述"粒子从已知初始分布如何向前扩散"的 Fokker–Planck 方程配的是初始条件、向前求解——两者是一对时间反演的镜像。\(\psi\) 满足 backward 方程这件事,正是 §1.2 能把它写成"从 \(t\) 出发、向 \(T\) 演化的轨迹期望"的根本原因:backward 的边界条件(在 \(T\))恰好成为 Feynman–Kac 期望里的终端被积项 \(e^{-\phi(x_T)/\lambda}\)。记住这个方向,下一节"对未来轨迹取期望"就不再突兀。
本质洞察:指数变换的魔力,本质是**把"取极小(\(\min\))"换成了"求期望(积分)"。在第二步,HJB 里有一个 \(\min_u\),是非线性的源头之一;指数加权 \(e^{-J/\lambda}\) 是 \(\log\!\sum\!\exp\)(软最小值,soft-min)的连续版本——当 \(\lambda\to 0\) 时 \(-\lambda\log\int e^{-J/\lambda}\to \min J\),精确退回硬最小值。换句话说,我们没有"解决"非线性,而是把它**搬到了指数的内部,让外层运算(积分、期望)变成线性的。这个"用 log-sum-exp 把 min 软化、从而线性可加"的思想,会在 §1.3 的自由能对偶里以完全相同的面貌再次出现——届时你会发现 Kappen 的 PDE 推导和 Williams 的信息论推导,其实是同一枚硬币的两面。
Kappen 条件的物理意义¶
\(\Sigma = \lambda R^{-1}\) 不是一个可有可无的技术细节,它编码了一句很强的物理陈述:在噪声大的方向上,控制是便宜的;在噪声小的方向上,控制是昂贵的。 因为 \(\Sigma\) 大对应 \(R\) 小(控制便宜),\(\Sigma\) 小对应 \(R\) 大(控制昂贵),二者此消彼长。
直觉上这很合理——如果某个控制通道天生就被大量噪声搅动,那么再花大力气去精确控制它也是徒劳,系统"乐于"让你在那个方向上随便推(低控制代价);反过来,一个几乎无噪声的通道,每一点控制都精确生效,理应谨慎使用(高控制代价)。
这个条件也解释了为什么 §1.2 之后我们能用"无控系统的随机轨迹"来估计最优控制:噪声的分布和控制的代价是**同一个几何对象**(差一个 \(\lambda\)),所以"系统在噪声驱动下自发探索的方向"恰好就是"控制代价低、值得探索的方向"。
一张对应表:量子力学、经典 HJ 与最优控制¶
把 §1.1 的整条逻辑收成一张表,能看清它在更大图景里的位置。指数变换不是控制论的孤立技巧,而是一族横跨三个领域的同构中的一员:
| 经典力学(Hamilton–Jacobi) | 量子力学(Schrödinger) | 随机最优控制(本章) | |
|---|---|---|---|
| 核心未知量 | 作用量 \(S\) | 波函数 \(\psi\) | 值函数 \(J\) / desirability \(\psi=e^{-J/\lambda}\) |
| 控制方程 | HJ 方程(**非线性**一阶 PDE) | 薛定谔方程(线性) | HJB(非线性)→ 线性 backward PDE |
| 线性化的桥 | —— | \(\psi=e^{iS/\hbar}\)(WKB) | \(\psi=e^{-J/\lambda}\)(Cole–Hopf) |
| "小参数" | —— | 普朗克常数 \(\hbar\) | 温度 \(\lambda\) |
| 该参数 \(\to 0\) 的极限 | —— | \(\hbar\to0\):回到经典力学 | \(\lambda\to0\):回到确定性最优控制(PMP) |
| 求解手段 | 特征线 / 最小作用量 | 路径积分(对所有路径求和) | 路径积分(对被动轨迹采样,§1.2) |
最后两行值得停一下。量子力学里 \(\hbar\to0\) 回到经典确定性世界;最优控制里 \(\lambda\to0\)(噪声趋零)回到确定性最优控制——Kappen 2005 明确证明,此极限下路径积分解经 Laplace 近似精确退化为 Pontryagin 极小值原理(PMP)所刻画的确定性最优轨迹。
换句话说,你在确定性最优控制课里学过的 PMP,正是本章随机理论在零温极限下的特例;噪声(温度 \(\lambda\))一旦打开,PMP 的单条最优轨迹就"软化"成一个轨迹**分布**——而这分布,正是 §1.2 起我们要采样的对象。Feynman 当年用"对所有路径求和"重写量子力学;路径积分控制做的是同一件事的控制论版本——用"对所有被动轨迹加权求和"重写最优控制。
⚠️ 常见陷阱¶
💡 概念误区:以为指数变换对任意最优控制问题都能线性化。 - 错误描述:看到 \(\psi=e^{-J/\lambda}\) 把 HJB 变线性,就以为这是个万能技巧,对任何代价、任何动力学都成立。 - 现象 / 后果:在一个控制代价不是二次的、或噪声不进控制通道的问题上套用,得到的"线性 PDE"其实残留了未消去的非线性项,后续所有结论(Feynman–Kac、蒙特卡洛估计)全部失效,却很难一眼看出错在哪。 - 根本原因:线性化严格依赖第六步的相消,而相消**只在 Kappen 条件 \(\Sigma=\lambda R^{-1}\) 下发生**。这要求(a)控制仿射,(b)控制代价二次,(c)噪声与控制走同一通道 \(G\)。三者缺一不可。 - 正确做法:套用前先核对这三个前提。若控制代价非二次、或动力学非控制仿射,应改用 §1.3 的信息论推导——Williams 2018 正是为去掉这些限制而生。
🧠 思维陷阱:把 Kappen 条件当作"可以事后调"的超参数关系。 - 错误描述:以为 \(\Sigma\)、\(R\)、\(\lambda\) 可以各自独立设定,跑不好再分别微调。 - 现象 / 后果:实现里把噪声方差、控制权重、温度当三个旋钮乱拧,结果要么数值发散,要么控制律根本不是任何问题的最优解。 - 根本原因:\(\Sigma=\lambda R^{-1}\) 是线性化成立的**充要条件**,不是建议。一旦三者不满足这条等式,你求出来的 \(\psi\) 就不再是原问题的解。 - 正确做法:把其中两个当自由量、第三个由等式定出。实践中常见的是固定噪声 \(\Sigma\) 和控制权重 \(R\),再令 \(\lambda\) 由问题尺度决定(§1.4 给出具体做法);或在 MPPI 实现里干脆把控制代价吸收进 \(\lambda\),只保留一个温度旋钮。
💡 概念误区:把 desirability \(\psi\) 当成概率密度。 - 错误描述:因为 \(\psi=e^{-J/\lambda}\) 形如玻尔兹曼因子,就默认它积分为 1、可以直接当分布采样。 - 现象 / 后果:在代码里拿 \(\psi\) 当权重却忘了归一化,或反过来对一个本不需归一化的量强行归一,引入隐蔽的尺度错误。 - 根本原因:\(\psi\) 是值函数的指数编码,是一个**非归一化**的正函数;只有在 §1.3 把它投影成轨迹分布时,才会出现真正的归一化常数(配分函数)。 - 正确做法:始终把 \(\psi\) 当作"合意度场"看待——它的**相对大小**有意义(哪个状态更合意),绝对值不重要;需要分布时再显式归一化。
练习¶
- (推导题) 补全第六步省略的代数:把第五步的三个导数完整代入第四步的非线性 HJB,逐项写出,验证除了那两个"对 \(\nabla\psi\) 二次"的项之外,其余项整理后恰好给出第七步的线性 PDE。明确指出每一项的来源。在草稿纸上完成。
- (证明题) 证明确定性极限:当噪声趋于零(\(\Sigma\to 0\),于是 \(\lambda\to 0\))时,路径积分解通过 Laplace 近似退化为 Pontryagin 极小值原理(PMP)所刻画的确定性最优控制。提示:\(-\lambda\log\int e^{-J/\lambda}\,\mathrm{d}\tau \xrightarrow{\lambda\to0} \min_\tau J\)。这一题把"随机最优控制"和你在确定性最优控制里学过的 PMP 接上了。
- (开放思考题) 假设 Kappen 条件被破坏:\(\Sigma = c\,\lambda R^{-1}\) 但 \(c\neq 1\)。第六步的两项不再相消,会残留一个怎样的项?它对 \(\psi\) 还是线性的吗?这个残留项的存在,对"用无控轨迹做蒙特卡洛估计"意味着什么困难?(你不必解出方程,只需定性说明——这正是 Williams 2018 要绕开的麻烦,§1.3 见分晓。)
§1.1 把方程变简单了,但线性 PDE 仍然是 PDE——高维下直接数值解它,维度灾难一分没少。下一节用 Feynman–Kac 引理把这个线性方程**真正解出来**,而且解的形式会直接告诉我们"该怎么撒轨迹"。
§1.2 Feynman–Kac 与路径积分控制律 ⭐⭐⭐¶
这一节解决什么问题:把 §1.1 得到的线性 PDE 解成一条**期望**,从而把"解偏微分方程"换成"采样求平均"——这是 MPPI 能用蒙特卡洛、能 GPU 并行的根源;本节末尾再给出同一思想在离散 MDP 上的平行形式(Todorov 线性可解 MDP)。
动机¶
线性化只完成了一半工作。§1.1 末尾我们手里有一个关于 desirability \(\psi\) 的线性 backward PDE,但"线性"不等于"好解":在 \(n=12\) 维状态空间上,无论方程线不线性,网格离散都要 \(50^{12}\) 个格点。
我们需要的不是"更好解的 PDE",而是**根本不解 PDE**。
Feynman–Kac 引理正是这把钥匙。它在数学上建立了一座桥:**任何线性抛物 backward PDE 的解,都可以写成某个随机过程上的期望。
** 一旦写成期望,求解方式就从"在整个状态空间上铺网格、反向扫描"变成"从当前点出发、向前撒一批随机轨迹、取平均"。前者的计算量随维度指数爆炸;后者的计算量只取决于采样条数 \(K\),与状态维度无关(蒙特卡洛的维度无关性)。
这一步是路径积分控制全部实用价值的来源。
如果不这样做会怎样¶
不用 Feynman–Kac,我们就只能老老实实数值解那个线性 PDE。即使它是线性的、即使我们用最先进的有限元或谱方法,状态维度一过 4、5 维,存储 \(\psi\) 在网格上的值本身就装不进内存。
这就是为什么经典最优控制的 PDE 方法(HJB 网格法、Level-set)几乎只用于 2–3 维玩具问题。Feynman–Kac 把"必须在全空间求解"这个诅咒,换成了"只在关心的初始点附近采样"——我们不再需要知道每个状态的最优代价,只需要知道**当前这个状态**该怎么动。
历史¶
Feynman–Kac 引理由 Mark Kac 在 1949 年提出,灵感正来自 Feynman 用路径积分重新表述量子力学的工作——Feynman 把量子振幅写成"对所有路径求和",Kac 意识到同样的"对路径求期望"结构可以严格地刻画热方程(以及更一般的抛物 PDE)的解。Kappen 2005 的贡献,是看出经过指数变换后的最优控制方程恰好属于这一类,从而把这座 1949 年就建好的桥直接搬来用。
推导:从线性 PDE 到路径积分¶
第一步:辨认生成元。 §1.1 的线性 PDE 可以写成
其中算子 \(\mathcal{L} = f^\top\nabla + \tfrac12\mathrm{tr}(G\Sigma G^\top\nabla^2)\) 正是**无控扩散过程**
的**无穷小生成元(infinitesimal generator)**。这个无控过程就是"把控制设为零、只让系统在自身漂移 \(f\) 和噪声驱动下自由演化"的被动动力学(passive dynamics)。
记住这一点:从这里开始,所有的"采样"都是对**无控系统**采样,而不是对受控系统采样。
第二步:套用 Feynman–Kac。 对于带零阶项(即那个 \(-\frac{V}{\lambda}\psi\))的线性 backward PDE,Feynman–Kac 给出的解是
其中 \(\mathbb{Q}\) 是上述无控扩散的轨迹分布(probability law),期望对从 \(x_t=x\) 出发的所有无控随机轨迹取平均。指数里的两项一一对应代价函数的两块:终端代价 \(\phi(x_T)\) 与累积运行代价 \(\int_t^T V\,\mathrm{d}s\),都被温度 \(\lambda\) 缩放后放进指数。
为什么 Feynman–Kac 给出的是一个期望? 不需要测度论,用离散随机游走就能看清这个"PDE ↔ 期望"的对应从何而来。把时间切成小步 \(\Delta t\),无控系统在一步内从 \(x\) 随机跳到邻近的 \(x'\)(高斯转移)。线性 backward PDE 在离散化后变成一条递推:当前格点的 desirability 等于"下一步各个可能落点的 desirability 的期望",再乘上这一步的局部代价因子 \(e^{-V(x)\Delta t/\lambda}\):
这只是把 PDE 的一步显式欧拉离散写成概率语言——零阶项 \(-V\psi/\lambda\) 变成乘性因子,扩散项变成对随机落点求期望。现在把这条递推**从 \(t\) 一路展开到终端 \(T\)**:每多走一步就多乘一个 \(e^{-V\Delta t/\lambda}\)、多套一层期望,\(T\) 处用终端条件 \(\psi(x_T,T)=e^{-\phi(x_T)/\lambda}\) 收尾。
所有这些一步因子连乘起来,正是 \(\exp(-\frac1\lambda[\phi(x_T)+\sum_t V\Delta t])\);所有这些嵌套期望合起来,正是"对整条随机游走轨迹求期望"。\(\Delta t\to0\) 取极限,求和变积分、随机游走变布朗运动,就回到上面那个 Feynman–Kac 箱式公式。
一句话:backward PDE 的解之所以是期望,是因为解 PDE 等价于把"逐格反向递推"沿所有随机路径展开成连乘——而沿路径连乘再对路径平均,就是路径积分。
用算子语言说一句(可跳过)。 上面那个"对下一步落点取期望"的操作,正是无控扩散的**无穷小生成元(infinitesimal generator)** \(\mathcal{L}=f^\top\nabla+\tfrac12\mathrm{tr}(G\Sigma G^\top\nabla^2)\) 在起作用:线性 backward PDE 可紧凑写成 \(-\partial_t\psi=(\mathcal{L}-\tfrac{V}{\lambda})\psi\),其解由生成元决定的轨迹期望给出,这正是 Feynman–Kac 的算子叙述。\(\mathcal{L}\) 描述"\(\psi\) 这种状态函数如何沿无控动力学演化";它的**伴随算子** \(\mathcal{L}^\dagger\) 则描述"概率密度如何演化",对应的 \(\partial_t\rho=\mathcal{L}^\dagger\rho\) 就是 Fokker–Planck 方程。\(\psi\) 走 backward(配终端条件)、密度走 forward(配初始条件),\(\mathcal{L}\) 与 \(\mathcal{L}^\dagger\) 互为伴随——这对时间反演的镜像关系,是上一段"backward vs forward"在算子层面的精确表述。本章不依赖这套语言,但若你读到把控制写成"生成元 + 势"的文献,它说的就是这里。
第三步:读懂这个公式的物理含义。 desirability \(\psi(x,t)\) 等于"从 \(x\) 出发、不施加任何控制、任系统随噪声漂流,所积累代价的指数的平均"。代价低的轨迹贡献大的 \(e^{-S/\lambda}\),代价高的轨迹贡献趋于零——所以 \(\psi\) 大,意味着"从这里随便走走就能撞上低代价的未来",这个状态天生合意;\(\psi\) 小,意味着"无论怎么漂都难逃高代价",这个状态不合意。最优代价被编码成了被动轨迹的一个加权统计量。
第四步:从 \(\psi\) 到控制律。 §1.1 第三步给出 \(u^\star = -R^{-1}G^\top\nabla J\),再用 \(J=-\lambda\log\psi\)(于是 \(\nabla J = -\lambda\nabla\psi/\psi\)):
把第二步的 Feynman–Kac 表达式代入 \(\nabla\psi/\psi\),最优控制就变成了**对无控轨迹的一个加权平均**:权重正比于每条轨迹的 \(e^{-S/\lambda}\),被加权的量是该轨迹初始时刻所需的"推力"。这就是**路径积分控制律(path integral control law)——最优控制不是解出来的,是**采样平均出来的。
MPPI 的全部,就是把这个连续时间的期望,换成离散时间下 \(K\) 条 rollout 的有限和。
贯穿例子:一维点质量(路径积分 = LQR 的硬证据)¶
抽象公式要落到一个能亲手算的例子上才站得住。取最简单的控制仿射系统——一维点质量 / 单积分器:
即"位置 \(x\) 的变化率就是控制 \(u\),外加强度 \(\sigma\) 的白噪声"。控制代价 \(\tfrac12 r\,u^2\)(\(R=r\)),运行代价 \(V=0\),终端代价 \(\phi(x)=\tfrac{a}{2}x^2\)(想把粒子拉回原点)。
Kappen 条件 \(\Sigma=\lambda R^{-1}\) 在此即 \(\sigma^2 = \lambda/r\),也就是 \(\lambda = r\sigma^2\)——温度由噪声和控制成本一起定死,正是 §1.1 第六步那条等式的标量版。
**无控动力学**此时是 \(\mathrm{d}x=\sigma\,\mathrm{d}W\),就是纯布朗运动,于是从 \(x_t=x\) 出发的终点服从
代入 Feynman–Kac(\(V=0\),只剩终端项):
这是一个**高斯积分**,可以闭式算出(用恒等式 \(\mathbb{E}_{y\sim\mathcal{N}(\mu,s^2)}[e^{-by^2/2}] = (1+bs^2)^{-1/2}\exp(-\tfrac{b\mu^2}{2(1+bs^2)})\),取 \(b=a/\lambda,\ \mu=x,\ s^2=\sigma^2(T-t)\)):
对 \(\log\psi\) 求梯度,再乘 \(\lambda R^{-1}G^\top=\lambda/r=\sigma^2\),得到最优控制律:
这是一个**时变线性反馈** \(u^\star=-k(t)\,x\),增益 \(k(t)=\dfrac{a/r}{1+(a/r)(T-t)}\) 随着 \(t\to T\)(临近终点)单调增大——越接近终点、纠偏越狠,符合直觉。
现在做交叉验证。 这个问题恰好是一个线性二次(LQR)问题(\(A=0,B=1\),状态代价 0,控制代价 \(r\),终端代价 \(a\))。它的连续时间 Riccati 方程 \(\dot P = P^2/r,\ P(T)=a\) 解得 \(P(t)=\dfrac{ar}{a(T-t)+r}\),对应最优反馈
两者逐字相同。 路径积分——一个表面上完全不碰 Riccati、只靠"对布朗轨迹取期望"的方法——在这个 LQ 情形给出了和经典最优控制**一模一样**的答案。这不是巧合:LQR 是路径积分能精确闭式求解的特例。而路径积分的真正威力在于,当 \(\phi\) 或 \(V\) 不是**二次的(比如 \(\phi\) 是"撞墙处跳到 \(\infty\)"的不连续障碍代价)、Riccati 彻底失效时,那个高斯积分换成蒙特卡洛求和**依然成立——这正是下一段要做的事。
动手验证:把"路径积分 = LQR"跑出来。 解析证明只覆盖了高斯特例;下面用最朴素的蒙特卡洛把它跑一遍——直接对被动布朗轨迹采样、按 desirability \(e^{-\phi/\lambda}\) 加权,看估计出的最优控制是否真的逼近闭式 Riccati 增益。整段代码不解任何方程、不碰 Riccati,纯粹是"撒点 + 加权平均":
import numpy as np
a, r, T, dt = 5.0, 1.0, 1.0, 0.02
sigma = 0.3; lam = r * sigma**2 # Kappen 条件 λ = rσ²
H = int(round(T / dt))
def pi_control(x0, t_idx, K=400_000): # 路径积分估计 t=t_idx·dt、x0 处的最优控制
steps = H - t_idx
xT = x0 + (sigma*np.sqrt(dt)*np.random.randn(K, steps)).sum(axis=1) # 被动布朗终点
w = np.exp(-0.5*a*xT**2 / lam); w /= w.sum() # desirability 权重 ∝ e^{-φ/λ}
return -(a/r) * (w*xT).sum() # u* = λ ∂_x log ψ 的蒙特卡洛估计
for t in [0.0, 0.5, 0.98]: # x0 = 1
ti = int(round(t/dt)); k = (a/r)/(1 + (a/r)*(T-t)) # 闭式 Riccati 增益
print(f"t={t:.2f} path-integral {pi_control(1.0, ti):+.4f} closed-form {-k:+.4f}")
输出(\(K=4\times10^5\),\(x_0=1\)):
t=0.00 path-integral -0.8455 closed-form -0.8333
t=0.50 path-integral -1.3853 closed-form -1.4286
t=0.98 path-integral -4.5407 closed-form -4.5455
三个时刻上蒙特卡洛估计都贴着闭式 Riccati 解,残差来自有限采样的方差——把 \(K\) 调大残差还会继续缩小。这就用"撒点 + 加权"验证了 §1.2 的核心论断;而它真正的意义在于:把终端代价 0.5*a*xT**2 换成任意(哪怕不连续的)代价,这段代码一字不改照样跑,可 Riccati 在那时早已失效。
再验一步:把运行状态代价也加进去。 上面的例子只有终端代价,路径积分公式里那个"沿途累积的运行代价 \(\int V\,\mathrm{d}s\)"还没被检验。给问题加上运行状态代价 \(V(x)=\tfrac12 q x^2\),它仍是个 LQ 问题(带状态代价的 LQR),最优控制 \(u^\star=-\tfrac1r P(t)x\) 由 Riccati 方程 \(-\dot P=q-P^2/r\)、\(P(T)=a\) 给出。路径积分这边,只需在每条 rollout 的总代价 \(S\) 里把沿途的 \(\int\tfrac12 q x^2\,\mathrm{d}s\) 累加进去,其余不变:
q, r, a, T, dt, sigma = 2.0, 1.0, 3.0, 1.0, 0.01, 0.3
lam = r*sigma**2; H = int(T/dt)
P = np.zeros(H+1); P[H] = a # 反向解 Riccati
for t in range(H, 0, -1): P[t-1] = P[t] + dt*(q - P[t]**2/r)
def logpsi(x0, ti, rng, K=300_000): # log ψ:含运行 + 终端代价
dW = sigma*np.sqrt(dt)*rng.standard_normal((K, H-ti))
x = np.concatenate([np.full((K,1), x0), x0+np.cumsum(dW,1)], 1)
S = 0.5*q*(x[:,:-1]**2).sum(1)*dt + 0.5*a*x[:,-1]**2 # ∫½q x²ds + ½a x_T²
m = (-S/lam).max(); return m + np.log(np.mean(np.exp(-S/lam - m)))
def pi_u(x0, ti, h=1e-3): # u* = λ ∂_x log ψ (有限差分)
f = lambda xx: logpsi(xx, ti, np.random.default_rng(7))
return lam*(f(x0+h) - f(x0-h))/(2*h)
for t in [0.0, 0.5, 0.9]:
ti = int(round(t/dt))
print(f"t={t}: path-integral {pi_u(1.0,ti):+.4f} Riccati {-(1/r)*P[ti]:+.4f}")
输出 t=0.0: -1.4628 / -1.4723、t=0.5: -1.6481 / -1.6759、t=0.9: -2.4822 / -2.4529——三个时刻路径积分仍贴着带运行代价的 Riccati 解。这验证了公式里那个常被忽略的 \(\int V\,\mathrm{d}s\) 项确实在起作用:desirability 不只看"终点好不好",还看"一路上代价高不高",而采样估计把这两块一并算对了。
从期望到蒙特卡洛估计器¶
闭式高斯积分只在 LQ 这种特例存在。一般情况下我们退回 Feynman–Kac 的定义,用 \(K\) 条无控轨迹的样本均值估计那个期望:
其中每条 \(x^{(k)}\) 是一条独立模拟的无控轨迹。由大数定律,\(K\to\infty\) 时 \(\hat\psi\to\psi\);控制律同理由相应的加权样本均值估计。
这里出现了 MPPI 的雏形:撒轨迹、按 \(e^{-\text{代价}/\lambda}\) 加权、求平均。
但纯被动采样有一个致命弱点,它直接催生了 §1.3。设想终端代价要求粒子精确停在某个远离原点的目标点:无控的布朗运动**几乎不可能**自己漂到那里,于是绝大多数轨迹的 \(e^{-S/\lambda}\approx 0\),只有极少数侥幸轨迹贡献了几乎全部权重——估计方差爆炸,\(K\) 要大到天文数字才够。
解决办法是**别再从无控分布 \(\mathbb{Q}\) 采样,而从一个已经接近最优的分布采样**(比如"当前控制序列 + 噪声"),再用重要性权重修正。这一步叫 generalized importance sampling,是 Williams 2017 把 Kappen 理论变成实用算法的关键转折,也是 §1.3 的主线。
这个"方差爆炸"可以用 §1.4 的有效样本数精确刻画:纯被动采样时,落在低代价区的样本极少,归一化权重几乎全压在那一两条上,\(\mathrm{ESS}=1/\sum_k w_k^2\) 塌到接近 \(1\)——名义上撒了 \(K\) 条,实际只有一条在起作用,估计自然不准。重要性采样从接近最优的分布采样,正是为了把权重摊开、把 ESS 拉回 \(K\) 的健康比例。
所以"提议分布要接近最优"与"ESS 要健康"是同一件事的两种说法,它们一起构成了后续所有采样设计(warm-start、有色噪声、协方差自适应)的共同目标。
本质洞察:路径积分控制把动态规划的 backward sweep 换成了 forward sampling。动态规划(Riccati、值迭代)必须从终点出发、反向逐状态计算每个状态的最优值——本质是串行的、要遍历状态空间。路径积分反过来:从当前点出发、向前并行撒一批轨迹、取加权平均——本质是并行的、只看采到的轨迹。这个"从反向遍历到正向采样"的范式翻转,不仅消解了维度灾难,更**直接决定了 MPPI 的硬件形态**:\(K\) 条 forward rollout 彼此独立,是 GPU 数千线程的完美负载(第 2 章的全部工程都建立在这个独立性上)。一句话——路径积分之所以能用 GPU,是因为 Feynman–Kac 把"解方程"变成了"撒点"。
等一下:采样在高维不也会爆炸吗?¶
上面说 forward sampling 消解了维度灾难,这里得诚实面对一个反问:控制序列的维度是 \(H\times m\)(时域乘控制维),在高自由度机器人上轻松上百维,随机撒点要撞中一条好序列,概率不也随维度指数衰减吗? 这个担忧是对的——朴素地从无控分布裸采样,确实会遭遇采样版的维度灾难(这正是上面 ESS 坍缩的根源)。MPPI 能在高维实用,靠的是三件事一起把这个诅咒压下去。
其一,你估计的是一个低维量。 MPPI 每周期真正要的,不是整条 \(H\times m\) 维的最优序列,而是**第一个控制 \(u_0\)**(执行完就重规划,§1.5)。估计一个低维的加权均值,比在高维空间里精确定位最优点容易得多——采样的方差体现在整条序列上,但被平均、被只取首步大幅稀释。
其二,提议分布把采样集中到了正确的低维邻域。 warm-start 用上一周期的解当中心、协方差自适应贴合低代价流形——采样不是在整个高维空间里盲撒,而是在一个**已经接近最优的薄邻域**里微调(§1.4 零方差提议的实践版)。维度灾难是"在整个空间里找"才有的,"在最优解附近修"则温和得多。
其三,真实控制的有效维度远低于名义维度。 平滑的控制序列(相邻时刻强相关,有色噪声正是利用这一点)实际只有少数几个自由度;高自由度系统的有用机动也往往落在一个低维流形上。名义上的 \(H\times m\) 维,有效探索维度小得多。
把这三点合起来:MPPI 不与高维硬碰硬,而是**用重规划把问题切成"估一个低维量"、用提议分布把采样限制在低维邻域、再借控制的内在低维性**。所以"forward sampling 消解维度灾难"这句话的完整版是——它消解的是**动态规划那种"遍历整个状态空间"的灾难**,代价是引入了一个新的、但可控得多的"采样要覆盖到好区域"的问题,而后者正是第 3–6 章一整条改进主线(更好的提议分布)要解决的。
离散时间的同一思想:Todorov 的线性可解 MDP(LMDP)¶
§1.1–§1.2 全程在连续时间里展开:SDE、HJB PDE、Feynman–Kac。但同一个"指数变换 → 线性化"的思想,在**离散时间的 MDP** 上有一个同样漂亮、而且更贴近你 RL 背景的版本——Todorov 2009 的**线性可解 MDP(Linearly-Solvable MDP, LMDP)**。
它不走 PDE 路线,而是直接改造贝尔曼方程。理解它有两重价值:补全路径积分的离散侧,并为 §1.3 的自由能–KL 对偶埋下伏笔。
动机:为什么标准 MDP 不可解析。 标准 MDP 的贝尔曼方程 \(v(x)=\min_u\{c(x,u)+\mathbb{E}_{x'}[v(x')]\}\) 里那个 \(\min_u\) 是离散、组合式的——动作是"向左 / 向右"这类符号,对它求极小只能穷举,没有解析解。Todorov 的问题与 Kappen 如出一辙:能不能像 LQR 那样,构造一类 MDP 让 \(\min_u\) 有闭式解?
关键设计:把控制代价定义成 KL 散度。 LMDP 做两件事。第一,把动作从"符号"换成"对下一状态的分布"——控制直接是受控转移概率 \(u(x'\mid x)\)。第二,引入一个**被动动力学(passive dynamics)** \(p(x'\mid x)\)(系统无控时的自然转移),并把控制代价**规定**为受控转移与被动转移之间的 KL 散度:
\(q(x)\) 是任意状态代价(不受限制),控制代价则度量"你把系统推离它的自然行为有多远"——KL 越大、推得越狠、越贵;且 \(\mathrm{KL}\ge0\)、等号当且仅当 \(u=p\)(完全不控制),符合直觉。
本质洞察:LMDP 的全部魔力来自这个"把控制代价定义成 KL 散度"的选择。连续时间里(§1.1),是 Kappen 条件 \(\Sigma=\lambda R^{-1}\)(二次控制代价 + 噪声进控制通道)让线性化得以发生;离散时间里,是 KL 形式的控制代价扮演同样的角色。两者并非巧合——KL 散度在小扰动下的二阶展开恰好是一个马氏距离型的二次型,所以"二次控制代价"与"KL 控制代价"在局部是同一个东西。这也预告了 §1.3:那里我们会看到 KL 控制代价不必"人为规定",它会从轨迹空间的自由能变分原理里**自然涌现**——而一旦控制代价是 KL,二次代价的限制就被彻底甩掉(这正是 Williams 2018 推广 MPPI 的关键一步)。
线性化:贝尔曼方程变成特征值问题。 代入这个控制代价,贝尔曼方程成为
大括号里是一个**对分布 \(u\) 的 KL 正则最小化**——和 §1.3 即将登场的对偶问题完全同构,其最优解是吉布斯型的:把被动转移按 \(e^{-v(x')/\lambda}\) 重新加权。定义 desirability(合意度)
(\(v\) 小的状态 \(z\) 大,与连续时间的 \(\psi=e^{-J/\lambda}\) 一一对应),最优受控转移有闭式:
即**被动转移被 desirability 重新加权再归一化**。把 \(u^\star\) 代回贝尔曼方程整理(见练习 4),得到关于 \(z\) 的方程:
其中 \(P\) 是被动转移矩阵。这个方程对 \(z\) 是线性的——非线性的贝尔曼方程被驯服成一个线性代数问题:首次到达(first-exit)问题是一个线性方程组,无穷时域折扣问题是一个**最大特征值问题**。
Todorov 由此得到求最短路径的 \(O(n)\) 算法,并指出这是"第一类能在给定最优代价后解析求出最优动作的一般 MDP"。
连续与离散:同一枚硬币的两面。 把 §1.1–§1.2 与 LMDP 并排,结构惊人地一致:
| 维度 | 连续时间(Kappen,§1.1–§1.2) | 离散时间(Todorov LMDP) |
|---|---|---|
| 让线性化发生的代价结构 | 二次控制代价 + Kappen 条件 \(\Sigma=\lambda R^{-1}\) | 控制代价 \(=\) KL 散度 \(\lambda\,\mathrm{KL}(u\|p)\) |
| 指数变换 | \(\psi=e^{-J/\lambda}\) | \(z=e^{-v/\lambda}\) |
| 线性化结果 | 线性 backward PDE | 线性贝尔曼 \(z=MPz\) |
| 求解手段 | Feynman–Kac → 蒙特卡洛采样 | 线性方程组 / 最大特征值 |
| "被动"基准 | 无控扩散 \(\mathrm{d}x=f\mathrm{d}t+G\mathrm{d}\xi\) | 被动转移 \(p(x'\mid x)\) |
| 最优控制 | \(u^\star=\lambda R^{-1}G^\top\nabla\log\psi\) | \(u^\star(x'\mid x)\propto p(x'\mid x)z(x')\) |
两条路线殊途同归:连续侧靠 Feynman–Kac 把线性 PDE 解成采样,离散侧靠线性代数把线性贝尔曼解成特征值。而 MPPI(§1.3 起)本质上是把"离散侧的吉布斯重加权"用蒙特卡洛在**轨迹空间**实现——所以它同时继承了两边的血统。
两个额外的结构红利。 其一是**可叠加性(compositionality):因为贝尔曼方程对 \(z\) 线性,若干"基础任务"(仅终端代价不同)的最优 desirability 可以**线性加权**组合出复合任务的最优解——这在标准 MDP 里做不到,是 LMDP 独有的好处。其二是 **Z-learning:可以像 Q-learning 那样从经验里 off-policy 地学 \(z\),且因为 \(z\) 只是状态的函数(不需要状态-动作值),Todorov 证明 Z-learning 比 Q-learning 更高效。这两点都源自同一个事实——线性:一旦把非线性的 \(\min\) 换成线性的指数加权,叠加原理(线性系统的标志)就回来了。
动手验证:在 5 状态小世界上解 \(z=MPz\)。 "线性贝尔曼"这个说法值得亲眼一见。下面构造一个最小例子:状态 \(0\dots4\) 排成一条链,状态 \(4\) 是目标(终端,\(z=1\)、\(q=0\)),其余每步罚 \(q=1\),被动动力学是左右等概率随机游走。直接解线性方程 \(z=MPz\)(这里用幂迭代,规模大时可换直接线性求解 / 最大特征值),再由 \(z\) 还原值函数 \(v=-\lambda\log z\) 与最优策略 \(u^\star(x'\mid x)\propto p(x'\mid x)z(x')\):
import numpy as np
n, lam = 5, 1.0
P = np.array([[.5,.5, 0, 0, 0], # 被动动力学:左右等概率随机游走
[.5, 0,.5, 0, 0],
[ 0,.5, 0,.5, 0],
[ 0, 0,.5, 0,.5],
[ 0, 0, 0, 0, 1.]]) # 状态 4 吸收(终端)
q = np.array([1., 1., 1., 1., 0.]) # 目标 q=0,其余每步罚 1
M = np.diag(np.exp(-q / lam))
z = np.ones(n)
for _ in range(2000): # 解 z = M P z(幂迭代),钳住终端
z = M @ P @ z; z[4] = 1.0
v = -lam * np.log(z) # 值函数 = -λ log z
U = P * z[None, :]; U /= U.sum(1, keepdims=True) # 最优策略:被动转移按 z 重加权
print("desirability z =", np.round(z, 3))
print("value v =", np.round(v, 3))
print("u*(.|state2) =", np.round(U[2], 3))
输出:
desirability z = [0.002 0.007 0.036 0.191 1. ]
value v = [6.455 4.965 3.315 1.657 0. ]
u*(.|state2) = [0. 0.035 0. 0.965 0. ]
desirability \(z\) 从目标(\(=1\))向远端指数衰减,值函数 \(v\) 相应递增;状态 \(2\) 的最优转移几乎把全部概率(\(0.965\))压向更接近目标的状态 \(3\)——这正是"被动转移被 desirability 重新加权"的字面体现。整个求解只是**线性代数**(幂迭代 / 解线性方程),全程没有对动作做任何组合搜索或迭代式 \(\min\)——这就是"线性可解"四个字的含义,也是它与 §1.1–§1.2 连续路径积分互为镜像之处。
再验证一个 LMDP 独有的红利:最优策略可线性叠加。 上面提到的可组合性值得亲眼一见,因为它在标准 MDP 里**根本做不到**。取一条 7 状态链,两端都可作目标。任务 A:"到左端状态 0";任务 B:"到右端状态 6"——两者动力学、运行代价完全相同,只有终端 desirability 不同。分别解出最优 desirability \(z_A\)、\(z_B\)。现在考虑一个**复合任务**:"到左端**或**右端皆可(等价看待)",其终端 desirability 取两者的等权混合。直接解这个复合任务得到 \(z_C\),再和 \(\tfrac12 z_A+\tfrac12 z_B\) 比较:
zA = solve_z({0: 1.0, 6: 1e-9}) # 任务A:终端只认左端
zB = solve_z({0: 1e-9, 6: 1.0}) # 任务B:终端只认右端
zC = solve_z({0: 0.5, 6: 0.5}) # 复合任务:两端等权
print(np.round(zC, 4)) # [0.5 0.0954 0.0188 0.0069 0.0188 0.0954 0.5]
print(np.round(0.5*zA + 0.5*zB, 4)) # [0.5 0.0954 0.0188 0.0069 0.0188 0.0954 0.5]
两者**逐点相等**(数值误差 \(\sim10^{-10}\))。这意味着:一旦解过"到左端"和"到右端"两个基础任务,"到任意一端"的最优解**不需要重新求解**,把两个 desirability 线性叠加即可——最优控制随之由 \(\nabla\log z_C\) 直接得到。
这是 \(z=MPz\) **线性**的直接馈赠(线性方程的解满足叠加原理),也是 Todorov 2009「Compositionality of Optimal Control Laws」的核心结论。它在标准 MDP 里没有对应物:值函数满足的贝尔曼方程带 \(\min\),是非线性的,两个任务最优值函数的线性组合**一般不是**复合任务的最优值函数。
这个"最优解能像向量一样线性组合"的性质,正是把非线性 \(\min\) 换成线性指数加权后,整个理论变"线性"所解锁的最漂亮的红利之一。
线性还带来另一个面孔:无穷时域 LMDP 是一个特征值问题。 上面的 \(z=MPz\) 配的是"到达目标即吸收"的首次退出(first-exit)设定,是个线性方程组。换成**无穷时域平均代价**设定,线性贝尔曼方程变成 \(z=\tfrac1\rho\,MP\,z\)——一个**特征值问题**:desirability \(z\) 是矩阵 \(MP\) 的主特征向量(Perron 特征向量),对应的最大特征值 \(\rho\) 直接给出最优平均每步代价 \(-\lambda\log\rho\)。在一个 \(5\) 状态环状链上跑出来:
import numpy as np
n, lam = 5, 1.0
P = np.zeros((n,n)) # 环状随机游走(遍历)
for i in range(n): P[i,(i-1)%n]=0.5; P[i,(i+1)%n]=0.5
q = np.array([0.0, 1.0, 2.0, 1.0, 0.5]) # 各状态瞬时代价
A = np.diag(np.exp(-q/lam)) @ P # A = M P
w, V = np.linalg.eig(A); k = np.argmax(w.real)
rho = w[k].real; z = np.abs(V[:,k].real); z /= z.max()
print(f"Perron 特征值 ρ={rho:.4f} 平均每步代价 -λlogρ={-lam*np.log(rho):.4f}")
print(f"desirability z={np.round(z,3)} (最高 z 在最低代价态)")
输出 ρ=0.5403 平均每步代价 -λlogρ=0.6157 desirability z=[1.0 0.368 0.08 0.27 0.713]:最低代价的状态(\(q=0\))desirability 最高,完全合直觉。线性化的回报在这里体现为:求解最优控制 = 求一个矩阵的主特征对,连迭代式 \(\min\) 都不需要——Todorov 把它和量子力学里求基态(最小能量本征态)相提并论,二者数学同构。
这是连续侧路径积分(解 backward PDE)在离散无穷时域的镜像:那边是解一个线性算子的本征函数,这边是解一个矩阵的本征向量。
⚠️ 常见陷阱¶
💡 概念误区:以为 Feynman–Kac 直接给出"最优轨迹"。 - 错误描述:把 \(\psi(x,t)\) 的期望表达式理解成"它算出了那条最优路径"。 - 现象 / 后果:去代码里找"最优轨迹变量",或把采样得到的某条低代价 rollout 当成最优解直接执行,得到次优甚至危险的控制。 - 根本原因:Feynman–Kac 给的是一个**标量场** \(\psi(x,t)\)(每个状态的合意度),最优控制由它的对数梯度 \(\nabla\log\psi\) 给出,是一个**反馈律**,不是任何单条轨迹。采样到的轨迹只是用来估计这个场/梯度的"原料"。 - 正确做法:始终区分"采样轨迹(手段)"与"加权平均得到的控制(结果)"。MPPI 执行的是 \(K\) 条轨迹**加权融合**后的控制序列,绝不是某一条 rollout。
🧠 思维陷阱:以为从无控分布采样就足够高效。 - 错误描述:既然 Feynman–Kac 是对无控过程 \(\mathbb{Q}\) 取期望,那就直接从 \(\mathbb{Q}\) 采样、按公式平均即可。 - 现象 / 后果:在目标远离被动轨迹自然到达范围时,几乎所有样本权重趋零,估计方差极大,必须把 \(K\) 加到不现实的量级才不发散。 - 根本原因:当最优轨迹是无控分布下的**低概率事件**,被动采样采不到它——这是重要性采样里典型的"提议分布与目标分布不重叠"问题。 - 正确做法:从一个更接近最优的提议分布采样(如当前控制序列叠加噪声),并用重要性权重修正。这正是 §1.3 的 generalized importance sampling,也是实用 MPPI 从不"裸采无控轨迹"的原因。
💡 概念误区:漏掉运行代价的路径积分项。 - 错误描述:实现时只把终端代价 \(\phi(x_T)\) 放进指数,忘了 \(\int_t^T V\,\mathrm{d}s\) 这一项。 - 现象 / 后果:规划器只顾"终点好不好",完全不管中途路径是否穿过障碍、是否平滑——轨迹在过程中代价巨大却被判为"优"。 - 根本原因:Feynman–Kac 指数里**终端项与运行项地位平等**,二者都对 \(\psi\) 有贡献;运行代价才是约束"过程"的部分。 - 正确做法:每条 rollout 的总代价 \(S_k = \phi(x_T^{(k)}) + \sum_t V(x_t^{(k)})\Delta t\) 必须把每一步的运行代价累加进去(第 2 章完整伪代码里逐步累积运行代价的那一行正是这一项)。
练习¶
- (推导题) 对一维点质量 + 二次终端代价,独立完成本节省略的高斯积分,得到 \(\psi(x,t)\) 的闭式,再求 \(u^\star(x,t)\);然后独立解一遍该问题的标量 Riccati 方程,验证两者给出的反馈增益**逐项相等**。最后说明:这个相等在 \(\phi\) 非二次时还会成立吗?为什么?在草稿纸上完成。
- (证明题) 直接验证 Feynman–Kac 表达式确实满足 §1.1 的线性 backward PDE:把 \(\psi(x,t)=\mathbb{E}_{\mathbb{Q}}[\,\cdot\,]\) 对 \(t\) 求导,用 Itô 引理处理期望内的随机积分,证明它满足 \(-\partial_t\psi = -\tfrac{V}{\lambda}\psi + \mathcal{L}\psi\) 且满足终端条件。提示:把 \(e^{-\int_t^T V/\lambda\,\mathrm{d}s}\psi\) 视为一个鞅。
- (开放思考题) 如果不从无控分布采样,而是给系统施加一个标称控制 \(\bar u(t)\) 后再采样(即从"有漂移"的分布采样),Feynman–Kac 的期望要怎样修正才能仍然估计同一个 \(\psi\)?你需要乘上一个什么样的"修正因子"?(你不必写出严格的 Girsanov 公式,只需定性说明这个修正因子应该依赖于 \(\bar u\) 的哪些量——这就是 §1.3 重要性权重的前身。)
- (推导题) 补全 LMDP 的线性化:把最优受控转移 \(u^\star(x'\mid x)\propto p(x'\mid x)z(x')\) 代回带 KL 控制代价的贝尔曼方程,证明它化简为线性方程 \(z(x)=e^{-q(x)/\lambda}[Pz](x)\)。提示:KL 正则最小化的最优解是吉布斯分布,其最优值等于 \(-\lambda\log[Pz](x)\)(即配分函数的对数,又一次 log-sum-exp)。完成后对照 §1.1 的连续推导,指出"KL 控制代价"在离散侧扮演了"Kappen 条件"在连续侧的角色。
§1.2 留下两个尾巴。其一,连续侧的线性化被绑死在"二次控制代价 + control-affine"的 Kappen 假设里(§1.1 的三前提),真实的神经网络动力学、不连续代价都不满足——不过 LMDP 已经给出了半个答案:一旦控制代价是 KL 形式而非二次,线性化就不再依赖 Kappen 条件。
但 LMDP 是把 KL 代价**人为规定**在离散 MDP 上的。其二,纯被动采样方差爆炸,必须换个分布采。
§1.3 一次性解决这两件事:它证明那个 KL 结构能从轨迹空间的**自由能变分原理**里自然涌现(从而对任意黑箱代价、任意动力学都成立),并把理论落地成一行就能写进代码的权重公式。
§1.3 自由能–KL 对偶与 MPPI 权重公式 ⭐⭐⭐⭐¶
这一节解决什么问题:抛开 Kappen 的 PDE 推导,改用信息论的自由能–KL 对偶,在**任意代价、任意(黑箱)动力学**下重新得到路径积分控制,并导出可直接编程的 MPPI 权重公式;最后证明它与 REINFORCE 数学同构。
动机¶
§1.1–§1.2 的推导很美,但它的适用范围被三个前提卡死:控制仿射、二次控制代价、噪声进控制通道(Kappen 条件)。现代采样式 MPC 想做的恰恰是突破这些前提——动力学是一个 MuJoCo 黑箱或一张神经网络,代价里含"碰撞即 \(+\infty\)"的不连续 indicator,控制代价未必二次。
这些场景下 Kappen 的 PDE 推导根本写不出来(HJB 都不一定存在经典解)。
Williams 2018 的关键洞察是:我们其实根本不需要 HJB。 路径积分控制的核心结论——"按 \(e^{-\text{代价}/\lambda}\) 给轨迹加权"——可以**完全脱离 PDE**,仅从信息论的一个变分原理(自由能–KL 对偶)推出来。
这个推导只用到"轨迹有个代价、我们能从某个分布采样轨迹"这两件事,对动力学和代价的形式毫无要求。于是同一套加权机制,瞬间从"一小类 LQ-like 问题"推广到"任何能采样、能算代价的问题"。
如果不这样做会怎样¶
如果守着 §1.1 的 PDE 推导,MPPI 就只是个理论玩具:一旦代价不连续或动力学不可微,指数变换那一套(求 \(\nabla J\)、要 Hessian 项相消)全部失效,你甚至写不出方程。守着它,你无法解释为什么 MPPI 能在"碰撞代价跳到无穷"的 cluttered forest 里工作(而 DDP 在那里因梯度为零彻底瘫痪)——而这恰恰是 MPPI 存在的全部理由。
信息论推导把 MPPI 从"线性-二次特例的精巧解法"提升为"任意黑箱随机优化的通用框架"。
历史¶
这条线有清晰的三代传承。Theodorou、Buchli、Schaal 2010 在 JMLR 提出 PI²(Policy Improvement with Path Integrals):把路径积分控制改造成一个**策略搜索**算法,用 reward-weighted regression 更新策略参数,没有学习率、没有矩阵求逆——这种"按代价指数加权求平均"的更新形式,是 MPPI 的直接祖先。
Williams、Aldrich、Theodorou 2017 在 JGCD 引入 generalized importance sampling,允许改变采样分布的漂移与扩散(即从"当前控制序列 + 噪声"采样而非裸采无控轨迹),并用 GPU 并行,MPPI 算法正式诞生。Williams 等 2018 在 IEEE T-RO 用**自由能–KL 对偶**给出集大成的信息论推导,去掉 control-affine 与二次代价限制,并在 AutoRally 上跑了 100+ 公里实车。
谱系:Kappen(PDE 起源)→ Theodorou(PI² 策略搜索)→ Williams(importance sampling + GPU + 信息论统一)。
推导:轨迹空间上的自由能与对偶¶
第一步:把问题搬到轨迹空间。 不再逐时刻看状态,而是把整条轨迹 \(\tau=(x_0,x_1,\dots,x_T)\) 当成一个对象。给定一个**基分布(base / proposal distribution)** \(\mathbb{Q}\)——在 MPPI 里就是"当前控制序列 \(U=\{u_0,\dots,u_{T-1}\}\) 叠加高斯噪声 \(\varepsilon\sim\mathcal{N}(0,\Sigma)\) 后 rollout 出来的轨迹分布"。每条轨迹有一个**总代价**
注意:\(S(\tau)\) 只是一个**标量数值**——它怎么算出来的(黑箱仿真器、神经网络、含不连续 indicator 的代价)完全无所谓,后面所有推导都不对 \(S\) 求导。这正是脱离 Kappen 假设的关键。
第二步:定义自由能。 借统计物理,定义轨迹分布 \(\mathbb{Q}\) 上的**自由能(free energy)**
这就是统计物理里 \(F=-k_B T\log Z\) 的形式(\(\lambda\) 当温度,\(\mathbb{E}_{\mathbb{Q}}[e^{-S/\lambda}]\) 当配分函数 \(Z\))。它是一个把"所有轨迹的代价"用温度 \(\lambda\) 软聚合成单个标量的泛函——当 \(\lambda\to0\),\(\mathcal{F}(\mathbb{Q})\to\min_\tau S(\tau)\)(硬最小值),\(\lambda\) 大时它趋于平均代价。
这正是 §1.1 本质洞察里那个 \(\log\sum\exp\)(软最小值)的再次现身。
这里要提前打消一个常见顾虑:配分函数 \(Z=\mathbb{E}_{\mathbb{Q}}[e^{-S/\lambda}]\) 是一个对整个轨迹空间的高维积分,看起来无法计算——统计物理里算配分函数往往是最难的事。难道 MPPI 要先解出这个 intractable 的 \(Z\)?答案是不必。
诀窍在于最终我们要的不是 \(Z\) 本身,而是吉布斯分布下的**期望**(控制的加权均值),而期望是一个**比值**:分子分母里的 \(Z\) 完全相消。这正是 §1.3 后面"自归一化重要性采样"的精髓——权重 \(w_k=e^{-S_k/\lambda}/\sum_j e^{-S_j/\lambda}\) 的分母是用**同一批样本**估计的 \(Z\),它在归一化里被约掉,于是我们绕开了那个高维积分。
换句话说,自由能 \(\mathcal{F}=-\lambda\log Z\) 作为**标量诊断量**很有用(它就是后面要最小化的目标,也是风险敏感解读的对象),但算法**从不显式计算 \(Z\)**;需要 \(Z\) 的地方,它总以比值形式出现并自我消去。记住这一点,"配分函数难算"就不再是 MPPI 的障碍。
第三步:自由能–KL 对偶定理。 核心结论是:自由能等于一个**带 KL 正则的代价最小化**问题的最优值,
且最小值在**吉布斯分布(Gibbs distribution)**
处取到。证明(Gibbs 变分原理,建议手推一遍):对任意与 \(\mathbb{Q}\) 绝对连续的 \(\mathbb{P}\),
把分母按 \(\mathbb{Q}\,e^{-S/\lambda}=Z\,\mathbb{P}^\star\) 改写,得
因为 \(\mathrm{KL}(\mathbb{P}\|\mathbb{P}^\star)\ge0\),当且仅当 \(\mathbb{P}=\mathbb{P}^\star\) 时为零,所以右端在 \(\mathbb{P}=\mathbb{P}^\star\) 取最小值 \(-\lambda\log Z = \mathcal{F}(\mathbb{Q})\)。\(\blacksquare\)
这个证明顺带暴露了一个值得记住的事实:对偶式的右端,经过改写恰好是 \(\lambda\,\mathrm{KL}(\mathbb{P}\|\mathbb{P}^\star)-\lambda\log Z\)。也就是说,最小化"期望代价 + KL 正则"等价于最小化 \(\mathrm{KL}(\mathbb{P}\|\mathbb{P}^\star)\)——把候选分布 \(\mathbb{P}\) 推向吉布斯目标 \(\mathbb{P}^\star\)。
这里的 KL 写法是 \(\mathrm{KL}(\mathbb{P}\|\mathbb{P}^\star)\)(候选在前、目标在后),在变分推断的术语里是**反向 KL(reverse KL),对应"模式寻找(mode-seeking)"的 I-投影。当 \(\mathbb{P}\) 不受限时,它的最小值就是 \(\mathbb{P}^\star\) 本身(无近似,正是上面的结论);而一旦把 \(\mathbb{P}\) **限制在一个可处理的族里(例如把控制更新限制成高斯),最小化反向 KL 就成了一次"用高斯去贴吉布斯目标的主模式"的投影。
这恰好是 MPPI 与 CEM 分道扬镳的地方(§1.5 会正面对比)。MPPI 走的是上面这条反向 KL:用指数权重把高斯提议分布朝 \(\mathbb{P}^\star\) 的主模式挪。
CEM 则相反——它最小化的是**交叉熵**,等价于**前向 KL(forward KL)** \(\mathrm{KL}(\text{精英经验分布}\,\|\,q_\theta)\),做的是"矩匹配(moment-matching)"的 M-投影:把高斯的均值与协方差去拟合精英样本的均值与协方差。两者都是"用一个高斯去概括低代价区域",但一个朝目标的主模式收紧(反向 KL,倾向锁定单峰)、一个去匹配精英集的矩(前向 KL,倾向覆盖)。
认出这层 KL 方向的差异,你就懂了为什么 vanilla MPPI 容易在多模问题上塌到一个模式,而 CEM 的协方差拟合更"铺得开"——这也预告了第 3 章为 MPPI 补协方差自适应、多模采样的动机。
为什么偏偏是 KL,不是别的散度? 一个自然的追问:正则项度量"\(\mathbb{P}\) 离基分布 \(\mathbb{Q}\) 多远",为什么用 KL 而不用 \(\chi^2\)、Wasserstein 或别的?最实在的理由是**它让问题有闭式解**——只有 \(\lambda\mathrm{KL}(\mathbb{P}\|\mathbb{Q})\) 这种"对数密度比的期望"形式,配上期望代价,变分最优解才恰好是吉布斯分布 \(\mathbb{Q}\,e^{-S/\lambda}\)(指数族);换成 \(\chi^2\) 或 Wasserstein,最优解不再是这种干净的指数重加权,权重公式也就无从谈起。另一层理由来自前面的解读:KL 正则对应**信息论里的最小相对熵原理**(在"不偏离先验太多"的前提下最优地融入新信息),也对应控制即推断里的**贝叶斯条件化**,还对应 §1.1 那项二次控制代价的连续推广(Girsanov)。换句话说,KL 不是从一堆散度里随便挑的——它是同时让"有闭式解、是贝叶斯推断、接续二次控制代价"三件事成立的那一个。这也解释了为什么从 Kappen 到 Williams 到整个最大熵 RL,正则项清一色是 KL/相对熵:选它不是习惯,是数学逼着选的。
第四步:读懂对偶式——它就是 SAC 的目标。 右端 \(\mathbb{E}_{\mathbb{P}}[S] + \lambda\,\mathrm{KL}(\mathbb{P}\|\mathbb{Q})\) 是"期望代价 + 温度 \(\times\) 对基分布的偏离惩罚"。把代价换成负奖励、把"对基分布的 KL"换成"对均匀分布的 KL(即负熵)",这就**逐字是 SAC 的最大熵目标**——奖励加上温度乘策略熵。最优解都是吉布斯/玻尔兹曼分布。这不是类比,是同一个变分原理在两个领域的两次应用:
| 最大熵 RL(SAC) | 路径积分控制(MPPI) | |
|---|---|---|
| 决策对象 | 策略 \(\pi(a\mid s)\) | 轨迹分布 \(\mathbb{P}(\tau)\) |
| 目标 | \(\max \mathbb{E}[R] + \alpha\mathcal{H}(\pi)\) | \(\min \mathbb{E}[S] + \lambda\,\mathrm{KL}(\mathbb{P}\|\mathbb{Q})\) |
| 温度 | \(\alpha\) | \(\lambda\) |
| 最优解 | 玻尔兹曼策略 \(\pi^\star\propto e^{Q/\alpha}\) | 吉布斯分布 \(\mathbb{P}^\star\propto\mathbb{Q}\,e^{-S/\lambda}\) |
| 正则基准 | 均匀分布(熵) | 基分布 \(\mathbb{Q}\)(KL) |
一个最小算例:两条轨迹的对偶。 把对偶定理在 \(K=2\) 上手算一遍,能看清它到底在说什么。设两条轨迹代价 \(S_1=0\)、\(S_2=c>0\),基分布对二者等概率 \(\mathbb{Q}=(\tfrac12,\tfrac12)\)。最优分布 \(\mathbb{P}^\star\propto\mathbb{Q}\,e^{-S/\lambda}\) 经归一化给出
可以直接验证对偶式右端 \(\mathbb{E}_{\mathbb{P}^\star}[S]+\lambda\mathrm{KL}(\mathbb{P}^\star\|\mathbb{Q})\) 恰好等于这个 \(\mathcal{F}\)。两端极限一目了然:\(\lambda\to0\) 时 \(\mathbb{P}^\star\to(1,0)\)——全压到代价最低那条,\(\mathcal{F}\to S_1=\min_k S_k\);\(\lambda\to\infty\) 时 \(\mathbb{P}^\star\to(\tfrac12,\tfrac12)\)——退回基分布,\(\mathcal{F}\to\mathbb{E}_{\mathbb{Q}}[S]=c/2\)(温度极高时自由能就是平均代价,对代价高低一视同仁)。
这个两点版本,正是 §1.5 代码里 w = softmax(-S/λ) 在 \(K=2\) 时的样子——权重公式不是从天而降,它就是对偶定理的最优解在有限样本上的实例化。
自由能能告诉我们什么:双侧夹逼与次优性证书¶
自由能 \(\mathcal{F}=-\lambda\log Z\) 不只是个会消去的中间量,它本身携带两条有用的信息。
其一,它被夹在硬最小与平均之间。 因为 \(\mathbb{E}_{\mathbb{Q}}[e^{-S/\lambda}]\le \max_\tau e^{-S(\tau)/\lambda}=e^{-\min_\tau S/\lambda}\),取 \(-\lambda\log\) 后不等号翻向,得
也就是说,自由能是一个**软最小值**,永远落在"最好那条轨迹的代价"与"被动平均代价"之间:\(\lambda\to0\) 时它从上方逼近硬最小 \(\min_\tau S\),\(\lambda\to\infty\) 时它升到平均 \(\mathbb{E}_{\mathbb{Q}}[S]\)。在一个 \(6\) 条轨迹、\(\lambda=0.8\) 的小例里跑出来是 \(\min S=0.72\le\mathcal{F}=1.82\le\mathbb{E}_{\mathbb{Q}}[S]=2.33\),三者各居其位。
这给了你一个**廉价的健全性检查**:算出的自由能若跌破当前 batch 的最小代价、或冒过平均代价,必有 bug。
其二,它给任意候选分布一张"次优性证书"。 对偶证明里那步改写其实是个恒等式——对**任何**与 \(\mathbb{Q}\) 兼容的候选分布 \(\mathbb{P}\),
左边是候选 \(\mathbb{P}\) 取到的目标值,右边第一项是最优值 \(\mathcal{F}\),于是**第二项 \(\lambda\,\mathrm{KL}(\mathbb{P}\|\mathbb{P}^\star)\ge0\) 恰好是 \(\mathbb{P}\) 离最优有多远**——一个以代价为单位、永远非负、当且仅当 \(\mathbb{P}=\mathbb{P}^\star\) 时为零的次优性度量。在上面那个小例里随手取几个候选 \(\mathbb{P}\),左右两边数值逐一相等(间隙分别约 \(2.73\)、\(0.89\)、\(1.40\)),证书成立。
它的意义在于:MPPI 的迭代更新(把控制朝低代价方向挪)本质上就是在**缩小这个 \(\mathrm{KL}(\mathbb{P}\|\mathbb{P}^\star)\)**,把候选分布往隐式最优 \(\mathbb{P}^\star\) 推。Williams 2018 的信息论推导正是建立在这种"自由能 + KL 间隙"的分解上——它让"离最优还差多少"成为一个可以书写、原则上可估计的量,而不只是一句定性的"还不够好"。
第五步:从吉布斯分布到 MPPI 权重公式。 我们拿到了最优轨迹分布 \(\mathbb{P}^\star\propto\mathbb{Q}\,e^{-S/\lambda}\),但它是**隐式**的——无法直接采样。MPPI 的做法是用重要性采样(importance sampling)把它的均值近似出来:从基分布 \(\mathbb{Q}\) 采 \(K\) 条 rollout(第 \(k\) 条由噪声 \(\varepsilon_k\) 生成,总代价 \(S_k\)),那么任意 \(\mathbb{P}^\star\) 下的期望都可由**自归一化重要性权重**估计:
把 \(\mathbb{P}^\star\) 投影回参数化控制序列:在 \(\mathbb{Q}\) 下第 \(k\) 条轨迹的控制是 \(u_t+\varepsilon_k(t)\),于是 \(\mathbb{P}^\star\) 下的均值控制对应"把噪声按 \(w_k\) 加权平均",给出 MPPI 的核心更新:
第六步:数值稳定化(\(\rho\) 减法)。 直接算 \(e^{-S_k/\lambda}\) 极易溢出:\(S_k/\lambda\) 大时下溢成 \(0\),小时上溢成 \(\infty\),权重变 NaN。注意到 softmax 对"所有指数同时减一个常数"不变,取 \(\rho=\min_k S_k\):
减去 \(\rho\) 后最小代价那条的指数变成 \(e^0=1\),其余都在 \((0,1]\),既不溢出也不改变权重。这就是 log-sum-exp 技巧——也是 §1.1 那条本质洞察(\(\min\leftrightarrow\log\sum\exp\))在算法层面的化身。
它不是可选优化,是必需的数值保命措施。
权重公式的离散推导:为什么只剩代价、控制代价去哪了¶
第五、六步的权重是从抽象的 \(\mathbb{P}^\star\propto\mathbb{Q}\,e^{-S/\lambda}\) 写出来的。两个常让人困惑的细节,值得在离散情形显式算一遍:(1) 重要性权重里为什么没有高斯采样密度这一项?(2) §1.1 明明有一项显式的二次控制代价 \(\tfrac12 u^\top Ru\),到了 §1.3 的权重里却不见了,它去哪了?
(1) 高斯密度为什么抵消。 把基分布写在扰动序列 \(\varepsilon=(\varepsilon_0,\dots,\varepsilon_{H-1})\) 上,每步 \(\varepsilon_t\sim\mathcal{N}(0,\Sigma)\) 独立,其密度
吉布斯最优分布是 \(\mathbb{P}^\star(\varepsilon)\propto q(\varepsilon)\,e^{-S(\varepsilon)/\lambda}\)。我们要估计 \(\mathbb{E}_{\mathbb{P}^\star}[\varepsilon]\)(用来更新 \(U\))。
从 \(q\) 采 \(K\) 个样本做自归一化重要性采样,第 \(k\) 个样本的权重是
\(q\) 被精确约掉了——因为我们恰好从那个出现在 \(\mathbb{P}^\star\) 里的同一个 \(q\) 采样。所以权重只剩代价的 softmax,没有任何高斯密度项。这正是 §1.5 的代码只用代价、不碰采样密度就能算权重的原因。
(2) 控制代价去哪了。 在最简 MPPI 里(围绕当前控制序列 \(U\) 采**零均值**扰动,即提议分布就是基分布 \(\mathbb{Q}\)),控制代价是**隐式**的:它藏在"\(\mathbb{P}^\star\) 不能离 \(\mathbb{Q}\) 太远"这件事里(对偶式里的 \(\lambda\mathrm{KL}(\mathbb{P}\|\mathbb{Q})\) 项),你不必手动往 \(S\) 里加 \(\tfrac12\varepsilon^\top R\varepsilon\)。但一旦你想**移动提议分布**(围绕一个不同于 \(U\) 的均值、或用不同协方差采样——这正是 Williams 2017 的 generalized importance sampling),权重就要乘上提议分布 \(q'\) 与基分布 \(q\) 之间的密度比:
两个高斯之间的对数密度比恰是一个 \(\propto u^\top\Sigma^{-1}u\) 的二次型——而在 Kappen 关系 \(\Sigma=\lambda R^{-1}\) 下,\(u^\top\Sigma^{-1}u=u^\top Ru/\lambda\),于是这个换测度修正在权重里正是 \(e^{-(\frac12 u^\top Ru)/\lambda}\)。**这恰好就是 §1.1 那项二次控制代价 \(\tfrac12 u^\top Ru\) 进入指数后的样子。
** 换句话说:§1.1 显式写出的二次控制代价,与 §1.3 对偶式里的 KL 项,是**同一个东西**——受控路径测度与被动路径测度之间的对数密度比(连续时间里这叫 Girsanov 变换)。最简 MPPI 把提议分布选成基分布,于是这一项退化为常数、权重纯由代价决定;只有当你移动提议分布时,它才作为显式的二次项重新现身——这就把 §1.1 的 PDE 推导与 §1.3 的信息论推导在这一点上彻底缝合。
动手验证:不可微的代价照样能用¶
§1.3 反复强调"\(S_k\) 只作一个标量进指数",所以代价可以不连续、不可微、来自黑箱。这一点值得亲眼一见,因为它正是 MPPI 相对梯度法最硬的优势。
设一个**阶梯型终端代价**:终点落入目标带 \([1.5,2.5]\) 代价为 \(0\),否则代价 \(10\)——这个代价的梯度**处处为零**(带内带外都是常数),梯度下降在它上面完全收不到信号、原地不动。但 MPPI 的权重不在乎可微性:
import numpy as np
rng = np.random.default_rng(1)
dt, H, sigma = 0.05, 40, 1.5; K = 8000
eps = sigma*rng.standard_normal((K,H)); U = eps # x0=0, 名义控制为零
x = np.zeros(K); S = np.zeros(K)
for t in range(H):
x += U[:,t]*dt; S += 0.5*0.05*U[:,t]**2*dt
S += np.where((x>=1.5)&(x<=2.5), 0.0, 10.0) # 阶梯终端代价(不可微)
w = np.exp(-(S - S.min())); w /= w.sum()
print(f"落入目标带占比={((x>=1.5)&(x<=2.5)).mean()*100:.1f}% 带内总权重={w[(x>=1.5)&(x<=2.5)].sum():.3f}")
print(f"加权 x_T={(w*x).sum():+.3f} 裸平均 x_T={x.mean():+.3f}")
输出 落入目标带占比=0.1% 带内总权重=0.955 与 加权 x_T=+1.53 裸平均 x_T=-0.009:尽管只有 \(0.1\%\) 的 rollout 侥幸落进目标带,权重却把 \(95.5\%\) 的信任压在它们身上,加权终点 \(+1.53\) 稳稳落在带内;而不加权的裸平均还停在出发点 \(0\) 附近。指数权重 \(e^{-S/\lambda}\) 只需要比较代价的大小,从不对代价求导,所以阶梯、障碍的硬跳变、黑箱仿真器吐出的不可微代价,对它都一视同仁。
这正是 §1.3 那个"\(S_k\) 只作标量进指数"论断的兑现,也是为什么 MPPI 能直接吃碰撞惩罚、稀疏奖励、规则化约束这些让梯度法束手无策的代价。(这里 ESS 很低、目标带是稀有事件——提醒你这种"撞大运"式采样正是 §1.4 要靠好的提议分布去改善的;但代价不可微这件事本身,丝毫没有妨碍权重的计算。
)
MPPI 与 REINFORCE 的同构¶
把 MPPI 更新和你熟悉的 REINFORCE 并排看。REINFORCE 对高斯策略 \(\pi=\mathcal{N}(u,\Sigma)\) 的策略梯度上升是(\(R=-S\) 为负代价,\(b\) 为基线):
而 MPPI 更新是
两者骨架完全相同:都是 \(u\leftarrow u + \mathbb{E}[\,g(S)\cdot\varepsilon\,]\)——"把采样噪声 \(\varepsilon\) 按一个与代价相关的标量权重 \(g(S)\) 加权平均"。区别只在权重函数 \(g\):
| 权重函数 \(g(S)\) | 性质 | 需要的东西 | |
|---|---|---|---|
| REINFORCE | \(\propto -(S-b)\)(线性) | 一阶;可正可负 | 学习率 \(\eta\)、基线 \(b\)、\(\Sigma^{-1}\) |
| MPPI | \(\propto e^{-S/\lambda}\)(指数 / softmax) | 零阶;恒非负、自归一化 | 温度 \(\lambda\);无学习率、无矩阵逆 |
二者的联系可以说得更精确:把 MPPI 的指数权重在 \(1/\lambda\) 小时做一阶泰勒展开,\(e^{-S/\lambda}\approx 1 - S/\lambda\),归一化后权重 \(\propto -(S-\bar S)\)——正是带基线的 REINFORCE。
本质洞察:MPPI 是**零阶(zeroth-order)策略梯度的闭式特例**,或者说"softmax 版的 REINFORCE"。指数权重 \(e^{-S/\lambda}\) 是 KL 正则最优化问题(第三步对偶定理)的**精确闭式解**;REINFORCE 的线性权重则是它的**一阶泰勒近似**。这条联系有两个直接的实践后果:其一,你在 RL 里积累的全部调参直觉——reward shaping、温度退火、方差缩减、基线设计——**可以零成本迁移**到 MPPI 的 cost 设计与 \(\lambda\) 调节;其二,MPPI"无学习率、无矩阵逆、一步到位"的优雅,根源在于它解的是**闭式**最优分布,而不是像 REINFORCE 那样沿梯度一小步一小步爬——这也解释了 PI² 当年"no open tuning parameters besides exploration noise"的卖点从何而来。
信息几何视角:为什么没有学习率¶
上一段说 MPPI"无学习率、一步到位"。这件事背后有一个更深的几何原因,值得点破:MPPI 的更新是分布空间里的一步自然梯度 / 镜像下降,而步长被 KL 约束自动定死了。
普通梯度下降在**参数**的欧氏空间里走,步长(学习率)是个要手调的自由量,走大了发散、走小了慢。但当优化对象是一个**概率分布**时,欧氏距离不是合适的度量——两个分布"差多远"该用 KL 散度来量,对应的几何是 Fisher 信息度量下的**信息几何**。
在这套几何里做最速下降,就是**自然梯度(natural gradient)。而本章第三步的对偶问题"\(\min_{\mathbb{P}}\mathbb{E}_{\mathbb{P}}[S]+\lambda\mathrm{KL}(\mathbb{P}\|\mathbb{Q})\)"恰恰是一个**带 KL 信赖域的最优化:它问的是"在离当前分布 \(\mathbb{Q}\) 不太远(KL 惩罚)的前提下,怎么把期望代价降到最低"。
这个问题有**闭式解**(吉布斯分布),于是 MPPI 不需要沿梯度试探着走——它直接跳到信赖域内的最优分布。\(\lambda\) 在这里同时扮演信赖域半径:\(\lambda\) 大,信赖域小、每步挪得保守;\(\lambda\) 小,信赖域大、挪得激进。
所谓"没有学习率",其实是**学习率被 KL 信赖域 + 闭式解吸收了**。
这把本章的几条线和更广的优化版图缝在了一起。CMA-ES 的现代推导(Abdolmaleki 等 2017 的"information-geometric trust regions")、自然进化策略(NES)、MPO 的 E 步,走的都是"在 KL/信息几何信赖域里更新分布"这同一条路;CEM 的矩匹配是它的一种投影实现,REINFORCE 是它去掉信赖域、退回欧氏一阶近似的版本。
换句话说,MPPI 不是一个 ad-hoc 的加权技巧,而是**分布空间自然梯度**这一大类方法在"轨迹分布 + 闭式吉布斯解"处的落点。理解这一点,你就明白它的"优雅"不是巧合,而是选对了几何。
迭代会收敛吗:单调改善与它的边界¶
§1.5 的"跑一跑"里,反复迭代 mppi_step 让代价单调下降——这背后能不能说点收敛性?能,但要分清在什么条件下。
把 MPPI 的迭代看成上面的镜像下降:每一步在"离当前分布 KL 不太远"的信赖域里跳到期望代价更低的吉布斯分布。在**理想(无限样本)**情形,这一步是一个 majorize-minimize / 期望最大化(EM)式的更新,**单调不增**地降低 KL 正则后的目标——这就是实测里代价稳步下降的理论来源,和 MPO 的 E 步、CEM 的迭代收敛性是同一类论证。
所以"无限样本 + 把提议分布朝吉布斯解挪"给的是一个有保证的下降序列。
但有两条边界必须说清。**其一,有限样本带来随机性。
** 真实的权重是 \(K\) 条 rollout 的蒙特卡洛估计,§1.4 已指出它有偏、有方差;于是单调下降只在期望意义/大 \(K\) 下成立,小 \(K\) 时单步可能不降反升,迭代是一个**随机**逼近过程而非确定的下降。**其二,非凸代价只保证局部。
** 信赖域里的下降把分布推向**当前邻域**内的更优解;当代价地形多模(如上一节的单摆双谷),这个过程会收敛到**某一个**模式而非全局最优——它会 commit 到一条谷,但不保证是更好的那条。这也呼应了"前向/反向 KL"与对称性破缺:模式寻找式的更新天然只抓一个峰。
所以诚实的表述是:MPPI 的迭代在理想条件下单调改善 KL 正则目标、收敛到一个局部最优分布;有限样本让它变成随机逼近,非凸让"最优"退化为"局部最优"。这在工程上完全够用——配合高频重规划,每周期只需把控制朝更优挪一步、并不指望单次迭代求到全局最优。
把"单次求解只做局部改善、靠重规划积累"这件事想清楚,你就不会对"为什么单步收敛慢"感到意外(§1.5 已点明),也不会误以为 MPPI 每周期都解到了全局最优。
贯穿例子(续):在一维点质量上跑一遍权重公式¶
回到一维点质量。设当前控制序列 \(U\) 全为 0(还没开始优化),从 \(\mathbb{Q}\) 采 \(K\) 条带噪 rollout:第 \(k\) 条的控制就是噪声本身 \(\varepsilon_k\),模拟得到轨迹、按 \(S_k=\tfrac{a}{2}(x_T^{(k)})^2 + \tfrac{r}{2}\sum_t \varepsilon_k(t)^2\Delta t\) 算总代价。
那些"恰好把粒子推向原点"的噪声序列代价低、\(w_k\) 大,于是 \(\sum_k w_k\varepsilon_k\) 给出一个"平均意义上朝原点推"的控制增量——一步更新后 \(U\) 就从全 0 变成了一个把粒子拉回原点的控制序列。这正是 §1.2 闭式解 \(u^\star=-k(t)x\) 的采样近似版本:闭式解告诉我们"理论上该这么推",权重公式让我们在**不会闭式积分、动力学是黑箱**时也能把同样的推力**采样**出来。
§1.5 会把这段文字直接写成 20 行 NumPy。
控制即推断:MPPI、SAC、REINFORCE 的共同母体¶
读到这里,一个问题应该已经浮现:为什么 MPPI 的权重、SAC 的玻尔兹曼策略、LMDP 的 desirability、乃至 REINFORCE 的更新,全都长着 \(e^{-\text{代价}/\lambda}\) 这副面孔?这不是巧合。它们是同一个框架——控制即推断(control as inference)——的不同侧影。
这个视角由 Levine 2018 的综述系统化;更早地,Kappen、Gómez、Opper 2012 已证明 Todorov 的 KL 控制理论"把路径积分控制作为一个特例包含其中"。把它讲清楚,本章此前所有看似独立的线索就被收束到一根主轴上。
第一步:把"最优"变成一个可观测的随机事件。 在每个时刻引入一个二值的**最优性变量(optimality variable)** \(\mathcal{O}_t\in\{0,1\}\),并规定它取 1 的概率随该步代价指数衰减:
其中 \(c\) 是单步代价(本章前文那项运行 + 控制代价),整条轨迹的代价 \(S(\tau)=\sum_t c(x_t,u_t)\)(含终端)。直觉:代价越低的一步,"看起来越像一个最优决策做出来的",\(\mathcal{O}_t{=}1\) 就越可能。
温度 \(\lambda\) 在这里控制"多低的代价才算足够像最优"。
第二步:把规划变成一次贝叶斯条件化。 现在问一个纯粹的推断问题:假设我们"观测到"整条轨迹自始至终都最优(\(\mathcal{O}_{1:T}{=}1\)),轨迹的后验分布是什么?由贝叶斯公式,
这个后验,恰恰就是推导第三步的吉布斯分布 \(\mathbb{P}^\star\)。 也就是说——"最优轨迹分布"与"在观测到全程最优这一证据后、对轨迹做贝叶斯推断得到的后验",是同一个东西。规划(planning)就是推断(inference)。
第三步:自由能就是负的对数证据。 那个反复出现的自由能 \(\mathcal{F}\) 立刻有了概率意义:
即自由能等于"全程最优"这一证据的**对数边际似然(log-evidence)**乘以 \(-\lambda\)。于是对偶定理 \(\mathcal{F}=\min_{\mathbb{P}}\{\mathbb{E}_{\mathbb{P}}[S]+\lambda\mathrm{KL}(\mathbb{P}\|\mathbb{Q})\}\) 正是**变分推断**的标准形式:右端是负的证据下界(ELBO),\(\lambda\mathrm{KL}(\mathbb{P}\|\mathbb{Q})\) 是变分分布 \(\mathbb{P}\) 与真后验之间的间隙,\(\mathbb{P}=\mathbb{P}^\star\)(真后验)时间隙归零、下界紧贴对数证据。
§1.3 整套推导,本质上就是一次变分推断。
第四步:四条路线,同一个后验。 一旦认出"最优 = 对指数化代价后验做推断",本章(及你 RL 课)里那些看似各自独立的方法,就显形为计算同一个后验 \(\mathbb{P}^\star\propto\mathbb{Q}\,e^{-S/\lambda}\) 的**不同路线**:
| 路线 | 怎么算后验 \(\mathbb{P}^\star\propto\mathbb{Q}\,e^{-S/\lambda}\) | 出处 |
|---|---|---|
| Kappen 路径积分 | 连续时间,指数变换 + Feynman–Kac,对被动轨迹采样 | §1.1–§1.2 |
| Todorov LMDP | 离散时间,值函数路线,线性贝尔曼 \(z=MPz\)(动态规划 / 线性代数) | §1.2 |
| MPPI | 轨迹空间,重要性采样**在线**估计后验均值;每步重规划、不学策略 | §1.3 |
| SAC / soft Q-learning / MPO | 同一后验,但把推断**摊销(amortize)**进一张学到的策略网络;离线训练、可复用 | RL 课 |
最后一行点出了 MPPI 与 SAC 最干净的区别:两者解的是同一个 KL 正则推断问题;SAC 把答案摊销成一个离线学好、随用随取的策略,MPPI 则在每个控制周期**在线**重算一遍(不学策略、不复用)。这也顺带回答了"有了 SAC 为什么还要 MPPI"——当你手里有一个(哪怕黑箱的)模型、又负担得起在线算力时,MPPI 免去训练、即插即用、且能随时换代价函数;当你有海量离线交互、想要一个零在线开销的反应式策略时,SAC 的摊销更划算。
而且不止 SAC——一旦你认出"指数加权 = KL 正则推断的闭式解",会发现现代 RL 里一整片算法都长着这副面孔。MPO(Maximum a Posteriori Policy Optimisation,Abdolmaleki 等 2018) 把策略优化写成 EM:E 步算一个非参数的变分分布 \(q\propto e^{Q/\eta}\)——这正是玻尔兹曼/吉布斯后验,与 MPPI 的权重同形;M 步把这个 \(q\) 拟合进参数化策略网络。
AWR(Advantage-Weighted Regression,Peng 等 2019) 更直白:用 \(e^{A/\beta}\)(优势的指数)给经验里的动作加权,做一次加权回归就更新策略,无需重要性采样修正。把它们和本章并排:
| 方法 | 指数权重的来源 | 怎么用这个权重 |
|---|---|---|
| MPPI | \(e^{-S/\lambda}\)(轨迹代价) | 在线对 rollout 加权平均,挪控制序列 |
| AWR | \(e^{A/\beta}\)(优势) | 对经验动作加权回归,拟合策略网络 |
| MPO(E 步) | \(e^{Q/\eta}\)(Q 值) | 算非参数玻尔兹曼后验,再 M 步蒸馏进网络 |
| SAC | \(e^{Q/\alpha}\)(软 Q) | 玻尔兹曼策略,软策略迭代摊销进网络 |
四者的权重都是"某种价值量除以温度再取指数",都来自同一个 KL 正则目标的闭式解。差别只在**价值量是什么**(轨迹代价 / 优势 / Q 值)与**怎么消费这个权重**(在线挪序列 / 回归 / 蒸馏成网络)。
看穿这一层,MPPI 在你眼里就不再是个孤立的控制技巧,而是 RL 里那套"指数加权 + KL 正则"在"有模型、在线、不学策略"这一格的填法——你在 RL 课上对 AWR/MPO/SAC 建立的任何直觉,都能平移过来。
本质洞察:§1.3 前面那两个"同构"——MPPI \(\approx\) REINFORCE、MPPI ↔ SAC——之所以成立,根子全在这里:它们都是控制即推断的实例。指数化代价后验 \(\mathbb{P}^\star\) 是那个共同的"母体",具体算法只是在回答同一个问题"如何逼近这个后验"时,选择了不同的**摊销程度**与**计算路线**:有模型 + 在线算力 → MPPI(每步重算);要可复用的反应式策略 + 离线交互 → SAC(摊销成网络);小规模离散模型 → LMDP(线性代数一次解出)。看穿这一点,你就不会把 MPPI、SAC、LMDP 当成三门要分别死磕的手艺,而是同一框架下按资源约束做出的三种工程选择——你在任意一边积累的直觉,都能照亮另外两边。
风险敏感视角:自由能其实是"指数效用"¶
控制即推断把自由能解读成对数证据;还有一个同样深刻、且对工程更直接的解读——自由能就是控制论里的"风险敏感目标"。这把 \(\lambda\) 从"温度/锐度旋钮"(§1.4 的视角)进一步揭示为一个**风险态度旋钮**。
把自由能在大 \(\lambda\) 处做泰勒展开(推导见练习),会得到一个干净的结果:
自由能不是平均代价,而是**平均代价减去一个方差项**。这立刻给出 \(\lambda\) 的风险含义:因为方差项前是减号,最小化 \(\mathcal{F}\) 等于在压低平均代价的同时**奖励代价的高方差**——也就是偏爱那些"存在极低代价尾巴"的分布。
换句话说,标准路径积分 / MPPI(\(\lambda>0\))天生是**轻度冒险(risk-seeking)**的:指数权重 \(e^{-S/\lambda}\) 把赌注押在最好的那几条 rollout 上。\(\lambda\to0\) 是极端冒险(只认单条最优,§1.4 的硬 \(\min\));\(\lambda\to\infty\) 时方差项消失、\(\mathcal{F}\to\mathbb{E}[S]\),退回**风险中性**的期望代价。
这个均值-方差展开可以直接验证。取一批代价 \(S\)(这里用对数正态以保证正方差),对比 \(\mathcal{F}\) 的精确值与 \(\mathbb{E}[S]-\mathrm{Var}[S]/2\lambda\):
import numpy as np
S = np.random.lognormal(0.0, 0.6, size=2_000_000)
ES, VarS = S.mean(), S.var() # E[S]=1.198, Var[S]=0.620
for lam in [50.0, 10.0, 2.0]:
F = -lam * np.log(np.mean(np.exp(-S/lam)))
print(f"λ={lam:>5}: F={F:.4f} E[S]-Var/(2λ)={ES - VarS/(2*lam):.4f}")
输出:
λ= 50.0: F=1.1914 E[S]-Var/(2λ)=1.1914
λ= 10.0: F=1.1683 E[S]-Var/(2λ)=1.1666
λ= 2.0: F=1.0752 E[S]-Var/(2λ)=1.0426
大 \(\lambda\) 时二者精确吻合;\(\lambda\) 越小,高阶项越重要、近似偏离越大,但 \(\mathcal{F}<\mathbb{E}[S]\) 始终成立——这正是"冒险偏好"的数值签名(自由能永远比平均代价乐观)。
这个目标在控制论里有专名。形如 \(\frac{1}{\theta}\log\mathbb{E}[e^{\theta X}]\) 的量叫**熵风险测度(entropic risk measure),等价于**指数效用(exponential utility)下的确定性等价;它最早由 Jacobson 1973 引入随机控制(线性-指数-二次-高斯,LEQG),用一个风险参数在"看重分布的众数还是尾部"之间连续调节。
van den Broek、Wiegerinck、Kappen 2010 的「Risk Sensitive Path Integral Control」证明:在与本章完全相同的假设下,路径积分直接推广到风险敏感控制——最小化的正是指数加权 cost-to-go,而指数权重的符号与大小决定了 risk-seeking 还是 risk-averse 的行为(在多模问题上,这与"选哪条路"的对称性破缺交织出相当微妙的最优控制)。
为什么工程上要在意这一层?因为它点破了一个常见误区:在**随机**环境里把 \(\lambda\) 调得很小,不只是"权重更尖",更是在让控制器变得**冒进**——它会押注于"如果一切顺利能达到的最低代价",从而在噪声较大、模型不准时做出激进而脆弱的决策(这也呼应了 §1.4 双缝里"过早 commit 可能撞上后来才出现的障碍")。反过来,若你的任务**需要**保守(如安全攸关场景),你要的其实不是路径积分默认的冒险方向,而是它的风险敏感推广里 risk-averse 的那一侧。
如何系统地处理"对风险的偏好"——机会约束、CVaR、分布鲁棒——是「不确定性规划」专题的主题;而风险敏感(指数效用)是其中最平滑的入口,且如你所见,它**直接从自由能里掉出来**,不需要任何额外机器。
本质洞察:\(\lambda\) 有三张面孔,对应本章三个视角,但它们是同一个量。在 §1.1–§1.2 它是**噪声温度**(Kappen 条件 \(\Sigma=\lambda R^{-1}\) 把它绑定到控制代价);在 §1.4 它是 softmax 的**锐度**(\(\min\) 与平均之间的旋钮);在这里它是**风险态度**(冒险与中性之间的旋钮)。三者不是巧合,而是同一个指数权重 \(e^{-S/\lambda}\) 在不同问题里的不同投影:温度调节探索的随机性、锐度调节权重的集中度、风险调节对代价分布尾部的偏好——而它们由同一个 \(\lambda\) 一并决定。所以调 \(\lambda\) 从来不是调一个孤立的超参数,而是同时在拨动探索、集中度与风险三个耦合的旋钮;理解这一点,"\(\lambda\) 调不好"就从"性能差一点"升级为"行为性质、安全裕度一起变"的判断。
⚠️ 常见陷阱¶
💡 概念误区:以为权重里的代价 \(S_k\) 必须可微。 - 错误描述:看到"权重 \(e^{-S_k/\lambda}\)"就以为要对 \(S_k\) 求梯度,于是要求代价函数光滑、动力学可微。 - 现象 / 后果:在该用 MPPI 的场景(不连续碰撞代价、黑箱仿真器)里反而退回梯度法,白白丢掉 MPPI 唯一不可替代的优势。 - 根本原因:整个 §1.3 推导**从不对 \(S\) 求导**——\(S_k\) 只作为一个标量进入 \(e^{-S_k/\lambda}\)。代价可以含 \(\arg\)、indicator、CNN cost-map;动力学可以是 MuJoCo 或神经网络。这是信息论推导相对 §1.1 PDE 推导的根本解放。 - 正确做法:放心把任意黑箱代价塞进 \(S_k\)。MPPI 的"杀手级场景"恰恰是梯度法失效的不可微问题(第 2 章 Williams 的 cluttered forest 实验是经典例证)。
🧠 思维陷阱:把 MPPI 更新当成"梯度下降走一步"。 - 错误描述:因为它和 REINFORCE 同构,就以为 MPPI 也是"沿某个梯度方向、按学习率走一步"。 - 现象 / 后果:去找 MPPI 的"学习率"并试图调它,或担心"步长太大不收敛",套用梯度法的收敛分析。 - 根本原因:MPPI 解的是**闭式最优分布**(吉布斯分布)的投影——它是**加权平均**,不是梯度步。没有学习率、没有矩阵逆(这正是 PI² 的标志性卖点)。 - 正确做法:把每次更新理解为"用当前这批样本,对最优分布的均值做一次蒙特卡洛估计"。控制"激进程度"的旋钮是温度 \(\lambda\)(决定权重分布的锐度)和采样协方差 \(\Sigma\),不是学习率。
🧠 思维陷阱:以为采样数 \(K\) 越大就一定越好,而忽视采样分布的质量。 - 错误描述:性能不好就一味加大 \(K\)。 - 现象 / 后果:\(K\) 加到很大,显存/算力吃满,效果却仍差——因为问题根本不在样本数。 - 根本原因:\(K\) 大只降低**估计方差**;但若基分布 \(\mathbb{Q}\) 离最优分布 \(\mathbb{P}^\star\) 太远(如初始控制序列很糟、噪声协方差不合适),低代价区域**根本没有样本落进去**,再多样本也是在错误的地方平均(§1.2 的"提议分布不重叠"问题)。 - 正确做法:先保证采样分布质量——合理的 warm-start(第 2 章)、合适的协方差 \(\Sigma\)、必要时注入先验(有色噪声 / ancillary controller)。这正是总论"三大认知跨越"中"采样分布设计决定一切"的含义;分布质量优先于样本数。
💡 概念误区:混淆温度 \(\lambda\) 与采样协方差 \(\Sigma\) 的作用。 - 错误描述:以为 \(\lambda\) 和 \(\Sigma\) 都是"控制探索"的,调哪个都一样。 - 现象 / 后果:想让 MPPI 更激进却拧错旋钮,或把两者耦合调坏。 - 根本原因:\(\Sigma\) 决定**采样在控制空间撒得多开**(探索的几何范围);\(\lambda\) 决定**拿到样本后对它们多挑剔**(权重分布的锐度)。一个管"撒哪里",一个管"信哪条"。 - 正确做法:先用 \(\Sigma\) 确保采样覆盖到有意义的控制范围,再用 \(\lambda\) 调节"在这些样本里多贪心地偏向低代价者"。§1.4 专门解剖 \(\lambda\)。
🧠 思维陷阱:在随机环境里把 \(\lambda\) 调小只是为了"更精准"。 - 错误描述:认为温度越低,控制就越接近"真正的最优",所以在任何环境都倾向把 \(\lambda\) 往小调。 - 现象 / 后果:在噪声大、模型不准的真实系统上,低温控制器表现激进而脆弱——它押注于"一切顺利时能达到的最低代价",遇到扰动或建模误差就大幅偏离,甚至失稳。 - 根本原因:自由能 \(\approx\mathbb{E}[S]-\mathrm{Var}[S]/2\lambda\),\(\lambda\) 同时是**风险旋钮**;\(\lambda\) 越小越偏好高方差(冒险),把信任压在代价分布最乐观的尾巴上(§1.3 风险敏感视角)。这在确定性环境无害,在随机环境就是鲁莽。 - 正确做法:在随机/不确定环境里,把 \(\lambda\) 理解为"风险态度"而非单纯的"锐度"——需要保守时不要一味降温;若任务本质要求 risk-averse,应转向风险敏感推广里 risk-averse 的那一侧(指数权重反号),而非默认的冒险方向。
练习¶
- (推导题) 用拉格朗日乘子法独立证明对偶定理:在约束 \(\int\mathbb{P}(\tau)\,\mathrm{d}\tau=1\) 下最小化 \(\mathbb{E}_{\mathbb{P}}[S]+\lambda\mathrm{KL}(\mathbb{P}\|\mathbb{Q})\),导出最优解为吉布斯分布 \(\mathbb{P}^\star\propto\mathbb{Q}\,e^{-S/\lambda}\),并代回验证最优值恰为 \(-\lambda\log Z=\mathcal{F}(\mathbb{Q})\)。在草稿纸上完成,与正文的 KL 配方证法对照,体会两种证明的异同。
- (推导题) 从吉布斯分布 \(\mathbb{P}^\star\propto\mathbb{Q}\,e^{-S/\lambda}\) 出发,写出"用 \(K\) 个 \(\mathbb{Q}\) 样本估计 \(\mathbb{P}^\star\) 下控制均值"的自归一化重要性采样估计量,导出权重公式 \(w_k\) 与更新 \(u_t\leftarrow u_t+\sum_k w_k\varepsilon_k(t)\)。再说明为什么"自归一化"(分母用样本和而非真实 \(Z\))让我们**不需要知道配分函数 \(Z\)**。
- (思考题) PPO 用 clipped surrogate objective 限制每次策略更新的步长,本质是约束新旧策略的 KL 不要太大;MPPI 用温度 \(\lambda\) 控制权重分布相对基分布 \(\mathbb{Q}\) 的锐度。两者都在防止"单次更新偏离当前策略太远导致崩溃"。请从 KL 散度的视角,说明这两种机制在数学目标上的共同点与关键差异(提示:一个把 KL 作为**硬约束/裁剪**,一个把 KL 作为目标里的**软正则项**;对偶定理第三步的 \(\lambda\mathrm{KL}(\mathbb{P}\|\mathbb{Q})\) 正是后者)。
- (推导题) 推导自由能的均值-方差展开:对 \(\mathcal{F}=-\lambda\log\mathbb{E}_{\mathbb{Q}}[e^{-S/\lambda}]\),把指数与对数都对 \(1/\lambda\) 做泰勒展开,证明 \(\mathcal{F}=\mathbb{E}[S]-\frac{1}{2\lambda}\mathrm{Var}[S]+O(1/\lambda^2)\)。据此说明:为什么 \(\lambda\to\infty\) 时风险中性、\(\lambda\) 有限时偏好高方差(冒险)?再思考——若把目标改成 \(+\lambda\log\mathbb{E}[e^{+S/\lambda}]\)(指数权重反号),展开式里方差项变号,会得到 risk-averse 还是 risk-seeking?这正是 van den Broek 等 2010 调节风险态度的机制。
- (推导题) 证明自由能的双侧夹逼 \(\min_\tau S(\tau)\le\mathcal{F}(\mathbb{Q})\le\mathbb{E}_{\mathbb{Q}}[S]\)(提示:左边用 \(\mathbb{E}[e^{-S/\lambda}]\le e^{-\min S/\lambda}\),右边用 Jensen 不等式于凹函数 \(\log\))。再证次优性证书恒等式:对任意候选 \(\mathbb{P}\),\(\mathbb{E}_{\mathbb{P}}[S]+\lambda\mathrm{KL}(\mathbb{P}\|\mathbb{Q})=\mathcal{F}(\mathbb{Q})+\lambda\mathrm{KL}(\mathbb{P}\|\mathbb{P}^\star)\)。这两条分别给了你一个**健全性检查**和一个**离最优多远的度量**——说说各自怎么用在调试 MPPI 上。
§1.3 把唯一的自由参数 \(\lambda\) 推到了台前——权重公式里除了采样协方差 \(\Sigma\),就只剩它。但 \(\lambda\) 该取多大?这不是个可以含糊带过的小问题:取错不是"差一点",而是让整个策略**变味**。
§1.4 专门解剖它,并借 Kappen 的双缝实验展示温度如何引发策略的**质变**。
§1.4 温度 \(\lambda\) 与对称性破缺 ⭐⭐⭐¶
这一节解决什么问题:把唯一的自由参数——温度 \(\lambda\)——彻底讲透:它在"贪心硬选"与"盲目平均"之间插值,可以用有效样本数定量地选取,并且在极端情形下会引发**对称性破缺**这种策略层面的相变。
动机¶
权重公式 \(w_k\propto e^{-S_k/\lambda}\) 里,\(\lambda\) 是除采样协方差外唯一的旋钮。但"该取多大"这个问题,初学者几乎总是答错——要么沿用某个默认值("就用 1.0 吧"),要么越调越小以为能逼出"更优解"。
两种做法都会出事。要正确地用 MPPI,必须先建立一个准确的直觉:\(\lambda\) 控制的是"拿到一批样本后,你对它们有多挑剔"。
如果不这样做会怎样¶
把 \(\lambda\) 调到两个极端,MPPI 就退化成两种都没用的东西。\(\lambda\to0\) 时,\(w_k\) 坍缩成 \(\delta\) 函数,只信代价最低的那**一条** rollout——这条很可能只是某个噪声样本的侥幸,控制因此剧烈抖动、被单条坏样本带偏。
\(\lambda\to\infty\) 时,\(w_k\to1/K\),对所有轨迹一视同仁地平均——好坏不分,相当于完全没用上代价信息,控制趋于"原地不动的平均"。两个极端之间那段"恰到好处"才是 MPPI 真正工作的区间。
不理解 \(\lambda\),你就是在这条窄带上盲目试错,且换个机器人就得从零再试。
历史¶
"用温度参数在硬最小值与平均之间连续插值"的思想横跨多个领域:统计物理的玻尔兹曼分布(温度决定能量分布的锐度)、组合优化的模拟退火(温度从高降到低,从全局探索过渡到局部锁定)、最大熵 RL 的熵正则(§1.3 已对照)。Kappen 2005 在那篇奠基作里,专门用一个"双缝"例子展示了温度/噪声如何引发最优策略的**自发对称性破缺**——这是本节最值得细看的一块。
推导:\(\lambda\) 的三种极限与软硬最小值¶
回到 §1.1 和 §1.3 反复出现的那个量——自由能(的样本估计)\(-\lambda\log\frac1K\sum_k e^{-S_k/\lambda}\)。它就是一个由 \(\lambda\) 调节锐度的**软最小值(soft-min)**,两端的极限把 \(\lambda\) 的作用一览无余:
| \(\lambda\) | 权重行为 | 软最小值极限 | 策略含义 | SAC 对应 |
|---|---|---|---|---|
| \(\lambda\to 0\) | \(w_k\to\delta(k=\arg\min_j S_j)\) | \(\to \min_k S_k\)(硬最小) | 只信代价最低的一条,贪心 | \(\alpha\to0\)(纯利用) |
| 适中 | 权重平滑地集中在低代价轨迹上 | 介于二者之间 | 在一簇好轨迹上加权融合 | 最优 \(\alpha\) |
| \(\lambda\to\infty\) | \(w_k\to 1/K\) | \(\to \frac1K\sum_k S_k\)(平均) | 好坏不分,盲目平均 | \(\alpha\to\infty\)(纯探索) |
两个极限都可以严格证明(见练习 1):\(\lambda\to0\) 时指数把最小项之外全部压成零(硬 \(\arg\min\));\(\lambda\to\infty\) 时对 \(e^{-S/\lambda}\approx1-S/\lambda\) 做一阶展开,软最小值退化为算术平均。\(\lambda\) 就是连续地在这两端之间滑动的旋钮。
能不能像模拟退火那样动态调 \(\lambda\)? 既然 \(\lambda\) 是"温度",一个自然的念头是借退火:先高温(大 \(\lambda\))全局探索、再降温(小 \(\lambda\))锁定。在**迭代式**优化里(同一状态反复 mppi 更新)这确实可行且有益——前几轮用大 \(\lambda\) 让权重摊开、广泛探索,后几轮降 \(\lambda\) 收紧到最优簇。但 MPPI 通常是**在线、每控制周期只迭代一次**的(§1.5 末尾),没有"多轮退火"的余地;此时更实用的不是按时间表降温,而是 SAC 式的**按目标自动调温**:设一个目标 ESS,在线根据当前 ESS 偏离目标的方向微调 \(\lambda\)(ESS 太低就升温、太高就降温),让温度自适应地跟踪问题尺度。这把"ESS 仪表盘"从只读指标升级成**闭环调节器**——与 SAC 的自动温度调节(按目标熵调 \(\alpha\))是同一套思路,只是把"目标熵"换成了"目标 ESS"。
退火确实能在迭代式优化里帮上忙,这一点可以直接跑出来。在一维点质量上做 12 次迭代式更新,对比两种温度安排——固定 \(\lambda=0.5\) 与几何退火 \(\lambda:2\to0.1\):
for label, sched in [("固定 λ=0.5", [0.5]*12),
("退火 λ:2→0.1", list(np.geomspace(2.0, 0.1, 12)))]:
rng = np.random.default_rng(7); U = np.zeros(H)
for lam in sched:
U = mppi_step(x0, U, K=1024, sigma=0.7, lam=lam, rng=rng)
print(f"{label}: 12 次迭代后 J={nominal(U):.3f}")
输出:
退火版收敛到更低的代价:前几轮高温让权重摊开、广泛探索不被局部样本绑架,后几轮降温收紧、把分布压到最优簇。这印证了"高温探索、低温锁定"的直觉。
但要再次强调上一段的限制:这套退火依赖**对同一状态多轮迭代**,而在线 MPPI 每周期只更新一次,真正起作用的是高频重规划而非多轮退火——退火在这里更适合离线轨迹优化、或每周期允许多次内迭代的场景(这也正是 CEM 类方法的典型工作方式,见 §1.5 的家族对比)。
用有效样本数(ESS)定量地选 \(\lambda\)¶
光有定性直觉还不够,工程上需要一个可计算的指标来选 \(\lambda\)。重要性采样里的**有效样本数(Effective Sample Size, ESS)**正好胜任。对归一化权重 \(\{w_k\}\)(\(\sum_k w_k=1\)),
它度量"这 \(K\) 条样本里,实质上有几条在起作用"。两端极限正好对应上表:\(\lambda\to\infty\)(权重均匀 \(w_k=1/K\))时 \(\mathrm{ESS}=K\)——看似"样本全用上了",实则因为不挑剔、等于没用代价信息;\(\lambda\to0\)(权重集中到一条)时 \(\mathrm{ESS}\to1\)——只有一条样本在起作用,方差极大、极易被坏样本带偏。
本质洞察:ESS 揭穿了一个反直觉的事实——"有效样本数大"未必好。\(\mathrm{ESS}\approx K\) 不代表"充分利用了所有样本",反而往往意味着温度过高、权重太平、根本没在"挑"轨迹(等于盲目平均);\(\mathrm{ESS}\to1\) 也不代表"精准锁定最优",而是过度自信、把全部信任压在一条偶然样本上。健康的 MPPI 应该让 ESS 落在 \(K\) 的一个中间比例(经验上常取 \(0.1K\sim0.5K\)):既挑出了一簇真正低代价的轨迹,又不至于孤注一掷。调 \(\lambda\) 的操作化目标,就是把 ESS 拉到这个健康区间——这比"凭感觉调 \(\lambda\)"可靠得多。
一个带数字的 ESS 算例。 取 \(K=5\) 条 rollout,代价 \(S=[\,0,\ 0.5,\ 1,\ 2,\ 4\,]\)(一条明显最好、几条尚可、一条很差)。\(\rho=\min_k S_k=0\),在三档温度下计算归一化权重与 ESS:
| \(\lambda\) | 权重 \(w_k\)(近似) | \(\mathrm{ESS}=1/\sum_k w_k^2\) | 区制 |
|---|---|---|---|
| \(0.25\)(低温) | \([\,0.87,\ 0.12,\ 0.02,\ 0.0003,\ \approx 0\,]\) | \(\approx 1.3\) | 几乎只信第一条,过度自信 |
| \(1\)(适中) | \([\,0.47,\ 0.29,\ 0.17,\ 0.06,\ 0.01\,]\) | \(\approx 3.0\) | 五条里约三条有效,健康的一簇 |
| \(4\)(高温) | \([\,0.28,\ 0.24,\ 0.21,\ 0.17,\ 0.10\,]\) | \(\approx 4.6\) | 五条几乎等权,趋于盲目平均 |
随 \(\lambda\) 从 \(0.25\) 升到 \(4\),ESS 单调地从 \(1.3\)(孤注一掷)爬到 \(4.6\)(盲目平均)。把 \(\lambda\) 调到使 ESS 落进期望区间(这里 \(K=5\),\(\mathrm{ESS}\approx3\) 已是健康的一簇),就是上面那条"操作化目标"的字面执行——一个**可以打印、可以盯着调**的仪表盘,而不是凭感觉拧温度。
这张表用几行代码就能复现,也提示你把 ESS 直接做成调参 / 运行时的打印项:
import numpy as np
S = np.array([0., 0.5, 1., 2., 4.]) # 一批 rollout 的代价
for lam in [0.25, 1.0, 4.0]:
w = np.exp(-(S - S.min()) / lam); w /= w.sum() # ρ 减法 + 归一化
print(f"λ={lam:>4}: w={np.round(w,3)} ESS={1/np.sum(w**2):.2f}")
# 输出与上表一致:ESS = 1.31 / 2.98 / 4.58
把这几行嵌进 MPPI 主循环、每个控制周期打印 ESS,你就有了上面反复强调的那个"仪表盘"——温度调对没对,一眼便知。
这也立刻给出 \(\lambda\) 与**代价尺度**的关系:真正进入指数的是无量纲量 \(S_k/\lambda\),所以 \(\lambda\) 必须和代价 \(S\) 的量级匹配。换个机器人、换个代价函数,\(S\) 的数量级一变,\(\lambda\) 就得按比例缩放——否则同一个 \(\lambda\) 在新问题上要么让 \(S/\lambda\) 全都巨大(权重坍缩,ESS→1)、要么全都微小(权重均匀,ESS→K)。
一个稳健的通用做法是:先跑一批 rollout,用这批代价的标准差(或极差)作为 \(\lambda\) 的量级基准,再据 ESS 微调。这样 \(\lambda\) 自动随问题尺度自适应,而不是一个写死的魔数。
把上面这些零散的判据收成一个**从零配置的操作流程**(区别于故障排查那种"已经坏了再修",这是"还没跑就先定个靠谱的起点"):
- 先定 \(\Sigma\),让采样覆盖到有意义的控制幅度。 看你的执行器能输出多大控制、什么尺度的扰动能产生可见的状态变化,把采样标准差设到这个量级——确保至少有一部分 rollout 能探到低代价区(否则后面调 \(\lambda\) 全是徒劳)。
- 跑一批 rollout,量代价的尺度。 用当前 \(\Sigma\) 采几百条,打印代价 \(S\) 的标准差 \(\hat\sigma_S\)。把 \(\lambda\) 的初值设为 \(\hat\sigma_S\) 的量级——这样 \(S/\lambda\) 落在 \(O(1)\),权重既不坍缩也不均匀。
- 用 ESS 微调 \(\lambda\)。 打印 \(\mathrm{ESS}=1/\sum w_k^2\),朝让它落进 \([0.1K,0.5K]\) 的方向调 \(\lambda\):ESS 太低就增大 \(\lambda\)、太高就减小。这一步把"凭感觉"换成"看仪表"。
- 在有闭式解的简化版上验证。 若可能,先在一个有标准答案的退化情形(如本章的一维点质量)上确认实现正确(§1.2 的 Riccati 对照),再上真实系统——把"算法 bug"和"调参问题"分开。
- 换系统/换代价就重做第 2–3 步。 \(\lambda\) 绑定代价尺度,任务一变就要重新量、重新调;别指望一个 \(\lambda\) 通吃。
整个流程的逻辑是"\(\Sigma\) 管采样覆盖 → 代价尺度定 \(\lambda\) 起点 → ESS 收尾微调 → 简化版验证正确性",每一步都对应本章建立的一个量,而不是盲目试参数。
估计器是有偏的:为什么样本数仍然重要¶
ESS 衡量"权重摊得够不够开",但还有一个更隐蔽的事实值得讲清:MPPI 用的**自归一化重要性采样估计器(self-normalized importance sampling)是有偏的**。回忆权重 \(w_k=e^{-(S_k-\rho)/\lambda}/\sum_j e^{-(S_j-\rho)/\lambda}\)——分子分母都依赖同一批随机样本,分母是一个随机的归一化量。
正是这个"用样本自己估出来的分母"引入了偏差:对有限 \(K\),\(\mathbb{E}[\hat{u}]\neq u^\star\)。理论上这个偏差是 \(O(1/K)\) 量级(随 \(K\) 增大而消失,所以估计器是**有偏但一致的**——consistent)。
这不是吹毛求疵,在"被动分布离最优很远"时偏差可以大到离谱。还是一维点质量、\(x_0=1\)、闭式真值 \(u^\star=-0.833\),纯从无控分布采样、重复数千次取估计均值:
| \(K\) | 估计均值 | 偏差 | RMSE |
|---|---|---|---|
| 16 | \(-2.374\) | \(-1.541\) | \(1.744\) |
| 64 | \(-1.575\) | \(-0.741\) | \(0.994\) |
| 256 | \(-1.068\) | \(-0.235\) | \(0.513\) |
| 1024 | \(-0.882\) | \(-0.049\) | \(0.227\) |
\(K=16\) 时偏差高达 \(-1.54\)(比真值本身还大),\(K\) 每翻 \(4\) 倍偏差大致减半,印证了 \(O(1/K)\) 的衰减。注意这里偏差之所以这么大,恰恰是因为我们**从无控分布采样**——绝大多数轨迹代价极高、权重趋零,少数侥幸轨迹主导了估计(正是 §1.2 末尾"方差爆炸"、ESS 坍缩的那个病灶)。
这把三件事串成了一条因果链:采样分布差 → ESS 低 → 估计偏差大。改善采样分布(warm-start、合适的 \(\Sigma\))同时治这三者——这也再次印证了全章的主线"分布质量比样本数 \(K\) 更关键":\(K\) 只能以 \(O(1/K)\) 的慢速度压偏差,而把提议分布挪近最优能从根上让偏差消失。
本质洞察:很多人默认"蒙特卡洛估计是无偏的、多采样就行",但 MPPI 的权重估计**有偏**,且偏差与采样分布质量直接挂钩。这解释了一个实践现象:在难任务上盲目加大 \(K\),收益会递减(偏差只按 \(O(1/K)\) 降),而改善提议分布往往一步到位。换句话说,\(K\) 是在为"提议分布不够好"埋单——分布越接近最优,需要的 \(K\) 越小、偏差越低。这就是为什么后续所有变体(warm-start、有色噪声、协方差自适应、学习采样分布)的发力点都在"分布"而非"样本数"。
最优提议分布是零方差的:给"分布质量优先"一个严格的理由¶
"分布质量比 \(K\) 更关键"这句话,前面靠经验和偏差表支撑;它其实有一个干净的理论根基。重要性采样的估计**方差正比于权重的方差**(ESS 正是这个方差的倒数刻画),于是问题变成:什么样的提议分布让权重方差最小?答案漂亮得出奇——最优提议分布就是目标分布本身,此时方差精确为零。
直觉很简单:要估 \(I=\int\phi(x)\,\mathrm{d}x\),从提议 \(q\) 采样、用 \(\hat I=\frac1K\sum \phi(x_k)/q(x_k)\) 估计。如果 \(q(x)=\phi(x)/I\)(即归一化后的目标),那么每个样本的比值 \(\phi(x_k)/q(x_k)=I\) 恒等于真值——所有项都一样,估计量是常数,方差为零。
用一个一维高斯积分跑出来看:
import numpy as np
sig_phi = 0.5; I_true = np.sqrt(2*np.pi)*sig_phi # φ(x)=exp(-(x-2)²/2·0.5²), I=1.2533
def phi(x): return np.exp(-(x-2.0)**2/(2*sig_phi**2))
def IS_estimate(mu, K, rng): # 从提议 q=N(mu,0.5) 采样估 I
sq=0.5; x=mu+sq*rng.standard_normal(K)
q=np.exp(-(x-mu)**2/(2*sq**2))/(np.sqrt(2*np.pi)*sq)
return np.mean(phi(x)/q)
for mu in [0.0, 1.0, 1.5, 1.9, 2.0]:
vals=np.array([IS_estimate(mu,200,np.random.default_rng(i)) for i in range(3000)])
print(f"μ={mu}: 估计均值={vals.mean():.4f} 标准差={vals.std():.4f}")
输出:
μ=0.0: 估计均值=0.9687 标准差=5.8455
μ=1.0: 估计均值=1.2515 标准差=0.5635
μ=1.5: 估计均值=1.2544 标准差=0.1157
μ=1.9: 估计均值=1.2536 标准差=0.0179
μ=2.0: 估计均值=1.2533 标准差=0.0000
提议均值从远处(\(\mu=0\),标准差 \(5.8\))移向目标中心,方差单调坍缩;当提议恰好等于目标(\(\mu=2\)、同宽)时,标准差精确为 \(0\)。这就是"最优(零方差)提议分布 = 目标分布"。
把它搬回 MPPI:我们的目标分布是吉布斯分布 \(\mathbb{P}^\star\propto\mathbb{Q}\,e^{-S/\lambda}\)。理想的提议分布就是 \(\mathbb{P}^\star\) 本身——可它恰恰是我们采样采不到的隐式分布(采得到就不用采样了)。
于是 MPPI 及其全部变体做的事,本质上都是**用各种手段构造一个尽量接近 \(\mathbb{P}^\star\) 的提议分布**:warm-start 用上一周期的解做起点、有色噪声匹配控制的时间相关性、协方差自适应让采样形状贴合低代价区、学习式采样直接拿网络拟合 \(\mathbb{P}^\star\)(第 3–6 章)。"分布质量优先于样本数"这句口号,至此有了它的定理:你不是在和 \(K\) 较劲,你是在向那个零方差的理想提议分布一步步靠近。
温度 \(\lambda\) 与采样协方差 \(\Sigma\):两个旋钮如何耦合¶
到这里你手上其实有两个旋钮,一个常被忽视:温度 \(\lambda\) 决定**怎么加权**采到的轨迹,采样协方差 \(\Sigma\) 决定**往哪里采**轨迹。实践中很多"调了 \(\lambda\) 却不见好"的困惑,根子在于把这两个旋钮当成独立的,而它们深度耦合。
回忆 §1.1 的 Kappen 条件 \(\Sigma=\lambda R^{-1}\)——在理论的连续时间根子上,这两个量本就被**绑死**:噪声协方差正比于温度。但落到算法层面,MPPI 通常把采样协方差 \(\Sigma\) 当成一个**独立**的实现超参数来调(Williams 2017 的 generalized importance sampling 正是允许这种自由)。
一旦解绑,两者就开始相互影响,体现在 ESS 上:
- \(\Sigma\) 太小:采样过于集中在当前控制序列附近,探索不到低代价区,绝大多数 rollout 代价相近 → 权重平 → ESS 偏高,但这是"没采到好东西的假健康"——你以为温度合适,其实是根本没东西可挑。
- \(\Sigma\) 太大:撒得太散,多数 rollout 飞到高代价区、权重趋零,只有少数侥幸轨迹主导 → ESS 坍缩到接近 \(1\) → 看起来像"温度太低",其实是采样太野。
- \(\lambda\) 与 \(\Sigma\) 必须配合调:给定一个 \(\Sigma\)(决定了代价分布的展开程度),\(\lambda\) 要匹配这批代价的尺度(§1.4 前面的标准差基准法);反过来,若 \(\Sigma\) 变了,代价分布的尺度也变,\(\lambda\) 通常要跟着重调。
这把全章反复出现的"采样分布质量"拆成了两个可操作的维度:\(\Sigma\) 管"采样覆盖到了正确的区域吗",\(\lambda\) 管"在覆盖到的样本里挑得对吗"。ESS 偏离健康区间时,第一反应不该只是拧 \(\lambda\),而要先问是哪个旋钮出了问题——ESS 太低且代价方差很大,多半是 \(\Sigma\) 太散或 \(\lambda\) 太小;ESS 太高且最优一直没改善,多半是 \(\Sigma\) 太小(没探到)。
第 3、4 章的协方差自适应与有色噪声,正是把 \(\Sigma\) 从一个手调常数升级为随问题自动塑形的对象——而理解它们的前提,是先认清 \(\lambda\) 与 \(\Sigma\) 这层耦合。
本质洞察:调 MPPI 不是调一个旋钮(\(\lambda\)),而是调一对耦合的旋钮(\(\lambda\) 与 \(\Sigma\)),它们在 ESS 这个共同仪表上的读数会相互混淆——单看 ESS 异常,分不清是"挑得不对"还是"采得不对"。理论的 Kappen 条件 \(\Sigma=\lambda R^{-1}\) 给了一个天然的起点(让二者保持正比),但实际部署里把 \(\Sigma\) 解绑能换来更强的探索控制——代价是你得同时为两个旋钮负责。把"采样覆盖(\(\Sigma\))"与"权重集中(\(\lambda\))"在脑子里分开诊断,是从"瞎调参"迈向"按仪表调参"的关键一步。
Kappen 双缝:温度引发的对称性破缺¶
\(\lambda\) 的作用不止是"调锐度"这么温和——在合适的问题上,它能引发策略的**质变(相变)**。Kappen 2005 的双缝例子是最干净的演示。
设置:一维粒子要在终点穿过一道墙上的**两条窄缝**(位于 \(x=\pm1\)),终端代价 \(\phi(x)=\infty\) 除两缝处为 \(0\),运行代价 \(V=0\)。由 Feynman–Kac,desirability \(\psi\) 是两条缝各自贡献的高斯之和;最优控制 \(u^\star=\lambda\partial_x\log\psi\) 决定粒子是"瞄准某一条缝"还是"先朝中间走"。
具体写出来。无控动力学是布朗运动,从 \((x,t)\) 出发的终点 \(x_T\sim\mathcal{N}(x,\,\nu(T-t))\)(\(\nu\) 即噪声方差,对应前文的 \(\sigma^2\))。
终端代价只在两缝处为 \(0\)、别处为 \(\infty\),于是 Feynman–Kac 的期望塌缩为"落到两缝邻域的概率密度之和"——desirability 是两个高斯的叠加:
在对称点 \(x=0\) 两高斯贡献相等,\(\partial_x\log\psi=0\)——粒子"不偏不倚"。但这个对称解**稳不稳定**,取决于 \(\psi\) 在 \(0\) 附近是单峰还是双峰:当两高斯方差 \(\nu(T-t)\) 足够大(目标远、噪声大),它们充分重叠、\(\psi\) 在 \(0\) 处单峰,对称解稳定——最优策略是"待在中间、让噪声替你探索、临到墙前才被某侧细节推过去";当方差足够小(目标近、噪声小),两高斯分得很开、\(0\) 处塌成双峰间的鞍,对称解失稳——最优策略**自发选定一条缝**committed 过去。
两种区制的分界,恰好落在下面这个无量纲量跨过 \(1\) 的地方。
Kappen 证明,这个问题的最优代价里出现了一个**逆温度** \(\beta=\dfrac{1}{\nu T}\)(\(\nu\) 为噪声强度,\(T\) 为到达墙的剩余时间),系统行为以 \(\nu T=1\) 为临界点发生**自发对称性破缺**:
| 区制 | 条件 | 逆温度 \(\beta=1/(\nu T)\) | 最优策略 |
|---|---|---|---|
| 高温 | \(\nu T>1\)(目标远 / 噪声大) | 小 | 在两缝之间瞄准中点——保持选项开放,让噪声替你探索,临近才决定("延迟决策 / delayed choice") |
| 低温 | \(\nu T<1\)(\(T<1/\nu\),目标近 / 噪声小) | 大 | committed 地瞄准其中一条缝——对称被打破,早早押注 |
而确定性极限 \(\nu\to0\)(等价于 \(\lambda\to0\)、温度趋零)**永远**从一开始就锁定一条缝——这正是确定性最优控制**看不见"延迟决策"这种策略**的原因:它没有噪声可借,也就没有"先保持模糊、晚点再选"的概念。
本质洞察:温度不是一个"差不多就行"的调参旋钮,它能让最优策略发生**定性翻转**。高温下,最优策略是"保持选项开放、让噪声替你探索、晚点再决定"(hedging / 延迟决策);低温下,最优策略是"早早押注一条路"(commit)。MPPI 调 \(\lambda\),本质上是在这两种**性质截然不同**的行为之间切换——这就解释了为什么 \(\lambda\) 调不好不是"性能差一点",而是"策略变味":\(\lambda\) 太大,控制像个"在所有选项间反复犹豫、迟迟不决"的人,输出抖动、不果断;\(\lambda\) 太小,控制像个"看到第一个还行的选项就死命扑上去"的人,过度自信、被单条侥幸轨迹带偏、还可能在动态环境里因过早 commit 而撞上后来才出现的障碍。把双缝的 \(\nu T\) 映射回 MPPI,你就有了调 \(\lambda\) 的物理直觉,而不是盲目试数。
真实系统上的双缝:单摆 swing-up 的多模地形¶
双缝是个抽象例子,但它的结构在你真会去控的系统上一字不差地重现。看**单摆 swing-up**:摆从最低点(\(\theta=0\))出发,要甩到最高点(\(\theta=\pi\))。
它是**欠驱动**的——力矩通常不足以一次直接推上去,得来回摆动积累能量(SMPPI、Biased-MPPI 等都拿它当标准非凸测试)。关键在于:**顺时针**使劲和**逆时针**使劲都能把摆甩上去,二者等价又互斥——这正是双缝的两条缝。
把控制简化成一个常值力矩 \(u\)(这是对控制空间切一条一维线,好让地形看得见),从静止摆出 \(H\) 步,记录终端到上方的代价,再算它的 desirability \(\psi(u)=e^{-\text{cost}/\lambda}\)(§1.1 的合意度,纯理论量):
import numpy as np
g, l, m, b = 9.81, 1.0, 1.0, 0.05; I = m*l*l; dt, H = 0.05, 60
def rollout_const(u): # 常值力矩 u 下摆 H 步,返回终端 (θ, ω)
th, om = 0.0, 0.0 # 从最低点静止出发
for _ in range(H):
om += (u - b*om - m*g*l*np.sin(th))/I * dt
th += om*dt
return th, om
def ang_to_up(th): # 到 π(上方)的角距离,wrap 到 [-π, π]
return (th - np.pi + np.pi) % (2*np.pi) - np.pi
us = np.linspace(-8, 8, 400)
cost = np.array([ang_to_up(rollout_const(u)[0])**2 + 0.1*rollout_const(u)[1]**2 for u in us])
for lam in [2.0, 0.3]:
psi = np.exp(-(cost - cost.min())/lam); w = psi/psi.sum()
peaks = [round(us[i],1) for i in range(1,399) if psi[i]>psi[i-1] and psi[i]>psi[i+1] and psi[i]>0.2]
print(f"λ={lam}: ψ 双峰@{peaks} 软加权 E[u]={(w*us).sum():+.3f}")
输出:
代价地形是**对称双谷**:\(u=\pm7.2\) 两个等代价低谷(顺/逆时针各甩上去),中间 \(u\approx0\) 是高代价脊(力矩太弱、甩不上去)。desirability 相应地是**双峰**。
最刺眼的是最后一列:对这两个对立模式做**软加权平均,得到的"最优控制"是 \(\mathbb{E}[u]\approx0\)——原地不动,恰恰是最差的动作!** 把"向左甩"和"向右甩"平均,结果是"不甩"。
这就是双缝的对称性破缺在真实系统上的样子,也暴露了一个深刻的陷阱:面对多模,盲目取均值会落进两个模式中间的高代价区。出路正是 §1.4 反复讲的——降低温度让对称性破缺、commit 到其中一个模式(低温下 \(\psi\) 的两峰中必有一个被偶然的不对称放大而胜出),而不是骑墙。
这也与上一节"前向 vs 反向 KL"接上了:反向 KL(模式寻找)会收紧到单峰、给出一个能用的甩法,而朴素的"对所有 rollout 取加权均值"在严格对称时会对消——这正是 vanilla MPPI 在多模问题上需要协方差自适应、多模采样(第 3、4 章)来补强的根本原因。
注意这里只演示了**代价地形的多模性**这一理论事实(一维切片 + desirability),并未实现单摆的闭环控制器——把 mppi_step 真正适配到单摆、在线跑出完整 swing-up,是 §1.5 留给你的练习。先看清地形长什么样,再去写控制器,你就知道自己在和一个怎样的非凸问题打交道。
一个常见误区:为什么不能"先解确定性最优,再加点噪声"¶
学到这里有人会问:既然随机这么麻烦,能不能先把**确定性**最优控制解出来(忽略噪声),再在执行时随便加点探索噪声了事?答案是不能——这恰好错过了本章温度 \(\lambda\) 所编码的全部精髓。随机最优控制与"确定性最优 + 加噪声"在三件事上本质不同。
其一,最优动作本身依赖噪声大小,而不只是被噪声扰动。 双缝和单摆都已展示:噪声/温度跨过临界值,最优策略会从"committed 押一条路"定性翻转**成"hedge 在中间等信息"(§1.4)。确定性解永远只会 commit(它没有噪声可借),所以"延迟决策 / 保持选项开放"这种策略它**根本算不出来——这不是加噪声能补的,是最优解的结构变了。
其二,它隐含的风险态度不同。 由 §1.3 的风险敏感视角,随机最优控制的自由能 \(\approx\mathbb{E}[S]-\mathrm{Var}[S]/2\lambda\) 天然带一个方差项;确定性最优只优化名义轨迹的代价,对"代价的分布"视而不见。在噪声大、有碰撞风险的场景,确定性解可能选一条名义最优但方差极大(偶尔灾难)的路,而随机最优会权衡这个方差。
其三,它对待反馈/信息的方式不同。 随机最优控制内蕴"未来能观测、能修正"的假设(接收水平正是利用这一点,§1.5),于是它愿意先走一步"保持灵活"的棋;确定性最优把整条轨迹一次性定死,不为"将来的信息"留余地。这就是控制论里"确定性等价"近似失效的地方——当不确定性大到会改变当前决策时,把随机问题当确定性问题来解就是错的。
所以本章不是把确定性最优控制复杂化,而是在解一个**结构上不同**的问题:温度 \(\lambda\) 不是给确定性解外挂的探索旋钮,而是决定最优策略形态、风险态度与信息利用方式的内在参数。这也是为什么"加噪声版的 iLQR"替代不了 MPPI——后者从一开始就在随机的框架里求解。
⚠️ 常见陷阱¶
💡 概念误区:以为 \(\lambda\) 有一个"通用好值"。 - 错误描述:把某个项目里调好的 \(\lambda\)(比如 \(1.0\))当成普适常数,换问题直接照搬。 - 现象 / 后果:新问题的代价量级不同,同一个 \(\lambda\) 要么让权重全部坍缩到一条(ESS→1,抖动发散),要么让权重均匀(ESS→K,原地不动),表现莫名其妙地差。 - 根本原因:进入指数的是无量纲量 \(S/\lambda\),\(\lambda\) 的"合适值"完全由代价 \(S\) 的尺度决定,而代价尺度随系统、随代价函数设计而变。 - 正确做法:把 \(\lambda\) 锚定到代价的尺度上——用一批 rollout 代价的标准差做量级基准,再据 ESS(目标落在 \(0.1K\sim0.5K\))微调。绝不跨问题照搬数值。
🧠 思维陷阱:把 \(\lambda\) 越调越小以追求"更优解"。 - 错误描述:以为"温度越低越贪心、越贪心越接近最优",于是不断减小 \(\lambda\)。 - 现象 / 后果:\(\mathrm{ESS}\to1\),控制只信一条偶然的最低代价轨迹,方差暴涨、剧烈抖动;在动态环境里因过早 commit(对应双缝低温区制)撞上后出现的障碍。 - 根本原因:低温的"贪心"信任的是**采样噪声里的运气**,不是真正的最优;它还杀死了探索(hedging),而探索在不确定/动态环境里是安全性的来源。 - 正确做法:把 \(\lambda\) 留在 ESS 健康区间,让权重集中在"一簇"低代价轨迹而非"一条"。需要更优时,优先改善采样分布质量(warm-start、协方差、先验),而不是一味降温。
💡 概念误区:把"对称性破缺"当成需要消除的 bug。 - 错误描述:看到 MPPI 在某些情形下"果断锁定一条路、不再 hedge",以为是温度没调好导致的失常。 - 现象 / 后果:盲目升高 \(\lambda\) 强行让控制"别那么果断",结果在本该 commit 的近距离/确定场景下反而犹豫、错失最优。 - 根本原因:对称性破缺是**最优策略本身**在低温/近距离区制下的正确形态(双缝里 \(\nu T<1\) 时就该瞄准一条缝),不是数值故障。 - 正确做法:根据任务的"剩余时间 vs 噪声"(即 \(\nu T\) 的类比量)判断当前该 hedge 还是该 commit,让 \(\lambda\) 服务于这个判断;commit 在确定、临近、单选场景下是对的,hedge 在不确定、动态、多选场景下是对的。
🧠 思维陷阱:以为加大 \(K\) 总能消除估计误差。 - 错误描述:默认"蒙特卡洛多采样就准",于是难任务上一味堆大 \(K\) 来压低误差。 - 现象 / 后果:\(K\) 翻倍带来的改善越来越小,算力涨上去、效果不见涨;尤其在采样分布离最优很远时,再大的 \(K\) 也救不回来。 - 根本原因:MPPI 用的是**自归一化重要性采样**,估计器**有偏**,偏差只按 \(O(1/K)\) 这种慢速度衰减(§1.4 偏差表:\(K\) 每翻 \(4\) 倍偏差才减半),且偏差大小由采样分布质量主导——分布差时偏差基数就大。 - 正确做法:把算力优先投到**改善提议分布**(warm-start、合适的 \(\Sigma\)、有色噪声),而不是单纯堆 \(K\);用 ESS 监控分布质量。\(K\) 是在为"分布不够好"埋单,治本在分布。
练习¶
- (推导题) 严格证明软最小值的两个极限:(a)\(\lambda\to0^+\) 时 \(-\lambda\log\frac1K\sum_k e^{-S_k/\lambda}\to\min_k S_k\)(提示:把最小项提出指数);(b)\(\lambda\to\infty\) 时该量 \(\to\frac1K\sum_k S_k\)(提示:对 \(e^{-S/\lambda}\) 做一阶泰勒展开再取对数展开)。在草稿纸上完成。
- (计算题) 推导归一化权重的有效样本数 \(\mathrm{ESS}=1/\sum_k w_k^2\),并证明 \(\mathrm{ESS}\in[1,K]\),分别在 \(\lambda\to0\) 与 \(\lambda\to\infty\) 时取到两端。给定一组具体代价(例如 \(S=[0,1,2,3]\),\(K=4\)),写出 \(\mathrm{ESS}(\lambda)\) 的表达式,并(数值或定性地)求使 \(\mathrm{ESS}=2\) 的 \(\lambda\)。
- (开放思考题) 在 Kappen 双缝里,把那道墙换成一个**会移动的障碍**(动态环境)。低温下的 committed 策略(早早瞄准一条缝)此时可能正好撞上移动到该缝的障碍。请论证:为什么在动态/不确定环境下,适度的高温(保持 hedging、延迟决策)反而更安全?这个"先别把路走死、留好备选分支"的思想,与不确定性规划专题里的 contingency planning(分支应急规划)有什么本质联系?
- (计算 + 分析题) 用正文的单摆地形代码,把力矩范围从 \(\pm8\) 逐步缩小(或加大阻尼 \(b\)),观察双谷如何变化。存在一个临界力矩,低于它两个低代价谷消失(再大的单次力矩也甩不上去,必须多次摆动积累能量)。找到这个临界值,并解释它和双缝里临界 \(\nu T=1\) 在"对称性是否破缺/解是否存在"意义上的类比。(只做地形分析,不要求实现控制器。)
- (推导 + 数值题) 证明:用重要性采样估计 \(I=\int\phi\) 时,若提议 \(q=\phi/I\),则估计量方差为零(提示:每个样本的 \(\phi(x)/q(x)\) 都等于常数 \(I\))。再把正文的零方差代码改成估计 \(\mathbb{E}_{\mathcal{N}(0,1)}[x^2]\),找出使方差最小的提议分布族参数,验证它不是 \(\mathcal{N}(0,1)\) 本身——并解释为什么(提示:被积量是 \(x^2\cdot\) 密度,最优提议正比于"被积函数的绝对值",而非目标密度)。
理论到此为止。最后一节把 §1.3 的权重公式落成约 20 行能跑的代码——你会亲眼看到,整章的 HJB、指数变换、Feynman–Kac、自由能对偶,最终**坍缩成一个五行的核心循环**;而理论的全部价值,恰恰体现在你知道这五行为什么对、每个常数该取多少、坏了往哪查。
§1.5 从公式到代码:最简 MPPI 与 Mini-MPPI 累积项目 ⭐⭐¶
这一节解决什么问题:把 §1.3 的权重公式落成可运行的最简 MPPI(约 20 行 NumPy),逐行对照公式,并把它定为贯穿整个采样式 MPC 方向的 **Mini-MPPI 累积项目**的第 0 个模块。
动机¶
"理解了"和"能写出来"是两回事。一个概念只有当你能把它落成代码、且每个符号都说得出对应公式里的哪一项时,才算真正掌握。
本节把 §1.3 的权重公式 \(w_k=\mathrm{softmax}(-(S_k-\rho)/\lambda)\) 与更新 \(u_t\mathrel{+}=\sum_k w_k\varepsilon_k(t)\) 变成可以亲手跑的代码,并刻意保持最简——只有理论核心,没有任何工程修饰,好让公式与代码一一对得上。
如果不这样做会怎样¶
不动手,权重公式就永远停在纸面。你不会知道 ESS 在 \(\lambda\) 变化时怎么动、控制轨迹在 \(\lambda\) 太大/太小时长什么样、自由能是不是真的单调下降。这些直觉只能从"跑一遍、调一调、看曲线"里长出来——这也是本节配套练习全部要求动手的原因。
最简 MPPI(一维点质量,延续贯穿例子)¶
下面是 MPPI 的理论最小核,控制对象就是 §1.2/§1.3 一路用下来的一维点质量。代码刻意写成向量化形式,因为 \(K\) 条 rollout 本就相互独立——这正是第 2 章把它搬上 GPU 的前提。
import numpy as np
def mppi_step(x0, U, K=256, H=30, dt=0.02, sigma=1.0, lam=1.0, a=5.0, r=1.0):
# 1. 采样噪声 ε_k ~ N(0, σ²),形状 (K, H) —— 对应 §1.3 基分布 Q
eps = sigma * np.random.randn(K, H)
# 2. K 条 rollout 并行前向模拟,累积每条的总代价 S_k —— 对应 S(τ)=φ+∫V
x = np.full(K, x0) # K 个并行状态(一维点质量)
S = np.zeros(K)
for t in range(H):
v = U[t] + eps[:, t] # 微扰控制 u_t + ε_k(t)
x = x + v * dt # 动力学 dx = u dt(黑箱即可,无需可微)
S += 0.5 * r * v**2 * dt # 运行(控制)代价;本例状态运行代价 V=0
S += 0.5 * a * x**2 # 终端代价 φ(x_T) = (a/2) x_T²
# 3. 权重:ρ 减法 + softmax —— 对应 §1.3 第六步稳定化
rho = S.min() # ρ = min_k S_k,log-sum-exp 稳定化
w = np.exp(-(S - rho) / lam)
w /= w.sum() # 归一化,Σ_k w_k = 1
# 4. 加权更新控制序列 —— 对应 u_t += Σ_k w_k ε_k(t)
U = U + (w[:, None] * eps).sum(axis=0)
return U, S, w
逐块对照 §1.3 的公式:第 1 块从基分布 \(\mathbb{Q}\)(当前控制 \(U\) + 高斯噪声)采样;第 2 块把每条 rollout 前向积分、按 \(S_k=\phi(x_T)+\sum_t V\Delta t\)(这里运行代价含控制项 \(\tfrac12 r v^2\))累积总代价——注意动力学 x + v*dt 可以换成任意黑箱仿真器,整段不需要任何梯度;第 3 块是权重公式 \(w_k=\exp(-(S_k-\rho)/\lambda)/\sum_j\exp(\cdot)\),rho = S.min() 就是 \(\rho\) 减法;第 4 块 (w[:,None]*eps).sum(0) 正是 \(u_t\mathrel{+}=\sum_k w_k\varepsilon_k(t)\)。整个 MPPI 的理论核心,就是这四块、约二十行。
跑一跑:看加权更新把代价压下去¶
mppi_step 返回更新后的控制序列。把它在固定初始点 \(x_0=2\) 上反复迭代(每次拿上一轮的 \(U\) 作起点),记录**标称计划**(无噪声地执行 \(U\))的终点 \(x_T\) 与轨迹代价 \(J\):
def nominal(x0, U, a=5.0, r=1.0): # 无噪声执行标称 U,返回终点与轨迹代价
x, J = x0, 0.0
for t in range(H):
J += 0.5*r*U[t]**2*dt; x += U[t]*dt
return x, J + 0.5*a*x**2
U = np.zeros(H); x0 = 2.0
for it in range(8):
xT, J = nominal(x0, U)
print(f"iter {it}: x_T={xT:+.3f} J={J:.3f}")
U, S, w = mppi_step(x0, U, K=1024, sigma=0.7, lam=0.49)
输出:
iter 0: x_T=+2.000 J=10.000
iter 1: x_T=+1.886 J=8.907
iter 2: x_T=+1.780 J=7.965
iter 3: x_T=+1.680 J=7.146
...
iter 7: x_T=+1.350 J=4.908
每一次加权平均更新都让标称计划的代价**严格下降**——这正是 §1.3 权重公式在做的事:把控制序列朝"低代价 rollout 的加权方向"挪一步。继续迭代,\(x_T\) 会持续逼近 \(0\)。
注意它收敛得**不快**——单次更新只是温和的加权平均,没有学习率去放大步长;真实 MPPI 不靠"把单步调猛",而靠**高频重规划**:每个控制周期算一次、立刻执行 \(u_0\)、下个周期在新状态上再算一次,用更新频率换取单步的温和与稳健。如何让这"每周期算一次"在毫秒内完成(warm-start 复用 + GPU 并行),正是第 2 章的主题。
为什么只执行第一个控制:开环序列如何变成闭环反馈¶
上一段说"每周期算一次、只执行 \(u_0\)、下周期重算",这个做法叫**接收水平控制(receding-horizon control)**,是 MPC 的核心范式,值得讲清它的理论依据。
MPPI 每次规划,产出的是一整条长度为 \(H\) 的控制序列 \(U=(u_0,u_1,\dots,u_{H-1})\)。如果把这整条序列**一口气执行完**,那它就是一个**开环(open-loop)**计划——一旦开跑就不再看状态,期间任何扰动、任何模型误差都无法纠正。
而接收水平控制只执行第一个 \(u_0\),然后在**新测得的真实状态**上重新规划下一条序列。这一步"重新测量 + 重新规划"正是反馈的来源:单次规划是开环的,但'执行一步—重测—重规划'的循环把它变成了闭环(closed-loop)反馈控制。
这也是为什么 §1.5 的最简版收敛慢却仍能实用——真实系统靠高频重规划补偿单步的温和,扰动来了下一周期就修正。
那为什么不执行更多步、非要每步重规划?有两层原因。其一是**反馈频率**:执行的步数越少、重规划越频繁,对扰动和模型误差的响应越快;只执行 \(u_0\) 是把反馈频率拉满。
其二与一个常被忽视的近似有关——确定性等价(certainty equivalence)。MPPI 在 rollout 时通常按"名义动力学"前向模拟,把未来当作确定的来优化,而真实世界有噪声和误差;执行一长串"在确定性假设下算出的"控制会让这个假设的偏差累积,重规划则不断用新的真实状态把偏差清零。
换句话说,越频繁地重规划,确定性等价这个近似带来的伤害越小。
值得强调的是,这套反馈来自**外层的重规划循环**,而不是 MPPI 单次求解内部——单次 MPPI 给的始终是一条开环序列。这一点也划清了与第 2 章的边界:本章讲清"为什么执行 \(u_0\) 并重规划能得到反馈"这个原理,而"如何让重规划快到能高频运行"(warm-start 把上次的 \(U\) 左移一位热启动、GPU 把数千条 rollout 并行)是第 2 章的工程主题。
时域 \(H\) 该取多长:截断与远见的权衡¶
代码里那个 \(H\)(rollout 步数 / 预测时域)不是随便定的,它在三件事之间权衡。太短,控制器"看不到"远处的后果——典型表现是贪图眼前低代价、撞上视野之外的障碍,或在需要提前减速的弯道前反应不及(短视)。
太长,每条 rollout 的计算量线性增加,更要命的是**采样难度随 \(H\) 指数上升**:控制序列的维度是 \(H\times m\),维度越高,随机采样能"撞中"一条好序列的概率越低、ESS 越容易坍缩(这也是为什么长时域更依赖好的提议分布而非裸采样)。
理论上,有限 \(H\) 引入一个**截断偏差**:真正的最优控制对应无穷(或到任务结束的)时域,砍到 \(H\) 步等于假装"\(H\) 步之后世界就不重要了"。一个标准的缓解办法是给 rollout 末尾加一个**终端代价 / 终端值函数**当作"\(H\) 之后所有代价的近似"——若这个终端值取得准(例如来自一个学到的价值网络,见后续 TD-MPC 一类工作),短时域也能逼近长时域的决策质量。
这正是 MPC 与 RL 的接口之一:用学到的值函数补偿时域截断。
接收水平控制还顺带软化了短 \(H\) 的伤害:即便单次只看 \(H\) 步,每个周期都重新规划、视野随之不断前移("滚动"时域之名由此而来),于是有效的决策跨度远大于单次的 \(H\)。实践中常取一个"够覆盖任务关键动态"的中等 \(H\),靠高频重规划补足远见,而不是把 \(H\) 一味拉长去硬扛采样维度的爆炸。
同一套数学在 C++ 里的样子(通往第 2 章的桥)¶
NumPy 版用来**验证理论**最清楚,但真实机器人上跑的是 C++。这里给出**同样那二十行核心**的最小 C++ 版——只用标准库(std::vector + <random>,不引 Eigen,保持可读),四块结构与上面的 mppi_step 严格一一对应。
它的作用是让你看清"权重公式落到部署语言里是什么样",而把 warm-start、CUDA、ROS2 这些真正的工程化留给第 2 章:
#include <vector>
#include <random>
#include <cmath>
using std::vector;
// 一维点质量:dx = u·dt + σ·dW,代价 S = Σ ½r v²dt + ½a x_T²
vector<double> mppi_step(double x0, vector<double> U,
int K, int H, double dt, double sigma,
double lam, double a, double r, std::mt19937& rng) {
std::normal_distribution<double> gauss(0.0, sigma);
vector<vector<double>> eps(K, vector<double>(H));
vector<double> S(K, 0.0);
for (int k = 0; k < K; ++k) { // [1][2] 采样 ℚ + 前向 rollout + 累积代价
double x = x0;
for (int t = 0; t < H; ++t) {
eps[k][t] = gauss(rng);
double v = U[t] + eps[k][t];
x += v * dt; // 动力学:可换成任意黑箱仿真器
S[k] += 0.5 * r * v * v * dt;
}
S[k] += 0.5 * a * x * x; // 终端代价
}
double rho = S[0]; // [3] 权重 w ∝ exp(-(S-ρ)/λ),ρ=min 稳定化
for (double s : S) rho = std::min(rho, s);
vector<double> w(K); double Z = 0.0;
for (int k = 0; k < K; ++k) { w[k] = std::exp(-(S[k] - rho) / lam); Z += w[k]; }
for (double& wi : w) wi /= Z;
for (int t = 0; t < H; ++t) { // [4] 更新 u_t += Σ_k w_k ε_k(t)
double du = 0.0;
for (int k = 0; k < K; ++k) du += w[k] * eps[k][t];
U[t] += du;
}
return U;
}
g++ -O2 -std=c++17 编译,在同样的迭代驱动下,代价同样从 \(10.0\) 单调降到约 \(5.0\)(与 NumPy 版趋势一致,数值差异仅来自随机数发生器不同)。把两版并排,你会看到一个**逐行对应**:NumPy 的 np.random.randn(K,H) 对应这里的 gauss(rng) 双层循环,S.min() 对应 std::min 归约,np.exp(-(S-rho)/lam) 与归一化一字不差,(w[:,None]*eps).sum(0) 对应最后那个手写的加权累加。
差别只在"怎么写循环",数学完全相同。而这也正暴露了 C++ 朴素版的瓶颈所在:那个 for k 的 rollout 循环是串行的,\(K=1024\) 条轨迹一条接一条算——可它们**彼此独立**(§1.2 本质洞察反复强调的那点),天然就是 GPU 数千线程的完美负载。
第 2 章要做的,正是把这个串行 for k 搬成一个 CUDA kernel、再叠上 warm-start 与执行器平滑,让它从"能跑"变成"毫秒级实时可部署"。所以这段 C++ 不是终点,是把理论最小核交到部署语言手里的**交接点**。
算一笔账:MPPI 的计算复杂度¶
把"为什么非要 GPU"量化一下。MPPI 单次规划的主要开销在 rollout:\(K\) 条轨迹,每条前向积分 \(H\) 步,每步算一次动力学与单步代价。
记单步动力学+代价的开销为 \(c\),则单次规划是 \(O(K\cdot H\cdot c)\);权重计算(softmax)只是 \(O(K)\)、控制更新 \(O(K\cdot H)\),都被 rollout 淹没。所以复杂度几乎全压在 \(K\cdot H\) 上。
关键不在这个量级本身,而在它的**结构**:\(K\) 条 rollout 彼此完全独立——第 \(k\) 条的积分不依赖第 \(j\) 条。这意味着对 \(K\) 这一维是**尴尬并行(embarrassingly parallel)**的:串行 CPU 要花 \(K\) 倍单条时间,而 GPU 可以让数千条 rollout 几乎同时跑完,把"乘以 \(K\)"这件事从时间成本变成空间(线程)成本。
于是实时性的算盘变成:单条 rollout 的 \(H\) 步是**串行**的(时间维有依赖,逃不掉),但 \(K\) 条之间**并行**——GPU 把前者扛在每个线程里、后者铺在数千线程上,\(K=2048\)、\(H\) 几十步的规划就能压进毫秒级。
这也把本章的几处提示连成一条因果:§1.2 的本质洞察说"Feynman–Kac 把解方程变成 forward 采样、\(K\) 条独立",正是这个独立性让 GPU 可行;§1.4 说"加大 \(K\) 收益递减(偏差 \(O(1/K)\))",于是实践上不会把 \(K\) 堆到天上,而是配合好的提议分布用中等 \(K\)。一句话:MPPI 的复杂度对 \(K\) 线性、对 \(K\) 并行、对 \(H\) 串行——理解这三点,第 2 章为什么把全部工程押在 GPU 并行与 warm-start(缩短有效 \(H\) 的重算)上,就一目了然了。
这二十行缺了什么(前向预告第 2 章)¶
这是**理论最小核**,刻意省略了所有工程组件——它能验证理论、能建立直觉,但**不能直接上真实机器人**。第 2 章会逐一补全:
| 缺失组件 | 作用 | 在哪补 |
|---|---|---|
| Warm-start shift | 每周期把 \(U\) 左移一位复用上次计算,而非从零开始 | 第 2 章 §2.1 |
| Savitzky–Golay 平滑 | 抑制加权平均带来的高频抖动(牺牲信息论最优换执行器友好) | 第 2 章 §2.1 |
| GPU / CUDA 并行 | 把这里的向量化 rollout 真正铺到数千线程,达到实时(~ms 级) | 第 2 章 §2.2 |
| 协方差自适应 / 有色噪声 | 改善采样分布质量(§1.3 反复强调的"分布比 \(K\) 更关键") | 第 3、4 章 |
| 约束处理 | 用 barrier / 投影 / 拒绝采样处理硬约束 | 第 3 章 |
本质洞察:整章的全部理论——非线性 HJB 的指数线性化、Feynman–Kac 把 PDE 解成期望、自由能–KL 对偶给出吉布斯分布——最终坍缩成上面这四块、约二十行代码。理论的价值**从来不是让代码更长**,恰恰相反,是让你在面对这极简的二十行时,知道它为什么对、每个常数该取多少、出问题往哪查:为什么是指数权重而不是别的(自由能对偶的闭式解)、\(\lambda\) 该多大(ESS / 代价尺度)、为什么必须减 \(\rho\)(log-sum-exp 数值稳定)、为什么不需要梯度(\(S\) 只作标量进指数)。这正是"理论教学"相对"直接调库"不可替代的地方——调库的人写得出这二十行,但调不动、查不出、迁不走。
MPPI 不是唯一的采样优化器:它在家族中的位置¶
写完这二十行,值得退一步看:MPPI 只是"用采样做轨迹优化"这个大家族里的一员。认清它和兄弟方法的关系,能帮你判断什么时候该用它、什么时候该换。
这些方法**共享同一个骨架**——从一个提议分布采一批控制序列、前向 rollout 评代价、按某种规则把样本加权平均成新的提议分布、迭代——区别只在那个**加权规则(shaping function)**:
| 方法 | 权重规则 \(w_k\) | 更新什么 | 一句话特征 |
|---|---|---|---|
| 随机打靶(random shooting) | 只取最优一条(\(\arg\min\)) | 直接输出最优序列 | 最朴素;不复用群体信息 |
| CEM(交叉熵方法) | 精英指示:\(\mathbb{1}\{S_k\le S_{\text{elite}}\}/N_e\)(硬选 top-\(k\)) | 均值**和**协方差,重拟合到精英集 | 硬阈值;自适应协方差 |
| MPPI | 指数软权:\(e^{-(S_k-\rho)/\lambda}/\sum_j(\cdot)\)(软选全样本) | 通常只更新均值 | 软加权;权重含可解释温度 |
并排看,CEM 与 MPPI 是**同一根轴的两端**:CEM 把权重做成"精英集内为 \(1\)、集外为 \(0\)"的硬指示,等于一个温度为零的阶跃;MPPI 用 \(e^{-S/\lambda}\) 的软指数,所有样本都按代价连续加权。从 §1.4 的视角,CEM 是 \(\lambda\to0\) 加上"只在 top-\(k\) 内平均"的特例,MPPI 则保留了一个可调的有限温度。
两者还有一个常被强调的差别:经典 CEM 会**重新拟合整个高斯**(均值与协方差都更新),而最朴素的 MPPI 只挪均值——这也是为什么实践中常给 MPPI 补上协方差自适应(第 3、4 章),让它享受 CEM 那样的分布塑形能力。更妙的是,二者在理论上同源:CEM 本就是基于 KL(交叉熵)最小化的自适应重要性采样(Rubinstein 1997;de Boer 等 2005 的教程是标准入口),而 MPPI 的权重来自同一个 KL 正则推断(§1.3)——它们是同一个"用采样逼近最优分布"思想下,对"如何加权"做出的不同选择。
这个"共享骨架、只换权重规则"的统一视角,是把整个采样式 MPC 家族(还包括 Predictive Sampling、CMA-ES 等)串起来的主线,也是本方向后续专门一章的主题;这里先把 MPPI 在地图上的位置标好——它是**软指数加权、温度可解释**的那一支。至于和**梯度式**优化器(如 iLQR/DDP)的对比,那是另一根轴(要不要梯度、要不要可微模型),留给本节练习去想。
把"权重规则"这根轴再铺开一点,家族的谱系就更清楚了。最极端的一端是 Predictive Sampling(Howell 等 2022 的 MuJoCo MPC 用的就是它):权重退化成"只取最优一条",连指数和精英集都不要,固定一个采样噪声、每步重采、取代价最低的序列——简单到极致,靠高频重规划兜底。
往中间走是 CEM 的精英硬选与 MPPI 的指数软权。还有介于"硬选"与"全员等权"之间的 rank-based 权重(按代价排名赋权,而非按代价值),它对代价的绝对尺度不敏感、更鲁棒,是 CMA-ES 等进化策略的常用做法。
把这些并排,你会发现它们只是在同一根"从硬到软、从看代价值到看代价排名"的谱线上取了不同的点——选哪个,取决于你的代价尺度是否可靠、是否需要可解释的温度、以及每周期能负担多少次内迭代。MPPI 之所以在机器人上流行,是因为它的软指数权既给了可解释的温度旋钮(§1.4),又能一步算完、配合高频重规划跑实时。
代价函数该怎么设计:从权重公式倒推¶
MPPI 的"调参"很大一部分其实是**设计代价 \(S\)**。理解了 §1.3 的权重和 §1.4 的 ESS,几条设计原则就能直接倒推出来,而不必靠试错。
第一,代价的尺度要和 \(\lambda\) 匹配,或反过来。 进指数的是无量纲量 \(S/\lambda\),所以真正决定权重锐度的是"代价的**展开范围**除以 \(\lambda\)"。一个常见错误是把不同量纲的代价项(位置误差、速度误差、控制能量)直接相加而不配权重,导致某一项的数值尺度淹没其余——此时无论怎么调 \(\lambda\),权重都只对那个主导项敏感。正确做法是先让各项量级可比,再用 §1.4 的"标准差基准"统一定 \(\lambda\)。
第二,低代价区要有"梯度"让采样能跟随。 这里的"梯度"不是数学梯度(MPPI 不求导),而是指**代价随状态平滑变化、给出方向感**。如果代价是一大片平地中间一个针尖最优(例如只有精确命中才给 0、周围全是同一个大常数),那么除非采样恰好撞中针尖,权重无从分辨好坏、ESS 坍缩——这正是上一节阶梯代价 ESS 只有 \(9/8000\) 的原因。实践上常给硬目标套一层平滑的"势"(如到目标的距离平方)作引导项,让远处的 rollout 也能按"离目标多近"被区分,把稀有事件变成可跟随的斜坡。
第三,硬约束用"大但有限"的罚值,别用 \(\infty\)。 障碍、越界等硬约束诱人写成 \(\infty\),但一旦**所有** rollout 都违约(采样没覆盖到可行区),\(e^{-\infty}=0\) 会让整批权重归零、\(\hat{\mathcal{F}}\) 变 NaN(见故障排查)。改用一个足够大但有限的罚值,既强烈抑制违约轨迹,又在"全员违约"时仍保留相对排序,让 MPPI 朝"违约最轻"的方向先挪一步。
第四,别忘了代价里隐含的风险态度。 由 §1.3 的风险敏感视角,同一个任务用"期望代价"还是"带方差惩罚的代价"会得到不同的冒险/保守倾向;安全攸关的项(碰撞、翻车)若只进期望,可能被低估。需要保守时,可在代价里显式加入对高代价事件的额外惩罚,或转向风险敏感的权重形式。
这四条都不是 MPPI 专属的玄学,而是"代价 → 权重 → ESS → 行为"这条因果链的直接推论。把代价设计当成"塑造 \(e^{-S/\lambda}\) 这个权重地形"来想,比逐项试参数高效得多。
累积项目:Mini-MPPI(贯穿全方向)¶
整个采样式 MPC 方向共享一个累积项目 Mini-MPPI——从这二十行起步,每学完一章给它加一个模块,到第 10 章成长为一个能在 ROS2 里跑实车的完整采样式 MPC 工程。本章交付**第 0 个模块**:
- 交付物:上面的
mppi_step+ 一个把它在一维点质量(及 pendulum)上闭环跑起来的驱动脚本,支持命令行调 \(\lambda\)、\(\sigma\)、\(K\)、\(H\)。 - 验证清单(跑通后应当观察到):
- 把 \(\lambda\) 从 \(0.01\) 扫到 \(100\),控制行为应从"剧烈抖动(ESS\(\approx 1\),过度自信)"过渡到"果断收敛(ESS 健康)"再到"原地不动的平均(ESS\(\approx\)K,盲目)"——亲眼复现 §1.4 的三种区制;
- 闭环代价随控制周期单调下降;
- 在一维点质量上,把 MPPI 输出与 §1.2 的闭式解 \(u^\star=-\frac{a/r}{1+(a/r)(T-t)}x\) 对比,\(K\) 越大两者越接近——用有闭式解的例子**验证实现正确性**;
- 固定一个偏离最优的初始控制,重复多次单步估计、看其均值与闭式真值的差距随 \(K\) 增大而缩小——亲眼看到估计器的偏差与 \(O(1/K)\) 衰减(§1.4);
- 在随机扰动较大的设置里把 \(\lambda\) 调小,观察控制变得激进/脆弱——体会 \(\lambda\) 作为风险旋钮的一面(§1.3 风险敏感);
- (选做)把权重规则从指数软权换成"取代价最低的 top-\(k\) 平均",就得到一个 CEM 风格的更新——亲手验证 §1.5 家族对比里"只换权重规则"的说法。
- 后续模块路线:第 2 章加 GPU/CUDA 与 warm-start/平滑 → 第 3 章加变体(Tube / 平滑 / 多模态)→ … → 第 10 章封装成 ROS2 节点上实车。
⚠️ 常见陷阱¶
💡 概念误区:把这二十行当成"MPPI 的全部"。 - 错误描述:跑通最简版后,以为 MPPI 就这么点东西,可以直接拿去控真实机器人。 - 现象 / 后果:上真机后发现控制抖得没法用(缺平滑)、每周期从零优化跟不上实时(缺 warm-start 与 GPU)、撞上约束(缺约束处理)。 - 根本原因:这二十行是**理论最小核**,刻意剥离了所有工程组件,目的是让公式与代码一一对应,而非可部署。 - 正确做法:把它当学习与验证的起点;可部署版需要第 2 章起逐章补全的工程模块(见上表)。
🧠 思维陷阱:验证新实现时直接上复杂系统。 - 错误描述:一上来就在 CartPole / 四旋翼上跑 MPPI,发现不 work 就猜是"算法不行"。 - 现象 / 后果:分不清问题出在算法实现、代价设计、还是 \(\lambda\) 调参,调试陷入泥潭。 - 根本原因:复杂系统把"实现正确性"和"调参/建模"耦合在一起,无法隔离变量。 - 正确做法:先在**有闭式解**的一维点质量上验证(与 §1.2 的解析解对比),确认实现无误后再上 pendulum / CartPole——这是一条隔离 bug 的黄金路径。
💡 概念误区:以为 NumPy 版"慢"是 MPPI 的固有缺陷。 - 错误描述:看到纯 NumPy / Python 的 MPPI 跑得慢,断言 MPPI 不适合实时控制。 - 现象 / 后果:错误地放弃 MPPI,或得出"采样式 MPC 不能实时"的错误结论。 - 根本原因:慢的根源是 Python 解释器开销与(这里
for t的)时间维串行,不是 MPPI 本身——\(K\) 条 rollout 在样本维完全独立、天然可并行。 - 正确做法:理解 MPPI 的实时性来自 GPU 并行(第 2 章),数千条 rollout 同时跑,K=2048 在 GPU 上可达 ms 级。NumPy 版只用于学习与验证。💡 概念误区:把 MPPI 和 CEM 当成两种互不相干的算法。 - 错误描述:以为 MPPI 与 CEM 是两套从头到尾不同的方法,分别死记各自的流程。 - 现象 / 后果:在 MPPI 与 CEM 之间二选一时无从判断,或重复造轮子、看不出一份代码稍改权重规则就能在两者间切换。 - 根本原因:二者共享同一骨架——"从提议分布采样 → 前向 rollout 评代价 → 按权重规则更新分布 → 迭代",唯一的区别是权重规则:MPPI 用全样本指数软权 \(e^{-S/\lambda}\),CEM 用精英集硬指示(top-\(k\))。它们同源于 KL / 交叉熵最小化(§1.5 家族对比)。 - 正确做法:把它们看成同一族里"软加权 vs 硬选"的两端,按需选择(要可解释温度、连续加权 → MPPI;要自适应协方差、硬阈值 → CEM),完整统一视角见本方向后续专章。
练习¶
- (A 型·动手) 把
mppi_step扩展到 pendulum swing-up(用 \(K=256,\ H=30,\ \mathrm{d}t=0.02\)):替换动力学与代价,闭环运行。把 \(\lambda\) 从 \(0.01\) 扫到 \(100\),绘制控制轨迹与闭环代价曲线随 \(\lambda\) 的变化,标出三种区制的分界。这是 Mini-MPPI 第 0 模块的核心交付。 - (A 型·自由能验证) 在每个控制周期额外计算自由能 \(\hat{\mathcal{F}}=-\lambda\log\frac1K\sum_k e^{-S_k/\lambda}\) 与有效样本数 \(\mathrm{ESS}=1/\sum_k w_k^2\)。验证:(a)温度合理时 \(\hat{\mathcal{F}}\) 随周期单调下降;(b)\(\hat{\mathcal{F}}\) 与加权平均代价 \(\sum_k w_k S_k\) 之差恰等于 \(\lambda\,\mathrm{KL}(\mathbb{P}^\star\|\mathbb{Q})\)(用 §1.3 对偶定理解释这个差从何而来);(c)画出 \(\mathrm{ESS}(\lambda)\) 曲线,找出让 \(\mathrm{ESS}\approx K/2\) 的 \(\lambda\)。
- (思考题) 这二十行里没有任何"梯度""学习率""矩阵求逆""line search"。对照你写过的 iLQR/DDP,逐项列出 MPPI 省掉了哪些组件,并说明每一项**因为什么**不再需要(提示:backward sweep ← Feynman–Kac 的 forward 采样;可微性 ← \(S\) 只作标量;学习率/矩阵逆 ← §1.3 解的是闭式最优分布而非梯度步)。这道题把本章的理论与你已有的梯度式 MPC 经验彻底接上。
本章常见误解汇总¶
| 常见误解 | 正确理解 | 见 |
|---|---|---|
| 指数变换对任意最优控制问题都能线性化 | 仅在 Kappen 条件 \(\Sigma=\lambda R^{-1}\)(控制仿射 + 二次控制代价 + 噪声进控制通道)下成立 | §1.1 |
| Kappen 条件是可事后微调的超参数关系 | 它是线性化成立的**充要条件**;三者绑死,定两个、第三个由等式决定 | §1.1 |
| Feynman–Kac 给出"最优轨迹" | 它给出 desirability 场 \(\psi\),最优控制是 \(\nabla\log\psi\) 决定的**反馈律**,不是某条轨迹 | §1.2 |
| 从无控分布裸采样就够高效 | 最优轨迹是低概率事件时方差爆炸;须从接近最优的提议分布做重要性采样 | §1.2 |
| 路径积分只能解线性-二次问题 | 信息论推导(自由能–KL 对偶)对**任意代价、任意黑箱动力学**都成立 | §1.3 |
| MPPI 权重里的代价 \(S_k\) 必须可微 | \(S_k\) 只作标量进指数,可来自不连续代价 / 黑箱仿真——这正是 MPPI 的核心优势 | §1.3 |
| MPPI 是"沿梯度走一步"的梯度下降 | 它是吉布斯分布的投影,是**加权平均**;无学习率、无矩阵逆 | §1.3 |
| \(\lambda\) 有个通用好值(如总用 1.0) | \(\lambda\) 必须随代价尺度缩放;用 ESS(目标 \(0.1K\sim0.5K\))定量选取 | §1.4 |
| \(\lambda\) 越小越贪心越接近最优 | 低温信任的是采样运气(ESS→1,方差大、易被坏样本带偏),且杀死探索 | §1.4 |
| 对称性破缺是需要消除的 bug | 它是最优策略在低温/近距离区制的正确形态(commit vs hedge) | §1.4 |
| §1.5 的 20 行就是 MPPI 的全部 | 那是理论最小核;可部署版需 warm-start/平滑/GPU/约束处理(第 2 章起补全) | §1.5 |
| NumPy MPPI 慢说明 MPPI 不能实时 | 慢源于解释器与串行;\(K\) 条 rollout 天然并行,GPU 上 K=2048 可达 ms 级 | §1.5 |
| 蒙特卡洛估计无偏,加大 \(K\) 总能解决 | 自归一化重要性权重**有偏**(\(O(1/K)\)),偏差随采样分布质量恶化;改善分布比加 \(K\) 更有效 | §1.4 |
| \(\lambda\) 只是调权重锐度,与风险无关 | 自由能 \(\approx\mathbb{E}[S]-\mathrm{Var}[S]/2\lambda\),\(\lambda\) 同时是风险旋钮;小 \(\lambda\) 在随机环境中冒进 | §1.3 |
| MPPI 与 CEM 是两种无关的算法 | 二者共享"采样-评代价-加权-迭代"骨架,仅权重规则不同(软指数 vs 精英硬选),同源于 KL 最小化 | §1.5 |
| 单次 MPPI 求解就是闭环反馈 | 单次解是**开环序列**;反馈来自外层"执行 \(u_0\) + 重测 + 重规划"的接收水平循环 | §1.5 |
| 代价必须可微才能用 MPPI | \(S\) 只作标量进指数,可不连续/不可微/黑箱;阶梯代价下权重照常聚焦(梯度法则失效) | §1.3 |
| 采样在高维必然爆炸,MPPI 不适合高自由度 | 重规划只需估低维的 \(u_0\)、提议分布把采样限在低维邻域、控制有效维度低——三者合力压制维度灾难 | §1.2 |
| 迭代 MPPI 会收敛到全局最优 | 理想下单调改善、收敛到**局部**最优分布;有限样本是随机逼近,非凸只保证抓住一个模式 | §1.3 |
本章小结¶
本章从一个问题出发——"为什么非线性随机最优控制能靠采样求解"——给出了完整的回答链:指数变换把非线性 HJB 线性化(§1.1);Feynman–Kac 把线性 PDE 解成被动轨迹上的期望,从而"采样即可"(§1.2);自由能–KL 对偶在任意黑箱代价下重得同一结果并落地为权重公式(§1.3);温度 \(\lambda\) 在 hedge 与 commit 之间插值、可由 ESS 定量选取(§1.4);最后坍缩成 20 行可运行代码(§1.5)。
三条推导路线,一个权重公式¶
本章其实给了同一个 MPPI 权重公式**三条独立的推导**,它们对问题的假设、买到的东西、付出的代价各不相同。把它们并排,你就知道面对一个新问题时该走哪条路、各自的适用边界在哪:
| 路线 | 出发点 | 关键假设 | 买到了什么 | 代价 / 局限 |
|---|---|---|---|---|
| Kappen(§1.1–§1.2) | 连续时间 HJB | 控制仿射 + 二次控制代价 + Kappen 条件 \(\Sigma=\lambda R^{-1}\) | 严格的 PDE 线性化与 Feynman–Kac 期望表示,物理直觉(温度、双缝) | 被绑死在 Kappen 假设里;状态代价可任意,但控制必须二次 |
| Todorov(§1.2) | 离散时间贝尔曼 | 控制代价 \(=\) KL(受控‖被动) | 线性贝尔曼 \(z=MPz\),最优策略可线性叠加(可组合性),线性代数一次解出 | 需把动作空间表达成对被动转移的重加权;状态空间需可枚举或近似 |
| Williams(§1.3) | 轨迹空间自由能 | 仅需"代价是轨迹的标量函数" | 摆脱二次代价与控制仿射,**任意黑箱代价 / 动力学**都适用,直接给 MPPI 权重 | 解的是隐式分布,须靠重要性采样近似(有限 \(K\) 有偏、依赖提议分布质量) |
三条路殊途同归到 \(w_k\propto e^{-S_k/\lambda}\),但**适用范围逐级放宽**:Kappen 最严(要二次代价),Todorov 换到离散世界,Williams 最宽(什么代价都行)——这也正是历史的演进方向(2005→2006→2017/2018),每一步都在松绑前一步的假设。工程上的取舍因此清晰:能写成连续控制仿射 + 二次代价、又想要解析洞察,Kappen 的视角最透彻;问题天然离散、状态可枚举、还想白嫖可组合性,走 Todorov;而真实机器人上那些不可微、不连续、黑箱仿真的代价,只有 Williams 的信息论路线扛得住——这也是为什么部署的 MPPI 几乎都按 §1.3 的形式实现。
理解三条路线的假设阶梯,比记住任何单条推导都更重要:它让你在换问题时知道**哪条路还走得通**。
MPPI 在经典最优控制版图里的位置¶
把 MPPI 放回你在确定性/随机最优控制里学过的经典方法旁边,能看清它继承了什么、放弃了什么。下表只列**基础**方法(局部二次方法 iLQR/DDP 与 MPPI 的对比是另一根轴,留给 §1.5 练习):
| 方法 | 求解对象 | 适用范围 | 与 MPPI 的关系 |
|---|---|---|---|
| LQR / Riccati | 反馈增益(闭式) | 仅线性动力学 + 二次代价 | MPPI 在 LQ 特例上的采样近似恰好复现 LQR(§1.2 已验证) |
| Pontryagin 极小值原理(PMP) | 最优轨迹的必要条件 | 确定性、一般非线性 | \(\lambda\to0\) 时路径积分经 Laplace 近似退回 PMP(§1.1 对应表) |
| HJB 方程 | 值函数(PDE) | 一般随机非线性 | MPPI 的起点;指数变换把它线性化、FK 把它变成采样(§1.1–§1.2) |
| 动态规划 / 值迭代 | 值函数(backward sweep) | 状态可枚举 | 同解一个值函数,但 DP 反向遍历状态空间、MPPI 正向采样轨迹(§1.2 洞察) |
一句话定位:MPPI 既不是 LQR 那种闭式反馈,也不是 DP 那种全状态遍历,而是"用前向采样近似 HJB 解"的随机方法——它用放弃精确性(有限采样、局部最优)换来了对任意非线性、任意(甚至不可微)代价、黑箱动力学的适用性,以及 GPU 并行的天然契合。你在经典最优控制里建立的每一个概念——值函数、反馈、必要条件、维度灾难——在 MPPI 里都能找到对应或对照,这也是为什么把它放进这张版图能加深理解,而不是把它当成一个突如其来的新算法。
符号表¶
| 符号 | 含义 | 首次出现 |
|---|---|---|
| \(x\in\mathbb{R}^n,\ u\in\mathbb{R}^m\) | 状态、控制 | §1.1 |
| \(f(x)\) | 漂移(drift),系统自身演化趋势 | §1.1 |
| \(G(x)\) | 控制矩阵,把控制与噪声注入同一通道 | §1.1 |
| \(\mathrm{d}\xi,\ \mathrm{d}W\) | 控制通道噪声增量 / 标准布朗运动增量 | §1.1 |
| \(\Sigma\) | 噪声协方差 | §1.1 |
| \(R\succ0\) | 二次控制代价权重 | §1.1 |
| \(\lambda>0\) | 温度;同时是 softmax 锐度与风险态度(三视角同一量) | §1.1 |
| \(J(x,t)\) | 最优代价函数 / 值函数(cost-to-go) | §1.1 |
| \(V(x,t)\) | 状态运行代价(可非凸、不连续) | §1.1 |
| \(\phi(x)\) | 终端代价 | §1.1 |
| \(\psi(x,t)=e^{-J/\lambda}\) | desirability(合意度),值函数的指数编码,非归一化 | §1.1 |
| \(\mathcal{L}\) | 无控扩散的无穷小生成元 \(f^\top\nabla+\tfrac12\mathrm{tr}(G\Sigma G^\top\nabla^2)\) | §1.2 |
| \(\mathbb{Q}\) | 基 / 提议分布(无控扩散,或当前控制序列 + 噪声) | §1.2 |
| \(z(x)=e^{-v/\lambda}\) | LMDP 的 desirability;\(v(x)\) 为离散 MDP 的最优值函数 | §1.2 |
| \(p(x'\mid x),\ P\) | LMDP 被动(无控)转移概率及其矩阵 | §1.2 |
| \(q(x),\ M\) | LMDP 状态代价;\(M=\mathrm{diag}(e^{-q/\lambda})\) | §1.2 |
| \(\tau,\ S(\tau)\) 或 \(S_k\) | 轨迹、轨迹总代价(第 \(k\) 条 rollout 的总代价;部分文献记作 \(J_k\)) | §1.3 |
| \(\mathcal{F}(\mathbb{Q})=-\lambda\log\mathbb{E}_{\mathbb{Q}}[e^{-S/\lambda}]\) | 轨迹空间自由能 | §1.3 |
| \(\mathbb{P}^\star\propto\mathbb{Q}\,e^{-S/\lambda}\) | 吉布斯分布(对偶最优解) | §1.3 |
| \(Z=\mathbb{E}_{\mathbb{Q}}[e^{-S/\lambda}]\) | 配分函数(归一化常数) | §1.3 |
| \(\varepsilon_k(t)\) | 第 \(k\) 条 rollout 在时刻 \(t\) 的采样噪声 | §1.3 |
| \(w_k,\ \rho\) | 归一化重要性权重、\(\rho=\min_k S_k\)(log-sum-exp 稳定化) | §1.3 |
| \(K,\ H\) | rollout 条数、时间步长(horizon) | §1.3 / §1.5 |
| \(\beta=1/(\nu T)\) | Kappen 双缝中的逆温度(\(\nu\) 噪声,\(T\) 到缝时间) | §1.4 |
| \(\mathrm{ESS}=1/\sum_k w_k^2\) | 有效样本数 | §1.4 |
| \(\mathcal{O}_t\) | 控制即推断中的二值最优性变量 | §1.3 |
| \(\frac{1}{\theta}\log\mathbb{E}[e^{\theta X}]\) | 熵风险测度 / 指数效用确定性等价(\(\mathcal{F}\) 的风险敏感解读) | §1.3 |
| \(\mathbb{1}\{S_k\le S_{\text{elite}}\},\ N_e\) | CEM 的精英指示权重、精英样本数(与 MPPI 软权对照) | §1.5 |
| \(\rho\) | 无穷时域 LMDP 中 \(MP\) 的 Perron 特征值;平均代价 \(=-\lambda\log\rho\) | §1.2 |
| \(\eta,\ \beta\) | MPO 的 E 步温度、AWR 的优势温度(与 \(\lambda/\alpha\) 同角色) | §1.3 |
| \(H\) | 预测时域 / rollout 步数(接收水平里每周期重规划) | §1.5 |
定理 / 公式速查表¶
| 名称 | 一句话说明 | 对应节 |
|---|---|---|
| 指数(Cole–Hopf)变换 | \(\psi=e^{-J/\lambda}\) 把非线性 HJB 变成线性 backward PDE | §1.1 |
| Kappen 条件 | \(\Sigma=\lambda R^{-1}\);线性化的充要条件,"噪声大处控制便宜" | §1.1 |
| Feynman–Kac 引理 | 线性抛物 PDE 的解 = 无控扩散过程上的期望 | §1.2 |
| LMDP(线性可解 MDP) | KL 控制代价使离散贝尔曼线性 \(z=MPz\);\(u^\star(x'\mid x)\propto p(x'\mid x)z(x')\) | §1.2 |
| 路径积分控制律 | \(u^\star=\lambda R^{-1}G^\top\nabla\log\psi\),对被动轨迹加权平均 | §1.2 |
| 自由能–KL 对偶 | \(\mathcal{F}(\mathbb{Q})=\min_{\mathbb{P}}\{\mathbb{E}_{\mathbb{P}}[S]+\lambda\mathrm{KL}(\mathbb{P}\|\mathbb{Q})\}\) | §1.3 |
| 吉布斯分布 | 对偶最优解 \(\mathbb{P}^\star\propto\mathbb{Q}\,e^{-S/\lambda}\) | §1.3 |
| MPPI 权重公式 | \(w_k=e^{-(S_k-\rho)/\lambda}/\sum_j e^{-(S_j-\rho)/\lambda}\),\(u_t\mathrel{+}=\sum_k w_k\varepsilon_k(t)\) | §1.3 |
| REINFORCE 同构 | 同骨架 \(u\leftarrow u+\mathbb{E}[g(S)\varepsilon]\);指数权重是 KL 正则闭式解,线性权重是其一阶近似 | §1.3 |
| 软最小值极限 | \(-\lambda\log\frac1K\sum e^{-S_k/\lambda}\xrightarrow{\lambda\to0}\min S_k\),\(\xrightarrow{\lambda\to\infty}\) 平均 | §1.4 |
| 有效样本数 | \(\mathrm{ESS}=1/\sum w_k^2\in[1,K]\),定量选 \(\lambda\) 的指标 | §1.4 |
知识点总表¶
| 编号 | 知识点 | 核心要点 | 对应节 | 难度 |
|---|---|---|---|---|
| 1 | 指数变换与 HJB 线性化 | Cole–Hopf 变换 + Kappen 条件 → 线性 PDE | §1.1 | ⭐⭐⭐ |
| 2 | Feynman–Kac、路径积分控制律与离散 LMDP | PDE → 期望;backward sweep → forward 采样;路径积分 = LQR(LQ 情形);KL 控制代价 → 线性贝尔曼 \(z=MPz\) | §1.2 | ⭐⭐⭐ |
| 3 | 自由能–KL 对偶 | Gibbs 变分原理 → 吉布斯分布 → 权重公式;脱离 Kappen 假设 | §1.3 | ⭐⭐⭐⭐ |
| 4 | REINFORCE 同构与控制即推断 | MPPI = softmax 版 REINFORCE;与 SAC/MPO/AWR/LMDP 同为"规划=推断"的实例 | §1.3 | ⭐⭐⭐ |
| 5 | 风险敏感视角 | \(\mathcal{F}\approx\mathbb{E}[S]-\mathrm{Var}[S]/2\lambda\);\(\lambda\) 是风险旋钮;指数效用 / 熵风险 | §1.3 | ⭐⭐⭐ |
| 6 | 信息几何与收敛性 | MPPI 是分布空间自然梯度/镜像下降;理想单调改善,有限样本随机、非凸局部 | §1.3 | ⭐⭐⭐⭐ |
| 7 | 自由能的边界与证书 | \(\min S\le\mathcal{F}\le\mathbb{E}[S]\);次优性 \(=\lambda\mathrm{KL}(\mathbb{P}\|\mathbb{P}^\star)\) | §1.3 | ⭐⭐⭐ |
| 8 | 温度 \(\lambda\) 与对称性破缺 | 软最小值锐度;ESS 选 \(\lambda\);偏差 \(O(1/K)\);零方差提议;单摆多模 | §1.4 | ⭐⭐⭐ |
| 9 | 最简 MPPI(Python + C++) | 20 行核心循环;理论价值在于"知道为何对/怎么调/怎么查" | §1.5 | ⭐⭐ |
| 10 | 接收水平与时域 | 执行 \(u_0\) 重规划 → 开环变闭环;时域 \(H\) 的截断与远见权衡 | §1.5 | ⭐⭐ |
| 11 | 采样式 MPC 家族定位 | MPPI(软指数)vs CEM(精英硬选):共享骨架、只换权重规则 | §1.5 | ⭐⭐ |
代码验证一览¶
本章的代码全部用于**数值验证理论**(理论教学的代码定位——验证推导结论,而非工程实现),各段都可独立运行、多为十余行:
| 验证 | 验证了什么 | 所在节 |
|---|---|---|
| 路径积分 \(=\) LQR | 蒙特卡洛估计的最优控制逼近闭式 Riccati 增益(三个时刻均吻合) | §1.2 |
| 带运行代价 LQ | 加入 \(\int\tfrac12 qx^2\) 运行项后路径积分仍匹配 Riccati(验证 \(\int V\) 项) | §1.2 |
| LMDP \(z=MPz\) | 线性贝尔曼可由线性代数解出;最优策略 \(=\) 被动转移按 \(z\) 重加权(概率压向目标) | §1.2 |
| LMDP 可组合性 | 复合任务最优 desirability \(=\tfrac12 z_A+\tfrac12 z_B\)(误差 \(5\times10^{-10}\)) | §1.2 |
| LMDP 特征值形式 | 无穷时域线性贝尔曼是特征值问题,Perron \(\rho{=}0.54\),\(\|Az-\rho z\|{=}6\mathrm{e}{-}16\) | §1.2 |
| 自由能均值-方差 | \(\mathcal{F}\approx\mathbb{E}[S]-\mathrm{Var}[S]/2\lambda\),大 \(\lambda\) 精确吻合(风险敏感的数值签名) | §1.3 |
| 自由能边界 + 证书 | \(\min S\le\mathcal{F}\le\mathbb{E}[S]\);次优性恒等式 LHS\(=\)RHS 逐一相等 | §1.3 |
| 不连续代价的权重 | 阶梯代价(梯度处处为 0)下权重仍聚焦目标带(裸平均不动、加权 \(+1.53\)) | §1.3 |
| ESS 随 \(\lambda\) | 权重有效样本数随温度从 \(1.31\) 单调升到 \(4.58\),把调 \(\lambda\) 变成可读仪表 | §1.4 |
| 估计器偏差随 \(K\) | 自归一化重要性采样偏差 \(\sim O(1/K)\)(\(K{=}16\) 偏差 \(-1.54\) → \(K{=}1024\) 偏差 \(-0.05\)) | §1.4 |
| 零方差提议分布 | 提议\(\to\)目标时估计标准差 \(5.85\to0.0000\)(最优提议\(=\)目标) | §1.4 |
| 退火 vs 固定温度 | 退火 \(\lambda{:}2{\to}0.1\) 收敛到 \(J{=}2.92\),优于固定 \(\lambda{=}0.5\) 的 \(3.69\) | §1.4 |
| 单摆多模地形 | 代价双谷 \(u{=}\pm7.2\),对称软加权 \(\mathbb{E}[u]{\approx}0\)(盲目平均=原地不动) | §1.4 |
| MPPI 迭代降代价 | 反复 mppi_step 使标称代价 \(10.0\to4.9\) 单调下降(Python 与 C++ 同趋势) |
§1.5 |
把这些各跑一遍,你就从"读懂了推导"过渡到"亲眼见过它成立"——而这正是动手做 Mini-MPPI(§1.5)的最好热身。其中 §1.5 的核心循环另给了一份等价的 C++ 实现,作为通往第 2 章工程化的桥。
中英术语对照¶
读英文文献时,本章概念对应的标准术语如下(按出现顺序):
| 中文 | 英文 | 备注 |
|---|---|---|
| 指数变换 / 对数变换 | exponential / Cole–Hopf transform | 把非线性 HJB 线性化的换元 |
| 合意度 | desirability | \(\psi=e^{-J/\lambda}\),非归一化 |
| 线性可解 MDP | linearly-solvable MDP (LMDP) | Todorov 的离散镜像 |
| 可组合性 | compositionality | 最优解可线性叠加 |
| 自由能 | free energy | \(-\lambda\log Z\) |
| 配分函数 | partition function | \(Z=\mathbb{E}_{\mathbb{Q}}[e^{-S/\lambda}]\) |
| 重要性采样 | importance sampling | 自归一化版给出 MPPI 权重 |
| 有效样本数 | effective sample size (ESS) | \(1/\sum_k w_k^2\) |
| 对称性破缺 | symmetry breaking | 双缝中 commit vs hedge |
| 控制即推断 | control as inference | 规划 = 对最优性后验做推断 |
| 风险敏感控制 | risk-sensitive control | 指数效用 / 熵风险 |
| 交叉熵方法 | cross-entropy method (CEM) | 精英硬选的同族方法 |
累积项目:本章新增模块¶
本章为贯穿全方向的 Mini-MPPI 项目交付**第 0 个模块**:约 20 行的 mppi_step(§1.5)+ 一维点质量 / pendulum 的闭环驱动脚本,支持命令行调 \(\lambda,\sigma,K,H\)。验证清单见 §1.5——核心是用一维点质量的闭式解(§1.2)验证实现正确性,并用 \(\lambda\) 扫描复现 §1.4 的三种区制。
后续每章给它加一个模块(第 2 章 GPU/CUDA + warm-start/平滑 → … → 第 10 章 ROS2 实车)。
延伸阅读¶
奠基理论(⭐⭐⭐ 进阶) - Kappen, H. J. (2005). Path integrals and symmetry breaking for optimal control theory. J. Stat. Mech., P11011(arXiv: physics/0505066)。指数变换 + 对称性破缺的奠基长文,双缝例子出处。 - Kappen, H. J. (2005). Linear theory for control of nonlinear stochastic systems. Phys. Rev. Lett. 95, 200201(arXiv: physics/0411119)。姊妹短文,确立"噪声扮演温度"的视角与临界噪声值。 - Todorov, E. (2009). Efficient computation of optimal actions. PNAS 106(28):11478–11483。离散时间线性可解 MDP(LMDP)的集成阐述,desirability 在离散情形的对应(本章 §1.2 主要依据)。框架最初提出见 Todorov, E. (2006). Linearly-solvable Markov decision problems. NeurIPS 19:1369–1376,含 KL 控制代价、O(n) 最短路径近似与 Z-learning(off-policy 学 \(z\),优于 Q-learning)。
MPPI 谱系(⭐⭐ 核心) - Theodorou, E., Buchli, J., Schaal, S. (2010). A Generalized Path Integral Control Approach to Reinforcement Learning. JMLR 11:3137–3181。PI²,reward-weighted、无学习率无矩阵逆,MPPI 的直接祖先。 - Williams, G., Aldrich, A., Theodorou, E. (2017). Model Predictive Path Integral Control: From Theory to Parallel Computation. J. Guid. Control Dyn. 40(2):344–357。generalized importance sampling + GPU,MPPI 算法诞生。 - Williams, G., Drews, P., Goldfain, B., Rehg, J., Theodorou, E. (2018). Information-Theoretic Model Predictive Control: Theory and Applications to Autonomous Driving. IEEE T-RO 34(6)。自由能–KL 对偶的集大成推导(本章 §1.3 主要依据),AutoRally 100+ km 实车。
前沿 / 综述(⭐⭐⭐⭐ 研究级) - Patil, A. (2025). Advancing Frontiers of Path Integral Theory for Stochastic Optimal Control. PhD dissertation, UT Austin(arXiv: 2504.17154)。把路径积分控制系统推广到机会约束、随机微分博弈、风险缓解等六类问题,并给出离散时间样本复杂度分析。(注:移动规控大纲曾将此工作误记为"Kappen 2025",实际作者为 Apurva Patil;引用时以此为准。)近年另有将高斯-牛顿等局部二次近似嵌入 MPPI 以兼顾采样鲁棒性与收敛速度的方向,可在第 3 章变体部分一并了解。
实现(⭐⭐ 核心)
- UM-ARM-Lab/pytorch_mppi:纯 PyTorch MPPI,约 200 行核心,支持神经网络近似动力学、KMPPI 平滑与自动调参,理解权重公式的最佳入门。
- ACDSLab/MPPI-Generic(Vlahov et al. 2024, arXiv: 2409.07563):Georgia Tech ACDS 官方 C++/CUDA header-only 库,含 VanillaMPPI / Tube-MPPI / RMPPI,第 2 章源码精读对象。
- Kim, T., Park, G., Kwak, K., Bae, J., Lee, W. (2022). Smooth Model Predictive Path Integral Control without Smoothing (SMPPI). IEEE RA-L(arXiv: 2112.09988)。在单摆 swing-up 与自动驾驶上测试 MPPI;本章 §1.4 单摆多模算例的设定(力矩不足、须多次摆动积累能量)即源于此类工作。
控制即推断(⭐⭐⭐ 进阶) - Levine, S. (2018). Reinforcement Learning and Control as Probabilistic Inference: Tutorial and Review.(arXiv: 1805.00909)。把最大熵 RL / 最优控制统一为概率推断的权威教程:确定性动力学下等价于精确推断、随机动力学下等价于变分推断;SAC、soft Q-learning 皆由此 KL 正则推断导出。 - Kappen, H. J., Gómez, V., Opper, M. (2012). Optimal control as a graphical model inference problem. Machine Learning 87(2):159–182。把 Todorov 的非线性随机最优控制重述为 KL 最小化 / 推断问题,并明确证明该 KL 控制理论**把路径积分控制作为特例包含其中**——§1.3"控制即推断"一节的主要依据。 - Abdolmaleki, A., Springenberg, J. T., Tassa, Y., Munos, R., Heess, N., Riedmiller, M. (2018). Maximum a Posteriori Policy Optimisation (MPO).(arXiv: 1806.06920)。把策略优化写成相对熵目标上的 EM:E 步算玻尔兹曼后验 \(q\propto e^{Q/\eta}\)(与 MPPI 权重同形),M 步蒸馏进网络——控制即推断在深度 RL 里的代表作。 - Peng, X. B., Kumar, A., Zhang, G., Levine, S. (2019). Advantage-Weighted Regression (AWR).(arXiv: 1910.00177)。用 \(e^{A/\beta}\)(优势的指数)加权回归更新策略,KL 正则策略改进的极简实现——与 MPPI 的指数加权同出一源。
风险敏感视角(⭐⭐⭐ 进阶) - van den Broek, B., Wiegerinck, W., Kappen, H. J. (2010). Risk Sensitive Path Integral Control. UAI 2010(arXiv: 1203.3523)。证明路径积分在相同假设下直接推广到风险敏感随机最优控制——最小化指数加权 cost-to-go,指数权重决定 risk-seeking / risk-averse,是 §1.3"风险敏感视角"一节的直接依据。 - Jacobson, D. H. (1973). Optimal stochastic linear systems with exponential performance criteria. IEEE Trans. Automatic Control 18(2):124–131。指数效用(LEQG)的奠基作,熵风险测度进入随机控制的源头。
采样优化家族(⭐⭐ 核心) - de Boer, P.-T., Kroese, D. P., Mannor, S., Rubinstein, R. Y. (2005). A Tutorial on the Cross-Entropy Method. Annals of Operations Research 134(1):19–67。CEM 的标准教程;理解 MPPI 软指数加权与 CEM 精英硬选的同源与差异,由此入门(完整家族见本方向后续"CEM 与统一视角"专章)。
教程 - Kappen ICML 2008 tutorial:路径积分控制的系统性讲解,含双缝、延迟决策、n 关节臂等例子,与本章思路高度一致。
如何读这些里程碑论文。 若要按图索骥,建议顺序:先读 Kappen 2005 PRL(最短、含双缝直觉),建立"噪声 = 温度、对称破缺"的物理图像;再读 Williams 2018 T-RO 的前几节(自由能–KL 对偶推导最完整,直接对应本章 §1.3);想补离散视角就读 Todorov PNAS 2009(LMDP,对应 §1.2 镜像);想把这一切与 RL 知识缝合,Levine 2018 的 control-as-inference 综述是最好的粘合剂。读的时候带着本章的"主线四问":它在解 HJB 还是 Bellman?控制代价是二次还是 KL?温度叫什么、极限行为如何?最优解是闭式重加权还是迭代梯度?你会发现这些论文表面记号各异,骨架却是同一副。
仓库 Star 数与库版本随时间变动,使用前请以当前 GitHub / 官方文档为准。
本章与后续章节的关系¶
| 后续章节 | 与本章的关系 | 本章哪个知识点为其铺垫 |
|---|---|---|
| 第 2 章 MPPI 核心算法与 GPU | 把本章权重公式落成完整实时算法(warm-start / SGF 平滑)并 CUDA 并行化 | §1.3 权重公式、§1.5 的 20 行核心 |
| 第 3 章 MPPI 六大变体 | Tube / Smooth / log-MPPI / 多模态——本质都在改造**采样分布** | §1.3"分布质量优先于 K"、§1.2 重要性采样 |
| 第 4 章 CEM 家族与统一视角 | CEM/CMA-ES 与 MPPI 统一为采样优化 | §1.3 自由能对偶提供统一视角的一半 |
| 第 5 章 扩散启发采样 MPC | 把扩散先验注入采样分布逼近 \(\mathbb{P}^\star\) | §1.3"\(\mathbb{P}^\star\) 是隐式最优分布" |
| 第 6 章 学习世界模型 TD-MPC | latent 空间 MPPI,动力学换成学习的世界模型 | §1.3"\(S\) / 动力学可黑箱" |
| 第 9 章 与梯度式 MPC 对比 | §1.5 练习 3(MPPI 省了哪些组件)的系统化展开 | §1.2 forward 采样 vs backward sweep |
| 不确定性规划专题(U) | 高温 hedging / 延迟决策 → contingency planning | §1.4 对称性破缺 |
| 风险敏感 / CVaR 规划(U) | 自由能即指数效用,是风险敏感控制最平滑的入口 | §1.3 风险敏感视角 |
| 最大熵 RL / SAC(RL 课) | 同属控制即推断,区别在摊销 vs 在线 | §1.3 控制即推断 |
这张表也透出一个更大的图景:本章给 \(\lambda\) 的三个解读(温度、锐度、风险)和给最优分布的多条推导(PDE、值函数、信息论、推断),各自都通向一个独立的研究方向。把"控制即推断"往深走是最大熵 RL;把"风险敏感"往深走是 CVaR、机会约束、分布鲁棒(不确定性规划);把"对称性破缺/多模"往深走是分支与博弈规划;把"\(\mathbb{P}^\star\) 是隐式最优分布"往深走是扩散式与学习式采样。
换句话说,本章不只是 MPPI 的前传,也是后面好几个方向共用的**思想原点**——你在这里建立的每一个视角,后面都会以更专门的形式重逢。
🔧 故障排查手册¶
| 症状 | 可能原因 | 排查步骤 | 相关节 |
|---|---|---|---|
| 权重出现 NaN / inf,控制失效 | 未做 \(\rho\) 减法,或 \(\lambda\) 过小导致 \(e^{-S/\lambda}\) 溢出 | 1. 确认计算了 \(\rho=\min_k S_k\) 并减去 2. 打印 \(S\) 的最大/最小值与 \(S/\lambda\) 量级 3. 适当增大 \(\lambda\) | §1.3, §1.5 |
| 控制输出剧烈抖动 | \(\lambda\) 太小(\(\mathrm{ESS}\approx1\),只信一条侥幸轨迹),或采样协方差 \(\Sigma\) 过大 | 1. 打印 \(\mathrm{ESS}=1/\sum w_k^2\) 2. 把 \(\lambda\) 增大到 \(\mathrm{ESS}\in[0.1K,0.5K]\) 3. 适当减小 \(\Sigma\) | §1.4 |
| 控制几乎不动 / 不收敛 | \(\lambda\) 太大(\(\mathrm{ESS}\approx K\),盲目平均),或 \(\lambda\) 与代价尺度不匹配 | 1. 打印 \(\mathrm{ESS}\) 2. 用一批 rollout 代价的标准差重定 \(\lambda\) 量级 3. 检查代价函数是否真的有区分度 | §1.4 |
| 一维点质量上 MPPI 输出与闭式解差很远 | 实现 bug / \(K\) 太小 / 漏了每步运行代价项 | 1. 增大 \(K\) 看是否收敛到闭式解 2. 核对 \(S_k\) 是否累加了每步 \(\tfrac12 r v^2\Delta t\) 3. 与 §1.2 的 \(u^\star=-\tfrac{a/r}{1+(a/r)(T-t)}x\) 逐点对比 | §1.2, §1.5 |
| 自由能 \(\hat{\mathcal{F}}\) 不单调下降 | \(\lambda\) 不合理,或采样分布离 \(\mathbb{P}^\star\) 太远(如初始控制很差、无 warm-start) | 1. 先在健康 \(\lambda\) 区间验证 2. 检查是否复用了上周期的控制序列 3. 改善 \(\Sigma\) 或注入先验 | §1.3, §1.4 |
| 含 \(\infty\)(碰撞 / 越界)代价时整批权重变 \(0\) 或 NaN | 所有 rollout 都违约(采样没覆盖可行区),或 \(\infty\) 未做处理 | 1. 确认至少有可行 rollout 2. 硬约束改用"大但有限"的罚值代替 \(\infty\) 3. 增大 \(\Sigma\) 让采样覆盖可行区 | §1.3 |
| 换机器人 / 换代价函数后整体失灵 | \(\lambda\) 没随新代价的尺度缩放 | 1. 用新代价一批 rollout 的标准差重定 \(\lambda\) 量级 2. 打印 \(S/\lambda\) 与 ESS 确认落在健康区间 | §1.4 |
| ESS 异常但拧 \(\lambda\) 不见效 | 病根在采样协方差 \(\Sigma\) 而非温度(采得不对,不是挑得不对) | 1. ESS 太高且最优长期不改善 → 增大 \(\Sigma\)(没探到)2. ESS 太低且代价方差大 → 减小 \(\Sigma\) 或增大 \(\lambda\) 3. 把"采样覆盖"与"权重集中"分开诊断 | §1.4 |
| 仿真里调好的 \(\lambda\) 一上真机就过于激进 | 低温在随机/不确定环境下是冒险态度,非单纯"更优" | 1. 适当增大 \(\lambda\) 提高保守性 2. 评估是否需要 risk-averse 推广(指数权重反号)3. 复核模型误差与噪声量级 | §1.3 |
一次完整的调试推演¶
把上面的诊断量串成一条实战路径会更有用。假设你写好了 MPPI,但机器人**原地抖动、不往目标走**——按下面的顺序排查,每一步都用本章建立的量。
第 1 步,先看 ESS。 打印 \(\mathrm{ESS}=1/\sum w_k^2\)。若 \(\mathrm{ESS}\approx1\):权重塌在单条轨迹上,要么 \(\lambda\) 太小、要么采样里只有一条侥幸轨迹。若 \(\mathrm{ESS}\approx K\):权重几乎均匀,等于在做无差别平均,难怪不动。抖动 + 低 ESS 是最常见的组合。
第 2 步,分清是"挑得不对"还是"采得不对"。 这是 \(\lambda\) 与 \(\Sigma\) 的解耦诊断。先固定 \(\Sigma\),把 \(\lambda\) 朝让 \(\mathrm{ESS}\) 落进 \([0.1K,0.5K]\) 的方向调。如果调遍 \(\lambda\)、ESS 始终要么 \(1\) 要么 \(K\)、最优毫无起色,问题多半在 \(\Sigma\):ESS 一直偏高且无改善 → \(\Sigma\) 太小、根本没探到低代价区,加大 \(\Sigma\);ESS 一直偏低且代价方差巨大 → \(\Sigma\) 太散,减小 \(\Sigma\)。
第 3 步,查代价尺度。 打印 \(S\) 这一批的最小、最大、标准差,以及 \(S/\lambda\) 的量级。若 \(S/\lambda\) 普遍是几百上千,权重必然坍缩(\(\lambda\) 相对代价太小);若普遍小于 \(1\),权重必然均匀。用标准差重定 \(\lambda\) 量级。顺便确认代价各项量纲可比、没有一项淹没其余。
第 4 步,用自由能做健全性检查。 算 \(\hat{\mathcal{F}}=-\lambda\log\frac1K\sum e^{-S_k/\lambda}\),确认它落在 \([\min_k S_k,\ \text{平均代价}]\) 之间(§1.3 的夹逼)。若它跌破最小代价或冒过平均代价,说明权重/数值有 bug(多半漏了 \(\rho\) 减法或溢出)。再看迭代中 \(\hat{\mathcal{F}}\) 是否单调下降;不降则采样分布离 \(\mathbb{P}^\star\) 太远,检查有没有 warm-start、\(\Sigma\) 是否合理。
第 5 步,回到代价设计。 如果以上都正常但行为仍不对,问题可能在代价本身:是不是低代价区是一片"平地加针尖"(ESS 天生低,加平滑引导项)?硬约束是不是写了 \(\infty\) 导致全员违约归零(改大但有限的罚值)?是不是该保守的任务用了冒险的低 \(\lambda\)(§1.3 风险敏感)?
这条 ESS → 解耦 → 尺度 → 自由能 → 代价 的链路,把本章四节的诊断量编成了一套可复用的排查流程——遇到问题不再是盲目拧旋钮,而是逐层定位。
研究实践建议¶
给新手:动笔写代码前,先把一维点质量的闭式解(§1.2)亲手推一遍——它是你验证一切实现的"标准答案"。写 MPPI 时务必把 \(\mathrm{ESS}\) 打印出来作为调 \(\lambda\) 的仪表盘,不要凭感觉拧温度。验证新实现遵循"先有闭式解的简单系统、再上 pendulum / CartPole"的顺序,否则分不清是算法 bug 还是调参问题。最后,把你在 RL 里积累的 reward shaping 与温度调节直觉**直接搬过来**——§1.3 已证明它们是同一套数学。
给有经验者:本章反复强调的"采样分布质量优先于样本数 \(K\)"是后续所有变体(第 3–5 章)的主线,值得现在就建立这个判断习惯。可以提前思考 \(\lambda\) 的**自适应调度**(类比 SAC 的自动温度调节,按目标 ESS 在线调 \(\lambda\))。§1.4 的对称性破缺不只是理论趣闻——它在动态 / 不确定环境下的安全含义(commit 过早可能撞上后出现的障碍)直接通向不确定性规划专题的 contingency planning,是一个值得深挖的交叉点。想看路径积分框架的当代延伸(机会约束、随机博弈、风险敏感),Patil 2025 的论文是一份系统的入口。
给即将落地的工程者:先想清楚你的代价能不能写成"逐条 rollout 可独立计算的标量"——能,MPPI 就适用、且天然并行;不能(比如代价依赖 rollout 之间的耦合),就要先重新设计代价。\(K\)、\(H\)、\(\Sigma\)、\(\lambda\) 四个旋钮里,\(\Sigma\) 和 \(\lambda\) 最该先调(决定"采样撒哪里"与"信哪条"),\(K\) 和 \(H\) 受实时预算约束——务实顺序是:先在 NumPy 上把行为调对(ESS 健康、闭环收敛、与简单系统闭式解吻合),再考虑搬 GPU 提 \(K\)、上 warm-start 提频率(第 2 章)。一个常见的过早优化是:行为还没调对就急着写 CUDA,结果只是在错误的 \(\lambda\) 上把错误跑得更快。
给做理论的研究者:本章的三条推导路线(PDE / 值函数 / 信息论)对应着不同的开放问题。Kappen 路线上,无穷时域、状态依赖噪声、非控制仿射系统的线性化边界仍有空间(见 Lefebvre–Crevecoeur 关于无穷时域的工作)。信息论路线上,自由能对偶与变分推断、最大熵 RL 的等价关系是把控制与现代生成模型连起来的活跃接口(控制即推断、扩散式采样都在这条线上)。风险敏感方向上,从指数效用(熵风险)推广到 CVaR、谱风险、分布鲁棒,并保持路径积分的可采样结构,是一个有明确实用价值的题目。一个贯穿性的判断:本章几乎每一个"本质洞察"——\(\min\leftrightarrow\log\sum\exp\)、backward sweep \(\leftrightarrow\) forward sampling、二次代价 \(\leftrightarrow\) KL 代价、温度 \(\leftrightarrow\) 风险——都是一座连接两个领域的桥,而桥的两端往往各自有尚未对齐的理论,这些缝隙正是选题的富矿。
版本信息速查¶
| 工具 / 库 | 定位 | 备注 |
|---|---|---|
| NumPy | Mini-MPPI 第 0 模块的实现语言 | 仅用于学习与验证;实时性靠第 2 章 GPU |
UM-ARM-Lab/pytorch_mppi |
PyTorch MPPI,神经网络动力学 + 自动调参 | 入门精读;含 KMPPI 平滑(2024 起) |
ACDSLab/MPPI-Generic |
C++/CUDA header-only,含 Vanilla / Tube / RMPPI | arXiv:2409.07563;第 2 章源码精读对象 |
AutoRally/autorally |
Williams 2016 原始 MPPI CUDA 实现 | 自驾激进驾驶平台,第 2 章参考 |
上述仓库的 Star 数、版本与 API 随时间变动,本章不锁定具体数值;动手前请核对当前官方仓库与文档。
本章一页纸速记¶
合上书前,用这一页把全章拎起来。每节一句话:§1.1 指数变换 \(\psi=e^{-J/\lambda}\) 在 Kappen 条件下把非线性 HJB 线性化;§1.2 Feynman–Kac 把线性 PDE 解成被动轨迹的期望(离散镜像是 Todorov 的 \(z=MPz\));§1.3 自由能–KL 对偶在任意黑箱代价下给出权重 \(w_k\propto e^{-S_k/\lambda}\);§1.4 温度 \(\lambda\) 用 ESS 选取、在 hedge 与 commit 间掌舵;§1.5 全部坍缩成约 20 行代码。
一个公式:\(w_k=\dfrac{e^{-(S_k-\rho)/\lambda}}{\sum_j e^{-(S_j-\rho)/\lambda}}\),\(\rho=\min_k S_k\)。记住它,就记住了 MPPI 的核。
\(\lambda\) 的三张面孔(同一个量):噪声温度(§1.1)、softmax 锐度(§1.4)、风险态度(§1.3)。
三条推导、一个结论:Kappen 的 PDE、Todorov 的值函数、Williams 的信息论,殊途同归到同一个权重公式,假设逐级放宽(要二次代价 → 离散 → 任意黑箱代价)。
一句心法:采样分布质量比样本数 \(K\) 更关键——\(K\) 只按 \(O(1/K)\) 慢慢压偏差,把提议分布挪近最优才是治本。
如果这一页里有哪一条让你卡壳,就回对应小节再看一遍;如果都顺,那就去跑 §1.5 的代码,让理论在你自己的屏幕上成立一次。
本章在整个方向中的位置¶
最后退到最远处看一眼。整个「采样式 MPC / 路径积分控制」方向,是要从这二十行核心出发,一路长成能在真实机器人上实时运行、处理约束与不确定性的完整工程体系。本章是这条路的**地基**——它不教任何一个具体的工程技巧(那些从第 2 章起逐章补),只回答一个问题:这套"撒轨迹、按指数加权、取平均"的做法,凭什么是对的? 答案就是本章的全部:因为指数变换把非线性 HJB 线性化、Feynman–Kac 把它变成可采样的期望、自由能–KL 对偶在最弱假设下给出那个权重公式。
往后的每一章,都是在这块地基上加东西:第 2 章让它跑得快(GPU、warm-start),第 3–4 章让采样分布更聪明(变体、有色噪声、协方差自适应、CEM 统一视角),后续章节让它处理学习的世界模型、约束、不确定性与多智能体。但无论上层盖多高,地基不变——你每次困惑"某个变体到底在改什么",答案几乎总能追回到本章的某个量:是在改提议分布(§1.4 零方差理想)、改温度(§1.3/§1.4)、还是改代价(§1.5 设计)。把这一章吃透,后面就不是学一堆零散技巧,而是看着同一套数学不断被加固和延伸。
第 1 章完结。 我们从"为什么非线性随机最优控制能靠采样求解"这个问题出发,一路推到能运行的 20 行代码——指数变换线性化了 HJB,Feynman–Kac 把求解变成采样,自由能–KL 对偶在任意黑箱代价下给出权重公式,温度 \(\lambda\) 在 hedge 与 commit 之间为你掌舵。下一章,我们把这套数学搬上 GPU,让它在数千条 rollout 上以毫秒级实时运行。