第 5 章 扩散启发采样 MPC——MPPI 作为单步去噪¶
📋 前置自测¶
怎么用这份自测:第 1–5 题考查前置知识(第 1/2/4 章),答不出 ≥ 2 题,建议先回第 1 章(自由能–KL、目标分布 \(\mathbb{P}^\star\))、第 2 章(MPPI 主循环、加权更新、ESS)、第 4 章(三设计维度、高斯天花板、MPPI 与 REINFORCE 同构)再读本章。第 6、7 题不是前置知识,而是两个"先记下你的直觉、本章会给你反直觉答案"的引子——答不上来很正常,带着好奇读下去即可。
- 第 2 章 MPPI 的均值更新写成增量形式是什么样的?(提示:\(U \leftarrow U + \sum_k w_k\,\varepsilon_k\),其中 \(\varepsilon_k\) 是什么、\(w_k\) 怎么算?)
- 第 4 章末尾点出采样式 MPC 有一个"共同天花板"——它是什么?为什么高斯提议分布表达能力有限?
- 第 4 章说 MPPI 的加权更新与强化学习里的某个更新"数学同构"——是哪个?这个同构让什么直觉可以迁移过来?
- 扩散模型(如果你在别处听过 Diffusion Policy)大致是怎么工作的?"前向加噪"和"反向去噪"分别在做什么?什么叫 score(\(\nabla \log p\))?
- 第 4 章 §4.6 说"形状比数目更重要",而高维(如几十维的力矩控制)下采样式 MPC 会遇到维度灾难——单纯靠加样本数能解决吗?为什么不能?
- 你听说"扩散模型表达能力很强"。凭直觉猜:这种表达能力是因为它每一步用了比高斯更复杂的分布,还是另有来源?(本章会告诉你答案,先记下你的猜测。)
- 你做过梯度优化(如 iLQR 或深度学习训练)。凭经验想一想:一个**更强**的优化器(更容易找到全局最优的那种),配上一个**写得不够严谨**的目标函数(漏了某个约束),结果会更好还是可能更糟?(本章 §5.5 会用一个具体例子告诉你答案,可能和直觉相反。)
参考答案要点(自评用,不必逐字对照):(1) \(U\leftarrow U+\sum_k w_k\varepsilon_k\),\(\varepsilon_k\) 是加在当前控制序列上的高斯扰动、\(w_k\propto e^{-J_k/\lambda}\) 是按代价的指数权重。
(2) 天花板是"提议分布被锁在高斯(或高斯混合)这一族";高斯单峰、对称、形状受限,表达不了真正多峰、复杂结构的最优控制分布。
(3) 与 REINFORCE / 回报加权回归(RWR)同构——MPPI 的"按指数化负代价给样本加权、再加权平均"就是策略梯度的一步;温度、reward shaping、用加权平均压方差这些 RL 直觉都能迁移。
(4) 前向:往干净数据里逐步加高斯噪声直到变成纯噪声;反向:从纯噪声出发、逐步去噪恢复出样本;score \(\nabla\log p\) 是对数概率密度的梯度,指向"数据更可能出现"的方向,去噪就是顺着 score 往高密度区挪。
(5) 不能——维度灾难下"撒满"空间所需样本数随维度指数爆炸(呼应第 4 章薄壳现象);靠堆样本数代价过高,必须换更聪明的搜索结构(这正是本章退火要解决的)。
(6) 表达能力**不**来自单步用更复杂的分布——扩散每一步仍是高斯;它来自"多步去噪的复合",许多个简单高斯步首尾相接,能雕出任意复杂的多峰分布。这是本章最核心的观念,若你猜的是"单步更复杂",正好是本章要纠正的直觉。
(7) 可能更糟——这点反直觉。更强的优化器会更精准地找到你写下的目标函数的全局最优;如果那个目标漏了约束,它会忠实地利用这个漏洞,给出一个"目标值最优但行为荒谬"的解(如本章 §5.5 里"只写到达项,退火优化器就让机器人穿墙到达")。弱优化器反而可能因为找不到最优而没暴露漏洞。所以优化器越强,对目标(代价)设计的严谨性要求越高。
本章目标¶
学完本章后,你应该能够:
- 说清 DDPM 反向去噪与 MPPI 加权更新的数学同构——两者都是"当前估计 + 加权噪声修正",MPPI 的一步更新就是扩散的**单步去噪**;
- 理解 score(\(\nabla\log p\))与 MPPI 权重的关系——MPPI 的加权平均是目标分布 score 的一个蒙特卡洛估计,"指数加权"与"朝 score 上升"是同一件事;
- 理解 Model-Based Diffusion(MBD)的核心洞见——对有已知动力学/代价的轨迹优化,score 可以由模型**直接算出**,因此扩散式优化**不需要训练任何网络、不需要任何数据**;
- 理解 DIAL-MPC 的扩散式退火——把单步 MPPI 沿温度/方差的调度重复多级,等价于一个完整的反向扩散过程,从而兼得全局覆盖与局部收敛;
- 解释 为什么退火能在全阶力矩级(几十维)控制上做到单级 MPPI 做不到的事——退火把维度灾难下"一次撒满"的不可能任务,拆成"多级逐步聚焦"的可行任务;
- 把扩散启发方法**准确地接回第 4 章的三维框架**——它没有换掉单步的高斯,而是在"如何组合多步"这个更高层面上突破了高斯天花板。
- 在 优化器谱系里为扩散启发方法定位、并按问题性质选型——用"要不要梯度/训练、什么提议分布、单步还是多步"四个维度,判断一个任务该用梯度 MPC、CEM/MPPI、RL,还是退火采样,并理解它们如何在真实项目中互补共存。
- 清醒地认识退火的边界——它不保证全局最优(只是大幅提高概率)、救不了写错的代价、也扛不住极端高维,知道何时该用降维 / learned prior 给它减负,何时该换有保证的方法。
本章知识导航¶
第 4 章的结尾留下了一个明确的悬念:采样式 MPC 这一族算法,无论怎么调权重函数、噪声、协方差,提议分布始终被锁在高斯(或高斯混合)里——这是它们共同的表达能力天花板。本章要讲的,正是**怎么挣脱这层天花板**。
挣脱的钥匙,来自一个起初让人意外、细想又非常自然的联系:MPPI 的一步加权更新,恰好就是扩散模型的一步去噪。一旦看穿这个同构,两扇门同时打开——
- 一扇通向 MBD:既然 MPPI 的一步是去噪,而去噪需要的 score 对"已知动力学的轨迹优化"可以由模型直接算出,那就能做**免训练的扩散式轨迹优化**。
- 另一扇通向 DIAL-MPC:既然一步 MPPI 是单步去噪,那把它沿温度/方差的调度重复多级,就得到一个**完整的反向扩散过程**——这正是让采样式 MPC 爬上几十维力矩控制的那一步。
本章的逻辑链:
| 节 | 主题 | 在全章中的位置 |
|---|---|---|
| §5.1 | DDPM → MPPI 数学桥梁 | 全章地基——证明"MPPI 一步 = 扩散一步去噪",并点出 MBD/DIAL 两个方向 |
| §5.2 | MBD 的数学框架 | 把轨迹优化重写成扩散采样;动力学/代价直接给出 score,免训练 |
| §5.3 | DIAL-MPC 完整算法 | 把单步去噪沿退火调度堆成多级;全阶力矩级四足控制 |
| §5.4 | 统一与前沿 | 三方面孔的严格统一(Gibbs 测度);learned prior 混合路线 |
| §5.5 | 六十行实战 | 把退火采样写成可跑代码;玩具到真机的台阶;级数消融 |
| §5.6 | 优化器谱系选型 | 横向对比六个优化器;四判据选型;与梯度 MPC 共存 |
| §5.7 | 深度答疑 | 一组高频问题集中辨析;"还原到已知"的学习心法 |
| §5.8 | 退火的局限 | 退火不保证全局最优、救不了错代价、扛不住极端高维——诚实的边界 |
一条贯穿全章的主线:扩散模型的表达力,不来自"单步用更花哨的分布"——它每一步仍是高斯;表达力来自"多步去噪的复合"。 所以扩散启发的采样 MPC 突破第 4 章高斯天花板的方式,不是替换单步的高斯提议分布,而是在"如何把许多步高斯组合起来"这个更高的层面做文章。理解了这一点,你就抓住了本章与第 4 章的接续关系,也不会掉进"扩散 MPC 就是要训一个大模型当采样器"的误解里。
表里 §5.1–§5.3 是三个理论核心,§5.4 把它们接入更大的统一图景,§5.5–§5.7 则分别从实战、选型、答疑三个角度帮你把理论落到自己的工程判断上,§5.8 收尾时诚实地划出退火的能力边界——前半章建立"是什么、为什么",后半章解决"怎么用、何时用、何时不该用"。
前置知识桥接¶
本章建立在前四章、尤其第 2、4 章之上,先把要反复用到的关键点温习一遍:
- MPPI 的加权更新(第 2 章):采 \(K\) 条 rollout、按代价指数加权、加权平均得到新均值。写成增量形式是 \(U \leftarrow U + \sum_k w_k\,\varepsilon_k\),其中 \(\varepsilon_k\) 是加在当前序列上的高斯扰动、\(w_k\propto e^{-J_k/\lambda}\)。本章 §5.1 的同构论证就从这个式子出发。
- 目标分布 \(\mathbb{P}^\star\) 与自由能–KL(第 1 章):最优控制分布是 \(\mathbb{P}^\star\propto\mathbb{Q}\,e^{-S/\lambda}\),代价越低概率越高。本章把"逼近 \(\mathbb{P}^\star\)"重新理解为"从一个把概率质量集中在低代价区的分布里采样",而这正是扩散模型擅长的事。
- MPPI 与 REINFORCE 同构(第 4 章 §4.1):第 4 章末尾我们刚看到,MPPI 的"指数化负代价加权 + 加权平均"与策略梯度 / 回报加权回归(RWR)是同一步。本章会把这个"加权更新"再往上接一层——它还等于扩散的一步去噪。三者(RWR、MPPI、单步去噪)其实是同一个数学对象的三张面孔。
- 高斯天花板与三维框架(第 4 章):采样式 MPC 的差异归结为权重函数、噪声、协方差三个设计维度,但提议分布始终是高斯。本章在第四个、更根本的维度——提议分布本身——上做突破,但方式很微妙(靠多步复合,而非换单步分布)。
- 维度灾难与薄壳现象(第 4 章 §4.2/§4.6):高维下随机样本几乎都落在远离均值的薄壳上,"一次撒满"高维空间需要指数级样本。这是 §5.3 退火要解决的核心困难。
- score 与梯度上升(数学基础):score 指对数概率密度的梯度 \(\nabla\log p\),指向"概率密度增大最快"的方向;沿 score 走一步,就是朝"更可能出现的样本"挪一步。本章反复用到"去噪 = 朝 score 上升"这个等价,而 score 又能由 MPPI 的加权平均估计(§5.1)、由已知模型直接算出(§5.2)。若你对"梯度指向函数增大方向"这个微积分基本事实清楚,理解 score 就毫无障碍——它只是把这个事实用在了"对数概率"这个特定函数上。
如果上面某条记不清了,对应章节会帮你补上;但务必把第 2 章的 MPPI 加权更新式记牢,本章几乎每一节都从它出发。
如果跳过本章会怎样¶
设想两个场景,它们会让你卡住:
场景一:你在 2024 年后的论文里频繁读到"MPPI 是单步扩散""我们用扩散式退火/model-based diffusion",却不知道这些话什么意思。 扩散与采样式控制的融合是近两年最活跃的方向之一。
不理解 §5.1 的同构,你会把扩散 MPC 当成一个需要从头学的新领域、甚至误以为它要训练庞大的扩散网络;理解了,你会发现它的内核就是你已经会的 MPPI,只是换了个看待和组织它的方式——学习成本几乎为零。
场景二:你想在高维系统(全身力矩、灵巧手、几十个自由度)上用采样式 MPC,单级 MPPI 怎么调都效果差,凭直觉拼命加样本数。 第 4 章告诉你高维下"撒满"空间需要指数级样本(薄壳现象),但没给出可落地的破解法。
§5.3 的 DIAL-MPC 给了答案——用扩散式退火把"一次撒满几十维"这个不可能任务,拆成"多级逐步聚焦"的可行任务,于是几千样本 × 几级就够,而非天文数字。不知道这一点,你只能在高维上和维度灾难硬碰硬、徒劳加样本;知道了,你有了一条让采样式 MPC 真正爬上高维的工程路径。
场景三:你手上有一台新机器人、动力学方程写得出来,但没有任何演示数据,想做一个稍复杂的控制任务。 你可能下意识觉得"现在做控制都得收集数据训练个策略",于是卡在"没数据"这一步。
§5.2 的 MBD 会让你意识到一件被忽视的事——很多控制问题的动力学和代价本就是已知的,根本不必从数据里学,可以用模型直接算出去噪所需的 score,做到免训练、免数据。不知道这条路,你会在"没数据"前停步、或被迫去凑数据训练;知道了,你手上"已知的模型"本身就是足够的资源,能直接上免训练的采样优化。
场景四:你的采样式 MPC 行为诡异(绕远、抖动、贴障碍走),你反复调算法参数却不见好。 你可能一直在错的地方找问题。
§5.5 的代价设计实验会让你意识到:采样式 MPC 的行为由算法和代价**共同**决定,而代价的影响常常更大——一个强优化器会忠实地利用代价里的每个漏洞。不懂这一点,你会在调算法上浪费大量时间;懂了,你的第一反应会变成"先逐项检查代价",往往一下就找到症结(漏了平滑项、避障权重配错、把硬约束当软约束)。这个"先查代价、再查算法"的诊断习惯,会为你省下无数调试时间。
一句话:第 4 章把经典采样式 MPC 的框架讲到了头并点出其高斯天花板,本章教你"怎么用扩散的视角和退火的机制突破这层天花板、爬上高维",并让你学会诚实地评估它的能力边界、把代价设计当成和算法同等重要的事。
预计阅读时间¶
- 精读(推导 + 代码 + 自己跑退火 demo):约 4–5 小时。§5.1 的同构是全章地基、§5.3 的退火是核心机制,都值得慢读;§5.2 的 score 推导稍抽象,可结合代码理解。
- 速读(抓主线、跳过部分推导):约 1.5–2 小时。重点读 §5.1 的"MPPI 一步 = 单步去噪"、§5.3 的"退火 vs 单级"对比。
- 速查(按需查阅):DDPM↔MPPI 对应看 §5.1 的并排公式;DIAL-MPC 退火调度看 §5.3 的伪代码与参数表。
本章学习路径建议¶
本章概念密度较大、核心节有难有易,按你的背景和目标,可以走不同的路径,不必所有内容一次啃完。
如果你时间有限、只想抓住核心思想:精读 §5.1(MPPI = 单步去噪的同构,全章地基)和 §5.5(六十行实战,把思想落成代码),再看每节末尾的"本质洞察"引用块。这条最短路径能让你建立"威力在多步复合、不在单步"的核心直觉,并亲手跑通一个退火采样 MPC。其余作为按需查阅。
如果你要理解数学细节:在上面基础上,重点读 §5.1 的"理论"小节和加深小节(DDPM 量的对应、两条技术线汇流)、§5.2 的 Tweedie 恒等式加深(score = 后验均值位移)。这些是"为什么去噪 = 朝 score 走"的数学根基,读完你能从原理上讲清整套等价关系。
如果你关心工程落地:重点读 §5.3(DIAL-MPC 全阶力矩控制、bi-level 退火、真机结果)、§5.5 的"从玩具到真机"加深、§5.6(选型与梯度 MPC 共存)、以及故障排查手册。这条路径帮你判断"我的项目该不该用、怎么和已有工具配合、踩坑了怎么排查"。
如果你想跟踪研究前沿:在理解前几节后,读 §5.4(Gibbs 统一、learned prior 两条路线)和延伸阅读。重点不是记住每个方法,而是掌握 §5.6 那套"四轴坐标系"和 §5.4 的"模型 ↔ 数据光谱",用它们定位层出不穷的新工作。
无论走哪条路径,都建议至少亲手跑一个本章的 NumPy demo(§5.1、§5.2、§5.5、§5.6 都有几十行可跑的),并完成对应的练习。本章反复强调"动手优先于读论文"——退火"由粗到精"的直觉,亲手把成功率调出来比读十遍推导都深刻。
科研发展脉络¶
本章的两项核心工作都出自 CMU LeCAR Lab(Shi 组),而且环环相扣——先有 MBD 把"扩散用于轨迹优化、且 score 来自模型"这条路打通,再有 DIAL-MPC 把同一套思想中的"退火"机制专门用于腿足力矩控制:
| 年份 | 工作 | Venue | 一句话贡献 |
|---|---|---|---|
| 2024 | Pan, Yi, Shi, Qu, Model-Based Diffusion for Trajectory Optimization(MBD) | NeurIPS 2024(arXiv:2407.01573) | 把动力学/代价直接当作 score 来跑反向扩散→**免训练、免数据**的轨迹优化;比 PPO 高约 59% |
| 2025 | Xue, Pan, Yi, Qu, Shi, Full-Order Sampling-Based MPC via Diffusion-Style Annealing(DIAL-MPC) | ICRA 2025(最佳论文入围;arXiv:2409.15610) | 扩散式退火 + 全阶力矩级采样 MPC;比标准 MPPI 跟踪误差低 13.4×、高难任务比 RL 高约 50%,真机带载跳跃,且全程**免训练** |
这条脉络的内在逻辑可以这样读。扩散模型在生成领域(图像、视频)大获成功后,被引入机器人做运动规划与控制——典型如 Diffusion Policy(Chi 等,2023),它把扩散模型当成一个从演示数据里学出来的策略。
但这类方法有一个根本限制:它们是 model-free 的,需要大量高质量演示数据训练,换个机器人(动力学变了)就得重新收集数据、重新训练,泛化性受限。
2024 年的 MBD 提出一个漂亮的反转:很多控制问题的动力学和代价是已知的——那何必从数据里学 score?直接用模型把 score 算出来不就行了。于是 MBD 做到了"免训练、免数据"的扩散式轨迹优化,并发现它在大量任务上比 PPO 还好。
2025 年的 DIAL-MPC 把这套思想里最适合实时控制的部分——"用多级退火模拟反向扩散"——专门做成腿足机器人的力矩级控制器,第一次让免训练的采样式 MPC 直接在全阶(几十维)动力学上实时跑,甚至在真机上完成带负载跳跃。
一个值得留意的趋势:这一波工作都在"用模型信息替代数据/训练"。第 4 章的方法是"在高斯框架内把采样调得更巧",本章的方法则更进一步——借扩散的结构、但拒绝扩散对数据和训练的依赖,把已有的模型知识用到极致。这是采样式控制与生成模型融合时,一条特别务实、特别适合机器人的路线。本章带你走完这一段。
§5.1 DDPM → MPPI 数学桥梁:一步加权更新就是一步去噪 ⭐⭐⭐¶
动机:扩散模型凭什么能生成高斯生成不了的东西?¶
第 4 章反复敲打一件事:高斯提议分布表达力有限——单峰、对称、形状受限。可扩散模型偏偏以"能生成极其复杂、多峰的分布"闻名(你见过的那些以假乱真的 AI 图像就是证据)。
这里就有一个值得深究的矛盾:扩散模型的每一步,用的恰恰也是高斯(反向过程每一步加的是高斯噪声、学的是高斯条件分布)。既然单步还是高斯,它凭什么能生成高斯生成不了的复杂分布?
答案是本章最重要的一个观念,先一句话点破,后面慢慢展开:扩散模型的表达力,不来自任何单步,而来自"许多步高斯去噪的复合"。 一步高斯挪不远、雕不出复杂形状,但几十上百步首尾相接,就能把一团纯噪声逐步"雕刻"成任意复杂的分布。
这件事对采样式 MPC 意味着什么?它提示了一条突破高斯天花板的新路——不必去设计一个更花哨的单步提议分布(那很难),只要学会把"许多步高斯更新"组织成一个去噪过程,就能获得远超单步高斯的表达力。
而最妙的地方在于:你早就会"一步高斯更新"了——那就是 MPPI。本节要证明的核心命题是:
MPPI 的一步加权更新,在数学上就是扩散模型的一步去噪。
一旦接受这个命题,扩散启发的采样 MPC 对你就不再神秘:它的零件你全都有(MPPI),缺的只是"如何把这些零件串成一个去噪过程"的组织方式——而这正是 §5.2(MBD)和 §5.3(DIAL-MPC)要补的。
把"高斯天花板"说得更具体一点¶
§5.1 开头说扩散要突破第 4 章的"高斯天花板",但"天花板"听起来抽象。这一小节用一个具体场景把它说透——你得先真切感到这堵墙的存在,才会珍惜扩散绕过它的价值。
设想一个最简单的多峰决策:机器人要从 A 点到 B 点,前方有一根柱子,绕左边和绕右边都可行、且代价差不多。那么"最优控制分布"在这个情形下是**双峰**的——一峰对应"向左绕"的控制序列,一峰对应"向右绕"的控制序列,两峰之间(直接撞柱子)是低概率区。
现在让单级高斯 MPPI 来逼近这个双峰分布,会发生什么?高斯是**单峰**的,它只有一个均值。于是它的均值会落在两峰之间——也就是"直直撞向柱子"的那个最差区域!这不是调参能解决的,是高斯这个分布族的**结构性局限**:单峰分布逼近双峰目标,最优的单峰拟合往往落在两峰中间的谷底。
这就是高斯天花板的具体面目:面对多峰的最优分布,单步高斯提议分布在原理上就拟合不好,甚至会把概率质量堆在最差的地方。 第 4 章那些技巧(有色噪声、CoVO 协方差整形、CEM 精英截断)都在"如何把这个高斯调得更好"上下功夫,但它们改变不了"它是个单峰高斯"这一根本——天花板纹丝不动。
读到这里你可能会想:那用高斯混合(多个高斯)不就行了? 这确实是一条路(第 4 章提过高斯混合),但它有两个麻烦:你得**事先知道有几个峰**(绕柱子是 2 个,复杂场景可能不知道有几个),还得管理多个分量的权重和协方差,调参和计算都更重。它治标——多给几个单峰拼一拼,但不够通用、不够自动。
扩散的解法则从另一个维度釜底抽薪:不在"单步用什么分布"上较劲,而是用"多步去噪的复合"自动生成任意复杂的多峰分布。 回忆 §5.1 的核心观念——每步仍是高斯(还是那个单峰的、好采样的高斯),但几十步去噪首尾相接,能把一团噪声雕成任意形状,包括双峰、多峰、带复杂结构的分布。
具体到绕柱子的例子:高噪声级时,去噪过程"看到"的是被大幅平滑后的地形,左右两峰糊成一个大致的"要绕开柱子"的方向;随着噪声级降低,过程会**随机地、但连贯地**坍缩到左绕或右绕的某一个峰上(取决于采样的随机性和初值),最终给出一条干净的单峰式具体轨迹——而不是卡在中间撞柱子。多步复合让"用单峰高斯的零件、表达多峰的结果"成为可能。
本质洞察:高斯天花板的本质,是"单步**的表达力"和"**目标分布**的复杂度"之间的鸿沟——目标可以任意多峰复杂,而任何单步分布(高斯、甚至高斯混合)的表达力都有限。第 4 章在"把单步调好"的框架内已经做到了极致,但框架本身锁死了上限。扩散的深刻之处在于它换了个维度思考:**与其追求一个表达力足够强的单步(很难、不通用),不如用许多个简单的单步复合出强表达力(每步都简单,复合后却无所不能)。 这是一种"用深度换宽度"的智慧——神经网络用多层换表达力、扩散用多步换表达力,本质相通。理解了这一点,你就明白本章为什么反复强调"突破在多步组织、不在单步":这不是一句口号,而是对"复杂性从哪里来"的根本回答。
如果不这样做会怎样:把扩散 MPC 当成"又一个要训练的大模型"¶
如果你不建立"MPPI = 单步去噪"这个连接,而是把扩散 MPC 当成一个独立的新领域,会付出什么代价?
第一,误以为它需要训练庞大的扩散网络。提到"扩散模型",多数人的第一反应是"要收集数据、训一个大网络"。
抱着这个预设,你会觉得扩散 MPC 又贵又难、和你手头的 MPPI 工程无关,从而错过它——殊不知 MBD/DIAL-MPC 这条线**根本不训练任何网络**,它们的内核就是你已经在跑的加权采样更新。
第二,看不懂这两年的论文。当论文写"MPPI is a single-step diffusion""we use diffusion-style annealing"时,没有 §5.1 的同构,你只能死记这些话、看不出它们其实在说"把你熟悉的 MPPI 重复几级"。
第三,在高维上无谋可施。不理解"单步去噪 → 多步退火"的升级路径,面对几十维的力矩控制,你只会本能地加样本数,撞上维度灾难的墙——而退火这把钥匙明明就在手边。
所以"看穿 MPPI = 单步去噪"不是一个炫技的理论联系,而是让你能低成本地接住整个扩散 MPC 方向、并把它用到高维控制上的地基。下面就来搭这个地基。
历史:从 DDPM 到 model-based 的转向¶
为了讲清同构,先快速回顾扩散模型的来路(只取理解 §5.1 必需的直觉,细节可查原论文)。
DDPM(去噪扩散概率模型,Ho、Jain、Abbeel,NeurIPS 2020) 是这波扩散浪潮的奠基工作之一。它的想法分两半。
前向过程(加噪):拿一张干净图像,逐步往里加高斯噪声,加足够多步后图像变成纯高斯噪声。这一步不需要学,是固定的。
反向过程(去噪):训练一个网络,学会"给定一张带噪图像,预测该往哪个方向去噪一点点",从纯噪声出发逐步去噪,最终恢复出一张干净图像。生成的本事全在这个反向去噪网络里。
score-based 视角(Song、Ermon,NeurIPS 2019) 给了去噪一个更本质的解释:去噪的方向,本质是 score——对数概率密度的梯度 \(\nabla_x\log p(x)\),它指向"数据更可能出现"的方向。顺着 score 一点点挪(再加点噪声保持多样性),就是反向去噪。这个视角对本章至关重要,因为 MPPI 的权重恰恰能和 score 对上。
Diffusion Policy(Chi 等,2023) 把扩散模型引入机器人——把"动作序列"当成要生成的对象,从人类演示里训练一个扩散策略。它很成功,但**是 model-free 的**:要数据、要训练,换个动力学就得重训。
model-based 的转向(MBD、DIAL-MPC,2024–2025) 正是对上面这个限制的回应:既然控制问题里动力学和代价常常已知,score 就能直接算、不必从数据学。这一转向把扩散从"数据驱动的生成模型"变成"模型驱动的优化器"——而它的一步,恰好就是 MPPI。下面把这个"恰好"讲清楚。
补一段来路:两条技术线如何汇流,又如何拐进控制¶
上面的历史小节讲了"从 DDPM 到 model-based 的转向",这里再补一层背景——扩散模型本身其实是**两条独立技术线汇流**的产物,理清这个,你会更明白本章方法继承了什么。想直接进理论的话可以跳过,但这段能帮你把"为什么去噪 = 朝 score 走"理解得更有来历。
第一条线:DDPM(加噪—去噪的视角)。 2020 年的 DDPM 把生成建模组织成"前向一步步加噪声、反向一步步去噪声"的过程,训练一个网络预测每步该去掉的噪声。它的语言是"噪声预测"——网络学的是"这一步混进了多少噪声"。
第二条线:score-based 生成(梯度场的视角)。 几乎同期(2019 年起),另一拨工作从完全不同的角度切入:把生成理解为"沿着数据分布的对数梯度(score)往上爬"。它的语言是"score 估计"——学的是"在当前点,往哪个方向走数据更可能"。
这两条线一开始看起来是两套理论,但很快人们发现它们**在数学上等价**:DDPM 里"预测噪声"和 score-based 里"估计 score"只差一个已知系数(你在 §5.2 加深会看到的 Tweedie 关系正是这个等价的核心)。于是"去噪一步"和"朝 score 上升一步"被证明是同一件事——这个统一,正是本章 §5.1 反复用的那个等价关系的源头。
理解了这个汇流,本章的逻辑就更清晰了。控制借的,主要是 score-based 这条线的语言——因为"朝 score(高密度 / 低代价方向)上升"和控制里"朝低代价方向优化"天然契合。MPPI 的加权更新被解读为"score 上升一步",靠的就是这条线。而 DDPM 那条线贡献了"多级噪声调度"的具体框架(怎么从高噪声一级级降到低噪声),对应本章的退火调度。
本质洞察:扩散模型能成为连接生成与控制的桥梁,恰恰因为它自己就站在"概率(score / 密度)"和"过程(加噪 / 去噪调度)"两条线的交汇点上。控制问题需要的两样东西——"往哪优化"(方向)和"怎么由粗到精"(调度)——正好分别对应这两条线。这不是巧合:任何"逐步逼近一个目标分布"的方法,本质上都要回答"每步往哪走"和"步子怎么安排"这两个问题,而扩散模型把这两个问题都漂亮地形式化了。所以本章不是把一个生成模型硬套到控制上,而是发现了控制问题本就需要的结构,碰巧在扩散模型里被研究得最透彻。看清这种"不同领域因共享底层结构而互通"的现象,是建立跨领域直觉的关键一步。
理论:把 MPPI 和 DDPM 反向步并排看¶
我们分三步搭桥:先各自写出 MPPI 的更新和 DDPM 的反向步,再论证它们结构同构,最后点出 score 与 MPPI 权重的精确关系。
第一步:MPPI 的一步更新(回顾第 2 章)。 给定当前控制序列均值 \(U\),采 \(K\) 条扰动 \(\varepsilon_k\sim\mathcal{N}(0,\Sigma)\),每条 rollout 算代价 \(J_k=J(U+\varepsilon_k)\),按指数权重加权平均更新:
读法:新均值 = 旧均值 + "加权后的噪声修正"。代价低的扰动权重大,于是更新朝着"低代价扰动指向的方向"挪。
第二步:DDPM 的一步反向(去噪)。 在去噪的某一级,给定当前(带噪的)估计 \(x_k\),反向一步生成更干净的 \(x_{k-1}\),其一般形式是:
其中 \(\nabla_x\log p_k\) 是当前噪声级下分布的 score、\(c_k,\sigma_k\) 是与噪声调度有关的系数。读法:新估计 = 旧估计 + "朝 score 方向的修正" + "一点保持多样性的噪声"。
第三步:论证两者同构。 把两个式子的结构抽出来,它们是同一个模板:
MPPI 的"\(\sum_k w_k\varepsilon_k\)"和 DDPM 的"\(c_k\nabla\log p_k\)"占的是同一个位置——都是"指向更优 / 更高概率方向的修正量"。要把它们真正对上,还差最后一块:论证 MPPI 的加权噪声,正是某个目标分布 score 的估计。
考虑 MPPI 隐含的目标分布(第 1 章):\(p(U)\propto \exp(-J(U)/\lambda)\),代价越低、概率越高。对它取对数梯度(score):
而 MPPI 的加权噪声 \(\sum_k w_k\varepsilon_k\),是用采样去估计"在 \(U\) 附近、按 \(e^{-J/\lambda}\) 加权的平均位移"——这正是上面这个 score(经高斯平滑后)的一个**蒙特卡洛估计**。换句话说,MPPI 没有解析地算 \(\nabla J\),而是用"撒扰动、按 \(e^{-J/\lambda}\) 加权"这个无导数的办法,估计出了"朝 score 上升"的方向。
这个结论可以用代码直接验证。对一个二次代价 \(J=\tfrac12 U^\top H U\),精确 score 上升方向是 \(-HU\);我们看 MPPI 的加权噪声更新方向和它有多接近:
import numpy as np
def mppi_step_dir(u, H, lam, sigma, K, rng):
eps = sigma * rng.standard_normal((K, u.size)) # 采扰动
U = u + eps
J = 0.5 * np.einsum('ki,ij,kj->k', U, H, U) # 二次代价
w = np.exp(-(J - J.min()) / lam); w /= w.sum() # 指数权重
return (w[:, None] * eps).sum(0) # MPPI 更新增量
rng = np.random.default_rng(0)
H = np.diag([4.0, 1.0, 0.25]); u = np.array([1.0, 1.0, 1.0])
# 多次平均以压低蒙特卡洛噪声, 看方向的期望
upd = np.mean([mppi_step_dir(u, H, 2.0, 0.4, 4000, rng) for _ in range(20)], axis=0)
score = -(H @ u) # 目标分布 score 上升方向 ∝ -∇J
cos = upd @ score / (np.linalg.norm(upd) * np.linalg.norm(score))
print("MPPI 更新增量 :", np.round(upd, 4))
print("score 上升方向 -Hu :", np.round(score, 4))
print("两方向余弦相似度 :", round(float(cos), 4))
输出:
余弦相似度 \(0.9985\)——MPPI 的加权噪声更新方向,和目标分布 score 的上升方向几乎完全一致。这就坐实了第三步的论证:MPPI 的一步加权更新 = 一步 score 上升 = 一步去噪。 三者是同一个操作。
本质洞察:MPPI 与扩散去噪的同构,不是表面的形式相似,而是因为它们在做同一件事——"朝着一个把概率质量集中在低代价(高密度)区的目标分布的 score 方向,挪一步"。DDPM 用一个**学出来的**网络提供 score,MPPI 用"撒扰动、按 \(e^{-J/\lambda}\) 加权"**估计**出 score。两条路殊途同归。理解了这一点,第 4 章那个"MPPI ↔ REINFORCE"的同构就有了第三张面孔:REINFORCE 的回报加权、MPPI 的代价加权、扩散的 score 去噪,本质是同一个"加权估计上升方向"的操作。一个采样式控制器、一个策略梯度、一个生成模型的去噪步,在数学的最内核处是同一个东西。
读到这里你可能会问:既然 MPPI 的一步就是去噪,那把它叫"扩散"是不是新瓶装旧酒、没有任何新东西? 这是个很合理的质疑,答案是"一步确实是旧的,但视角和组织方式带来了两样真东西"。
其一是 MBD 的视角红利:一旦认出"去噪需要 score、而 score 对已知模型可以直接算",你就得到一个免训练的扩散式优化器(§5.2)——这是把 MPPI 放进扩散框架后才看清的。
其二是 DIAL-MPC 的组织红利:单步去噪是旧的,但"把单步沿温度/方差调度重复多级、组成完整反向扩散"是新的(§5.3)——正是这个"多步复合"突破了单步高斯的天花板,让采样式 MPC 爬上几十维。
所以"MPPI = 单步去噪"这句话本身平平无奇,它的价值在于打开了"多步复合"和"model-based score"这两扇门。下面先看"多步复合"能带来什么——用一个最小的退火 demo 直观感受,再到 §5.3 看它怎么征服高维。
补一个严谨性问题:二次代价是凸的,这个同构对非凸代价还成立吗¶
细心的读者会在这里停下来质疑:上面用来验证"MPPI 一步 = score 上升"的代价 \(J=\frac12 U^\top HU\) 是凸的、单峰的,可本章通篇在讲非凸问题——这个同构在非凸代价上还成立吗? 这是一个很好的、必须正面回答的质疑。答案是成立的,但要把"成立的到底是什么"说精确。
先说结论:MPPI 的加权平均估计的,不是原代价 \(J\) 的 score,而是"被高斯核平滑过的目标分布"的 score。这个区别在凸代价上不重要(平滑后还是那个单峰),在非凸代价上恰恰是关键。
把它讲清楚。MPPI 在当前点 \(U\) 附近撒方差为 \(\sigma^2\) 的高斯扰动、按 \(e^{-J/\lambda}\) 加权平均。这个操作在数学上算的是什么?它算的是目标分布 \(p(U)\propto e^{-J(U)/\lambda}\) **与一个方差 \(\sigma^2\) 的高斯核做卷积之后**的那个分布——记作 \(p_\sigma\)——在当前点的 score。也就是说:
这里的卷积(\(*\))正是 §5.2 那个"高斯核模糊地形"的几何操作的数学写法。对**凸的二次代价**,\(p\) 本身是单峰高斯型,卷积后 \(p_\sigma\) 还是同类型的单峰,其 score 方向和原 \(J\) 的负梯度方向一致——所以前面的数值验证里余弦相似度高达 0.9985,\(p_\sigma\) 的 score 和 \(-\nabla J\) 几乎同向。
对**非凸代价**,\(p\) 是多峰的,卷积后的 \(p_\sigma\) 是"被模糊过的多峰"——\(\sigma\) 越大模糊越狠、局部峰被抹得越平。这时 MPPI 加权平均估计的是这个**模糊版** \(p_\sigma\) 的 score,而不是原始多峰 \(p\) 的 score。这恰恰是好事,也正是退火能工作的根本原因:
本质洞察:MPPI 的加权平均"自带平滑"——它估计的从来不是原始代价的 score,而是被采样方差 \(\sigma^2\) 决定的高斯核平滑过的目标分布的 score。这一个事实同时解释了本章的两件大事。其一,它解释了 §5.1 的同构为什么对非凸代价依然成立:同构成立的是"MPPI 一步 = 平滑版目标分布的一步 score 上升",平滑版对凸/非凸代价都有定义、都成立,只是凸代价下平滑不改变峰的结构、非凸代价下平滑抹平了小峰。其二,它解释了 §5.2/§5.3 的退火为什么有效:退火让 \(\sigma\) 从大到小,等价于让平滑核从大到小——高 \(\sigma\) 级估计的是"重度模糊版"的 score(能看全局),低 \(\sigma\) 级估计的是"轻度模糊版"的 score(能精修)。所以"MPPI 一步 = 单步去噪""退火 = 由粗到精"这两个本章反复用的论断,根子上是同一个数学事实——采样方差就是平滑尺度,加权平均就是平滑后分布的 score 估计。一旦你抓住"\(\sigma\) 既是采样范围、又是平滑尺度"这个一体两面,本章所有零散的直觉就被这一个公式串成了整体。
这也顺带解答了一个 §5.1 埋下、很多人会困惑的点:为什么前面二次代价 demo 里,MPPI 增量的**大小**远小于 \(-\nabla J\)(增量约 \(-0.24\),而 \(-Hu\) 约 \(-4\)),只有**方向**一致?因为 MPPI 估计的是 \(\sigma^2\nabla\log p_\sigma\),那个 \(\sigma^2\)(demo 里 \(\sigma=0.4\),\(\sigma^2=0.16\))和平滑本身都会缩小幅度——但方向不变。这就是为什么本章一路只谈"方向一致(余弦≈1)"而不谈幅度相等:幅度本就差一个 \(\sigma^2\) 的步长系数和平滑因子,方向才是同构的本质。
多步复合的威力:退火 vs 单级(一个最小 demo)¶
为什么"多步复合"比"单步"强这么多?这里用一个刻意构造的非凸地形直观演示——它是 §5.3 DIAL-MPC 退火机制的最小化身。
构造一个二维"欺骗性"代价地形:起点附近有一个**宽而浅**的局部最优阱(代价约 \(-1\)),远处有一个**深的全局最优阱**(代价约 \(-4\))。起点就落在局部阱里。
- 单级 vanilla MPPI:固定一个不大不小的方差 \(\sigma\) 和温度 \(\lambda\) 反复更新。方差小了走不出局部阱、方差大了又无法在全局阱里精细收敛——单一尺度顾此失彼。
- 多级退火 MPPI:方差和温度从大到小逐级缩小(如 \(\sigma:2.0\to1.0\to0.5\to0.25\),\(\lambda:10\to3\to1\to0.3\))。高温大方差阶段先在全局尺度上"看见"深阱,低温小方差阶段再在深阱里精细收敛。
关键约束:两者用完全相同的总采样预算(都是 \(3200\) 个样本),唯一区别是"一个尺度撒到底"还是"多个尺度逐级聚焦"。代码骨架如下:
def cost(U): # 非凸: 深全局阱(2,2) + 宽浅局部阱(0,0)
U = np.atleast_2d(U); g = np.array([2.0, 2.0])
Jg = -4.0 * np.exp(-((U-g)**2).sum(1) / (2*1.0**2)) # 深、中宽
Jl = -1.0 * np.exp(-(U**2).sum(1) / (2*0.7**2)) # 浅、宽
return Jg + Jl + 0.02*(U**2).sum(1)
def mppi_single(seed, K=200, iters=16, lam=1.0, sigma=0.45):
rng = np.random.default_rng(seed); mu = np.zeros(2)
for _ in range(iters): # 单一 (λ, σ) 撒到底
eps = sigma*rng.standard_normal((K,2)); U = mu+eps
J = cost(U); w = np.exp(-(J-J.min())/lam); w /= w.sum()
mu = mu + (w[:,None]*eps).sum(0)
return mu
def mppi_anneal(seed, K=200, iters_per=4,
lams=(10.,3.,1.,0.3), sigs=(2.0,1.0,0.5,0.25)):
rng = np.random.default_rng(seed); mu = np.zeros(2)
for lam, sigma in zip(lams, sigs): # 多级: 温度&方差逐级缩小
for _ in range(iters_per):
eps = sigma*rng.standard_normal((K,2)); U = mu+eps
J = cost(U); w = np.exp(-(J-J.min())/lam); w /= w.sum()
mu = mu + (w[:,None]*eps).sum(0)
return mu
跑 30 个随机种子,统计平均最终代价和"找到全局阱"的次数:
单级 vanilla MPPI (λ=1, σ=0.45, 16 迭代): 平均代价 -1.517 命中全局阱 2/30
多级退火 MPPI (λ:10→0.3, σ:2→0.25, 4级×4): 平均代价 -3.514 命中全局阱 26/30
总样本预算: 单级 200×16=3200; 退火 200×4×4=3200 (完全相同)
差异一目了然:完全相同的样本预算下,单级 MPPI 几乎总被宽浅的局部阱吸住(只有 2/30 逃出去找到全局阱、平均代价仅 \(-1.5\));多级退火则 26/30 找到全局阱、平均代价 \(-3.5\)。 把"一个尺度撒到底"换成"多尺度逐级聚焦",仅此一项,效果天差地别。
为什么退火能赢?因为它把"探索"和"利用"在**时间上分开**了:高温大方差阶段牺牲精度换全局视野(先看清深阱在哪),低温小方差阶段再牺牲视野换精度(在深阱里收敛)。单级 MPPI 被迫用一个固定尺度同时干这两件相互矛盾的事,自然两头不讨好。
这正是"多步复合"威力的最小演示——它和 DDPM 反向过程"从高噪声级逐步去噪到低噪声级"是同一个道理:高噪声级管全局、低噪声级管局部,逐级交棒。 §5.3 的 DIAL-MPC 把这个机制做到极致,让它在几十维力矩空间里工作。
这个 demo 也顺带回答了"退火和模拟退火什么关系"——值得做个跨领域类比,但要标好边界。
退火(annealing)这个词本就来自**冶金**:把金属加热到高温让原子能自由移动(跳出局部的晶格缺陷),再缓慢降温让它们安顿到全局能量最低的规整结构。模拟退火(simulated annealing) 把这个思想搬进优化——用一个"温度"参数控制接受劣解的概率,高温多探索、低温多收敛。
DIAL-MPC 的温度退火与模拟退火**相似之处在于**:都用一个从高到低的温度调度,先全局探索、后局部收敛。不同之处在于:模拟退火每步走一个候选、靠"以一定概率接受劣解"来跳出局部最优;DIAL-MPC 每级撒一批样本、做一次 MPPI 加权更新(即一步去噪),靠"批量采样 + 加权平均"来感知全局。一个是单点随机游走、一个是批量去噪。
不要把这个类比延伸过头:DIAL-MPC 的温度 \(\lambda\) 是 MPPI 加权里的温度(控制权重软硬),和模拟退火里"接受概率"的温度虽精神相通、但不是同一个机制。共同的内核是"高温探索、低温收敛的调度",这一点跨越冶金、优化、扩散、采样控制,是个通用智慧。
还有一个对你这个有 RL 背景的读者更亲切的类比(也是本章思考题会深挖的):退火调度很像 RL 里的**课程学习(curriculum learning)**——都是"先易后难/先粗后精"地安排搜索。区别在于课程学习改的是任务难度的调度,退火改的是采样分布尺度的调度;但"用一个由粗到精的调度来让搜索更高效"这个思想是共通的。后面 §5.3 会回到这个对照。
把对应关系做精确:DDPM 的每个量在 MPPI 里是什么¶
前面证明了"MPPI 一步 = 去噪一步"的结构同构,但有的读者会想要更扎实的东西——DDPM 反向公式里那些系数(\(\bar\alpha_k\)、\(\beta_k\)、噪声调度)到底对应 MPPI 的什么?本小节把这张对应表做细,不影响主线,想跳过直接看下一小节也可以。
DDPM 的前向加噪由一串噪声调度系数 \(\beta_1,\dots,\beta_K\)(每步加多少噪声,通常很小、随 \(k\) 递增)决定。定义 \(\alpha_k=1-\beta_k\)、累积量 \(\bar\alpha_k=\prod_{i\le k}\alpha_i\),则前向可以一步到位地写成:
读法:\(\bar\alpha_k\) 从 \(k=0\) 的 \(1\) 单调降到 \(k=K\) 的接近 \(0\)。\(k\) 小时 \(\sqrt{\bar\alpha_k}\approx1\)、噪声项小,\(\tau_k\) 仍接近干净轨迹;\(k\) 大时 \(\sqrt{\bar\alpha_k}\approx0\),\(\tau_k\) 几乎是纯噪声 \(\varepsilon\)。这一串 \(\bar\alpha_k\) 就是"噪声级调度"。
下面这张表把扩散的每个量翻译成 MPPI / 退火采样 MPC 的语言:
| DDPM / 扩散里的量 | 含义 | 在退火采样 MPC 里对应 |
|---|---|---|
| 噪声级索引 \(k\)(\(K\to0\)) | 反向过程从纯噪声到干净的进度 | 退火级索引(高温级 → 低温级) |
| 噪声调度 \(\bar\alpha_k\) | 每级保留多少原信号 | 该级采样方差 \(\sigma_k^2\) 的调度(大 → 小) |
| score \(\nabla_\tau\log p_k(\tau_k)\) | 当前噪声级下指向高密度的方向 | MPPI 加权噪声 \(\sum_k w_k\varepsilon_k\)(用采样估计) |
| 反向步注入的噪声 \(\sigma_k z\) | 保持多样性、不塌成一个点 | MPPI 下一级重新采样的扰动方差 \(\Sigma_l\) |
| 学到的去噪网络 \(\epsilon_\theta\) | 提供 score(需训练) | 用模型 rollout 算代价加权(MBD:免训练) |
| 温度(采样随机性强弱) | 生成的多样性 / 锐度 | MPPI 温度 \(\lambda\)(权重软硬) |
这张表里最值得盯住的是两行。第一行是 score:扩散用一个训练好的网络 \(\epsilon_\theta\) 提供它,退火采样 MPC 用"撒扰动、按 \(e^{-J/\lambda}\) 加权"估计它——这正是 §5.2 MBD 免训练的根基。第二行是 噪声调度 \(\bar\alpha_k\) ↔ 方差调度 \(\sigma_k\):扩散里 \(\bar\alpha_k\) 怎么从 1 降到 0,对应退火里方差怎么从大降到小,两者都是"由高噪声到低噪声"的同一条调度。
有一处差异要诚实标注,免得你把对应关系当成完全等同。标准 DDPM 的反向过程,每一步去噪后会再注入一点噪声 \(\sigma_k z\)(为了从分布里采样、保持多样性),所以它生成的是一条随机样本;而**退火采样 MPC 通常只保留"加权平均"这个均值更新、把多样性体现在下一级重新采样上**,目标是收敛到一个低代价解而非采样多样轨迹。
换句话说,生成模型要的是"采样出多样的好样本",控制要的是"收敛到一个最优解"——同一个去噪机制,因为目标不同,在"要不要保留注入噪声"上有取舍。这也解释了为什么 MBD/DIAL 把这套机制叫"扩散启发"而非"扩散":它们借了去噪/退火的骨架,但按优化(而非生成)的目标做了裁剪。
本质洞察:DDPM 用一串精心设计的噪声调度 \(\bar\alpha_k\) 把"加噪—去噪"组织成一个连续的概率路径,而退火采样 MPC 用一串温度/方差调度 \((\lambda_l,\sigma_l)\) 做同一件事。两者的"调度"在数学上扮演同一个角色——决定"由粗到精"的节奏。理解了这一点,你调退火调度(几级、温度怎么降、方差怎么缩)时,心里参照的其实就是扩散里调噪声调度的那套直觉:降太快会"跳级"(来不及从全局过渡到局部),降太慢则浪费计算。调度设计是这类方法的核心手艺,而它跨越生成与控制两个领域是相通的。
读到这里你可能会问:既然对应得这么齐整,为什么不干脆把训练好的扩散去噪网络直接拿来当控制器,省得在线撒一堆样本? 这个想法很自然,也正是 Diffusion Policy 那条路(§5.2 对照过)。但它要付出三个代价:要数据训练、绑定训练时的动力学、且学到的是"像演示数据的动作"而非"对当前代价最优的动作"。
而退火采样 MPC 用在线采样估计 score,换来的是免训练、跨动力学、且直接对当前代价/约束最优——代价是每步要在线算。所以不是"哪个绝对好",而是 §5.2 会展开的那个取舍:score 是"学出来"还是"算出来"。这张对应表的价值,正是让你看清这两条路其实在同一个框架里,只在"score 从哪来"这一格上分道扬镳。
⚠️ 常见陷阱¶
编程陷阱:退火温度/方差表写反方向(从小到大),或忘记逐级缩小协方差。
错误做法:把 lams、sigs 写成递增(如 \(\lambda:0.3\to10\)、\(\sigma:0.25\to2\)),或只缩温度不缩方差(甚至全程固定方差)。
现象/后果:写反方向会让算法先在小尺度精修(过早锁死在起点附近的局部阱)、再用大尺度把已收敛的解打散,退火彻底失效,效果还不如单级;只缩温度不缩方差则后期仍在大范围乱撒,无法精细收敛,最终解抖动、精度差。
根本原因:退火的核心是"高温大方差先全局、低温小方差后局部"这个**由粗到精的单向调度**——方向反了就是"由精到粗",违背了"先看清再收敛"的逻辑;方差不缩则丢了"后期精修"这一半。
正确做法:温度和方差都**单调递减**(高→低),且通常同步缩小(DIAL-MPC 的 horizon_diffuse_factor/traj_diffuse_factor 就是控制这个缩小速率的);高温级数管全局覆盖、低温级数管局部收敛。
自检方法:打印每级的 \((\lambda,\sigma)\),确认单调递减;在上面的非凸 demo 上跑,若"命中全局阱"的比例不明显高于单级,多半是调度方向或缩放写错了。
概念误区:以为"扩散启发的采样 MPC"就是要训练一个扩散网络当提议分布。 错误认识:一听"扩散 MPC"就默认要收集数据、训一个扩散模型来生成动作(像 Diffusion Policy 那样)。 现象/后果:误判这个方向又贵又难、和手头的 MPPI 工程无关而错过它;或者真去训一个网络,绕了大弯还引入了数据依赖和泛化问题。 根本原因:混淆了"用扩散模型(model-free,要训练)"和"用扩散的结构/思想(model-based,免训练)"。本章的 MBD/DIAL-MPC 属于后者——它们借的是扩散"多步去噪/退火"的结构和"score 引导"的思想,而 score 由已知模型直接算,不训练任何网络、不需要任何数据。 正确做法:把扩散启发方法理解为"用扩散的组织方式重新跑 MPPI"——零件是你已有的加权采样更新,新增的只是"多级退火"的调度和"用模型算 score"的视角。需要训练网络的那类(如把扩散策略当 learned prior)是另一条前沿支线(§5.3 前沿会提),不是本章主线。
思维陷阱:把"MPPI = 单步去噪"理解成"扩散没给采样 MPC 带来任何新东西"。 错误认识:既然一步就是 MPPI,那扩散视角不过是换个说法,没有实质增量。 现象/后果:轻视这个方向,不去学退火和 model-based score,结果在高维控制上仍只会单级 MPPI、撞维度灾难。 根本原因:只看到"单步相同",没看到"多步复合"和"model-based score"这两个真增量。单步确实是旧的,但"把单步组织成多级退火"突破了单步高斯的表达天花板(§5.3 让采样 MPC 上了几十维),"用模型算 score"打开了免训练扩散优化(§5.2)——这都是单看一步看不到的。 正确做法:把"MPPI = 单步去噪"当成**起点而非终点**——它的价值是把整个扩散 MPC 方向接到你已有的知识上,真正的新内容在"多步怎么组织"(退火)和"score 从哪来"(模型)这两件事上。
练习¶
- (实现 + 验证,⭐⭐) 复现本节"理论"小节里的余弦验证:对一个二次代价 \(J=\tfrac12U^\top HU\),实现 MPPI 的单步加权更新,计算它的更新方向与解析 score 上升方向 \(-HU\) 的余弦相似度,验证两者≈1。
然后增大温度 \(\lambda\) 或减小样本数 \(K\),观察余弦相似度如何变化——思考:什么时候 MPPI 的"score 估计"会变差?(提示:样本太少时蒙特卡洛估计噪声大;\(\lambda\) 极小时权重塌到单个样本,估计方差大。这呼应第 2 章的 ESS。)
- (退火对比,⭐⭐⭐) 复现本节"多步复合的威力"小节的退火实验:在那个"宽浅局部阱 + 深全局阱"的非凸地形上,对比单级 MPPI 与多级退火 MPPI 在**相同样本预算**下的平均最终代价与"命中全局阱"比例。
进一步实验:(a) 退火级数从 4 改成 2、6、8,命中率如何变化?(b) 把退火调度方向写反(从小到大),验证陷阱里说的"退火失效"。(c) 固定退火、增大单级 MPPI 的样本数,要加到多少倍才能追上退火的命中率?(这量化了"多步复合"相对"单步堆样本"的效率优势。)
-
(同构思辨,⭐⭐⭐,思考题) 本节论证了"MPPI 一步 = 单步去噪 = 一步 score 上升",第 4 章论证了"MPPI ↔ REINFORCE/RWR"。请把这三者(REINFORCE 的回报加权、MPPI 的代价加权、扩散的 score 去噪)并排写出它们各自的更新式,指出三者在"当前估计 + 加权上升方向修正"这个模板下分别对应什么。思考:如果说它们是同一个数学对象的三张面孔,那么一个领域的技巧(如 RL 的基线降方差、扩散的噪声调度)能不能迁移到另一个领域?举一个你认为可迁移的例子。
-
(从单峰到多峰,⭐⭐⭐,思考+实现) 练习 1 在**凸的单峰**二次代价上验证了"MPPI 单步 ≈ score 上升"。现在换一个**双峰**代价(两个分开的高斯阱,对应 §5.1 那个"绕柱子"的双峰最优分布),重复这个实验:把初值放在两峰中间,跑一步 MPPI 加权更新,观察它把均值推向哪里。你会看到一个关键现象——单步加权平均会被两个峰"两头拉扯",均值停在中间的低概率区,而不是收敛到任一个峰。请据此回答:(a) 这个现象和 §5.1"单峰高斯拟合双峰目标会卡在谷底"是不是同一回事?(b) 为什么"多级退火"能解决它而"单步多跑几轮"不能?(提示:高噪声级先把双峰模糊成单峰、锁定一侧,再降噪精修——回到"由粗到精"。)这道题让你亲手看见单步的天花板,从而真正理解为什么需要多步复合。
§5.2 MBD 的数学框架:动力学就是 score,于是不必训练 ⭐⭐⭐¶
动机:想要扩散的本事,又不想要它的数据和训练¶
§5.1 让我们看清:扩散的本事来自"多步去噪的复合",而每步去噪需要一个 score。DDPM 和 Diffusion Policy 的 score 是**从数据里训练出来的网络**——这正是它们强大、也正是它们受限的地方。
受限在哪?两点。其一,要数据:训练扩散策略需要大量高质量演示,很多任务根本没有。其二,不迁移:score 网络绑定了训练时的动力学,换个机器人(质量、连杆、关节变了)就得重新收集数据、重新训练。
MBD(Model-Based Diffusion,Pan、Yi、Shi、Qu,NeurIPS 2024)提出一个漂亮的反转,它的出发点是一个被忽视的事实:在轨迹优化里,动力学和代价通常是已知的。
既然目标分布由代价和动力学**完全确定**了,那 score 就是一个可以**算**出来的量,何必从数据里**学**?MBD 的全部精神就在这句话里:
用模型直接算 score,于是扩散式优化不需要训练任何网络、不需要任何数据。
这一步把扩散从"数据驱动的生成模型"变成了"模型驱动的优化器"。而 §5.1 已经告诉我们,算 score 的那一步——"撒候选、按 \(e^{-J/\lambda}\) 加权、平均"——正是 MPPI。所以 MBD 在算法上就是**一串 model-based 的 MPPI 式去噪步骤**,串成一个反向扩散过程。下面把这件事讲精确。
如果不这样做会怎样:被"扩散必须有数据"的成见挡在门外¶
如果你默认"用扩散就得有演示数据、就得训练",会错过什么?
你会错过**一大类根本没有数据、但动力学已知的问题**。很多机器人任务(新设计的机器人、新装的负载、仿真里的新场景)没有现成演示,但它们的动力学方程、代价函数是清清楚楚写得出来的。
对这类问题,model-free 的扩散策略无能为力(没数据可训),而 MBD 正好大显身手——它把已知的模型当成免费的、无限量的"监督信号"。看不到这一点,你会以为"没数据就不能用扩散",白白把扩散这套强大的多步搜索机制拒之门外。
反过来还有一层:你会高估训练的必要性。一旦理解 score 可以算、不必学,你对"什么时候真的需要训练一个网络"会有更清醒的判断——只有当目标分布说不清楚(如要模仿人类风格里那些难以写成代价的隐式偏好)时,才真正需要数据驱动;目标分布写得清楚时,算 score 又快又准还能跨动力学迁移。
理论:把轨迹优化重写成反向扩散¶
我们分四步:先把轨迹优化重写成"从目标分布采样",再写前向加噪、反向去噪,最后点出 score 如何由模型算出。
第一步:轨迹优化 = 从目标分布采样(回顾第 1 章)。 轨迹优化要找一条让代价 \(J(\tau)\) 最小的轨迹 \(\tau\)(\(\tau\) 是整条控制序列,或状态-控制序列)。把它改写成一个采样问题:定义目标分布
代价越低、概率越高(这正是第 1 章 \(\mathbb{P}^\star\propto\mathbb{Q}\,e^{-S/\lambda}\) 的同一个对象)。当 \(\lambda\to 0\),这个分布的概率质量全部集中到最优轨迹上——所以"从 \(p_0\) 采样"就等价于"找最优轨迹"。难点和第 4 章一样:\(p_0\) 无法直接采样(高维、非凸、含归一化常数)。扩散提供了一条迂回的采样路径。
第二步:前向过程(加噪)。 仿照 DDPM,定义一串噪声逐渐增大的中间分布。从一条轨迹 \(\tau_0\) 出发,逐级加高斯噪声:
其中 \(\bar\alpha_k\) 随级数 \(k\) 从 \(1\) 递减到 \(0\):\(k=0\) 是干净轨迹,\(k\) 最大时 \(\tau_k\) 几乎是纯噪声。这定义了一串"被噪声平滑过的"目标分布 \(p_k\)——噪声越大,\(p_k\) 越平滑、局部极小越少(这点稍后是逃离局部最优的关键)。
第三步:反向过程(去噪)。 从纯噪声 \(\tau_K\) 出发,逐级去噪,恢复出一条低代价轨迹。每一步去噪的核心,是估计"给定带噪的 \(\tau_k\),干净轨迹 \(\tau_0\) 大概在哪"——即后验均值 \(\hat\tau_0(\tau_k)=\mathbb{E}[\tau_0\mid\tau_k]\),然后朝它挪一步。这正是 §5.1 说的"朝 score 方向去噪",只是这里写成了后验均值的形式(两者由一个恒等式联系,细节见原论文)。
第四步:score 如何由模型算出(MBD 的核心)。 关键问题来了:后验均值 \(\hat\tau_0(\tau_k)\) 怎么算?按定义它是
读这个式子:在 \(\tau_k\) 附近撒一批候选轨迹 \(\tau_0^i\),用模型对每条算代价 \(J(\tau_0^i)\)(一次前向 rollout),按 \(e^{-J/\lambda}\) 加权平均。这就是 MPPI 的加权平均——只不过 MBD 把它解释成"对干净轨迹的后验均值估计 / 一步 score 上升"。
这一步把 MBD 的"model-based"讲透了:权重里的代价 \(J\) 来自**已知的动力学和代价模型**(撒一条候选、用模型 rollout 一遍就得到),不来自任何训练好的网络、不需要任何数据。模型本身就提供了去噪所需的全部信息。
把 MBD 整体串起来:从纯噪声起步,做 \(K\) 级去噪,每级在当前 \(\tau_k\) 附近撒候选、用模型算代价加权、更新到后验均值、降一级噪声——逐级把一团噪声"雕刻"成一条低代价轨迹。这就是一个**用模型当 score、免训练的反向扩散过程**。论文把这个过程称为蒙特卡洛 score 上升(Monte Carlo score ascent)。
为什么这样能逃离局部最优? 这是 MBD(和一切多级退火)最值钱的性质,§5.1 已埋下伏笔,这里讲透。高噪声级下的 \(p_k\) 是原目标被大高斯核平滑过的版本——平滑抹平了细小的局部极小,只留下大尺度的全局结构,于是高噪声级的去噪能"看见"全局最优大致在哪。
随着噪声级降低,\(p_k\) 逐步逼近真实的、坑坑洼洼的 \(p_0\),去噪在已经锁定的全局区域里精细收敛。先在平滑版上找对大方向、再在原版上抠细节——这正是逃离局部最优的机制,和优化里的"逐步求精 / 同伦延拓"是同一个思想(边界:同伦延拓通常用确定性的连续化路径,MBD 用随机采样的噪声级调度,但"由平滑到精细"的内核一致)。
本质洞察:MBD 颠覆的不是扩散的机制,而是 score 的**来源**——它把"从数据里学 score"换成了"用模型算 score"。这个替换之所以可能,是因为一个常被忽视的事实:在轨迹优化里,目标分布 \(p_0\propto e^{-J/\lambda}\) 被代价和动力学**完全确定**了,所以它的 score 是一个确定的、可估计的量,根本不是需要从数据里猜的未知函数。一旦认清这一点,"用扩散就要有数据、要训练"的成见就被打破:模型就是最好的、无限量的、且天然跨场景的监督信号。这也把第 1 章的 \(\mathbb{P}^\star\)、第 2 章的 MPPI、§5.1 的去噪彻底缝合到了一起——它们都是在和同一个由代价定义的目标分布打交道,只是 MBD 用扩散的多级结构,把"逼近这个分布"做得比单级 MPPI 更不容易陷在局部。
用代码把 MBD 跑出来感受一下。任务是一个 8 维控制序列,要让点质量到达目标、同时绕开一个造成非凸的障碍(进入障碍圆有不可微的硬惩罚)。MBD 从噪声起步、做多级去噪,全程只调用 cost()(前向 rollout),零梯度、零训练:
def mbd(seed, K=300, levels=6, sig0=1.2, lam0=2.0, decay=0.6):
rng = np.random.default_rng(seed)
mu = rng.standard_normal(T*2) * 0.3 # 从噪声起步
sig, lam = sig0, lam0
for _ in range(levels): # 反向扩散: 噪声级逐步降低
eps = sig * rng.standard_normal((K, T*2))
U = mu + eps
J = cost(U) # 用模型 rollout 算代价(无梯度)
w = np.exp(-(J - J.min()) / lam); w /= w.sum()
mu = mu + (w[:, None] * eps).sum(0) # 一步 MC score 上升 = 一步去噪
sig *= decay; lam *= decay # 退火: 降一级噪声
return mu
跑 30 个随机种子,和"单级加权采样"(同样的总采样预算)对比:
MBD(6级反向去噪, 免梯度/免训练): 平均代价 0.34 既避障又到位 28/30
单级加权采样(6迭代, 同预算) : 平均代价 1.29 既避障又到位 21/30
总样本: 均为 K*levels = 300*6 = 1800 (完全相同)
MBD 在 8 维非凸任务上平均代价 \(0.34\)、\(28/30\) 既避障又到达目标,明显优于单级的 \(1.29\)、\(21/30\)——而它**全程没用一次梯度、没碰一条训练数据**,只反复调用前向模型。这就是"用模型算 score 的免训练扩散优化"在一个最小例子上的样子。
MBD 论文在更实际的任务上给出了更有力的结果:MBD 在一系列任务上比 PPO 高约 59%,且只需几十秒的"扩散"时间——注意这是和一个需要大量训练的 RL 方法比,而 MBD 完全免训练。
MBD 还有一个灵活之处值得一提,它体现了 model-based 路线的额外好处。虽然 MBD 本身免数据,但它**可以自然地融合不完美的数据**来引导扩散:把演示数据当作目标分布的"观测",叠加到 score 估计里。
举个论文里的例子:用只有下半身的人类动作数据(不完整、且动力学不完全匹配)来引导一个全身人形机器人的轨迹生成,结果生成的全身动作更自然。关键是,这些数据**不需要完美、不需要完整、甚至不需要动力学可行**——因为模型算出的 score 保证了可行性,数据只负责"调味"(注入难以写成代价的风格偏好)。这是 model-free 扩散做不到的:它高度依赖数据质量,烂数据会直接毁掉策略。
补一个关键恒等式:score 和后验均值为什么是一回事¶
§5.2 正文里有一句话一带而过——"朝 score 方向去噪"和"朝后验均值挪"由一个恒等式联系。有的读者会卡在这里:score 是个梯度(方向),后验均值是个点(位置),它俩怎么会是一回事?这一小节补上这块拼图。它稍微抽象,但补上后你对"为什么 MPPI 加权平均就是去噪"会有更彻底的理解;不想深究的话,记住结论"加权平均估计后验均值、等价于一步 score 上升"即可跳过。
设在噪声级 \(k\),带噪样本 \(\tau_k\) 是干净样本 \(\tau_0\) 加了方差 \(\sigma_k^2\) 的高斯噪声得到的。有一个漂亮的结果(在统计里叫 Tweedie 公式)说:带噪样本处的 score,正比于"从带噪样本指向干净样本后验均值的位移"。写成式子:
读这个式子:左边是 score(方向),右边是"后验均值减当前位置"再除以噪声方差——也是一个方向。它说 score 这个方向,恰好指向后验均值 \(\hat\tau_0\)。所以"朝 score 上升一步"和"朝后验均值 \(\hat\tau_0\) 挪一步"是同一个动作,只差一个步长系数 \(\sigma_k^2\)。这就把"梯度"和"位置"统一了:score 不是别的,正是"该往后验均值那边去"的指示。
现在把这个恒等式和 §5.2 正文的后验均值公式接起来。正文说后验均值由加权平均估计:
两式一拼,整条逻辑链就闭合了:在 \(\tau_k\) 附近撒候选、用模型算代价、按 \(e^{-J/\lambda}\) 加权平均得到 \(\hat\tau_0\)(这是 MPPI),而 \(\hat\tau_0-\tau_k\) 正比于 score(Tweedie),所以挪向 \(\hat\tau_0\) 就是朝 score 上升一步(这是去噪)。 §5.1 用余弦相似度 0.9985 在数值上验证的那件事,这里有了解析的来由。
本质洞察:Tweedie 恒等式是连接"采样视角"和"梯度视角"的暗扣。MPPI 的人会说"我在按代价加权平均",扩散的人会说"我在朝 score 去噪"——Tweedie 告诉你这两句话描述的是同一个几何动作:朝着"低代价候选的加权重心"移动。这也解释了一个常让人困惑的点:MPPI 明明没算任何梯度,为什么能"朝 score 上升"?因为后验均值的位移本身就编码了 score 信息——你不需要显式求导,只要能采样并按代价加权,那个加权重心相对当前点的偏移,就已经是 score(乘了个步长)。无导数优化能逼近梯度方向,秘密就在这个恒等式里。
读到这里你可能会问:既然 score 等价于后验均值位移,那 MBD 和一个普通的"加权平均迭代"(比如第 4 章的 CEM/MPPI 多跑几轮)到底差在哪? 差在**噪声级的调度**。普通 MPPI 多跑几轮,用的是同一个固定方差——相当于一直待在同一个噪声级 \(k\) 上反复估计同一个后验均值,地形的局部极小一直都在。
MBD(和退火)则让噪声级 \(\sigma_k\) 从大到小变化:高噪声级上的后验均值是"大范围平滑后"的重心(能跨过局部极小看全局),低噪声级上的后验均值是"精细的"重心(在全局区域里收敛)。所以差别不在单步公式(都是加权平均),而在"沿一串递减的噪声级走"这个调度——这又回到了全章主线:威力在多步组织,不在单步。
读到这里你可能还会问:Tweedie 要求"\(\tau_k\) 是 \(\tau_0\) 加高斯噪声",可优化里我的候选是我自己撒的高斯,这个前提满足吗? 满足——因为你正是用 \(\tau_0^i\sim\mathcal{N}(\tau_k,\sigma_k^2I)\) 撒的候选,构造上就符合"高斯加噪"的假设。这也是为什么退火采样 MPC 默认用高斯扰动:不只是高斯方便,而是高斯让"加权平均 = score 估计"这个等价关系精确成立。如果换成非高斯噪声,Tweedie 的简洁形式就不再严格——这是个有意思的细节,它说明第 4 章"单步用高斯"不仅是历史选择,也和这套去噪解释的自洽性有关。
落到实操:MBD 的噪声调度怎么定¶
讲完 MBD 的原理和那个免梯度 demo,你大概率会问一个非常实际的问题:代码里的 sig0(起始噪声)和 decay(衰减率)到底该取多少? 这两个参数直接决定退火的成败,但论文很少给可操作的范围。这一小节用实验给你一套起手式——它也示范了"怎么用消融实验确定调度参数"这个通用方法。
先建立直觉,再看数据。sig0 决定"第一级撒多远"——它必须大到能覆盖问题的全局尺度,否则高噪声级看不到全局、退火第一步就废了;但也不必过大,过大反而在有限级数里浪费在无谓的远处探索上。decay 决定"噪声降多快"——降太快会"跳级"(来不及从全局过渡到局部精修),降太慢则末级方差还太大、收不住。
用 §5.2 那个 8 维非凸任务(到达目标 + 绕开障碍),固定其余参数,分别扫这两个:
起始噪声 sig0 的影响(decay=0.6 固定,30 seeds):
sig0=0.3 : 成功 9/30 平均代价 3.41 ← 撒不够远, 看不到全局
sig0=0.6 : 成功 30/30 平均代价 0.12 ← 够用
sig0=1.2 : 成功 30/30 平均代价 0.09 ← 最优区
sig0=2.0 : 成功 30/30 平均代价 0.13
sig0=3.0 : 成功 30/30 平均代价 0.23 ← 过大, 精度略降
衰减率 decay 的影响(sig0=1.2 固定,30 seeds):
decay=0.40 : 成功 30/30 平均代价 0.09
decay=0.60 : 成功 30/30 平均代价 0.09
decay=0.75 : 成功 30/30 平均代价 0.11
decay=0.90 : 成功 28/30 平均代价 2.83 ← 降太慢, 末级方差还太大, 收不住
两条曲线都印证了直觉,也给出了可操作的范围:
sig0 有一个"够大即可、过大略损"的平台。 太小(0.3)直接腰斩成功率(撒不出全局视野),而从 0.6 到 2.0 是一个宽阔的最优平台——这告诉你 sig0 不必精调,取到"能覆盖问题全局尺度"的量级就行。一个实用的定法:估计你的决策变量合理变化范围,sig0 取到能让首级样本铺满这个范围的大小。过大(3.0)只是轻微损失精度,不致命。
decay 不能太慢,但有较宽的容忍区。 0.4 到 0.75 都工作良好,只有降太慢(0.9)才明显变差——因为 6 级里每级只降 10%,末级方差仍接近起点,等于没退火到位、收不住。实用定法:让末级方差降到"精修所需的小尺度",反推 decay。比如要 6 级从 1.2 降到约 0.1,则 \(decay \approx (0.1/1.2)^{1/5}\approx 0.6\)——这正是落在最优区里。
本质洞察:这两条曲线合起来传递一个让人安心的信息——退火参数有相当宽的"好用区间",不是必须精调才能工作的脆弱旋钮。
sig0有一个宽平台、decay有一个宽容忍区,只有取到极端值(太小、太慢)才会失败。这其实是退火方法一个被低估的工程优点:相比梯度法对步长、对初值的敏感,退火对它的两个主参数都相当鲁棒。理解这一点能省下你大量盲目调参的时间——先用"覆盖全局尺度的sig0+ 让末级够小的decay"这个起手式定一个值,往往一次就落在好用区间里,不行再用上面这种单参数扫描微调。会用消融定参数,比记住任何一组推荐值都通用。
读到这里你可能会问:这个调度的宽容区间,是 MBD 特有的,还是退火方法普遍如此? 普遍如此,这正是退火作为一类方法的共性优点。无论是 MBD、DIAL-MPC、还是 §5.5 那个绕墙 demo,只要是"温度/方差由高到低"的退火调度,都表现出类似的鲁棒性——起始尺度"够大即可"、衰减率"别太慢",中间有宽阔的好用区间。背后的原因在 §5.1 那个"采样方差 = 平滑尺度"的洞察里:退火的有效性来自"由粗到精"这个定性的尺度变化趋势,而非某个精确的数值,所以只要趋势对(单调、够大的起点、够小的终点),具体取值有相当的容错。这跟梯度法对步长的敏感形成鲜明对比——梯度法步长大一点就发散、小一点就爬得慢,而退火对它的尺度参数宽容得多。这是退火在工程上一个被低估、却很省心的好处。
展开:MBD 怎么"融合不完美数据",为什么这是 model-free 做不到的¶
§5.2 正文提到 MBD 能融合"不完美、不完整、甚至动力学不可行"的数据来引导扩散,还举了"用下半身人类动作引导全身人形"的例子。这个能力很反直觉——别的方法对数据质量斤斤计较,MBD 怎么敢用烂数据?这一小节讲清它的机制,它也最能体现 model-based 路线的独特价值。
先回顾 model-free 扩散(Diffusion Policy)对数据的依赖有多重:它的 score 完全从数据学,数据有多好,学到的 score 就有多好。给它不完美的数据(次优动作、不可行轨迹),它会忠实地学出"产生这些烂动作的分布",生成的策略自然也烂。数据是它唯一的信息来源,所以容不得沙子。
MBD 的处境完全不同——它的 score 主要来自**模型**(动力学和代价),数据只是一个**额外的、可选的引导**。具体机制是这样:MBD 把演示数据当作目标分布的"观测",在 score 估计里叠加一个"向数据靠拢"的项。于是最终的去噪方向,是"模型算出的可行 / 低代价方向"和"向数据靠拢方向"的**加权合成**。
这个合成的关键在于:模型那一项保证了底线。无论数据多烂,模型算出的 score 始终把轨迹拉向"动力学可行、代价低"的区域;数据那一项只在这个底线之上做"风格微调"。所以——
- 数据**不完美**(次优):没关系,模型保证可行性和基本最优性,数据只把解往它示范的风格上稍微带一带;
- 数据**不完整**(如只有下半身):没关系,模型负责补全没有数据覆盖的部分(上半身),数据只约束它覆盖到的部分(下半身);
- 数据**动力学不可行**(如简化模型生成的轨迹、或动力学不匹配的人类动作):没关系,模型那一项会把不可行的部分纠正回可行流形,数据只提供"大致往哪个方向运动"的意图。
那个"下半身人类动作引导全身人形"的例子现在就好理解了:人类下半身动作是**不完整**(没上半身)且**动力学不匹配**(人和机器人动力学不同)的数据,但 MBD 用机器人模型保证生成的全身动作动力学可行,同时让下半身向人类动作的风格靠拢,结果是一个"动力学正确、且下半身姿态自然"的全身动作。换 model-free 方法,这种烂数据根本没法直接用。
本质洞察:MBD 对数据的态度,揭示了 model-based 和 model-free 在信息论上的根本差异——信息从哪来,决定了你对数据有多挑剔。 model-free 把全部信息押在数据上,所以数据是命门、容不得瑕疵;MBD 把可行性 / 最优性的信息交给模型、只把"难以写成代价的风格偏好"交给数据,于是数据从"唯一信息源"降级为"可选的风格调料"——调料可以不纯,因为主食(模型)已经管饱。这也给你一个实用的判断框架:当你纠结"我的数据够不够好能不能用"时,先问"可行性和最优性能不能由模型保证"——如果能,那数据只需提供模型给不了的那部分信息(风格、偏好、意图),质量要求就大大放宽;如果不能(模型也没有),那你才真的需要高质量数据。把信息的来源拆开看,很多"数据焦虑"会迎刃而解。
读到这里你可能会问:既然模型这么万能,那数据到底还有什么用、为什么不纯靠模型? 因为有些东西**写不进代价函数**。"动作要自然""风格要像人""手势要优雅"——这些人类一眼能判断、却极难用数学代价精确描述的隐式偏好,模型算不出来。
数据的不可替代价值,正在于它**隐式地携带了这些写不出的偏好**。所以 MBD 的"融合数据"不是因为模型不够,而是因为模型和数据擅长不同的事:模型擅长"可行 / 最优"这种能写成方程的,数据擅长"自然 / 优雅"这种只可意会的。把两者各用所长地合起来,才是这个机制的精髓——这也再次呼应了 §5.4 那条"光谱":纯模型、纯数据各有盲区,知道哪部分交给谁,才是高手。
把"为何逃局部最优"画出来¶
§5.2 正文说"高噪声级平滑地形、低噪声级精修"能逃局部最优,这是 MBD 和一切退火方法最值钱的性质,值得用一个更几何的画面钉死它。
想象代价地形是一条起伏的曲线,上面有一个浅的局部谷(陷阱)和一个深的全局谷(目标),它们之间隔着一道小山脊。单级方法从某点出发往下走,很容易滚进近处的浅谷就出不来了——山脊挡住了去全局谷的路。
退火的前向加噪在数学上等价于**用一个高斯核去卷积(模糊)这条曲线**。卷积的效果是"抹平细节":
- 高噪声级(大高斯核):曲线被大幅模糊,那道分隔浅谷和深谷的小山脊被抹平了,整条曲线变成一个朝着全局谷大致倾斜的平滑大碗——此时往下走,自然朝全局谷的方向去,浅谷的陷阱已经"看不见"了。
- 中噪声级(中等核):模糊程度减小,全局谷的轮廓开始清晰,解进一步收敛到全局谷所在的大致区域。
- 低噪声级(小核):几乎不模糊,恢复出原始的坑洼地形,但此时解已经在全局谷里了,只需在谷底精细收敛。
高噪声级(强模糊): 低噪声级(还原):
___ ╲ ╱╲ ╱
╱ ╲___ ╲ ╱ ╲ ╱
╱ ╲___ ╲╱ 浅 ╲╱ 深(已在此精修)
(山脊被抹平,整体朝全局倾斜) (山脊还原,但解已落在深谷)
这就是"由粗到精"逃局部最优的几何本质:不是更努力地往下走,而是先把挡路的小山脊'模糊'掉、看清全局大方向,再逐步恢复细节精修。 局部极小是"细节",全局结构是"大势"——退火让你先抓大势、后抠细节,从而绕过了困住单级方法的局部陷阱。
本质洞察:把退火理解成"对代价地形的逐级去模糊",是本章最有几何直觉的一个视角。它解释了为什么退火能做到单级做不到的事——单级方法只能在原始的坑洼地形上挣扎,而退火先在"模糊版"上找对全局方向、再逐级清晰化。这个"在不同分辨率 / 平滑度上分层搜索"的思想,和图像处理的多分辨率金字塔、优化里的同伦延拓、甚至人解决问题时"先抓主要矛盾、再处理细节"的策略,是同一个智慧的不同化身。一旦你建立了这个"模糊—清晰"的画面,退火、扩散、MBD 的全局搜索能力对你就不再是公式,而是一幅能在脑子里放电影的图景。
读到这里你可能会问:MBD 说免训练、免数据,可它每次优化都要在线撒一大堆样本做多级去噪,这个在线计算量和'训练一个网络'比,到底哪个划算? 这要分摊到使用场景看,是个典型的"前期投入 vs 每次开销"权衡。
训练一个网络(如 Diffusion Policy)是**一次性的大投入**(收集数据 + 训练,可能几天),但训练好后每次推理很快(一次前向)。MBD 是**零前期投入**,但每次用都要在线做多级采样优化(每次几十毫秒到秒级)。所以:如果你要在**同一个固定任务上跑成千上万次**(如量产机器人重复同一动作),训练网络把成本摊薄到每次极低,更划算;如果你面对的是**不断变化的新任务 / 新机器人、且没有数据**(研究原型、小批量、任务多变),MBD 省掉了每个任务重新收集数据训练的巨大成本,更划算。
这又回到 §5.4 那条光谱和本章反复的主旨:没有绝对划算的方法,只有匹配场景的方法。MBD 的"免训练"在"任务多变、无数据、能容忍在线计算"的场景下是巨大优势,在"单一任务、海量重复、追求极致推理速度"的场景下则未必。看清你的场景属于哪一类,比纠结"哪个绝对好"更重要。
MBD 与 Diffusion Policy 的对照:算 score vs 学 score¶
把 MBD 和它的"model-free 表亲"Diffusion Policy 并排,能看清这条路线的取舍——这也是一处典型的"不是 X 而是 Y":
| 维度 | Diffusion Policy(model-free) | MBD(model-based) |
|---|---|---|
| score 来源 | 从演示数据**训练**一个网络 | 用已知模型**算**(MPPI 式加权) |
| 数据需求 | 大量高质量演示 | 零数据 |
| 训练需求 | 需要训练 | 零训练 |
| 换动力学 | 要重新收集数据、重训 | 直接换模型即可,天然迁移 |
| 在线开销 | 推理快(前向网络) | 每次要在线跑多级采样,较慢 |
| 隐式偏好 | 能从数据里学到难以写成代价的风格 | 要靠代价显式写出(或融合少量数据补) |
这张表里的取舍很清楚:MBD 用"已知模型"换掉了"数据和训练",代价是每次都要在线做多级采样优化(比训练好的网络前向推理慢),且写不出代价的隐式偏好要额外想办法(融合数据)。
所以 MBD 不是全面碾压 Diffusion Policy,而是占据一个互补的生态位:**目标分布写得清楚、动力学已知、没有数据**时,MBD 是更好的选择;**有大量演示、想学难以言说的风格、要快速推理**时,Diffusion Policy 更合适。理解这个互补,你才不会把"免训练"误读成"无脑更优"。
这也预告了一条前沿支线(§5.3 末会提):把两者结合——用 MBD 保证可行性、用 learned 扩散先验注入数据里的偏好,兼得两者之长。
⚠️ 常见陷阱¶
编程陷阱:把 MBD 的 score 当成解析梯度去算,或反向过程忘记逐级降噪。
错误做法:看到"score = \(\nabla\log p\)"就去对代价求解析梯度 \(\nabla J\)(要求动力学可微),或者实现反向过程时全程用固定噪声级 \(\sigma\)(不退火)。
现象/后果:求解析梯度会让 MBD 退化成需要可微动力学的方法,丢掉它"黑箱模型也能用"的最大优势,遇到接触等不可微动力学直接失败;不退火则失去"由平滑到精细"的逃离局部最优能力,在非凸任务上和单级 MPPI 一样容易卡住。
根本原因:MBD 的 score 是**蒙特卡洛估计**(撒候选、按 \(e^{-J/\lambda}\) 加权),不是解析梯度——这正是它免梯度、能处理黑箱动力学的根源;而"多级降噪"是它逃离局部最优的机制,少了就不成其为扩散。
正确做法:score 一律用"采样 + 代价加权"估计(只需前向 rollout,不求导);反向过程的噪声级 \(\sigma_k\)(及温度)必须随级数**单调递减**,对应 \(\bar\alpha_k\) 从小到大、噪声从大到小。
自检方法:确认代码里只调用 cost()(前向)、从不调用任何梯度函数;打印每级 \(\sigma_k\) 确认递减;在非凸 demo 上对比退火与不退火的最终代价。
概念误区:以为 MBD 需要可微的动力学和代价。 错误认识:因为 score 被称作"对数概率的梯度",就推断 MBD 需要对动力学/代价求导。 现象/后果:误判 MBD 不适用于接触丰富、含 indicator 硬惩罚等不可微问题,从而在这些最该用采样式方法的场景放弃 MBD。 根本原因:MBD 的 score 是用采样**估计**的,不是解析求导的。它对代价的唯一要求是"能前向算出一个数"(黑箱即可),和 MPPI 的要求完全一样——这本就是采样式方法相对梯度式方法的核心优势(第 2、3 章反复强调)。 正确做法:把 MBD 的"score"理解为"用模型 rollout 加权估计出的上升方向",它和 MPPI 一样**只需前向、不需可微**。本节 demo 里的障碍硬惩罚就是不可微的,MBD 照样处理得很好。
思维陷阱:以为"免训练免数据"意味着 MBD 全面优于需要训练的方法。 错误认识:既然 MBD 不用数据不用训练还比 PPO 高 59%,那它就是更好的方法,应该取代 RL / Diffusion Policy。 现象/后果:在不合适的场景硬上 MBD——比如要求毫秒级推理的高频任务(MBD 每步要在线跑多级采样,慢),或要模仿数据里难以言说的风格(MBD 要靠显式代价),结果不如训练好的策略。 根本原因:免训练是用"在线计算"和"已知模型"换来的,不是没有代价。MBD 把成本从"离线训练"挪到了"在线优化",并要求模型已知、目标分布写得清楚。这是**取舍**,不是优劣(呼应第 4 章对 Predictive Sampling 的同款提醒)。 正确做法:按场景选——模型已知、无数据、能容忍在线优化耗时,选 MBD;要快速推理或学隐式风格、且有数据,选训练类方法。"免训练"是 MBD 的适用条件标签,不是优越性勋章。
练习¶
- (实现 + 验证免梯度,⭐⭐) 复现本节 MBD demo:在那个"到达目标 + 绕开障碍"的 8 维非凸任务上实现多级反向去噪,对比它与单级加权采样在相同预算下的平均代价与成功率。
在实现中确认一件事:你的 MBD 代码是否只调用了 cost()(前向 rollout)、从未求任何梯度?这正是 MBD"免梯度、可处理黑箱/不可微代价"的体现。再把障碍惩罚换成更尖锐的不可微形式(如进入即 \(+\infty\)),验证 MBD 依然能用(而任何需要梯度的方法会失效)。
- (退火消融,⭐⭐⭐) 在 MBD 里把"逐级降噪"关掉(全程固定 \(\sigma\)),对比它与正常退火 MBD 的成功率,验证"多级降噪是逃离局部最优的关键"。
再扫描去噪级数(如 3/6/10 级)和噪声衰减率 decay,观察成功率如何变化。思考:级数太少 / 衰减太快会怎样?(提示:太少或太快 = 退火不充分 = 来不及从平滑过渡到精细。)
-
(贯通三章的思辨,⭐⭐⭐,思考题) 本节的后验均值公式 \(\hat\tau_0=\sum_i w_i\tau_0^i/\sum_i w_i\)(\(w_i\propto e^{-J/\lambda}\))和 §5.1 的"MPPI 一步 = score 上升"是同一个加权平均,又和第 4 章"MPPI ↔ REINFORCE"相连。请论证:MBD 的一级去噪,就是在"被噪声平滑过的目标分布"上做一步 MPPI。由此回答:(a) 为什么说 MBD 是"多级 MPPI"而非全新算法?(b) 第 4 章 §4.6 的 CoVO(最优协方差)思想能不能用到 MBD 的每一级去噪上(给每级的采样协方差也按代价地形整形)?这会带来什么好处、什么额外开销?
-
(动手验证 Tweedie 直觉,⭐⭐⭐) 基于 §5.2 加深小节"score = 后验均值位移"的恒等式,设计一个小实验:取一个一维双峰代价(两个高斯阱),固定一个带噪点 \(\tau_k\),在它周围撒一批候选、按 \(e^{-J/\lambda}\) 加权算出后验均值 \(\hat\tau_0\),验证 \((\hat\tau_0-\tau_k)\) 的方向是否指向"代价更低的加权重心"。然后改变噪声方差 \(\sigma_k\)(即撒样的范围),观察后验均值如何从"被两峰平均拉向中间"(大 \(\sigma_k\))逐渐变成"锁定到近处某一峰"(小 \(\sigma_k\))——这就是退火"由粗到精"在 score 估计层面的体现。
§5.3 DIAL-MPC:把单步去噪堆成多级退火,征服全阶力矩控制 ⭐⭐⭐¶
动机:高维力矩控制,是单级 MPPI 的滑铁卢¶
前两节我们看清了"单步 = MPPI"和"多步 = 反向扩散"。现在把这套思想推到它最有价值的战场——腿足机器人的全阶力矩级控制。
什么叫"全阶力矩级"?传统腿足 MPC 为了实时,往往用简化模型(质心动力学、倒立摆等降阶模型)或预设接触序列,再交给底层 WBC/PD 跟踪。**全阶**意味着直接在完整的刚体动力学(几十个自由度)上优化,**力矩级**意味着直接输出关节力矩、不依赖底层跟踪器。这是最干净、也最难的设定——维度高、非凸、接触不可微。
第 4 章 §4.2/§4.6 早已警告:高维下随机样本几乎都落在远离均值的薄壳上,"撒满"空间所需样本数随维度指数爆炸。在几十维的力矩空间里,单级 MPPI 要找到一条好轨迹需要的样本数大到不切实际——这正是采样式 MPC 长期被认为"上不了全阶腿足控制"的原因。
DIAL-MPC(Xue、Pan、Yi、Qu、Shi,ICRA 2025 最佳论文入围)给出的破解,正是 §5.1–§5.2 的扩散退火:把"一次在几十维里撒满"这个不可能任务,拆成"多级逐步聚焦"的可行任务。 它成了第一个能在全阶四足动力学上实时、且免训练运行的采样式 MPC。
如果不这样做会怎样:在高维上和维度灾难硬碰硬¶
不掌握退火这把钥匙,面对高维力矩控制你只剩两条路,且都不好走。
一条是**降维**:退回简化模型、预设接触序列、配底层 WBC。这能实时,但牺牲了全阶模型的精度与通用性,且每个新步态/新任务都要重新设计降阶模型和接触序列,工程量大、不通用。
另一条是**硬堆样本**:坚持全阶、单级 MPPI,靠加样本数对抗维度灾难。但样本数随维度指数增长,很快就堆到实时跑不动、或堆得起也找不到好解。§5.1 的对比已经量化过这件事——单级在非凸地形上即便给足预算也大概率卡在局部(2/30)。
退火提供了第三条路:既保留全阶模型,又不靠指数级样本。它用"高温大方差先看清全局、低温小方差再精细收敛"的调度,把搜索效率提上来,让几千样本 × 几级退火就能在全阶动力学上找到好轨迹。不知道这条路,你会以为"采样式 MPC 做不了全阶腿足控制"——而 DIAL-MPC 证明了它能。
理论:DIAL-MPC 算法¶
DIAL-MPC 在算法上就是 §5.1–§5.2 那套"多级退火 MPPI",针对实时控制做了两点工程化:warm-start(用上一周期的解初始化,利用时间连续性)和 bi-level(双层)退火。先看主干,再讲双层。
主干是一个多级退火循环,每一级就是一次标准 MPPI 更新,级与级之间温度和采样方差逐级缩小:
算法: DIAL-MPC(主干)
输入: 当前状态 x₀, 上周期解 U_prev, 退火级数 L, 每级温度/方差 {(λ_l, Σ_l)}
输出: 当前要执行的力矩 u₀
U ← shift(U_prev) # 1. warm-start: 上周期解平移一格做初值
for l = 1..L: # 2. 多级退火(= 反向扩散的 L 步去噪)
for k = 1..K (并行): # 2a. 在当前 U 附近采 K 条扰动
ε_k ~ N(0, Σ_l)
U_k = U + ε_k
J_k = rollout_full_order(x₀, U_k) # 全阶动力学 rollout(GPU 并行)
ρ = min_k J_k # 2b. 标准 MPPI 加权更新(= 一步去噪)
w_k = exp(-(J_k - ρ)/λ_l) / Σ_j exp(-(J_j - ρ)/λ_l)
U ← U + Σ_k w_k ε_k
# λ_l, Σ_l 已按调度逐级缩小(高温大方差 → 低温小方差)
execute(u₀ = U[0]) # 3. 只执行第一格, 下周期重来(滚动时域)
把它和第 2 章的 vanilla MPPI 对照,差异只有一处、但很关键:
| vanilla MPPI | DIAL-MPC | |
|---|---|---|
| 更新次数 | 单个 \((\lambda,\Sigma)\) 下更新一次 | \(L\) 级,每级 \((\lambda_l,\Sigma_l)\) 逐级缩小 |
| 等价视角 | 单步去噪 | 完整反向扩散(多步去噪) |
| 搜索行为 | 单一尺度,探索/利用顾此失彼 | 高温级全局覆盖 → 低温级局部收敛 |
| 高维表现 | 维度灾难,需指数级样本 | 多级聚焦,几千样本 × 几级即可 |
**bi-level 退火**是 DIAL-MPC 的精细之处。论文不止在"轨迹整体"上退火,而是分两个层面:
- 轨迹级退火(trajectory-wise):在不同的在线迭代上用不同的采样方差,对整条规划轨迹逐步精炼——这就是上面主干里的多级 \(\Sigma_l\)。
- 动作级退火(action-wise):对规划时域里不同位置的控制用不同的退火处理——直观说,越靠近当前时刻的控制越需要精确(马上要执行),越远的控制可以更"粗"(后面还会重规划)。
两个层面叠加,让有限的采样预算花在刀刃上:近端动作精修、远端动作粗扫、整条轨迹随在线迭代逐级收敛。
DIAL-MPC 的开源实现(基于 JAX/Brax + MuJoCo MJX,GPU 上并行 rollout 数千条全阶轨迹)给出的默认参数能让你对"几千样本 × 几级"有具体概念:
Nsample: 2048 # 每级采样轨迹数(GPU 并行 rollout)
Hsample: 25 # 规划时域(步)
Ndiffuse: 4 # 常规扩散(退火)级数
Ndiffuse_init: 10 # 首个周期用更多级(冷启动需要更充分的退火)
temp_sample: 0.05 # MPPI 温度 λ
horizon_diffuse_factor: 1.0 # 动作级退火: 沿时域的方差缩放
traj_diffuse_factor: 0.5 # 轨迹级退火: 跨迭代的方差缩放
update_method: mppi # 每级用标准 MPPI 加权更新
leg_control: torque # 直接输出关节力矩(全阶力矩级)
注意几个数:每级 \(2048\) 条样本、常规 \(4\) 级退火(冷启动 \(10\) 级)——这意味着一个控制周期的总 rollout 量在万的量级,而非维度灾难所需的天文数字。这正是退火把高维问题变可行的关键:不是撒得更多,而是撒得更聪明(多级聚焦)。
本质洞察:DIAL-MPC 让采样式 MPC 爬上全阶力矩控制,靠的不是任何单步的改进——它每一步仍是普通的 MPPI 加权更新、仍用高斯采样。突破来自"把许多步沿退火调度复合起来"这个**组织方式**,正是 §5.1 反复强调的"表达力来自多步复合、而非单步分布"。这也精确回应了第 4 章的高斯天花板:DIAL-MPC 没有去设计一个更花哨的单步提议分布(那在几十维里几乎不可能调好),而是把"一次在高维里撒满"的不可能任务,沿温度/方差的调度拆成"由粗到精的多级聚焦"。换句话说,它在"如何组合多步高斯"这个更高的层面上突破了天花板,而把每一步留作最简单、最稳的高斯 MPPI。这是整章主线在工程上最有力的落地。
深一层:为什么"全阶力矩控制"对传统方法这么难¶
§5.3 正文说全阶力矩控制"维度高、非凸、接触不可微",但没展开为什么这三点对传统方法是致命的。理解这一点,才能体会 DIAL-MPC 用采样 + 退火绕过它们有多关键。这一小节补这个背景,它也顺带把前几章关于"采样式方法为什么存在"的动机收个尾。
第一难:接触带来非光滑、甚至不连续的动力学。 腿足机器人靠脚和地面的接触产生力。脚一落地,接触力瞬间出现;脚一离地,接触力瞬间消失。这种"通断"让动力学在接触切换的瞬间**不可微、甚至不连续**。
基于梯度的方法(iLQR/DDP、梯度 MPC,你在前置课程里学过)在这里就卡住了——它们要对动力学求导,而接触点的导数要么不存在、要么剧烈跳变,牛顿步会失效或乱跳。这是梯度类方法做接触丰富任务的根本障碍。
第二难:维度高 + 强非凸,局部方法易陷局部最优。 全阶模型几十个自由度,代价地形在这么高维里布满局部极小(不同的踏步相位、摆腿方式都是局部解)。梯度类方法是局部方法,初值不好就收敛到一个糟糕的局部最优(比如原地踏步而不前进)。要跳出局部最优,需要全局性的搜索。
第三难:传统降阶方案的代价。 为了绕开前两难,传统腿足 MPC 普遍降阶:用质心 / 倒立摆等简化模型(避开全阶的高维和部分接触复杂性)、预设接触序列(人为规定先迈哪只脚、何时落地,避开接触切换的优化)、再交给底层 WBC/PD 跟踪。
这能实时,但代价是:简化模型丢了精度和通用性、预设接触序列限制了动作的灵活性(机器人只能做你预先编排好的步态)、每个新任务都要重新设计降阶模型和接触序列,工程量大且不通用。
把这三难摆出来,DIAL-MPC 的选择就显出分量了。它**直接在全阶动力学上采样**——
- 对付**接触非光滑**:采样式方法只需前向 rollout 算代价,根本不求导,接触的不可微对它毫无影响(这正是第 2、3 章反复强调的采样式方法核心优势,在这里兑现为"能碰梯度方法碰不了的接触问题")。
- 对付**高维强非凸的局部最优**:用**多级退火**做全局搜索(§5.1–§5.3 的主线),高温级跨过局部极小看全局、低温级精修。
- 对付**降阶的代价**:不降阶、不预设接触序列,直接全阶 + 力矩级,于是换任务只换模型和代价、不重新设计(§5.4 讲的可迁移性)。
本质洞察:DIAL-MPC 能做全阶力矩控制,本质是两个"免"叠加的结果——免求导(采样式,绕开接触非光滑)和**免陷局部**(多级退火,绕开高维非凸的局部最优)。这两件事恰好对应本课程两条主线的交汇:采样式方法(第 2–4 章)解决了"不可微 / 黑箱也能优化",扩散启发的退火(第 5 章)解决了"高维非凸也能全局搜索"。任何单独一条都不够——只有采样、没有退火,在几十维上会陷局部(§5.1 的 2/30);只有退火思想、没有采样而用梯度,接触一来就崩。两者合体,才第一次让免训练的方法直接啃下全阶腿足力矩控制这块硬骨头。这也是为什么 DIAL-MPC 出现在本章而非更早——它需要前四章的采样地基和本章的退火机制同时就位。
读到这里你可能会问:既然全阶采样这么好,为什么腿足领域几十年来一直用降阶模型 + 预设接触,直到 2024 年才有 DIAL-MPC? 答案是算力和并行。全阶 rollout 数千条轨迹 × 多级退火,是个巨大的计算量,在 GPU 大规模并行仿真(如 MuJoCo MJX、Brax)成熟之前,根本做不到实时。
DIAL-MPC 的成立,一半是算法洞见(退火),另一半是工程时机(GPU 并行物理仿真)。这也呼应第 3 章讲 MPPI 时强调的"采样式方法的复兴是被 GPU 并行能力催生的"——同一个故事,在全阶腿足这个更极端的规模上再演了一遍。理解这一点,你对"为什么是现在"会有更立体的认识:好算法也要等对的算力土壤。
多视角:退火调度 vs RL 的课程学习¶
DIAL-MPC 用温度退火达成的效果,和强化学习里用**课程学习(curriculum learning)** 达成的效果,有一个耐人寻味的对应——这也是本章思考题的核心。
两者都在用"由粗到精/由易到难的调度"提升搜索效率。RL 的课程学习从简单任务/宽松约束起步,逐步加难,让策略循序渐进地学;DIAL-MPC 的退火从大方差/高温起步,逐步收紧,让采样循序渐进地聚焦。
相似之处:都承认"一步到位地在最终难度/最终精度上搜索"效率低下,都用一个调度把搜索分阶段,先解决"大方向"再解决"细节"。不同之处:课程学习调的是**任务本身的难度**(环境、奖励、初始分布),需要离线训练许多 episode,产出一个泛化策略;退火调的是**采样分布的尺度**(方差、温度),在线、每个控制周期重来一遍,不产出可泛化的策略、只产出当前这一步的控制。
不要把类比延伸过头:课程学习改的是"问题",退火改的是"求解器的搜索尺度";一个为了让学习更稳、一个为了让单次优化更高效。但"用由粗到精的调度让搜索更高效"这个智慧,在 RL、扩散、采样控制里反复出现,是个值得记住的通用模式。从搜索效率的角度看,DIAL-MPC 相当于把 RL 离线课程学习里"分阶段搜索"的好处,搬到了在线优化里、且不需要训练——这正是思考题让你深究的对照点。
再拆 bi-level 退火:两个"由粗到精"叠在一起¶
§5.3 正文介绍了 bi-level(双层)退火分"轨迹级"和"动作级",但比较抽象。这一小节用更直观的方式拆开它——理解这两层各自在退火什么,你才能看懂 DIAL-MPC 的参数表、也才能在自己的实现里把它配对。
先建立一个画面:DIAL-MPC 每个控制周期要规划一条未来 \(H\) 步的控制序列 \(U=[u_0,u_1,\dots,u_{H-1}]\),并通过多级退火逐步精炼它。"双层"指的是退火沿**两个不同的轴**同时进行。
第一层——轨迹级退火(沿"在线迭代"轴)。 这是我们前面一直讲的那个退火:在一个控制周期内,对整条序列 \(U\) 做多级精炼,每一级用逐渐缩小的采样方差。第 1 级大方差全局探索整条轨迹的大致形状,后续级小方差精修。这一层回答的是"随着迭代推进,整条轨迹怎么由粗到精"。DIAL-MPC 参数表里的 traj_diffuse_factor(轨迹扩散因子)控制的就是这一层——跨迭代时方差怎么缩。
第二层——动作级退火(沿"时域位置"轴)。 这是 DIAL-MPC 的精细创新。它注意到:序列里**不同位置的控制,重要性和确定性不一样**。\(u_0\) 马上就要执行、必须精确;而 \(u_{H-1}\) 在很远的未来、下个周期还会重新规划,没必要现在就精修。
于是 DIAL-MPC 让退火在**时域位置上也分层**:对近端控制(如 \(u_0\))用更小的方差(更精确、更确定),对远端控制(如 \(u_{H-1}\))用更大的方差(更粗略、保留更多探索余地)。参数表里的 horizon_diffuse_factor(时域扩散因子)控制的就是这一层——沿时域方差怎么变。
把两层叠起来,效果是:采样预算被花在最该花的地方。近端 × 低噪声级 = 精修马上要执行的动作;远端 × 高噪声级 = 粗扫还会重规划的未来;整条轨迹随在线迭代逐级收敛。这种"双轴由粗到精"比单轴退火更高效——它额外利用了"滚动时域里近端比远端重要"这个结构(呼应第 2 章 MPC 滚动时域、只执行第一步的思想)。
回头看 §5.3 那张 DIAL-MPC 参数表,现在每个数都有了着落:
| 参数 | 值 | 对应到双层退火 |
|---|---|---|
Ndiffuse |
4 | 轨迹级退火的级数(常规) |
Ndiffuse_init |
10 | 冷启动时轨迹级退火用更多级(首周期没有 warm-start,要更充分退火) |
traj_diffuse_factor |
0.5 | 轨迹级(跨迭代)方差缩放——每级方差乘 0.5 衰减 |
horizon_diffuse_factor |
1.0 | 动作级(沿时域)方差缩放 |
Nsample |
2048 | 每级采样的轨迹数 |
Hsample / Hnode |
25 / 5 | 规划时域 / 控制节点数(控制用样条等参数化,降维) |
temp_sample |
0.05 | MPPI 温度 \(\lambda\) |
注意 Hnode=5 这个细节——它暗示 DIAL-MPC 没有对 25 步每一步都独立优化一个力矩,而是用更少的"节点"(5 个)参数化整条控制曲线(如样条插值),这把决策维度从 25 降到 5,是高维控制里常用的降维技巧(和第 4 章 §4.2 平滑噪声、降低有效维度的思路相通)。这类工程细节单看琐碎,但它们合起来才让全阶力矩控制在实时预算内跑得动。
本质洞察:bi-level 退火体现了一个比"退火"本身更深的设计哲学——把有限的计算 / 采样预算,按"信息价值"非均匀地分配。 均匀退火(单层)对整条轨迹一视同仁,而 bi-level 认识到"近端动作比远端重要、马上执行的比还会重规划的重要",于是把精度预算向高价值的近端倾斜。这个"按价值分配预算"的思想远不止用于退火——它是一切实时系统在算力约束下的通用智慧(你在第 2 章 MPC 只精确执行第一步、第 4 章 iCEM 把样本花在精英区,看到的都是它的化身)。学会问"我的预算有没有花在最该花的地方",比记住 bi-level 这个具体结构更有长远价值。
深一层:warm-start 为什么是退火的"天然搭档"¶
§5.3 的伪代码第一行是 U ← shift(U_prev)——用上周期的解平移一格做初值。这个 warm-start 在陷阱和参数表里都提到了,但它和退火的关系值得正面讲清:warm-start 不只是个加速技巧,它和退火在"利用结构"这件事上是天作之合。
先说 warm-start 本身在做什么。滚动时域 MPC 每个控制周期都要重新规划一条未来 \(H\) 步的序列,但相邻两个周期的最优解高度相似——你这一时刻的最优计划 \([u_0,u_1,\dots,u_{H-1}]\),和下一时刻的最优计划,差别主要是"整体往前挪了一格"(因为时间前进了一步、目标没怎么变)。所以下个周期与其从零开始,不如把这周期的解 \([u_1,u_2,\dots,u_{H-1},\,?]\) 拿来当初值——前 \(H-1\) 格直接复用,只有末尾那一格 ? 是新的、需要填(通常复制 \(u_{H-1}\) 或置零)。这就是 shift。
读到这里你可能会问:warm-start 和退火,一个是"复用上周期解"、一个是"多级由粗到精",它俩有什么关系,为什么说是搭档? 关系在于它们都在**利用问题的结构来省搜索**,且恰好互补。
退火解决的是"空间**上的结构"——在当前这次规划里,从大尺度全局探索逐级收缩到小尺度精修。warm-start 解决的是"**时间**上的结构"——相邻控制周期的解高度连续,不必每次从头找。两者叠加的效果是:**warm-start 提供一个已经很接近最优的初值,退火则在这个好初值附近用少得多的级数完成精修。
这就解释了 §5.3 参数表里那个一直没细说的细节——为什么"冷启动"要用更多退火级(Ndiffuse_init=10),而常规周期只用 4 级(Ndiffuse=4)。冷启动(第一个控制周期)没有上周期的解可复用,初值是任意的、离最优很远,所以需要充分的退火(10 级)从大尺度一路搜过来;而之后每个周期有 warm-start 给的好初值,已经在最优解附近,只需少量退火级(4 级)精修即可。
把这个关系想透,你会得到一个漂亮的统一视角:
本质洞察:warm-start 其实可以理解为退火在时间维度上的延伸——它把"上一个控制周期"当成了"本周期退火的第 0 级"。上周期辛辛苦苦退火收敛到的那个解,对本周期而言就是一个"已经过粗筛、相当靠谱的起点",本周期的退火接着它往下精修就行。从这个角度看,整个滚动时域 MPC 的运行,是一条跨越无数控制周期的、永不停止的退火长链:每个周期内部做几级退火,周期之间靠 warm-start 把上一段的成果传给下一段。这也是为什么 DIAL-MPC 能用区区 4 级退火就在实时回路里工作——它没有在每个周期里从头退火,而是站在了所有先前周期累积的"退火成果"之上。理解了这一点,你就明白 warm-start 在采样式 MPC 里绝不是可有可无的小优化,而是让"多级退火"和"实时控制"这两个看似矛盾的要求得以共存的关键枢纽。
最后留一个实践提醒(呼应 §5.3 的故障排查场景一与编程陷阱):warm-start 平移后那个新的末尾格,是整条轨迹里唯一"没被退火充分打磨过"的部分,如果不让它参与后续退火、或初始化得太差,它会随着滚动时域逐步"污染"整条轨迹。所以正确的做法是平移后给末尾格一个合理初值(复制前一格是个稳妥的默认),并确保它和其余部分一起参与本周期的退火精修。这个细节看似琐碎,但在长时间运行的实时回路里,一个没被妥善处理的末尾格会随着每个周期的平移,把劣质控制一点点"灌"进轨迹中段,几十个周期后就可能酿成明显的性能退化——这也是 §5.3 故障排查场景一里"末端处理不当污染整条轨迹"那条的来由。把它列在这里,是提醒你 warm-start 虽好,但那个新生的末尾格是它唯一的"软肋",值得多看一眼。
真机结果:诚实地看 DIAL-MPC 做到了什么¶
DIAL-MPC 论文报告了几个有分量的结果,照实列出(数字均来自论文,且全程**无任何训练**):
- 比标准 MPPI 跟踪误差低约 13.4 倍——这是和同为采样式 MPC 的基线(标准 MPPI、CMA-ES)比,多级退火带来的精度提升是数量级的,直接量化了"多步复合 vs 单步"的差距。在行走这类相对温和的任务上,这个倍数约为 3.9 倍;在高难任务上拉大到 13.4 倍——任务越难、非凸越强,退火的优势越明显。
- 接触奖励比 MPPI 高约 107.7%——在需要丰富接触的序列跳跃任务上,DIAL-MPC 维持的接触奖励是 MPPI 的两倍多,说明它在"接触不可微"这个采样式方法的主场上把优势发挥得更充分。
- 在高难任务上比 RL 策略高约 50%——注意这是和需要大量训练的 RL 比,而 DIAL-MPC 免训练。(一个值得留意的细节:DIAL-MPC 早期版本的摘要里这个数字写作"跳跃任务高 40%",正式版改为"爬越任务高 50%"——任务设定和数字都微调了。这提醒你引用论文数字时以正式版为准,也是 §5.7 那条"关注质的结论而非记死某个数字"的现成例子。)
- 爬箱任务上是唯一持续可行的采样式 MPC——在爬越超过自身两倍高度障碍这类极端任务上,DIAL-MPC 是唯一能持续生成可行解的采样式 MPC,成功率比最佳 MPPI 调度高约 3 倍,而 RL 和不退火的 MPC 通常直接失败。
- 真机四足带负载精确跳跃、50 Hz 实时——不是仅仿真,DIAL-MPC 在真实 Unitree Go2 上完成了带载跳跃,全阶优化在硬件上以 50 Hz 运行。论文还展示了用它控制人形机器人推一个 30 kg 板条箱,并在把箱子减到 15 kg 时自动生成更省力的策略——同一套框架、不同负载,不重新设计,体现了"换模型即用"的通用性。
- 首个在全阶四足动力学上实时、免训练运行的方法——这是它在采样式 MPC 谱系里的历史定位。
把这些放进本章脉络:§5.1 证明了 MPPI 一步 = 去噪,§5.2 的 MBD 证明了 score 可由模型免训练算出,DIAL-MPC 则证明了这套"免训练扩散退火"能在最难的全阶腿足力矩控制上、在真机上工作。这是采样式 MPC 与扩散思想融合后,结出的一个相当硬核的果实。
前沿与开放问题¶
这个方向仍在快速演进,几个值得关注的前沿:
扩散先验 + 采样 MPC(learned prior)。DIAL-MPC/MBD 是纯免训练的,好处是不要数据、能跨动力学迁移,但写不出代价的隐式偏好(如人类运动的自然风格)就难以注入。一条前沿路线是把训练好的扩散策略当作 MPPI 的 learned prior——用数据学到的先验提供"好动作大概长什么样",再用采样 MPC 在线优化保证可行性与最优性。这等于把 §5.2 对照表里 MBD 与 Diffusion Policy 的两端**合起来**:数据先验注入风格、模型 score 保证可行。
sim-to-real 与建模误差。DIAL-MPC 虽已展示真机带载跳跃,但采样式全阶 MPC 高度依赖动力学模型的准确性——模型和现实有偏差时,rollout 算出的代价就不可靠。如何在线辨识/自适应模型、或让退火对建模误差更鲁棒,是把这套方法推广到更多真机、更复杂任务的核心挑战。
实时性与算力。DIAL-MPC 直接在全阶力矩空间优化,需要数千条轨迹 × 多级退火,依赖 GPU 并行(DIAL-MPC 用 JAX/MJX)。如何在算力受限的板载平台上保持实时,曾是工程落地的现实约束——不过这一约束正在被快速推进:§5.4 前沿三会讲到的后续工作,用样条参数化把决策维度压到个位数,已经做到在纯 CPU 上几十个样本实时运行。这说明"算力门槛"很大程度上取决于"在什么决策空间优化",而非退火机制本身。
这些开放问题也提示了你能切入的方向——无论是把 learned prior 接进来、还是改进 sim-to-real 鲁棒性,都是当下活跃且有空间的课题。
读到这里你可能会问:DIAL-MPC 既然每级就是标准 MPPI,那它和我直接把 MPPI 多跑几轮(迭代 MPPI)有什么区别? 区别就在"几轮之间变不变尺度"。迭代 MPPI 多跑几轮,用的是同一个固定的 \((\lambda,\Sigma)\)——相当于一直在同一个噪声级上原地精修,地形的局部极小始终困着它(§5.1 的 2/30 就是这么来的)。
DIAL-MPC 的多级,每级的 \((\lambda_l,\Sigma_l)\) 是**递减**的——高温级大方差先跨过局部极小看全局,低温级小方差再精修。所以不是"多跑几轮"那么简单,而是"每轮换一个由粗到精的尺度"。一句话:迭代 MPPI 是"同一尺度重复",DIAL-MPC 是"多尺度退火",后者才有反向扩散的全局搜索能力。
读到这里你可能还会问:全阶 rollout 几千条轨迹 × 多级,听起来计算量巨大,普通机器人板载算力跑得动吗? 这正是 §5.3 反复标注的现实约束。DIAL-MPC 依赖 GPU 大规模并行仿真(JAX/Brax + MuJoCo MJX)才能实时——它的成立一半靠算法(退火)、一半靠算力(GPU 并行物理引擎)。
在算力受限的板载平台上保持实时,确实是这套方法落地的核心工程挑战之一(§5.4 开放问题里也提了)。但有几个缓解手段:用控制节点参数化降低决策维度(DIAL 的 Hnode=5)、warm-start 减少每周期所需级数、把冷启动的多级只用在第一周期。这也提醒你:纸面上的算法优势,要落到真机还得过算力这一关——这是采样式方法(尤其全阶)始终要正视的工程现实。
读到这里你可能会问:DIAL-MPC 论文报的"比 MPPI 跟踪误差低 13.4×""比 RL 高 50%"这些数字,我在自己的任务上能复现 / 期待吗? 要谨慎对待,理由有二。其一,这些数字是特定任务、特定机器人、特定对比设置下测出来的——它们证明了"退火 + 全阶采样在这些腿足任务上确实显著优于基线",但不保证在你的任务上有同样的倍数。换个任务、换个代价、换个对比基线,数字会变。
其二,更重要的是,论文数字的价值在于'证明这条路走得通、且优势可观',而非给你一个能照搬的性能承诺。你应该从这些数字里读出的是方向性结论——"退火让免训练采样 MPC 在全阶腿足上达到甚至超过 RL 成为可能",而不是"我上了 DIAL 就能拿到 13.4×"。这也是读任何方法论文都该有的态度:关注它证明了什么质的突破,而非记住某个量的数字。真要知道在你的问题上效果如何,唯一可靠的办法是自己跑——这也是 §5.5 让你亲手做 demo、§5.7 强调用多种子统计说话的原因。
⚠️ 常见陷阱¶
编程陷阱:warm-start 平移后忘记处理末端,或退火调度与控制频率不匹配。
错误做法:shift(U_prev) 把上周期解平移一格后,末端那一格留空(用零或随机)却不退火精修;或不管控制周期多短都套用固定的退火级数,导致单周期算不完、跟不上实时。
现象/后果:末端处理不当会让规划轨迹尾部出现劣质控制,随滚动时域逐步"污染"整条轨迹;退火级数与频率不匹配则要么单周期超时(实时性崩)、要么级数太少退火不充分(精度差)。
根本原因:warm-start 利用的是时间连续性,但平移产生的末端"新"控制仍需退火优化;而退火级数 × 每级样本数 × 单条 rollout 耗时必须 ≤ 控制周期。
正确做法:平移后对末端做合理初始化(如复制前一格)并让它参与后续退火;根据控制频率和单周期算力预算反推可行的级数与样本数(DIAL-MPC 的 Ndiffuse/Nsample 就是这个权衡的产物,且冷启动用更多级 Ndiffuse_init)。
自检方法:打印单控制周期的实际耗时,确认 ≤ 周期预算;可视化 warm-start 后的初始轨迹,确认末端没有突兀的劣质控制。
概念误区:以为 DIAL-MPC 的"diffusion"意味着它训练了扩散模型。 错误认识:名字里有"diffusion / 扩散",就以为它像 Diffusion Policy 那样训练了网络。 现象/后果:误判它需要数据和训练、复现时去找"预训练权重",或在"无数据"场景误以为用不了。 根本原因:DIAL-MPC 是 diffusion-inspired(扩散启发),借的是扩散"多级退火/去噪"的**结构**,不是扩散模型本体;它每一步是标准 MPPI、score 隐含在加权里、全程免训练(呼应 §5.1 概念陷阱)。 正确做法:把"diffusion-style annealing"读作"模仿反向扩散的多级退火调度",它的全部新意在调度和组织,不在任何被训练的网络。需要训练的是另一条前沿支线(learned prior),不是 DIAL-MPC 本身。
思维陷阱:以为多级退火总比单级好,级数越多越好。 错误认识:既然退火在非凸/高维上赢单级,那就无脑多加级数、处处用退火。 现象/后果:在简单凸问题上用一堆退火级数,白白增加计算、未必更好;或盲目加级数导致单周期超时、丢实时性。 根本原因:退火的收益来自"非凸/高维下分阶段搜索",问题本身简单(近凸、低维)时单级就够,多级只是浪费;级数也有边际递减——超过任务需要的级数后,每加一级的收益趋零、开销却线性增长(呼应第 4 章"按问题选方法、别为复杂而复杂")。 正确做法:级数和退火强度按问题的非凸程度和维度来定——简单问题少退火甚至不退火,难问题多退火;用消融实验(§5.2 练习 2 的做法)找到收益饱和的级数,不盲目堆。
练习¶
-
(算法精读,⭐⭐) 对照本节伪代码与 vanilla MPPI(第 2 章),逐行标出 DIAL-MPC 多了哪些步骤、每一步对应"反向扩散"的哪个环节。特别说明:
shift(U_prev)、多级 \((\lambda_l,\Sigma_l)\) 缩小、bi-level 里的轨迹级与动作级退火,各自解决什么问题。 -
(退火 vs 单级,⭐⭐⭐) 在一个你熟悉的非凸控制任务(如 Pendulum/Acrobot swing-up,或一个带障碍的可达任务)上,实现单级 MPPI 与多级退火 MPPI,在**相同样本预算**下对比成功率与最终代价。
复用 §5.1/§5.2 的退火骨架即可。重点观察:哪类任务退火优势明显(提示:需要"先远离目标再接近"的强非凸任务,如 swing-up)、哪类任务单级就够(近凸任务)。把结论和本节"思维陷阱"对照。
- (跨章综合题,⭐⭐⭐⭐) 本章把"提议分布"这个维度从第 4 章的"单步高斯"升级为"多级去噪复合"。请综合第 1–5 章回答:
(a) 第 4 章的三设计维度(权重函数、噪声、协方差)在 DIAL-MPC 里分别变成了什么?(提示:权重仍是 MPPI 指数权重;噪声/协方差现在是**逐级退火**的,多了"调度"这个新自由度。)
(b) 第 4 章 §4.6 的 CoVO(最优协方差整形)能否与 DIAL-MPC 的退火结合——即每一级不只缩小方差、还按代价地形把该级协方差整形到最优方向?论证可行性,并分析收益(更快收敛?)与代价(每级要估计/分解协方差,开销大)。
(c) 从第 1 章的目标分布 \(\mathbb{P}^\star\) 视角统一陈述:CEM、MPPI、iCEM、MBD、DIAL-MPC 都在"逼近同一个由代价定义的目标分布",它们的根本区别是什么?(提示:用什么提议分布、单步还是多步、score 从哪来。)这正是贯穿第 4–5 章的主线。
- (连接全阶与降维,⭐⭐⭐,思考题) §5.3 提到 DIAL-MPC 用控制节点参数化(
Hnode=5而非对 25 步独立优化)来降低决策维度。请回答:(a) 把 25 步的控制用 5 个节点(如样条插值)表示,决策维度从多少降到多少?(b) 这种降维和第 4 章 §4.2 用平滑 / 有色噪声降低"有效维度",思路上有什么共通之处?(c) 降维省了计算,但代价是什么(提示:表达力 / 控制的精细程度)?什么样的任务适合更少节点、什么样的适合更多?
§5.4 更大的图景:扩散、MPPI、RL 的统一与前沿 ⭐⭐¶
前三节走完了一条具体的线:MPPI 一步 = 去噪(§5.1)→ 用模型算 score 的免训练扩散优化 MBD(§5.2)→ 多级退火征服全阶力矩控制 DIAL-MPC(§5.3)。本节把镜头拉远,看这条线在 2024–2025 年汇入的更大图景——它会让你明白本章学的不是两个孤立的算法,而是一个正在成形的统一框架的一部分。
读到这里你可能会问:前面反复说"MPPI、REINFORCE、扩散去噪是同一个东西的三张面孔",这只是一个教学比喻,还是真有人把它写成了严格的统一理论? 答案是后者——这正是 2025 年这个方向最受关注的进展之一。
一个分布,三张面孔:Gibbs 测度统一¶
2025 年初,已有工作(Li 等,2025)把 MPPI、强化学习的策略梯度、扩散模型**显式统一**在同一个数学对象下:一个 Gibbs 测度(玻尔兹曼分布)形式的目标分布
其中 \(\hat E\) 在不同领域有不同含义、\(\tau\) 是温度。把三者并排,差别只在 \(\hat E\) 是什么:
| 领域 | \(\hat E(U)\) 的含义 | 更新的内核 |
|---|---|---|
| MPPI / 路径积分控制 | 负代价 \(-J(U)\) | 按 \(e^{-J/\lambda}\) 加权采样、加权平均 |
| 强化学习(策略梯度) | 期望回报 | 按回报加权、朝高回报方向更新 |
| 扩散模型 | 数据(对数)密度 | 朝 score \(\nabla\log p\) 去噪 |
三者共享同一个更新模板——"按指数化的能量给样本加权、朝加权方向挪一步"。这就是前三节那个"三张面孔"比喻的严格版本:它不是教学上的近似类比,而是一个可以写成统一公式的事实。第 1 章讲自由能–KL 时建立的 \(\mathbb{P}^\star\propto\mathbb{Q}\,e^{-S/\lambda}\),正是这个 Gibbs 测度在控制里的化身。
本质洞察:本章最值得带走的,不是 MBD 或 DIAL-MPC 任何一个具体算法,而是这个统一视角本身——一旦你认识到采样式控制、策略梯度、扩散去噪都是在"逼近同一个 \(\exp(\text{能量}/\text{温度})\) 形式的目标分布",三个领域的全部技巧就被打通成一个共享的工具箱。RL 里降方差的基线、扩散里的噪声调度、采样控制里的协方差整形(第 4 章 CoVO),原则上都能跨领域借用。这种"看穿表面差异、认出共同结构"的能力,比记住任何单个算法都更持久、更有迁移价值——它正是第 4 章统一精神在更大尺度上的延续:不同领域的方法,骨子里常在解同一个问题。
这个统一也直接支撑了一类**混合算法**的设计思路:既然数据驱动的先验(扩散/RL)和优化驱动的精炼(采样 MPC)面对的是同一个目标分布,就可以把两者拼起来——用前者提供"好解大概在哪"的先验,用后者保证可行性与最优性。下面看这条混合路线的两个代表。
前沿一:把扩散模型当 learned prior 或近似动力学¶
§5.2 的对照表留了一个尾巴:MBD(model-based,免训练)写不出"难以言说的隐式偏好",Diffusion Policy(model-free,要训练)能从数据学到这种偏好但绑定动力学。2025 年的若干工作正是要把这两端合起来。
一条路线是**扩散先验 + 采样精炼**。用从数据里学到的扩散模型提供动作提议分布("好动作大概长什么样"),再用采样式 planner 在线优化新的奖励、保证约束——典型如 D-MPC(2024)。它用扩散模型学到轨迹级的动力学和动作提议分布,再用一个 random shooting 式的采样 planner 在其上规划。在 D4RL 离线基准上,D-MPC 显著优于已有的基于 MPC 的离线规划方法,与最先进的基于模型和无模型的 RL 方法相当,还能在运行时优化训练中没见过的新奖励、适应新动力学。
另一条路线更激进,把**扩散模型直接当作近似动力学先验**来做规划——典型如 Diffusion-MPC(2025)。它的出发点是:经典 MPC 依赖精确的动力学模型,而复杂环境里精确模型往往拿不到。Diffusion-MPC 用一个学习的生成式扩散模型当近似动力学先验来规划,在每个反向去噪步里融入奖励规划并施加约束投影,得到既满足任务目标又落在物理极限内的轨迹。它还设计了交互式在线训练——在环境里执行带奖励和约束的规划器、按实际回报对收集到的轨迹做过滤和重加权、再更新去噪器,让规划模型超越单纯的模仿预训练。
这两条路线和本章主线的关系值得说清:DIAL-MPC/MBD 是"纯 model-based、免训练、靠多步复合突破天花板"的一端,D-MPC/Diffusion-MPC 则把"学习的先验"重新引了回来。
它们不矛盾——回到 Gibbs 统一视角,前者的 score 全部由模型算、后者的 score 部分来自学习的先验,两者只是在"score 从哪来"这条轴上取了不同的点。理解了统一框架,你就能在"要不要引入学习、引入多少"之间,按任务有没有数据、动力学准不准来理性取舍,而不是把"免训练"或"学习"当成信仰。
前沿二:从四足到灵巧手——同一套退火的可迁移性¶
§5.3 强调 DIAL-MPC 的一个工程优点是"换模型即用"(plug-and-play,不需重设计降阶模型)。这个优点很快被它自己的后续验证了:DIAL-MPC 的开源实现先打通了 Sim2Real 流程,又在 2025 年 5 月加入了用手指转球的灵巧操作 demo(Allegro 手的物体重定向)。
从四足力矩控制到灵巧手物体重定向,任务和机器人完全不同,但用的是同一套"扩散式退火 + 全阶采样"框架——只换了动力学模型和代价函数。这正是 model-based 采样方法相对"为每个任务训一个策略"的 RL 的结构性优势:算法和任务解耦,换任务只换模型与代价、不重训。
灵巧手是个特别能体现采样式 MPC 价值的战场——高维、接触极其丰富、且常缺乏训练数据。事实上,独立的工作也在沿这个方向推进:已有研究首次在物理(非仿真)的仿生腱驱机器人手上演示了采样式 MPC 的手内操作,把物理仿真器直接当作动力学模型。把这些放在一起看,趋势很清楚:用物理模型 + 采样(+ 退火)做接触丰富的高维操作,正成为 RL 之外一条不依赖大规模训练数据的现实路径。
不过要诚实标注边界(呼应 §5.3 的开放问题):这些真机结果令人鼓舞,但采样式全阶 MPC 仍高度依赖动力学模型的准确性和板载算力。模型与现实有偏差时 rollout 的代价就不可靠,sim-to-real 的鲁棒性、在线模型自适应、受限算力下的实时性,仍是把这套方法推向更广泛真机应用的核心挑战。这个方向远未尘埃落定——这既是它的不确定性,也是你能切入做出贡献的空间。
前沿三:把"必须 GPU、必须步态先验"也打掉——CPU 上 30 个样本的退火 MPC¶
§5.3 反复标注了 DIAL-MPC 的两个现实约束:依赖 GPU 大规模并行(数千条全阶 rollout),以及评测时仍用参考步态跟踪。读到这里你可能会担心:没有 GPU、没有现成参考步态的项目,这套退火 MPC 是不是就用不上? 2025 年底的一项后续工作给了一个相当鼓舞人的回答。
这项工作(Reference-Free Sampling-Based MPC,2025 年底)沿用了 DIAL-MPC 的扩散启发噪声退火思想,但换了两个关键设计:用**三次 Hermite 样条**在关节空间参数化控制(大幅压缩搜索维度),并把力矩级执行交给一个底层 PD 控制器。结果是——它在**纯 CPU** 上、用**少到 30 个样本**就能实时运行,而不再需要数千条 GPU rollout,也不依赖预定义的步态先验或参考轨迹。同一套框架在 Go2 四足和 G1 人形两种形态上都产生了多样的运动行为。
这件事对你理解本章主线有两层意义。
第一层是**直接打掉了"退火 MPC = 必须 GPU"这个认知**。DIAL-MPC 的几千样本是为"直接在全阶力矩空间优化"付的代价;一旦换用样条参数化把决策维度从几十压到个位数(呼应 §5.3 那个 Hnode=5 的降维细节),所需样本数就从数千降到几十,CPU 实时成为可能。这印证了 §5.6 那条"对比表是快照、边界在移动"——DIAL-MPC 标注的"高维要 GPU"约束,一年内就被一个更聪明的参数化推进了一大步。
第二层更深:它再次确认了**退火(多步复合)这个内核的普适性与廉价性**。从 DIAL-MPC 的"GPU + 全阶力矩 + 数千样本"到这项工作的"CPU + 样条 + 几十样本",变的全是"在什么决策空间、用多少样本"这些工程接口,不变的是"由高到低的噪声退火调度"这个核心机制。这正是 §5.5"算法是内核、工程是外壳"那条洞察的又一个现成例证——退火这个内核如此朴素,以至于它能在天差地别的算力预算下都成立。
当然,廉价是有代价的、要诚实标注(呼应本章一贯的态度):把控制点放在关节空间、用 PD 执行力矩,缩小了搜索空间,也牺牲了对力矩的精细优化——生成的动作在平滑性和能效上不总是最优。这是"降维换实时"的典型权衡(§5.3 练习 4 让你思考过的那个权衡),没有免费的午餐。
顺带一提,这条线还在继续生长:另有工作在 DIAL-MPC 基础上加入了约束强制机制和终端价值函数近似,让退火 MPC 能做更长时域的推理。把这些放在一起看,DIAL-MPC 更像是一个"起点"而非"终点"——它确立的"扩散启发退火 + 采样 MPC"范式,正在沿"更省算力""更长时域""更多形态"等多个方向被快速推进。这对你是个信号:这个方向年轻、活跃、且每一步进展都还是在那个你已经吃透的内核上做文章。
把前沿一、二、三摆在一起,会看到一个清晰的格局:它们都在给"纯免训练的退火采样 MPC"补短板,但补法不同。前沿一(learned prior)用**数据**补"写不出隐式偏好"的短板;前沿三(样条降维 + CPU)用**更聪明的参数化**补"算力门槛高"的短板;而可迁移性(前沿二)则展示了这个内核的**通用性**有多宽。其中"借数据"这条路(前沿一)最值得再展开一层——因为它把本章主线的"纯 model-based"和 §5.2 对照过的"纯 model-free"重新接到了一起,下面就细看这条混合路线的两个代表怎么工作。
把两条 learned prior 路线讲细一点¶
§5.4 正文提了 D-MPC 和 Diffusion-MPC 两个代表,但一笔带过。这里各展开一层它们怎么工作的——不是要你掌握细节,而是让你看清"学习"是怎么具体地接进采样 MPC 框架的,从而在统一视角里给它们准确定位。想只抓主线的话,记住"前者学动作提议 + 随机射击规划,后者把扩散当近似动力学 + 反向步里融入奖励和约束"即可。
D-MPC:用扩散学"动力学 + 动作提议",再用随机射击规划。 经典 MPC 有两个部件——一个预测未来的动力学模型,一个挑动作的规划器。D-MPC 用扩散模型把这两件事都从离线数据里学出来:一个扩散模型学**轨迹级的动力学**(给定历史和动作序列,未来状态长什么样),另一个学**动作序列的提议分布**(好动作序列大概长什么样)。
有了这两个学到的部件,规划时用一个**随机射击(random shooting)**式的采样 planner:从学到的动作提议分布里采一批候选序列,用学到的动力学模型预测它们的结果,按目标函数挑最好的。这本质上就是一个"提议分布换成了学习版"的采样 MPC——内核还是"采样—评估—选优",但提议分布不再是高斯,而是从数据学到的扩散模型。
它的好处正是 learned prior 的典型好处:动作提议来自数据,比白噪声高斯"更懂"什么动作合理,于是在复杂任务上采样效率更高。在离线 RL 的 D4RL 基准上,D-MPC 显著优于已有的基于 MPC 的离线规划方法、与最先进的 RL 方法相当,还能在运行时优化训练时没见过的新奖励、适应新动力学——这后一点是纯学策略的方法(如行为克隆)做不到的,因为 D-MPC 保留了"在线按目标规划"的能力。
Diffusion-MPC:把扩散模型当"近似动力学先验",在去噪里融入奖励和约束。 它的出发点更尖锐:经典 MPC 依赖**精确**动力学模型,而复杂环境里精确模型常常拿不到(接触、形变、未建模效应)。Diffusion-MPC 干脆用一个学习的生成式扩散模型当**近似动力学先验**来做规划——把扩散模型当成"环境动力学的富有表达力的近似器",而不只是一个条件生成器。
它的精妙之处在**反向去噪的每一步里同时做三件事**:预测未来状态和动作、融入奖励规划(朝高回报方向引导)、施加约束投影(把轨迹拉回物理可行范围)。这样去噪出来的轨迹既像真实动力学会产生的、又朝着任务目标、还满足约束。为了让这个学习的规划模型超越单纯模仿预训练数据,它还设计了**交互式在线训练**:在真实环境里执行带奖励和约束的规划器、按实际拿到的回报对收集到的轨迹做过滤和重加权、再回头更新去噪器——这是个"边用边学"的闭环,让模型逐步适应到比初始演示更好的水平。
放回统一视角给它们定位。 这两条路线和本章主线 MBD/DIAL 的关系,用 §5.4 的 Gibbs 统一一句话就能讲清:它们都在逼近"\(\exp(\text{能量}/\text{温度})\)"形式的目标分布,区别只在 score(或提议分布)从哪来——
- MBD/DIAL:score 全部由**已知模型**算(免训练、免数据、跨动力学迁移);
- D-MPC:提议分布和动力学都**从数据学**(要数据训练,但保留在线按新目标规划的能力);
- Diffusion-MPC:动力学先验**从数据学**(应对模型难建的环境),但奖励和约束在去噪时**在线注入**(保留对任务目标的适应)。
本质洞察:把这四个方法摆在一起,你会看到一条清晰的"光谱",而非彼此孤立的算法。光谱的一端是纯 model-based(MBD/DIAL,全靠已知模型、零数据),另一端是纯 model-free(Diffusion Policy,全靠数据、不用模型),中间是各种混合(D-MPC、Diffusion-MPC,部分学、部分算)。决定一个方法落在光谱哪个位置的,是一个根本问题:关于这个任务,你"知道"多少、"有"多少数据。 模型知道得多、数据少,就往 model-based 端走;模型难建、数据多,就往 model-free 端走;两者都有一些,就用混合。理解了这条光谱,你面对任何新方法都能问"它把多少交给了模型、多少交给了数据",从而准确判断它适合你的问题与否。这比追逐"最新最强"有用得多——因为光谱上每个位置都有它不可替代的适用场景,没有哪个点能通吃。
读到这里你可能会问:§5.4 说扩散、MPPI、RL 统一在 Gibbs 测度下,可它们一个是生成模型、一个是控制器、一个是学习算法,差这么远,"统一"是不是有点牵强? 不牵强——统一的是它们**求解的数学问题**,不是它们的应用场景或工程形态。
打个比方:傅里叶变换在信号处理、量子力学、图像压缩里形态各异,但底层是同一个数学对象。MPPI/RL/扩散也是如此:它们表面上做的事(控制、学策略、生成图像)天差地别,但剥到最里层,都在解"如何逼近 / 从一个 \(\exp(\text{能量}/\text{温度})\) 形式的分布里采样或优化"。这个共同的数学内核是实打实的(有论文把它严格写出来,§5.4 引的 Li 等 2025),不是类比修辞。认出它的价值在于:一个领域积累的技巧(RL 的方差缩减、扩散的噪声调度、控制的协方差整形)有了跨领域迁移的桥梁。统一不是抹平差异,而是在差异之下找到那个共享的骨架。
这给你的实践启示¶
把本节的图景落到你自己的工程判断上,有三条可操作的启示:
第一,遇到"扩散 + 控制/MPC"的新论文,先用统一视角解码——问三个问题:它的目标分布是不是 \(\exp(\text{能量}/\text{温度})\) 形式?score 从哪来(算出来的,还是学出来的)?是单步还是多步复合?答完这三问,再花哨的新方法你也能迅速定位它在本章框架里的坐标。
第二,"要不要引入学习"取决于数据和模型,不是取决于时髦。动力学已知、目标分布写得清楚、没数据 → 纯 model-based(MBD/DIAL);有数据、要学难以言说的偏好或要快推理 → 引入 learned prior(D-MPC/Diffusion-MPC)。这是工程权衡,第 4 章对 Predictive Sampling 的"按问题选方法"在这里同样适用。
第三,退火/多步复合是你应对高维、非凸、接触问题的默认升级。当单级 MPPI 在高维上调不动时,先想"能不能加退火",而不是先想"能不能堆样本"——这是本章相对第 4 章最实用的新增工具。
读到这里你可能会问:§5.4 把这么多方法(MBD、DIAL、D-MPC、Diffusion-MPC)放进一个框架,可它们发表时间挨得很近、又各有各的名字,我怎么记得住、怎么不混淆? 别去记名字和细节,记**坐标**。用 §5.6 那四个轴(要不要梯度、要不要训练、什么提议分布、单步还是多步),或 §5.4 这条"模型 ↔ 数据"光谱,给每个方法标一个位置,你就不会混淆了。
比如:MBD 和 DIAL 都在"免训练、纯模型、多步退火"这一端,区别只是 DIAL 专做全阶力矩实时控制、MBD 更通用;D-MPC 和 Diffusion-MPC 都在"用学习的扩散先验"这一端,区别是前者学动作提议 + 随机射击、后者把扩散当近似动力学 + 约束投影。记住"它们在光谱 / 坐标上的相对位置和各自补的短板",远比记住论文名和发表年份有用——因为位置反映了"它解决什么问题",而这才是你选型时真正需要的信息。这个方向每年都有新名字冒出来,但坐标系是稳定的;学会用坐标系定位新方法,你就再也不会被层出不穷的新名词淹没。
把全章主线收成一句话¶
走到这里,本章四节(加上后面的实战与选型)其实在反复打磨同一条主线,值得在进入更广图景前把它收成一句你能随身带走的话。
第 4 章留给你一个困局:采样式 MPC 的所有花样都在"单步怎么撒、怎么加权、怎么整形协方差",但单步是高斯,高斯是单峰,单峰逼近多峰目标会卡在最差的谷底——这就是高斯天花板,且它在"单步框架"内无法被打破。
本章给出的回答,一句话就是:不在单步上较劲,改用多步的复合。 每一步仍然是那个朴素的、好采样的高斯(§5.1),但把许多步沿一个由高到低的噪声 / 温度调度复合起来(退火),就能自动生成任意复杂的多峰分布、爬上几十维的全阶控制(§5.3);而这多步去噪所需的"往哪走"(score),在动力学和代价已知时可以由模型直接算出,无需训练任何网络(§5.2)。再往上一层看,这套"多步逼近一个 \(\exp(\text{能量}/\text{温度})\) 目标分布"的做法,和 RL、和生成式扩散共享同一个数学内核(§5.4)。
所以如果有人问你"扩散给采样式控制带来了什么",你可以这样答:它没有发明一个更聪明的单步,而是证明了'把简单的单步复合起来'就能突破单步的天花板——威力从来不在某一步有多花哨,而在许多步如何被组织。 这句话不仅是本章的总结,也是一把钥匙:以后你遇到任何"逐步逼近"的方法(扩散、退火、甚至深度网络的逐层变换),都可以用它来快速看穿"复杂性到底从哪来"。
⚠️ 常见陷阱¶
概念误区:把"统一视角"当成"这些方法都一样、可以随便互换"。 错误认识:既然 MPPI、RL、扩散统一在同一个 Gibbs 测度下,那它们就是一回事、用哪个都行。 现象/后果:在该用 RL 的场景(需要泛化策略、可承受离线训练)硬上在线采样 MPC,或在该用采样 MPC 的场景(无数据、要换任务)去训 RL 策略,南辕北辙。 根本原因:统一的是"目标分布和更新内核",不是"工程权衡"。同一个目标分布,可以离线学一个泛化策略来逼近(RL)、可以在线每周期重新优化(MPC)、可以多步去噪生成(扩散)——它们在数据需求、实时性、泛化性、迁移性上截然不同。 正确做法:用统一视角理解共性、借用技巧,但选型仍按第 4 章和本节的工程维度(有无数据、要不要泛化、实时性、动力学是否已知)来定。统一是"理解的工具",不是"选型的借口"。
思维陷阱:以为前沿方法越新越复杂就越该用。 错误认识:D-MPC、Diffusion-MPC 比 DIAL-MPC 新、比 MPPI 复杂,所以更先进、更该采用。 现象/后果:在一个动力学已知、纯优化就能解的任务上,引入学习的扩散先验、交互式训练,徒增数据依赖、训练成本和不确定性,效果未必比一个调好的 MPPI/DIAL-MPC 好。 根本原因:每种方法都有其适用前提,引入学习是为了解决"目标分布写不清/要隐式偏好"这个特定问题,没有这个问题时引入它只是增加复杂度(呼应第 4 章"别为复杂而复杂"和 §5.3 的同款陷阱)。 正确做法:从最简单够用的方法起步(能用调好的 MPPI 就别上退火,能用免训练 DIAL 就别引入学习),只在简单方法确实不够时、针对性地引入更复杂的机制,并能说清"为这个具体问题引入它"。
练习¶
-
(统一视角应用,⭐⭐) 用本节的"三张面孔"表,把第 1 章的自由能–KL、第 2 章的 MPPI、第 4 章的 REINFORCE 同构、本章的扩散去噪填进同一个 \(q\propto\exp(\hat E/\tau)\) 框架,逐一写出各自的 \(\hat E\) 和温度 \(\tau\) 对应什么。然后挑一个你熟悉的 RL 降方差技巧(如优势函数/基线),论证它能否迁移到 MPPI(提示:MPPI 里"减去 \(\rho=\min_k J_k\)"的操作,和 RL 的基线是不是一回事?)。
-
(前沿调研 + 选型,⭐⭐⭐,开放题) 给定三个场景,分别说明你会选纯 model-based(MBD/DIAL)还是 learned-prior 混合(D-MPC/Diffusion-MPC),并说清理由:(a) 一台全新设计、没有任何演示数据、但动力学方程已知的四足机器人,要做跨障跳跃;(b) 要让机械臂模仿人类演示里那种"自然、拟人"的取放风格,有大量遥操作数据;(c) 一个动力学难以精确建模、但有少量次优演示的接触丰富操作任务。把你的选择和本节"实践启示"对照。
-
(跨章贯通,⭐⭐⭐⭐,思考题) 本章把第 4 章的"提议分布"维度从"单步高斯"升级为"多步去噪复合",本节又把它接入 MPPI/RL/扩散的统一框架。请用一段话向一个只学过经典 MPPI(第 2 章)的同学解释:扩散启发的采样 MPC 到底"新"在哪、"不新"在哪?要求点明三件事——(i) 单步仍是高斯(不新)、(ii) 多步复合 + 退火调度带来表达力与高维能力(新)、(iii) score 可由模型免训练算出(新视角)。这道题检验你是否真正抓住了全章主线。
§5.5 实战:六十行写一个退火采样 MPC ⭐⭐⭐¶
理论讲了四节,现在动手——把 §5.1–§5.3 的核心机制浓缩成一个能跑的最小实现。第 3 章你写过 Mini-MPPI,本节是它的"扩散启发升级版":在同一个 MPPI 内核外面,包一层退火调度。代码不到六十行,却完整体现了本章主线"突破在多步组织、不在单步"。
我们按"为什么这样写 → 正确实现 → 常见错误写法 → 对比"四步走,确保你不只是抄代码,而是理解每一行为什么在那里。
任务:一个逼着你绕路的强非凸问题¶
挑任务有讲究。退火的优势只在"单一尺度顾此失彼"的问题上才显现——如果问题近凸、单级 MPPI 一把就能解,退火只是徒增开销(§5.4 陷阱说过,累积项目里 CEM 的例子也演示过)。所以我们要一个**强非凸、需要"先远离目标再接近"**的任务。
设计这样一个场景:一个点要从起点 \((0,0)\) 走到正上方的目标 \((0,4)\),但中途 \(y=2\) 处横着一道墙,墙上只在 \(x\in[1.2,2.0]\) 有一个缺口。直线冲向目标必撞墙——必须**先横向绕到缺口(远离目标的 \(x\) 方向)、穿过缺口、再纵向抵达**。这个"先朝看似错误的方向走"正是强非凸的典型特征,也是单级 MPPI 最容易栽跟头的地方。
import numpy as np
start = np.array([0.0, 0.0]); goal = np.array([0.0, 4.0]); H = 12
def cost(U): # U:(K, H*2) 每步的 (dx,dy) 速度增量
Ur = np.atleast_2d(U).reshape(-1, H, 2)
X = np.cumsum(Ur, axis=1) * 0.5 + start # 积分成位置轨迹 (K,H,2)
term = ((X[:, -1, :] - goal) ** 2).sum(1) * 8.0 # 终端到达目标
ctrl = 0.02 * (Ur ** 2).sum((1, 2)) # 控制能量
y, x = X[:, :, 1], X[:, :, 0]
in_wall = (y > 1.9) & (y < 2.1) & ~((x > 1.2) & (x < 2.0)) # 撞墙(不在缺口)
return term + ctrl + in_wall.sum(1) * 60.0 # 撞墙重罚 → 非凸不可微
注意这个代价**不可微**(撞墙惩罚是个 indicator 计数),这正是采样式方法的主场——它只需要前向算出一个数,不需要梯度(呼应第 2 章和 §5.2 反复强调的"只需前向")。
第一步:为什么要包一层退火¶
先想清楚退火那层在解决什么。单级 MPPI 用一个固定方差 \(\sigma\) 撒扰动:\(\sigma\) 小了,扰动跨不出"直冲目标"的思维定式、发现不了"要先横向绕行",于是撞墙;\(\sigma\) 大了,能探索到绕行路径,却无法在缺口附近精细收敛、终点飘忽。单一尺度无法同时满足"敢绕远"和"收得准"。
退火的解法是把这两件事在时间上分开:高温大方差的早期级负责"敢绕远"(全局探索,发现缺口在哪边),低温小方差的后期级负责"收得准"(局部精修,对齐缺口和目标)。这就是 §5.1 那个最小 demo 的道理,也是 DDPM 反向过程"高噪声级管全局、低噪声级管局部"的道理。
第二步:正确实现¶
把这个思路写出来——内核是标准 MPPI,外面套一个"温度和方差都从高到低"的调度循环:
def anneal_mpc(seed, anneal=True, K=500, levels=5, iters_per=3):
rng = np.random.default_rng(seed)
U = np.zeros(H * 2)
if anneal: # 退火: 温度&方差几何递减(高→低)
lams = np.geomspace(15.0, 0.3, levels)
sigs = np.geomspace(2.5, 0.35, levels)
else: # 单级对照: 固定尺度, 相同总更新次数
lams = np.full(levels, 1.0)
sigs = np.full(levels, 1.0)
for lam, sig in zip(lams, sigs): # 外层: 退火级(= 反向扩散的去噪级)
for _ in range(iters_per): # 内层: 该级做几次 MPPI 更新
eps = sig * rng.standard_normal((K, H * 2))
U_samples = U + eps # 在当前解附近撒扰动
J = cost(U_samples) # 前向 rollout 算代价(无梯度)
w = np.exp(-(J - J.min()) / lam) # MPPI 指数权重(减最小值防溢出)
w /= w.sum()
U = U + (w[:, None] * eps).sum(0) # 加权平均 = 一步去噪
return U
读这段代码,请把注意力放在结构上:内层三行(采扰动、算代价、加权平均)就是第 2 章的 MPPI,一字未改;新增的全部内容只是外层那个"\((\lambda,\sigma)\) 从高到低"的调度循环。这精确对应本章主线——突破不在单步(单步还是 MPPI),在"如何把多步组织起来"(退火调度)。np.geomspace(15.0, 0.3, levels) 生成几何递减的温度,是退火"由粗到精"的引擎。
第三步:几种典型的错误写法¶
把上面的正确版和初学者常写错的版本对比,能加深理解。每种错法都对应 §5.3 故障排查里的一条:
# 错误A: 调度方向写反(从低到高)——变成"由精到粗", 退火失效甚至帮倒忙
lams = np.geomspace(0.3, 15.0, levels) # ✗ 温度递增
sigs = np.geomspace(0.35, 2.5, levels) # ✗ 方差递增
# 后果: 先在小尺度锁死(直冲撞墙), 再用大尺度把已有的解打散, 比单级还差
# 错误B: 只退火温度, 方差固定——丢掉"后期精修", 终点飘忽
sigs = np.full(levels, 1.5) # ✗ 方差全程不变
# 后果: 后期仍大范围乱撒, 即便找到缺口也对不准, 终端误差大
# 错误C: 末级方差太大——精修不到位
sigs = np.geomspace(2.5, 1.2, levels) # ✗ 末级 σ=1.2 仍偏大
# 后果: 全局找对了, 局部收不住, 终点在目标附近抖动
# 错误D: 不减最小值直接 exp——大代价下数值溢出
w = np.exp(-J / lam) # ✗ J 很大时 exp(-大数)=0, 全零权重
# 后果: 撞墙的高代价让 exp 下溢成 0, 权重退化或 NaN
这些错法看似细节,却都会让退火彻底失效——退火的全部威力依赖"温度和方差**同步、单调、降到足够小**"这个精确的调度,任何一处偏差都可能让它退回单级甚至更糟。
第四步:对比与现象¶
跑 30 个随机种子,对比退火与单级(完全相同的总更新次数 15 次 × K=500,唯一区别是调度):
单级固定 (λ=1, σ=1, 5×3 次更新): 平均代价 14.57 成功(绕墙且到达) 23/30
多级退火 (λ:15→0.3, σ:2.5→0.35): 平均代价 0.48 成功(绕墙且到达) 30/30
(成功 = 全程不撞墙且终点落在目标 0.7 内;两者预算完全相同)
退火 \(30/30\) 全部成功、平均代价 \(0.48\);单级 \(23/30\)、平均代价高达 \(14.57\)(那些失败种子多半撞了墙吃了重罚)。把样本数加到 50 个种子,结论一致(退火 \(49/50\) vs 单级 \(37/50\))——这不是某个幸运种子的偶然。
更有意思的是看退火**逐级**的中间解都把终点放在哪:
第1级 (λ=15.00, σ=2.50): 终点≈(-0.15, +3.96) 代价= 0.47 ← 高温大方差: 一步就找对全局区域
第2级 (λ= 5.64, σ=1.53): 终点≈(+0.08, +4.08) 代价= 0.54
第3级 (λ= 2.12, σ=0.94): 终点≈(-0.01, +3.94) 代价= 0.56
第4级 (λ= 0.80, σ=0.57): 终点≈(+0.04, +3.99) 代价= 0.52 ← 低温小方差: 精修对齐
第5级 (λ= 0.30, σ=0.35): 终点≈(-0.00, +3.99) 代价= 0.48
第一级(高温大方差)就已经把终点带到了目标附近的正确区域——因为大方差让它"敢"探索绕行路径、发现缺口;后续级在已锁定的全局结构里逐步精修,把终点对得越来越准。这就是"高噪声级管全局、低噪声级管局部,逐级交棒"的字面演示,和 DDPM 反向过程同构。
本质洞察:这六十行代码是整章最浓缩的标本。它告诉你扩散启发的采样 MPC 在工程上到底是什么——不是一个全新的复杂系统,而是你已经会的 MPPI,外面包了一层从高到低的温度/方差调度。 关掉那层调度(本节代码里的
anneal=False,让温度/方差全程固定),它就退回第 4 章的单级 MPPI;打开它,它就获得了多步去噪的全局搜索能力。第 4 章的高斯天花板没有被一个更聪明的单步打破,而是被这层朴素的外循环绕了过去。能亲手把成功率从 23/30 调到 30/30、并看懂逐级中间解为什么由粗到精,你就真正掌握了本章——剩下的 MBD、DIAL-MPC、统一视角,都只是这同一个机制在不同问题、不同包装下的展开。
读到这里你可能会问:这个 demo 里我没看到"score",它和 §5.1 说的"去噪 = 朝 score 上升"对得上吗? 对得上,而且 score 就藏在那一行加权平均里。回忆 §5.1:MPPI 的加权噪声 \(\sum_k w_k\varepsilon_k\) 就是目标分布 score 的蒙特卡洛估计。代码里 (w[:,None]*eps).sum(0) 这一行,算的正是当前级(被该级方差平滑过的)目标分布的 score 上升方向。你没有显式写 score,但每做一次加权平均,就隐式地估计并沿着 score 走了一步——这正是 MBD 所谓"用模型算 score"的字面实现(这里的"模型"就是 cost 函数里的 rollout)。
一个消融实验:退火级数真的越多越好吗¶
§5.4 的陷阱和累积项目都说过"退火不是越多越好",但那是定性的。这里用一个真实的消融实验把它量化——固定总更新预算(15 次 × K=500),只改变"分成几级",看成功率怎么变。这种"控制变量、扫一个超参"的消融,是你做任何方法时都该有的实验习惯。
级数 每级迭代 成功率 平均代价
1 15 23/30 14.57 ← 单级: 无退火, 困局部(最差)
2 7 29/30 2.64 ← 开始退火, 大幅改善
3 5 29/30 2.52
5 3 30/30 0.48 ← 甜区: 成功率与代价双双最优
8 1 25/30 10.33 ← 级数过多, 每级仅1次, 回落
15 1 26/30 8.42 ← 极端: 退化成"每级换挡但没踩实"
(同一绕墙任务,固定总更新≈15 次 × K=500,30 个随机种子)
这条曲线呈现一个清晰的"先升后降"——成功率和代价都在**级数=5 附近达到最优**,两侧都更差。读懂这个形状,你就真正理解了退火级数这个超参的本质:
左端(级数太少)差,因为退火不充分。 级数=1 就是单级 MPPI,完全没有"由粗到精",困在局部(23/30)。级数 2、3 已经体现退火的好处(升到 29/30),但还没到最优。
右端(级数太多)也差,因为每级没踩实。 注意"每级迭代"那一列:总预算固定,级数越多,每级能分到的更新次数越少。级数=8 和 15 时,每级只剩 1 次更新——这意味着每个噪声级上**还没在该级收敛就急着换下一级**了,相当于"换挡太勤、每挡都没踩实离合",于是性能回落(25-26/30,代价反弹到 8-10)。
中间(级数 3–8,这里峰值在 5)是甜区,因为它同时满足了两个条件:级数够多以体现"由粗到精"的退火结构,每级迭代又够多以在该噪声级大致收敛。这正是 §5.7 问七讲的那个权衡的实验证据。
本质洞察:这条"先升后降"的曲线,是几乎所有"分阶段 / 多步"方法共有的形状——步数太少则每步负担过重(这里是退火不充分),步数太多则每步收益过薄(这里是每级没踩实),最优在中间。你在神经网络的层数、优化的迭代轮次、课程学习的阶段数里都会反复见到同样的形状。它背后是一个朴素而深刻的道理:在固定的总预算下,"分多少步"本身是一个要优化的超参,不是越多越好也不是越少越好。 养成"固定预算、扫这个超参、画出曲线找甜区"的习惯,比记住任何一个具体的推荐值都有用——因为甜区的位置依问题而变(这个绕墙任务是 5,你的问题可能是 3 或 8),但"先升后降、甜区在中间"这个规律是普适的,找它的方法也是普适的。
代价设计:决定行为的,往往不是算法而是代价¶
本章反复说"代价设计是采样式 MPC 工程里最花时间的部分",但一直没正面演示它有多重要。这一小节用同一个退火内核、四种不同的代价写法,让你**亲眼看到代价怎么决定行为**——这是从玩具走向真机时最容易被低估、却最常出问题的环节。
退火 MPPI 的内核是个"忠实的执行者":你写什么代价,它就忠实地去最小化什么。它不会"理解"你的真实意图,只会优化你写下的那个数。所以代价里漏了什么、权重配错了什么,行为就会以你意想不到的方式跑偏。用 §5.5 那个绕墙任务,固定退火内核不变,只换代价:
# 代价A: 只写了"到达目标", 忘了避障
def costA(U):
X = path(U)
return ((X[:,-1,:] - goal)**2).sum(1) * 8.0 # 只有终端项
# 代价B: 终端 + 撞墙硬惩罚(本章标准写法)
def costB(U):
X = path(U); term = ((X[:,-1,:]-goal)**2).sum(1) * 8.0
hit = in_wall(X).sum(1) # 撞墙步数
return term + hit * 60.0 # 重罚
# 代价C: B + 控制能量(抑制剧烈抖动)
def costC(U):
term, hit = ... # 同 B
ctrl = 0.02 * (U.reshape(-1,H,2)**2).sum((1,2)) # 控制能量项
return term + hit*60.0 + ctrl
# 代价D: 有避障项, 但惩罚权重太弱(撞墙只罚 2)
def costD(U):
term, hit = ... # 同 B
return term + hit * 2.0 # 罚太轻
跑 30 个种子,把"到达目标"和"撞墙"分开统计(这比单看"成功率"更能暴露问题):
代价A 只有终端项 : 到达目标 30/30 撞墙 14/30 ← 抄近路直接穿墙!
代价B 终端+硬避障 : 到达目标 30/30 撞墙 0/30 ← 正确
代价C B+控制能量 : 到达目标 30/30 撞墙 0/30 ← 正确, 且动作更平滑
代价D 避障惩罚太弱 : 到达目标 30/30 撞墙 5/30 ← 算账后觉得穿墙划算
(退火内核完全相同, 唯一区别是 cost 怎么写)
四个结果,四个教训,全是真机工程里反复上演的:
代价 A——漏写约束 = 行为缺失。 只写"到达目标",优化器就只优化到达,撞墙 14/30:它发现"直接穿过墙"是到达目标的最短路,而你没说不能穿墙,它就穿了。这是初学者最常踩的坑——你以为"理所当然"的约束,不写进代价它就不存在。优化器没有常识,只有你写下的数。
代价 B——补上约束 = 行为正确。 加一个撞墙的硬惩罚(权重 60),撞墙立刻降到 0/30。这就是本章一直用的标准写法。
代价 C——加软项 = 行为更优雅。 在 B 基础上加控制能量项,撞墙仍是 0,但前面测过它把控制抖动从 20.4 降到 16.9——动作更平滑、更省力。软项不改变"能不能完成任务",但塑造"以多优雅的方式完成"。真机上,这类软项(平滑、省能、远离关节限位)往往是动作能否真正可用的关键。
代价 D——权重配错 = 约束形同虚设。 同样有避障项,但权重只有 2(远小于到达项的收益),于是优化器"算账"后发现:穿墙吃 2 分罚、但能更快到达省下的分更多,划算!于是 5/30 撞墙。这揭示一个反直觉的点——有约束项不等于约束生效,权重必须大到让违反约束"不划算"。硬约束(如安全)的惩罚要远大于其他项,否则优化器会拿它做交易。
本质洞察:这个实验揭示了采样式 MPC(乃至一切优化式控制)一个深刻又危险的特性——算法越强,对代价错误越敏感。一个弱的优化器可能因为找不到最优解,反而"歪打正着"没暴露代价的漏洞;而退火 MPPI 这样强的优化器,会忠实地找到你写下的代价的全局最优——如果那个代价有漏洞(漏约束、配错权重),它会精准地利用漏洞,给你一个"代价最优但行为荒谬"的解(代价 A 的穿墙就是"终端代价最优"的解)。这就是为什么真机工程里,调代价的时间常常远多于调算法。它也给你一个诊断习惯:当行为诡异时,先别怀疑算法,先问"我的代价是不是漏了什么、或哪个权重配错了"——十有八九问题在代价,不在求解器。强优化器是一面照妖镜,把代价里的每个疏忽都放大成可见的荒谬行为。
读到这里你可能会问:那硬约束(绝对不能违反的,如安全边界)就只能靠"调大权重"吗,有没有更可靠的办法? 调大权重是最简单的办法,但它本质上还是"软约束"——理论上总存在一个收益足够大的情形让优化器愿意违反。更可靠的办法有两类:一是**硬性裁剪**,在 rollout 里直接把违反约束的轨迹代价设为极大(或直接判定为无效样本),让它的权重严格为零;二是 §5.4 提到的 约束投影(Diffusion-MPC 用的那种),在每步去噪后把轨迹投影回可行域。对安全攸关的约束,别只靠软惩罚的权重,要用这类更硬的机制——这也是把退火 MPC 用到真机时一个重要的工程考量。
从这六十行到真实控制:还差哪几步¶
§5.5 的 Mini 实现跑的是一个二维绕墙玩具,而 DIAL-MPC 跑的是几十维全阶腿足。中间差的不是"原理"(原理一模一样,都是退火 + MPPI),而是几个工程化的台阶。把这些台阶列清楚,你就知道怎么把手里的玩具代码一步步长成真实控制器——这也帮你把前面所有节的零件串成一条落地路径。
台阶一:把决策对象从"2D 点的速度"换成"机器人的控制"。 玩具里 \(U\) 是 12 步 × 2 维的速度增量;真实里 \(U\) 是规划时域内每步的关节力矩(或样条节点)。cost 里的 np.cumsum 积分要换成**真实动力学 rollout**——给定当前状态和控制序列,用动力学方程(或物理引擎)推出未来状态轨迹。这一步把玩具的"假动力学"换成真模型,是 model-based 的核心。
台阶二:把 cost 换成真实任务代价。 玩具的代价是"到达 + 撞墙惩罚";真实里是"跟踪参考 + 保持平衡 + 关节限位 + 接触约束 + 控制能量"等的组合。代价设计是采样式 MPC 工程里最花时间的部分(第 2、3 章强调过)——退火本身不挑代价(黑箱即可),但代价写得好不好直接决定行为质量。
台阶三:加 warm-start(§5.3)。 玩具每次从 \(U=0\) 冷启动;真实控制是滚动时域的,每个周期应该用上周期的解平移一格作初值。这一步几乎免费,却能大幅减少每周期所需的退火级数(因为初值已经很好),是实时性的关键。玩具代码加 warm-start 很简单——把 U=np.zeros(...) 换成"上次的解平移"。
台阶四:把单次规划变成滚动时域闭环。 玩具跑一次出一条完整轨迹;真实控制要"规划→执行第一步→观测新状态→重新规划"地循环(第 2 章 MPC 的核心)。也就是把 §5.5 的 anneal_mpc 包进一个控制循环里,每周期调一次、只执行 U[0]、然后用新状态再调。
台阶五:并行化与降维(§5.3)。 玩具 K=500 在 CPU 上瞬间跑完;真实全阶高维下 K 要数千、维度几十,必须 GPU 并行 rollout(JAX/PyTorch + 物理引擎),并用控制节点参数化(如 DIAL 的 Hnode=5)降低决策维度。这一步是从"能跑"到"实时能跑"的台阶。
把这五个台阶对照 §5.5 的六十行,你会发现:算法骨架(退火 + 每级 MPPI)一行都不用改,变的全是"接口"——动力学接口、代价接口、状态反馈接口、算力接口。 这正是本章想让你建立的信心:扩散启发的退火采样 MPC,内核就是你已经会、已经能在六十行里写出来的东西;从玩具到真机,是工程接口的逐步替换,不是另起炉灶学一套新算法。
本质洞察:这五个台阶揭示了一个常被初学者忽略的事实——把一个算法从 demo 做到真机,难点几乎从不在算法本身,而在它周围的接口。 退火 MPPI 的核心逻辑六十行就写完了,但真实部署要解决动力学建模、代价设计、状态估计、实时算力一整圈工程问题。这不是这个方法特有的,而是几乎所有控制方法的共性(你在 acados/梯度 MPC 的工程化里也会遇到同样的圈)。认识到"算法是内核、工程是外壳",你就不会在学会算法后误以为"离落地只差一步",也不会被真机部署的复杂度吓到以为"算法很难"——难的是外壳,而外壳是可以一个台阶一个台阶搭的。
读到这里你可能会问:那我学这个玩具 demo 到底有多大意义,既然真机还要做这么多工程? 意义很大——玩具 demo 让你**彻底吃透了内核**。当你亲手把退火的成功率从 23/30 调到 30/30、看懂逐级中间解为什么由粗到精、踩过四种错误写法的坑,你对"退火为什么有效、怎么调才对"的理解,是任何工程接口替换都动摇不了的。
真机部署时,当退火不 work,你能立刻判断是"内核参数没调好"(回到玩具里验证过的直觉)还是"外壳接口有问题"(动力学不准、代价没写好)——这种"分离内核与外壳"的诊断能力,正来自你在玩具上把内核练到了肌肉记忆。先在最简环境里把原理吃透,再逐步加上工程复杂度,是学任何控制方法都最高效的路径。
⚠️ 常见陷阱¶
编程陷阱:退火外循环写对了,但内层 MPPI 的数值细节出错(权重溢出、ESS 塌缩)。
错误做法:内层算权重时直接 w = exp(-J/lam)(不减最小值),或在温度极小的级上不监控 ESS。
现象/后果:撞墙等高代价让 exp(-大数) 下溢成全 0,权重退化或 NaN,那一级更新失效甚至污染后续;温度过小时权重塌到一两个样本,更新被个别噪声样本主导、解突然跳变。
根本原因:退火把温度降到很低时,数值问题比单级 MPPI 更突出——低温本就让权重尖锐,再加上高代价的指数,极易溢出或塌缩。这是"退火让单步更极端"带来的副作用。
正确做法:内层永远用 w = exp(-(J-J.min())/lam) 减最小值防溢出(§5.5 代码就是这么写的);在低温级监控 ESS(第 2 章),过低就让温度下降更平缓或加该级样本数。
自检方法:打印每级的权重和(应为 1、非 NaN)与 ESS;在最低温级单独检查更新是否被极少数样本主导。
思维陷阱:把"代价降下去了"等同于"任务完成对了"。 错误认识:优化器收敛了、代价数值降到很低,就认为行为一定正确。 现象/后果:接受一个"代价最优但行为荒谬"的解(如 §5.5 代价 A 那个穿墙到达、代价低却违反常识的解),在仿真里没发现、上真机才出事。 根本原因:代价是你对"好行为"的**不完整编码**——它只覆盖你写进去的方面,漏掉的约束、配错的权重,优化器都会忠实利用。代价低只意味着"在你写下的标准下最优",不意味着"符合你真实意图"。 正确做法:除了看代价数值,务必**可视化 / 检查实际行为**(轨迹长什么样、有没有违反未显式编码的常识);把代价逐项拆开看每项贡献;用 §5.5 代价设计的四个教训自查(漏约束?权重配错?硬约束当软约束?)。代价是手段,行为正确才是目的。
练习¶
-
(复现 + 调参,⭐⭐) 把本节六十行代码敲一遍跑通,复现退火 30/30 vs 单级 23/30 的对比。然后逐一复现第三步的四种错误写法(方向反、只退火温度、末级方差太大、不减最小值),观察每种如何让退火失效,并和 §5.3 故障排查手册的对应场景印证。
-
(推退火的"够用"边界,⭐⭐⭐) 把退火级数从 5 改成 1(退化单级)、2、3、8,每级更新次数相应调整以保持总预算不变,观察成功率随级数如何变化。找到"成功率饱和"的级数——超过它再加级数是否还有收益?再把任务改简单(去掉墙,纯粹走到目标),验证此时单级就够、退火无增益(呼应"退火不是越多越好")。
-
(接回 score 视角,⭐⭐⭐,思考题) 本节末尾论证了"加权平均那行就是 score 上升"。请据此回答:(a) 如果某一级的温度 \(\lambda\) 取得极小(接近 0),这一步的 score 估计会怎样(提示:权重塌到单个最优样本,第 2 章 ESS)?(b) MBD 说"用模型算 score",本节的"模型"具体是哪部分代码?(c) 如果把
cost里的撞墙惩罚换成一个需要梯度才能算的光滑函数,本节代码要改吗——这说明采样式方法相对梯度式方法的什么优势? -
(设计你自己的退火任务,⭐⭐⭐,开放题) 仿照 §5.5 的绕墙任务,自己设计一个"单级会失败、退火能成功"的二维玩具问题(提示:关键是构造一个"必须先朝远离目标的方向走"的强非凸结构,比如 U 形障碍、双缺口墙、或需要先后退再前进的陷阱)。实现它,验证退火确实优于单级。然后反过来设计一个"退火没有优势"的任务(近凸、单级就够),验证此时退火不带来增益甚至因开销而略差。做完这两个,你就能凭直觉判断"什么样的问题该上退火"——这比任何文字描述都管用。
-
(代价设计实战,⭐⭐⭐,实现+思考) 复现本节"代价设计"实验:在绕墙任务上,用同一个退火内核跑四种代价(只有终端项 / 加硬避障 / 再加控制能量 / 避障惩罚太弱),分别统计到达率和撞墙率,复现"代价 A 穿墙 14/30、代价 B 归零、代价 D 因权重太弱回到 5/30"的现象。然后回答:(a) 把代价 A 的撞墙惩罚权重从 0 逐步加到 60,撞墙率如何随权重变化?找到"刚好不撞墙"的临界权重。(b) 这个临界权重和"到达项的收益量级"是什么关系(提示:惩罚要大到让穿墙"不划算")?(c) 如果这是个安全攸关约束(撞的是人不是墙),你会满足于"调到刚好不撞"的软惩罚权重吗,还是用硬性裁剪 / 约束投影?为什么?
§5.6 把扩散启发方法放回优化器谱系:何时用谁 ⭐⭐¶
学到这里,你的工具箱里已经堆了不少优化器:iLQR/DDP 和梯度 MPC(前置课程)、CEM 和 MPPI 及其变体(第 2–4 章)、PPO/SAC(前置 RL)、现在又加上 MBD/DIAL-MPC 的退火采样(本章)。一个很现实的问题随之而来——面对一个具体任务,我到底该用哪个? 本节把它们放回同一张谱系图里横向对比,给你一套可操作的选型判据。这是工程落地最需要、却最容易在学一堆算法后反而糊涂的地方。
先用一个对比 demo 建立直觉¶
退火相对单级 MPPI 的优势前面演示过了,但你可能会问:逃局部最优的办法不止退火一种——随机重启、换更激进的 CEM 也能逃,凭什么用退火? 用前面那个绕墙任务,把几种方法放在**完全相同的预算**(15 次更新 × K=500)下比一比:
单级 MPPI : 平均代价 14.57 成功(绕墙且到达) 23/30
CEM : 平均代价 4.23 成功 28/30
退火 MPPI(扩散启发) : 平均代价 0.48 成功 30/30
随机重启 MPPI : 平均代价 2.97 成功 29/30
(同一非凸任务,30 个随机种子,预算完全相同)
读这张表能学到三件事。其一,逃局部最优的手段确实不止一种——CEM 的激进精英截断、随机重启的多次尝试,都比单级 MPPI(23/30)强,能部分逃出局部阱。其二,退火是其中最有效的——30/30 全成功、且平均代价 0.48 远低于其他(CEM 4.23、重启 2.97),因为退火不是"碰运气逃"(重启)或"靠激进截断逃"(CEM),而是用"由粗到精的尺度调度"系统地**先看清全局再收敛。其三,**它们不互斥——退火本身可以叠加重启、可以用 CEM 式权重(累积项目里就能配置),不是非此即彼。
退火胜出的关键在"代价"那一列:其他方法即便成功率接近,最终解的质量(代价)也明显更差,因为它们逃出局部后缺乏退火那种"低温级精修"的收尾。这正是 DDPM 反向过程"低噪声级精细去噪"对应的好处。
横向对比表:六个优化器的适用边界¶
把主要优化器按几个关键维度并排,每一行回答"它假设什么、擅长什么、不擅长什么":
| 优化器 | 要梯度? | 要训练/数据? | 处理非凸 | 处理高维 | 处理接触/不可微 | 典型场景 |
|---|---|---|---|---|---|---|
| iLQR/DDP、梯度 MPC | 要 | 否 | 弱(局部) | 强(若可微) | 弱(接触求导难) | 光滑动力学、要精解、有好初值 |
| CEM | 否 | 否 | 中 | 中(高维样本效率差) | 强(只需前向) | 中低维非凸、黑箱 |
| MPPI(单级) | 否 | 否 | 中 | 中 | 强 | 实时控制、黑箱、中维 |
| PPO/SAC(RL) | 否(策略梯度) | 要(大量交互) | 强(全局,靠探索) | 强 | 强 | 要泛化策略、可大量训练、可接受离线成本 |
| MBD(扩散启发) | 否 | 否 | 强(多级退火) | 强 | 强 | 模型已知、无数据、强非凸、可容忍在线优化耗时 |
| DIAL-MPC(扩散启发) | 否 | 否 | 强 | 强(全阶) | 强 | 全阶力矩级实时控制、模型已知、有 GPU |
这张表里,扩散启发的两列(MBD/DIAL)几乎在每个"能力"维度都是"强"——它们继承了采样式方法的"免梯度、处理接触",又用退火补上了采样式方法在"高维非凸"上的短板。代价集中在两个"假设"维度:要模型已知(这是 model-based 的前提),以及**要容忍在线优化耗时**(多级采样比训练好的网络前向推理慢,且 DIAL 全阶 rollout 要 GPU)。
读这张对比表时的一个提醒¶
最后提醒一句关于这张横向对比表的态度,它和本章"诚实对待方法边界"的基调一致。这张表是**一个时间点的快照**,不是永恒的真理。每一格的"强 / 中 / 弱",反映的是这些方法**当前**的典型能力,而这些边界正在被研究不断推动。
举两个例子说明边界在移动。RL 那一行标了"要大量交互数据",但离线 RL、世界模型等方向正在降低这个数据需求;采样式方法标了"高维要 GPU 才实时",而更高效的采样、更好的并行、更聪明的降维(如本章的退火、控制节点参数化)正在不断扩展它能实时处理的维度上限。今天的"弱",明天可能因为一个新技巧变成"中"。
所以正确的用法是:用这张表理解'当前各方法的相对位置和权衡逻辑',而不是把每一格的结论当成不可更改的事实背下来。 真正稳定、值得你内化的,是表头那几个**维度**(要不要梯度、要不要数据、非凸 / 高维 / 接触怎么处理)和"按问题性质匹配方法"的**逻辑**——这套坐标系和逻辑不会过时,而具体某方法落在哪一格会随技术进步移动。当你几个月后读到一个新方法,把它放进这套坐标系、看它在哪个维度上推动了边界,你就能立刻理解它的意义——这种"框架稳定、内容更新"的学习方式,是应对快速演进领域的根本之道。
选型决策:四个判据¶
把上表压缩成一套可操作的判断流程。面对一个任务,依次问:
第一问,动力学可微且光滑吗? 若是(如无接触的机械臂自由空间运动)且要高精度解、有好初值——优先 iLQR/DDP 或梯度 MPC,它们在光滑问题上收敛快、精度高。一旦涉及接触 / 不可微,梯度方法出局,转采样式。
第二问,有数据、且需要可泛化的策略 / 难以写成代价的隐式偏好吗? 若是(如要模仿人类演示的自然风格、要一个能跨场景部署的策略)——考虑 RL(PPO/SAC)或学习类扩散(Diffusion Policy / learned prior,§5.4)。它们用离线训练换来快速推理和泛化。
第三问(到这里说明是黑箱 / 接触 / 无数据的在线优化问题),问题强非凸或高维吗? 若否(中低维、近凸)——单级 MPPI 或 CEM 就够,别上退火(徒增开销,累积项目里 CEM 的例子)。若是——上**退火采样(MBD/DIAL 的思想)**,这是本章的核心增量。
第四问,是全阶、高频实时控制吗(如腿足力矩级)? 若是——DIAL-MPC 路线(退火 + 全阶 rollout + warm-start + GPU 并行);否则 MBD 式的离线 / 准在线轨迹优化即可。
这套判据的精神和第 4 章对 Predictive Sampling 的提醒一脉相承:没有最好的优化器,只有最匹配问题的优化器。 扩散启发的退火很强,但它的强是有前提的(模型已知、能容忍在线计算);把它当成"非凸 / 高维 / 接触问题"的默认选项,而不是"包治百病的银弹"。
本质洞察:这张谱系表最该带走的,不是某一格的具体结论,而是一个看待所有优化器的统一坐标——它们都在"逼近同一个由代价定义的目标分布"(§5.4 的 Gibbs 统一),区别只在四个轴上的取值:要不要梯度、要不要训练、用什么提议分布、单步还是多步复合。iLQR 是"要梯度、单步、局部",MPPI 是"免梯度、单步高斯、采样",PPO 是"免梯度、要训练、学一个泛化策略",DIAL 是"免梯度、免训练、多步退火、全阶"。一旦你用这四个轴去解构任何一个新优化器(包括将来会出现的),选型就不再是"背诵每个算法的优缺点",而是"读出它在四个轴上的坐标、匹配到你问题的坐标"。这种坐标化的理解,是本章和第 4 章统一精神给你的、最可迁移的能力。
一个工程现实:退火采样和你手上的梯度 MPC(acados)怎么共存¶
你在前置课程里用过 acados 这类梯度 MPC 工具,它们在光滑问题上又快又准。学完本章你可能会纠结:是不是该把它们全换成退火采样?答案是**不该全换,而要让两者各管各擅长的**。这一小节给你一个共存的工程视角,它比"非此即彼"的选型更贴近真实项目。
先把两者的工程画像摆清楚。梯度 MPC(acados/iLQR)的画像是:毫秒级求解、依赖光滑可微动力学、给出局部最优精解、对初值敏感。退火采样 MPC 的画像是:几十毫秒到秒级、不要求可微、全局搜索能力强、对初值不敏感、要 GPU 才能高维实时。这两组画像几乎互补——一个快但挑条件,一个稳健但费算力。
于是真实项目里常见的不是"二选一",而是**分层 / 分场景共存**:
- 按子系统分:机器人的某些子任务光滑可微(如机械臂自由空间轨迹),交给 acados 享受它的毫秒级精解;某些子任务接触丰富 / 强非凸(如足地交互、抓取),交给退火采样。同一个机器人,不同模块用不同求解器。
- 按阶段分:用退火采样做**离线 / 慢速的全局规划**(找到一个好的大致轨迹,不怕慢),再用梯度 MPC 做**在线 / 高频的局部跟踪精修**(在全局轨迹附近快速优化)。退火负责"找对全局山谷",梯度法负责"在谷底快速精修"——这正好对应它们各自的强项。
- 按需降级:高算力时用全阶退火采样追求性能,算力紧张或退火超时的时候,降级到梯度 MPC + 简化模型保底实时。
举一个"按阶段分"的具体交接例子,让你看清两个求解器怎么对接:设想机械臂要"先快速移动到物体上方、再精细地接触抓取"。第一阶段(自由空间移动)光滑可微,但若空间里有障碍则强非凸——用退火采样找一条避障的全局路径,输出是一条到达抓取预备位的轨迹;第二阶段(接触抓取)虽然有接触不可微,但如果你愿意用一个接触光滑化模型,也可以用梯度 MPC 在第一阶段终点附近精细优化抓取力。交接点就是第一阶段轨迹的终点状态——它既是退火采样的输出,又是梯度 MPC 的初值。一个求解器的输出状态喂给下一个求解器当起点,这就是"分阶段共存"最常见的对接方式。
什么时候从梯度 MPC**切换**到退火采样?给你三个触发信号:(1) 你的梯度 MPC 在接触切换处频繁求解失败 / 数值不稳——不可微在作祟,该换采样式;(2) 它总收敛到糟糕的局部解、换初值才能好——局部性在作祟,该上退火的全局搜索;(3) 你被迫维护一堆简化模型和预设接触序列、每个新任务都要重做——该考虑 DIAL-MPC 那种"换模型即用"的全阶采样路线,省掉降阶工程。
本质洞察:成熟的控制工程师,工具箱里不是只有一把锤子,而是一组互补的工具,以及"何时用哪把"的判断力。梯度 MPC 和退火采样不是竞争关系而是互补关系——前者是"光滑世界里的快刀",后者是"崎岖世界里的稳手"。本章教你退火采样,不是要你抛弃已有的梯度 MPC,而是给你的工具箱**新增**一件应对"接触 / 非凸 / 高维"的利器,并让你看清它和旧工具的分工边界。真正的能力增长,往往不是"用新的替换旧的",而是"工具箱里多了一件、且知道它和其他件如何配合"。这种"工具组合与切换"的工程判断,是比掌握任何单个算法都更接近实战的素养。
读到这里你可能会问:这张表里梯度方法(iLQR)在"处理高维"上标了"强",可前面又说采样式方法才能上几十维的全阶控制,这不矛盾吗? 不矛盾,区别在"可微"这个前提。iLQR 在**光滑可微**的高维问题上确实强、收敛快(它利用了梯度,信息利用率高);但腿足全阶控制的高维伴随着**接触不可微**,这时 iLQR 的梯度要么不存在要么乱跳,它的"高维能力"用不出来。
所以表里 iLQR 的"高维-强"有个隐含前提"若可微"(我在表里标了)。一旦不可微,梯度方法整体出局,舞台才让给采样式 + 退火。这也说明读这类对比表不能只看单格,要把"假设"那几列一起看——能力是有前提的能力。
读到这里你可能还会问:既然退火采样这么全能,为什么不干脆所有控制问题都用它,省得选来选去? 因为它的"全能"是有代价的——每个控制周期都要在线撒大量样本做多级优化,这比一个训练好的策略网络前向推理慢得多,也比光滑问题上一步到位的 iLQR 牛顿步费。
在一个动力学光滑、用 iLQR 几步就能精确收敛的问题上,硬上退火采样是"杀鸡用牛刀"——又慢又没必要。选型的意义正在于"用匹配问题复杂度的方法":简单光滑问题用梯度法、有数据要泛化用 RL、黑箱非凸高维才用退火采样。把任何一个方法当万能钥匙,都会在它不擅长的场景吃亏——这是本章和第 4 章选型智慧反复强调的。
⚠️ 常见陷阱¶
概念误区:把横向对比表里某一格的"强/弱"当成绝对、永恒的结论。 错误认识:表里写 iLQR"处理非凸-弱"、退火采样"处理高维-强",就当成铁律,不看前提地套用。 现象/后果:在一个其实光滑可微的高维问题上,因为"梯度法处理高维标了强但要可微"这个前提没看清,错误地排除了又快又准的 iLQR;或把"退火处理高维强"当成无条件成立,在极端高维上盲目硬上而撞墙(§5.8 局限三)。 根本原因:对比表的每一格都是**有前提的能力**(iLQR 的"高维-强"前提是可微,退火的"高维-强"前提是预算够、维度在可行范围内),且是**某一时间点的快照**(§5.6 已强调边界在移动,前沿三就把"必须 GPU"推翻了)。脱离前提和时效看单格,必然误判。 正确做法:读对比表时把"假设"那几列和"能力"那几列**一起看**;记住表头那几个稳定的**维度**和"按问题性质匹配"的逻辑,而非背诵每一格的结论;遇到新方法用同一套维度去定位它(§5.7 的还原心法)。
思维陷阱:默认"越新、越复杂、越万能的方法越该用"。 错误认识:退火采样比单级 MPPI 强、learned prior 比纯免训练新,所以应该总用更强更新的那个。 现象/后果:在光滑低维问题上硬上退火采样(杀鸡用牛刀,又慢又没必要);在动力学已知、纯优化就能解的任务上引入 learned prior 和训练(徒增数据依赖与不确定性)。 根本原因:每种方法的"强"都是为解决特定问题付出特定代价换来的——退火的全局搜索能力以"每周期在线多级采样"为代价,learned prior 的隐式偏好能力以"要数据、要训练"为代价。问题没有那个特定难点时,这些代价就是纯粹的浪费(呼应第 4 章"别为复杂而复杂"、§5.4 同款陷阱)。 正确做法:从最简单够用的方法起步(能用 iLQR 就别上采样,能用单级 MPPI 就别退火,能免训练就别引入学习),只在简单方法确实不够、且你能说清"为这个具体难点引入它"时,才升级到更复杂的方法。复杂度要花在刀刃上。
练习¶
-
(复现对比,⭐⭐) 复现本节四方法对比(单级 MPPI / CEM / 退火 / 随机重启),在绕墙任务上验证退火成功率最高、代价最低。然后把"随机重启"和"退火"结合(每次重启内部也做退火),看是否进一步提升——思考:这种结合的收益和额外开销各是什么?
-
(选型实战,⭐⭐⭐,开放题) 用本节的四个判据,为下列任务各选一个优化器并说明理由:(a) 七自由度机械臂在无障碍空间画一个精确圆(动力学光滑);(b) 四足机器人在未知地形上跑步,全阶力矩控制,无数据,有 GPU;(c) 让机械臂学会人类演示里"温柔地"放置易碎品,有大量遥操作数据;(d) 一个中等维度、含接触开关、需要实时但不要求全阶的抓取任务。把你的选择和第 3 问的决策流程对照。
-
(坐标化理解,⭐⭐⭐⭐,思考题) 用本节"本质洞察"里的四个轴(要不要梯度、要不要训练、什么提议分布、单步还是多步),给下列方法各写出它的"坐标":iLQR、CEM、MPPI、iCEM、PPO、Diffusion Policy、MBD、DIAL-MPC。然后回答:(a) 哪两个方法的坐标最接近?它们的实际区别是什么?(b) 如果有人提出一个"要梯度、多步复合、免训练"的新方法,它大概会长什么样、适合什么问题?(提示:这其实指向了把梯度信息也融进多级精炼的方向。)
-
(共存架构设计,⭐⭐⭐,开放题) 基于本节"梯度 MPC 与退火采样共存"的讨论,为一个具体机器人设计一个"分层求解"方案:一台带机械臂的移动机器人,要完成"导航到桌前 → 用机械臂抓取桌上物体"的任务。请说明:(a) 任务的哪些部分适合梯度 MPC、哪些适合退火采样,分别为什么;(b) 你会用"按子系统分""按阶段分"还是"按需降级"中的哪种共存策略,或它们的组合;(c) 两个求解器之间如何交接(一个的输出怎么变成另一个的输入)。这道题没有标准答案,重在用本章和前置课程的知识做出合理的工程权衡。
§5.7 深度答疑:把容易混淆的地方一次讲清 ⭐⭐¶
本章概念密度大,有些问题会在你读完、动手后才冒出来。这一节用问答形式集中回答——这些都是学这个主题的人反复问、且不弄清就会埋下误解的真问题。每个回答都尽量给出"一句话结论 + 为什么"。
问一:扩散模型不是以"生成多样的样本"著称吗?可控制要的是"一个最优解",这不矛盾吗?
不矛盾,但这正是"扩散"和"扩散启发"的分界。生成模型要从分布里采出多样的好样本,所以反向过程每步去噪后会**再注入噪声**保持多样性(§5.1 加深小节讲过)。控制 / 优化要收敛到一个低代价解,所以退火采样 MPC 通常**只保留加权平均这个均值更新**、把"多样性"降级为"下一级重新采样的探索"。
同一个去噪骨架,因为目标从"采样"变成"优化",在"要不要保留注入噪声、要不要收敛到单点"上做了不同裁剪。这就是 MBD/DIAL 自称"扩散启发(inspired)"而非"扩散"的原因——借结构,改目标。
问二:温度 \(\lambda\) 和方差 \(\sigma\) 在退火里都从大到小,它俩是不是一回事、能不能只调一个?
不是一回事,但耦合很紧、通常一起降。\(\sigma\)(采样方差)控制"撒多远"——决定探索的**空间范围**;\(\lambda\)(温度)控制"权重多软"——决定对撒出来的样本**多看重代价差异**。
举个例子能看清区别:\(\sigma\) 大、\(\lambda\) 也大,是"撒得远但几乎等权平均",等于大范围模糊平均;\(\sigma\) 大、\(\lambda\) 小,是"撒得远且只认最优的几个",探索范围大但收敛激进。退火要的是"早期 \(\sigma\) 大 \(\lambda\) 大(大范围温和看全局)→ 晚期 \(\sigma\) 小 \(\lambda\) 小(小范围锐利精修)",所以两者同向降。能不能只调一个?可以,但效果打折——只降 \(\sigma\) 不降 \(\lambda\),后期虽撒得近却权重仍软、收敛不锐;只降 \(\lambda\) 不降 \(\sigma\),后期虽认最优却仍在大范围撒、精度受限(§5.5 错误写法 B、C 演示过)。实践中默认同步降,省心且稳。
问三:MBD 说"用模型算 score",可我看 §5.2 的代码里全是采样和加权,哪一步在"算 score"?
加权平均那一步就是。这是最容易卡住的点,再说一遍因果:score(Tweedie,§5.2 加深)等于"后验均值减当前点",而后验均值由"撒候选、用模型 rollout 算代价、按 \(e^{-J/\lambda}\) 加权平均"估计。
所以你没有显式写 \(\nabla\log p\),但每做一次"撒候选→算代价→加权平均",那个加权重心相对当前点的偏移,就**是**score(乘了步长)。"用模型算 score"里的"模型",指的是 rollout 用到的动力学和代价——它们让你能对每条候选算出 \(J\),从而算出加权重心。对比之下,Diffusion Policy 的 score 是一个**预先训练**的网络输出的,不需要在线撒样本。这就是"算 score"(在线采样估计,免训练)和"学 score"(离线训练网络)的全部区别。
问四:退火采样 MPC 处理高维"靠的是多级聚焦而非堆样本",可每级还是要撒几千样本,总样本量也不小,凭什么说它破了维度灾难?
关键在"指数 vs 线性"。维度灾难的可怕之处是所需样本数随维度**指数**增长——单级 MPPI 要在 \(D\) 维里"一次撒满"到足以发现好区域,样本数像 \(c^D\) 那样爆炸。
退火的做法是把这个"一次撒满"拆成 \(L\) 级,每级只需在"上一级已锁定的较小区域里"撒,所需样本数不再是覆盖整个高维空间、而是覆盖一个逐级缩小的局部,于是总样本量大致是"级数 × 每级样本"这种**线性可控**的量级(DIAL:4 级 × 2048)。不是样本绝对数小,而是它**不随维度指数爆炸**。打个比方:在黑暗的大房子里找东西,单级是"同时照亮整个房子"(要海量光),退火是"先大致定位到某个房间、再照亮那个房间、再照亮房间里的某个角落"(每步只照一小块,总光量随步数线性增长)。
问五:既然 §5.4 说有更新更强的 learned prior 方法(D-MPC、Diffusion-MPC),本章为什么还花大力气讲免训练的 MBD/DIAL?
因为它们解决的是不同前提下的问题,没有谁取代谁。免训练方法(MBD/DIAL)的前提是"模型已知、目标分布写得清楚、没数据",这在机器人里极其常见(新机器人、新负载、新任务往往没有现成数据,但动力学方程写得出来)。
learned prior 方法的前提是"有数据、且要学难以写成代价的隐式偏好或要快推理"。本章主线选免训练,是因为它(a)覆盖一大类现实问题,(b)内核是你已会的 MPPI、学习成本低,(c)不引入数据依赖和训练不稳定性。§5.4 把 learned prior 作为前沿介绍,是让你知道"当免训练的前提不满足时往哪走"。这又回到全章反复的主旨:按问题前提选方法,不被"更新更复杂"牵着走。
问六:本章和我学过的"模拟退火""课程学习"到处都在说"退火 / 由粗到精",它们到底是不是同一个东西?
是同一个**思想**,不是同一个**机制**。"用一个由粗到精 / 由高温到低温的调度让搜索更高效"这个思想,跨越冶金退火、模拟退火、课程学习、扩散去噪、本章的退火采样 MPC——这是个通用智慧(§5.1 和 §5.3 都做过类比并标了边界)。
但机制各不同:模拟退火是单点随机游走 + 按温度概率接受劣解;课程学习是改任务难度的调度、靠离线训练;扩散去噪是批量样本 + 朝 score 走 + 噪声调度;退火采样 MPC 是批量 MPPI 更新 + 温度/方差调度。认出"共同思想"能让你跨领域迁移直觉,但落地时要尊重"机制差异",别把一个领域的具体做法生搬到另一个。这种"看穿共性、尊重差异"的能力,比记住任何单个机制都重要。
问七:退火的"级数"和每级的"更新次数"该怎么分配?给定总预算,是级数多好还是每级多迭代好?
这是实现时最实际的调参问题,没有万能公式,但有清晰的权衡。给定"总更新次数 = 级数 × 每级迭代次数"固定,往两个极端想:
- 级数极多、每级只迭代 1 次:退火调度非常精细(温度 / 方差平滑地一点点降),但每个噪声级上只更新一次,可能还没在该级收敛就换级了——"换挡太勤、每挡没踩实"。
- 级数极少(如 1 级)、每级迭代很多:退化成单级 MPPI 多跑几轮,丢掉了退火的"由粗到精"——回到第 4 章的天花板。
实践中的甜区在中间:级数够多以体现"由粗到精"(典型 4–10 级),每级迭代够多以在该噪声级大致收敛(典型 2–5 次)。一个实用的起点是 §5.5 用的"5 级 × 3 次"或 DIAL-MPC 的"4 级(冷启动 10 级)"。具体最优值依问题而定——非凸越强、维度越高,倾向更多级;代价评估越贵(rollout 慢),倾向更少级以省预算。建议像 §5.5 练习 2 那样,固定总预算、扫不同级数,亲手找到你这个问题的甜区。
问八:我能不能在退火过程中途改变样本数,比如高温级少采样、低温级多采样?
可以,而且常常是个好主意。高温级的目标是"大致看清全局方向",对精度要求不高,用较少样本即可;低温级要"精细收敛到全局谷底",值得多花样本提高精度。这种"样本数随级数变化"的策略,和 §5.3 bi-level 退火"按信息价值分配预算"是同一个精神——把计算花在最该花的地方。
不过要注意一个反向的考量:高温级方差大、采样空间大,太少样本可能连全局方向都没采准(§5.3 故障排查场景六)。所以不是无脑"高温少采、低温多采",而是要保证**每一级的样本数都足以完成该级的任务**(高温级够采清全局大势、低温级够精修)。实践中很多实现为了简单就每级等样本数(如 DIAL 的 Nsample=2048 全程不变),这也完全可行——先用等样本跑通,再按需做"按级分配"的优化。
问九:退火采样 MPC 和我做过的"模拟退火 + 随机搜索"到底能不能混用,比如在某一级里用模拟退火?
原理上可以混,但要想清楚为什么混、混了图什么。退火采样 MPC 的每一级内核是"批量采样 + 代价加权平均(MPPI)",这是个**并行、利用了全部样本信息**的更新;而模拟退火是**单点、串行**的随机游走 + 概率接受。两者在"如何利用样本"上哲学不同——MPPI 用所有样本算一个加权重心(信息利用率高、适合并行 / GPU),模拟退火一次只看一个点(信息利用率低,但实现极简、内存极省)。
把模拟退火塞进某一级,通常是用并行性 / 信息利用率换实现简单或内存——在 GPU 并行充裕的机器人场景,这个交换一般不划算(你放弃了 MPPI 最大的优势)。所以实践中很少这么混。真要混合不同机制,更常见的是"退火 + 随机重启"(§5.6 对比过)或"退火 + learned prior"(§5.4),这些混合各取所长、目标明确。一个一般原则:混合多个方法前,先问清楚"每个被混进来的部分,补的是当前方法的哪个具体短板"——为混而混往往只增加复杂度。
问十:本章一直在二维玩具和腿足 / 灵巧手例子里讲,那对我做的'普通'机器人(比如一台工业机械臂、一辆移动小车)有用吗,还是说这是只属于前沿炫技的东西?
非常有用,而且这正是本章希望纠正的一个误解——退火采样 MPC 不是只为腿足 / 灵巧手这类"炫酷"系统准备的,它的适用边界由**问题的性质**(非凸、接触、不可微、高维)决定,而非机器人的"档次"。
举几个"普通"场景:工业机械臂在杂乱料箱里抓取(bin-picking),涉及与堆叠物体的接触、路径强非凸——退火采样比梯度法更稳健;移动小车在拥挤动态环境里导航,避障代价非凸、可能多峰(左绕 / 右绕)——退火能避免卡在"直冲障碍"的谷底(正是 §5.1 那个双峰例子);任何"代价函数写得出、但不可微或强非凸、且没有训练数据"的控制问题,都是它的用武之地。
反过来,如果你的机械臂只是在无障碍空间走光滑轨迹,那确实用不上退火采样——一个梯度 MPC(acados)又快又好(§5.6 讲过)。所以判断"用不用得上"的正确问法不是"我的机器人够不够高级",而是"我的问题有没有非凸 / 接触 / 不可微、有没有数据"——这才是本章选型逻辑的核心。把方法和问题性质对应起来,而不是和机器人类型对应起来,你就能在自己的"普通"项目里准确地判断它该不该出场。
问十一:§5.6 说退火和梯度 MPC(acados)共存,那能不能更紧地把它们"焊"在一起——比如用退火找全局、紧接着用梯度法在局部精修同一条轨迹?
能,而且这是个很有前景的方向,但要满足一个前提:精修阶段的局部地形必须是可微光滑的。思路是分两段:先用退火在非凸地形上找到全局最优所在的"那个谷"(退火擅长的全局搜索),再把退火给出的解当作梯度法的初值、在那个谷内部用 iLQR/梯度 MPC 快速精修到高精度(梯度法擅长的局部收敛)。这正好让两者各扬其长——退火补梯度法"易陷局部、对初值敏感"的短板,梯度法补退火"局部精度有限、收敛慢"的短板。
但前提很关键,它决定了这个组合能不能用。退火能处理接触等不可微地形,可一旦切到梯度精修阶段,就要求那一段局部是可微的。如果你的问题**全程**都有接触不可微(如腿足始终在触地),那"局部光滑"的前提不成立,梯度精修这一段就用不上,只能纯退火(这也是 DIAL-MPC 选择纯采样、不接梯度精修的原因——全阶腿足全程接触)。反过来,如果接触只在某些阶段、其余阶段光滑(如机械臂先自由空间运动、最后才接触物体),那"退火找全局 + 梯度精修光滑段"就很合算。
所以这个"焊接"是否值得,回到 §5.6 的判据:看你的问题**有没有一个可微光滑的局部精修阶段**。有,就用混合(退火兜底全局、梯度冲刺精度);全程不可微,就纯退火。这也再次印证本章反复的主旨——方法的组合不是越复杂越好,而是看问题结构允许你用上谁的长处。一个一般的设计原则:让每种方法只在它擅长的地形上工作,用一种方法的输出喂给下一种方法的输入。
本质洞察:这些问题表面分散,背后其实是同一件事在反复确认——扩散启发的采样 MPC,每一个"新"概念都能还原成你已经会的东西:生成 vs 优化的裁剪(问一)、温度与方差的分工(问二)、加权平均即 score(问三)、多级聚焦的线性代价(问四)、按前提选方法(问五)、共同思想与具体机制之别(问六)。如果说本章有一个统一的学习心法,那就是:遇到任何让你觉得"高深"的扩散控制新名词,别急着把它当新知识囤积,先问"它在我已有的 MPPI / 目标分布 / 退火框架里对应什么"——十有八九,你会发现它只是老朋友换了件衣服。这种"还原到已知"的习惯,会让你在这个飞速演进的方向里始终站得稳。
§5.8 退火不是万能的:它的理论局限与失败模式 ⭐⭐⭐¶
前面七节几乎都在讲退火(多步复合)为什么强、强在哪。但一份诚实的教学,必须同样讲清它**不保证什么、什么时候会失败**——否则你会带着"退火是银弹"的错觉上手,在它失灵时一头雾水。这一节集中讲退火的边界,它和本章一贯的诚实态度一致,也是你真正掌握一个方法(而非迷信它)的标志。
读到这里你可能会问:退火既然能"由粗到精"地逃局部最优,那它是不是总能找到全局最优? 不是。这是关于退火最重要、也最容易被误解的一点,必须讲透。
在展开三个局限之前,先说清楚讲它们的用意——不是要否定退火(前七节已充分说明它有多强),而是要让你建立一个**准确的能力边界模型**。一个工具,你既要知道它能做什么,也要知道它不能做什么;只知前者会盲目滥用、在它失灵时归因错误,只知后者会因噎废食、该用时不敢用。下面三个局限,每一个都对应一类你迟早会遇到的"退火没达到预期"的真实情形——提前知道它们,你就能在遇到时准确判断"这是退火的固有局限(该换思路)还是我用错了(该调参数)",而不是对着结果一头雾水。
局限一:退火不保证全局最优——它只是大幅提高了找到全局最优的概率¶
退火的"高噪声级看全局"是个**概率性**的优势,不是**确定性**的保证。回忆 §5.2 的几何图景:高噪声级把代价地形用大高斯核模糊,抹平小山脊、露出全局结构。但这里有两个"如果":
如果模糊后的地形仍是多峰的呢? 高斯核只能抹平"比核尺度小"的局部极小。如果两个深谷之间隔着一道**又宽又高**的山脊(尺度大于你的最大噪声级),那么再大的退火起始方差也模糊不掉它——高噪声级看到的仍是多峰,退火可能收敛到错误的那个峰。换句话说,退火能逃出的是"相对于噪声尺度而言的小局部极小",逃不出"尺度超过噪声调度范围的大沟壑"。
举个具体的画面帮你建立直觉:设想代价地形上有两个深谷,全局最优那个在 \(x=10\),次优那个在 \(x=0\),你的初值在 \(x=0\) 附近,两谷之间隔着一道从 \(x=2\) 到 \(x=8\)、足足六个单位宽的高山脊。如果你的退火起始方差 \(\sigma_0\) 只有 1(一个标准差只能撒到约 \(x=1\)),那么即便在最高噪声级,采样也几乎触不到山脊另一侧的 \(x=10\)——高斯核的"模糊半径"远小于山脊宽度,模糊之后 \(x=0\) 附近仍是个独立的谷,退火会安心收敛到这个次优谷,对 \(x=10\) 的全局最优一无所知。要逃出去,你的 \(\sigma_0\) 必须大到能让样本以可观概率越过六个单位宽的山脊(比如 \(\sigma_0\gtrsim 5\))。这就是"退火能逃的局部极小尺度受限于噪声调度范围"的字面含义——也是 §5.8 练习 1 让你亲手构造并验证的现象。
如果随机采样在高噪声级恰好偏向了错误的一侧呢? 即便地形被模糊成了利于全局的形状,每一级的更新仍是有限样本的蒙特卡洛估计,带随机性。某个不走运的种子可能在关键的高温级把均值推向了错误方向,后续低温级又锁死在那里。这正是 §5.5 那个绕墙 demo 里"退火 30/30 但不是 50/50 全中"的原因——49/50、30/30 已经很高,但**几乎从不是 100%**,剩下那一两个失败种子就是这种随机性的体现。
所以正确的心智模型是:退火把"单级几乎必陷局部"(§5.1 的 2/30)改善成"大概率找到全局"(26/30、30/30),但不是"保证全局"。 它是个极其有效的启发式,不是全局优化的数学保证。任何宣称"退火 = 全局最优"的说法都是错的。
本质洞察:退火和模拟退火共享一个深刻而微妙的性质——理论上的全局收敛保证,和工程上的实际表现,是两回事。模拟退火有一个著名的理论结果:只要温度下降得足够慢(满足某个对数级慢的调度),它以概率 1 收敛到全局最优。但这个"足够慢"在实践中慢到没法用(要无穷多步)。所以工程上用的退火(包括本章的扩散退火),都用快得多的、没有全局保证的调度——用"理论保证"换"实际可用的速度"。这是优化领域一个普遍的张力:有保证的算法往往慢到不实用,实用的算法往往没有保证。 理解这一点能让你既不迷信退火(它没有保证),也不苛求它(要保证就得慢到不可用)——它是一个"用一点最优性的确定性,换巨大的实用速度"的务实选择。这种"保证 vs 实用"的权衡意识,比记住退火本身更重要。
局限二:退火帮不了"代价本身就错"的问题¶
这一点呼应 §5.5 的代价设计——退火再强,也只是更高效地最小化你写下的代价。如果代价写错了(漏约束、配错权重),退火只会更快、更精准地收敛到那个错误代价的最优解。 §5.5 代价 A"只写到达项"的例子里,退火让 30/30 都到达了目标——但其中 14/30 是穿墙到达的,因为退火忠实地优化了"到达"这个被写错的目标。退火解决的是"怎么更好地优化给定代价",解决不了"代价该怎么写"。
事实上,退火让优化器变强,反而对代价的严谨性提出了**更高**要求(§5.5 本质洞察讲过)——弱优化器找不到代价漏洞处的"荒谬最优解",强优化器却能精准找到。所以退火不是减轻了代价设计的负担,而是加重了。
读到这里你可能会问:那这是不是说,越强的优化方法越"危险"、不如用弱一点的更安全? 不是——这是个常见的误读,要纠正。强优化器把代价的漏洞暴露出来,恰恰是好事:它让你**尽早、在仿真里**看到"代价写错会导致什么荒谬行为",从而去修代价;而弱优化器只是"碰巧"没触发漏洞,那个漏洞依然在,换个初值、换个场景就可能爆发,反而更危险(你以为没问题,其实只是没被触发)。正确的结论不是"用弱优化器躲开问题",而是"用强优化器 + 严谨的代价设计 + 充分的测试"——让强优化器帮你把代价里的每个疏忽都提前照出来,然后逐一修好。把暴露问题当成强优化器的优点而非缺点,你才会用对它。
局限三:高维 + 强非凸的极端情形,退火也会力不从心¶
§5.3 说退火让采样式 MPC 爬上了几十维全阶控制。但这不意味着维度可以无限高、非凸可以无限强。当问题同时满足"维度极高 + 极度非凸 + 实时预算紧"时,退火所需的级数和每级样本数会增长到实时跑不动;或者在固定预算下,退火也无法充分覆盖如此巨大的搜索空间。
读到这里你可能想要个具体的量级感:退火大概到什么维度开始吃力?这没有一刀切的答案(强烈依赖非凸程度和实时预算),但可以给个参照——DIAL-MPC 直接在全阶力矩空间(四足约几十维)工作时,已经要靠 GPU 并行数千样本才实时;如果维度再上一个量级(如高自由度人形的全身力矩、或很长的规划时域把决策维度乘起来),同样的"直接在原始决策空间退火"就会力不从心。这也正是为什么 §5.4 前沿三的样条参数化如此关键——它不是让退火变强了,而是把"原始几十维"压成了"样条几个节点的个位数维",让退火在一个小得多的空间里工作。所以"退火扛不住的维度"不是一个固定数字,而是"在你能负担的样本预算下、退火能否充分覆盖的决策空间大小"——降维能直接改变这个边界。
这也是为什么 §5.4 的前沿工作要引入**降维**(样条参数化把决策维度从几十压到个位数)和 learned prior(用数据先验缩小搜索范围)——它们正是在"退火也扛不住的极端高维/非凸"处,给退火"减负"。退火是把高维问题变可行的强力工具,但它有自己的天花板,越过那个天花板就需要别的手段配合。
读到这里你可能会问:既然退火有这么多局限,那它和单级 MPPI 比,优势到底有多可靠? 优势非常可靠,但要正确理解"可靠"的含义。退火相对单级的优势,是**统计意义上稳定的**——在非凸/高维任务上,跨大量种子,退火的平均表现和成功率系统性地高于单级(本章所有 demo 都是 30–50 种子的统计佐证)。它不可靠的是**单次的确定性**(某一次跑可能失败)和**全局最优的保证**(从来没有)。
所以使用退火的正确姿势是:把它当成"大幅提高成功概率的强力升级",用多种子统计来评估它(而非看单次),并清醒地知道它不保证全局最优、扛不住极端高维、救不了错误代价。带着这份清醒去用,你既能享受它的强大,又不会在它失灵时手足无措。
最后把这一节扣回全章主线:本章前七节讲"多步复合如何突破单步高斯的天花板",这一节则诚实地说明"多步复合也有自己的天花板"。两者并不矛盾——退火把采样式控制的能力边界**大幅外推**了(从"几乎做不了非凸/高维"推到"大概率能解非凸、能上几十维"),但边界外推不等于边界消失。认识到这一点,你对退火的理解才算完整:它是一次实实在在的能力跃升,不是终点;它的局限,又恰好指向了 §5.4 那些前沿工作(降维、learned prior、约束投影)正在努力的方向。一个方法的边界,往往就是下一批工作的起点——这也是你将来做研究时寻找题目的一个可靠思路。
⚠️ 常见陷阱¶
思维陷阱:把退火的"概率性优势"误当成"确定性保证"。 错误认识:退火能逃局部最优,所以它总能找到全局最优、每次都成功。 现象/后果:用单次运行结果下结论("这次退火失败了,所以退火不行"或"这次成功了,所以退火保证成功");在需要最优性保证的场合误用退火。 根本原因:退火是启发式,它把"找到全局最优的概率"从很低提到很高,但不是 1;高噪声级模糊不掉超过噪声尺度的大沟壑,蒙特卡洛采样也带随机性。 正确做法:用多种子统计(成功率、均值±标准差)评估退火,而非单次;需要全局最优保证时,退火不是合适工具(那需要分支定界等有保证但慢的方法);接受"大概率好"而非"保证最优"这个定位。
概念误区:以为提高退火级数/样本数总能把任何问题解到全局最优。 错误认识:退火失败了?加级数、加样本就能解决,加到足够多总能找到全局最优。 现象/后果:在"大沟壑"型地形或极端高维问题上无限堆级数和样本,实时性崩溃,却仍找不到全局最优。 根本原因:退火逃不出"尺度超过最大噪声级的大沟壑",这是机制决定的,不是预算决定的;极端高维下搜索空间的增长也可能超过任何可行预算。加预算能改善概率,但改变不了机制性的局限。 正确做法:先判断问题是否在退火的能力范围内(局部极小的尺度是否小于可用噪声级、维度是否在可行预算内);超出范围时,配合降维、learned prior、或换有保证的方法,而非盲目堆退火预算。
练习¶
-
(构造退火失败的例子,⭐⭐⭐) 仿照 §5.1 的非凸 demo,刻意构造一个"退火也会大概率失败"的一维或二维代价:让两个深谷之间隔一道**宽度大于你最大退火方差**的高山脊。跑退火,统计成功率,验证它显著低于 §5.1 那个"山脊较窄"的例子。然后把退火的起始方差
sig0加大到超过山脊宽度,看成功率是否回升——这让你亲手感受"退火能逃的局部极小,尺度受限于噪声调度范围"。 -
(保证 vs 实用的权衡,⭐⭐⭐,思考题) 模拟退火有"温度足够慢则概率 1 收敛全局最优"的理论结果,但实践中用快得多、无保证的调度。请论证:(a) 为什么"有理论保证的慢调度"在实时控制里不可用?(b) 本章的扩散退火(4–10 级的快速调度)放弃了什么、换来了什么?(c) 在什么样的应用场景下,你宁可要"慢但有保证",什么场景下要"快但无保证"?举例说明。
-
(退火的能力边界,⭐⭐⭐⭐,综合题) 综合本节三个局限和 §5.4 的前沿,论证:当一个问题"高维 + 强非凸 + 实时预算紧"同时成立、退火单独扛不住时,§5.4 提到的两类手段(降维、learned prior)分别如何给退火"减负"?它们各自缩小的是搜索空间的哪个方面(维度?范围?)?这道题让你把"退火的局限"和"前沿如何补救"连成一个完整的认知。
常见误解汇总¶
把本章各节的概念误区集中起来,方便你回头自查。每条都是初学者真实会踩的坑:
误解一:"扩散启发的采样 MPC 需要训练一个扩散网络。" 不需要。本章主线的 MBD/DIAL-MPC 是 diffusion-inspired——借扩散"多步去噪/退火"的结构和"score 引导"的思想,而 score 由已知模型直接算,全程免训练、免数据。需要训练网络的是另一条前沿支线(learned prior,§5.4),不是本章主线。
误解二:"MPPI = 单步去噪,所以扩散没给采样 MPC 带来任何新东西。" 单步确实是旧的(就是 MPPI),但有两个真增量:多步复合(把单步沿退火调度堆起来,突破单步高斯的表达天花板、爬上高维)和 model-based score(用模型算 score,打开免训练扩散优化)。
误解三:"扩散的表达力来自每步用了更花哨的分布。" 恰恰相反——扩散每一步仍是高斯。表达力**全部来自多步去噪的复合**。这是全章最关键的观念,也是它突破第 4 章高斯天花板的真正方式:不换单步分布,靠多步组合。
误解四:"MBD 需要可微的动力学/代价。" 不需要。MBD 的 score 是用"采样 + 代价加权"**估计**的(只需前向 rollout),不是解析求导——这正是它和 MPPI 一样能处理黑箱、不可微、接触丰富问题的根源。
误解五:"免训练(MBD/DIAL)全面优于需要训练的方法。" 不是。免训练是用"在线计算"和"已知模型"换来的,要求动力学已知、目标分布写得清楚、能容忍在线优化耗时。要快速推理或学习难以言说的隐式风格、且有数据时,训练类方法(Diffusion Policy / learned prior)更合适。这是取舍,不是优劣。
误解六:"退火级数越多越好,处处该用退火。" 退火的收益来自非凸/高维下的分阶段搜索;问题简单(近凸、低维)时单级就够,多级只是浪费,且级数有边际递减。本章累积项目里 CEM 在温和地形上单级已满分、退火无额外增益,就是个现成的反例。
误解七:"统一视角(MPPI/RL/扩散同构)意味着它们可以随便互换。" 统一的是"目标分布和更新内核",不是"工程权衡"。同一个目标分布,可以离线学泛化策略(RL)、在线每周期优化(MPC)、多步去噪生成(扩散),它们在数据需求、实时性、泛化性、迁移性上截然不同。统一是理解的工具,不是选型的借口。
误解八:论文里的性能数字(如 13.4×、+50%、+59%)是我能直接照搬期待的指标。 不是。这些数字是特定任务、机器人、对比设置下测出的,证明的是"这条路走得通、优势可观"这一**质的结论**,而非可移植的**量的承诺**。换任务、换代价、换基线,数字都会变。读方法论文,关注它证明了什么突破、用了什么机制,而非记住某个倍数——要知道在你的问题上效果如何,唯一可靠的办法是自己用多种子跑出来。
误解九:"算法选对了、调好了,行为就该对了。" 不一定。采样式 MPC 的行为由**算法和代价共同决定**,而代价的影响常常更大。一个调得很好的退火 MPPI,配一个漏了约束或权重配错的代价,照样会给出荒谬的行为(如 §5.5 代价设计实验里"只写到达项就穿墙")。强优化器会忠实地利用代价里的每个漏洞。所以行为诡异时,先查代价、再查算法——十有八九问题在代价。
本章小结¶
术语速查表¶
| 术语 | 含义 | 首次出现 |
|---|---|---|
| DDPM | 去噪扩散概率模型;前向加噪 + 反向去噪生成,反向网络是生成本事所在 | §5.1 |
| score | 对数概率密度的梯度 \(\nabla\log p\),指向"数据更可能出现"的方向;去噪即朝 score 挪 | §5.1 |
| 单步去噪 = MPPI 一步 | MPPI 的加权更新在数学上等价于扩散的一步去噪 / 一步 score 上升 | §5.1 |
| 多步复合 | 扩散表达力的真正来源——每步仍是高斯,但多步去噪首尾相接雕出复杂分布 | §5.1 |
| MBD(Model-Based Diffusion) | 用已知模型算 score 的免训练扩散式轨迹优化(NeurIPS 2024) | §5.2 |
| 后验均值 \(\hat\tau_0\) | \(\mathbb{E}[\tau_0\mid\tau_k]=\sum_i w_i\tau_0^i/\sum_i w_i\),\(w_i\propto e^{-J/\lambda}\)——即 MPPI 加权平均 | §5.2 |
| Monte Carlo score ascent | MBD 对反向去噪过程的称呼:每级用采样估计 score 并上升一步 | §5.2 |
| 平滑目标分布 | 高噪声级下被大高斯核平滑过的目标分布,局部极小被抹平,便于看清全局 | §5.2 |
| DIAL-MPC | 扩散式退火 + 全阶力矩级采样 MPC(ICRA 2025 最佳论文入围) | §5.3 |
| warm-start | 用上一控制周期的解平移一格作为本周期初值,利用时间连续性 | §5.3 |
| bi-level 退火 | 轨迹级(跨迭代不同方差)+ 动作级(沿时域不同处理)两层退火 | §5.3 |
| 全阶力矩级控制 | 直接在完整刚体动力学(几十维)上优化、直接输出关节力矩,不依赖降阶模型/底层跟踪 | §5.3 |
| Gibbs 测度统一 | MPPI/RL/扩散统一为对 \(q\propto\exp(\hat E/\tau)\) 的采样,差别只在能量 \(\hat E\) | §5.4 |
| learned prior | 用学习的扩散模型提供动作提议/近似动力学,再用采样 MPC 在线精炼(D-MPC 等) | §5.4 |
| Tweedie 公式 | 带噪点的 score 正比于「后验均值减当前点」,把「朝 score 上升」与「朝后验均值挪」统一 | §5.1/§5.2 |
| 噪声调度 \(\bar\alpha_k\) | DDPM 里每级保留多少原信号;对应退火里采样方差 \(\sigma_k\) 的由大到小调度 | §5.1 |
| 扩散启发 vs 扩散 | 借去噪/退火骨架但按优化目标裁剪(只保留均值更新、收敛到单点),故称 inspired | §5.1/§5.7 |
知识点总表¶
| 知识点 | 核心结论 | 对应节 |
|---|---|---|
| MPPI ↔ 单步去噪同构 | MPPI 一步加权更新 = 一步 score 上升 = 扩散一步去噪(demo 余弦 0.9985 验证) | §5.1 |
| 表达力来源 | 不来自单步分布(每步仍高斯),来自多步去噪的复合 | §5.1 |
| 退火 vs 单级 | 同预算下,多步退火在非凸地形上远胜单级(命中全局 26/30 vs 2/30) | §5.1 |
| MBD 核心 | 目标分布由代价/动力学完全确定 → score 可由模型算出 → 免训练免数据 | §5.2 |
| MBD 逃局部最优 | 高噪声级平滑地形看清全局、低噪声级精细收敛(由粗到精) | §5.2 |
| MBD 免梯度 | score 用采样估计、只需前向 rollout,可处理黑箱/不可微代价(demo 验证) | §5.2 |
| MBD vs Diffusion Policy | 算 score(免训练,要模型)vs 学 score(要数据训练,绑动力学)——互补 | §5.2 |
| DIAL-MPC = 多级退火 MPPI | warm-start + bi-level 退火,每级一次标准 MPPI 更新 | §5.3 |
| 退火破维度灾难 | 把"一次撒满几十维"拆成"多级聚焦",几千样本×几级即可(非天文数字) | §5.3 |
| DIAL-MPC 真机成绩 | 比 MPPI 跟踪误差低 13.4×、爬越比 RL 高 ~50%、接触奖励 +107.7%、真机带载跳跃、50Hz | §5.3 |
| 三方统一 | MPPI/RL/扩散都是逼近 \(\exp(\text{能量}/\text{温度})\) 形式的目标分布 | §5.4 |
| 选型原则 | 模型已知无数据→纯 model-based;要隐式风格/快推理且有数据→learned prior | §5.4 |
| 退火 = MPPI + 调度 | Mini 实现:内核是标准 MPPI,外面包一层 (λ,σ) 从高到低的调度(§5.5 demo 23/30→30/30) | §5.5 |
| 退火 vs 其他逃局部手段 | 退火比随机重启、CEM 更有效——系统地由粗到精,且低温级精修使最终代价更低 | §5.6 |
| 优化器坐标化选型 | 用四轴(要不要梯度/训练、什么提议分布、单步还是多步)解构任一优化器并匹配问题 | §5.6 |
| 还原到已知的心法 | 任何扩散控制新名词,先问它在 MPPI/目标分布/退火框架里对应什么 | §5.7 |
| 退火的三个局限 | 不保证全局最优(只提高概率)、救不了错代价、扛不住极端高维 | §5.8 |
| 保证 vs 实用的权衡 | 有全局保证的调度慢到不可用,实用的快调度无保证——务实选择 | §5.8 |
承上启下¶
承上:本章是第 4 章的直接续篇。第 4 章把经典采样式 MPC 统一进"权重/噪声/协方差"三维框架,并点出它们共同的高斯天花板。本章在第四个、更根本的维度——提议分布如何跨多步组织——上做突破:把"单步高斯"升级为"多步去噪复合 + 退火调度"。第 1 章的目标分布 \(\mathbb{P}^\star\)、第 2 章的 MPPI 加权更新、第 4 章的 REINFORCE 同构,在本章被缝合成"同一个目标分布的多步采样"这一统一图景。
启下:本章的扩散启发方法假设动力学和代价**已知且确定**。但真实世界充满**不确定性**——动力学有误差、环境有噪声、他人行为不可预测。当目标分布本身因不确定性而模糊时,"逼近一个确定的 \(\mathbb{P}^\star\)"这个前提就需要重新审视。后续章节将转向**不确定性下的规划与控制**(鲁棒/随机 MPC、风险敏感、博弈与多智能体交互),那里 score 不再能简单地由一个确定模型算出,需要新的工具。本章打下的"采样逼近目标分布"的统一视角,仍是理解那些方法的基础。
全章一句话速记¶
如果只能带走八句话,就是下面这八句——每节一句,串起来就是本章的完整骨架:
| 节 | 一句话 |
|---|---|
| §5.1 | MPPI 的一步加权更新,就是扩散的一步去噪 / 一步 score 上升;采样方差既是探索范围、又是平滑尺度。 |
| §5.2 | 目标分布由代价和动力学完全确定,所以 score 能用模型算、不必从数据学——这就是免训练的 MBD。 |
| §5.3 | 把单步 MPPI 沿温度/方差调度堆成多级退火,就让采样式 MPC 第一次爬上了全阶力矩控制。 |
| §5.4 | MPPI、RL、扩散都是逼近同一个 \(\exp(\text{能量}/\text{温度})\) 目标分布;区别只在 score 从哪来、单步还是多步。 |
| §5.5 | 退火采样 MPC 的内核就是六十行 MPPI 外面包一层调度;而决定行为的往往不是算法,是代价。 |
| §5.6 | 没有最好的优化器,只有最匹配问题的——用"要不要梯度/训练、什么提议分布、单步还是多步"四轴选型。 |
| §5.7 | 任何扩散控制新名词,先问"它在我已有的 MPPI/目标分布/退火框架里对应什么"——还原到已知。 |
| §5.8 | 退火不保证全局最优(只大幅提高概率)、救不了错代价、扛不住极端高维——清醒地用它。 |
学完自检:你真的掌握了吗¶
读完本章,用下面几个问题自查。如果某一条答不上来,回到对应节再过一遍——这些是本章的"必须掌握"清单:
- 你能不写代码、只用一句话说清"为什么 MPPI 的一步等于扩散的一步去噪"吗?(不能 → §5.1)
- 有人问"扩散 MPC 是不是要训练一个大网络",你能立刻说清 MBD/DIAL 为什么免训练吗?(不能 → §5.2 + 误解一)
- 你能解释"退火为什么能逃局部最优,而单级 MPPI 不能"吗?关键词是"高噪声级把地形模糊"。(不能 → §5.2 几何图景 + §5.1 平滑尺度)
- 给你一个新的"扩散 + 控制"论文标题,你能用"目标分布是什么形式、score 从哪来、单步还是多步"三问给它定位吗?(不能 → §5.4 + §5.7)
- 你的退火 MPPI 行为诡异,你的第一反应是查算法还是查代价?(答"查算法" → §5.5 代价设计)
- 有人说"退火保证找到全局最优",你能指出这话哪里错吗?(不能 → §5.8)
- 面对一个光滑、低维、有好初值的控制问题,你会用退火采样还是梯度 MPC?(答"退火" → §5.6 选型)
能顺畅答完这七问,你就真正掌握了本章——不是记住了几个算法名字,而是抓住了"单步去噪 + 多步复合 + 按问题选型 + 清醒认识边界"这条完整的认知链。
累积项目:本章新增模块¶
前几章的累积项目逐步搭起了一个"可切换变体的统一采样优化器":第 3 章交付了同一主循环 + 几个钩子的"可切换 MPPI",第 4 章把它扩成"换算法 = 换配置"——unified_optimizer(weight=, noise=, cov=, ...),三个维度(权重函数、噪声、协方差)自由组合。
本章给这个优化器加上**第四个维度:schedule(采样调度)。它正是本章主线的代码化身——schedule='single' 是第 4 章的"单步高斯"(单一 \((\lambda,\sigma)\) 撒到底),schedule='anneal' 则把同一次更新沿温度/方差调度跑多级,等价于一个反向扩散过程(DIAL-MPC/MBD 的去噪复合)。关键是:**新维度不改任何单步逻辑,只在外面包了一层"多级调度"——这恰好对应"突破不在单步、在多步组织"的全章主线。
def unified_optimizer(weight='mppi', schedule='single', ...):
rng = np.random.default_rng(seed); mu = np.zeros(dim)
if schedule == 'single': # 第4章行为: 单一 (λ, σ) 撒到底
for _ in range(iters):
mu = _update(mu, K, sigma, lam, weight, r, elite_frac, rng)
else: # 第5章新增: 多级退火 = 反向扩散去噪
lams = np.geomspace(lam0, lamT, anneal_levels) # 温度由高到低
sigs = np.geomspace(sig0, sigT, anneal_levels) # 方差由大到小
for lv in range(anneal_levels):
for _ in range(iters_per):
mu = _update(mu, K, sigs[lv], lams[lv], weight, r, elite_frac, rng)
return mu
# _update 就是第4章的单步: 采扰动 → cost → 按 weight 算权重 → 加权平均
# 注意: schedule 这一层完全复用 _update, 不改任何单步逻辑——突破在"多步组织"
在第 4 章那个"宽浅局部阱 + 深全局阱"的非凸地形上,用**完全相同的总更新次数(16 次 × K=200)**对比单级与退火:
weight=mppi | single: 代价 -1.517 命中 2/30 | anneal: 代价 -3.505 命中 26/30
weight=cem | single: 代价 -3.839 命中 30/30 | anneal: 代价 -3.841 命中 30/30
(30 个随机种子;总更新次数相同,退火仅改变"尺度调度",不增样本)
这组结果有两层教学价值。其一,对 MPPI 权重,退火带来质变——命中全局阱从 2/30 跃升到 26/30,平均代价从 \(-1.5\) 改善到 \(-3.5\),正是本章主线"多步复合突破单步局限"的现场演示。其二,对 CEM 权重,退火几乎没有增益(单级已 30/30)——因为 CEM 的硬阈值精英截断本身就偏向激进收敛,在这个温和地形上单级足矣。
第二层恰好印证 §5.4 的陷阱"退火不是越多越好、要看问题":是否需要退火、需要几级,取决于问题的非凸程度和所用权重函数的探索-收敛特性,而不是一个无脑该开的开关。把这个 schedule 维度加进来后,你的统一优化器现在能表达的范围,已经从第 4 章的经典采样式 MPC,扩展到了本章的扩散启发退火方法——同一份代码、四个正交维度、覆盖两章所有算法。
读到这里你可能会问:这个 schedule 维度和前三个维度(权重/噪声/协方差)是不是同一个层级的东西? 不完全是,这点值得说清。前三个维度都作用在**单步内部**(怎么撒、怎么加权),而 schedule 作用在**单步外部**(怎么把多步组织起来)——它是更高一层的维度。这也呼应了全章反复强调的:经典采样式 MPC 的所有花样都在"单步怎么做",而扩散启发方法的突破在"多步怎么组织"。你的优化器现在同时拥有了这两个层级的旋钮。
这个累积项目还能怎么往下走? 本章给统一优化器加了 schedule(退火)维度,但留了空间:当前的退火调度是预设的几何递减,而前沿方法(如 CoVO 思想 + 退火,见跨章思考题 2)会让每级的协方差也自适应。如果你想在课程之外继续打磨这个累积项目,一个自然的方向是把"调度自适应化"——让级数、温度衰减率、每级协方差都随问题在线调整,而非手工设定。这会把你的优化器从"四个手动维度"推向"部分自动调度",更接近研究前沿的做法。这个延伸不是必须的,但它能让你把本章学到的退火思想,和第 4 章的协方差整形思想真正融会贯通。
延伸阅读¶
本章两项核心工作(建议精读,先看项目主页的视频再读论文):
- Model-Based Diffusion for Trajectory Optimization(Pan、Yi、Shi、Qu,NeurIPS 2024,arXiv:2407.01573)。MBD 原始论文。重点读它如何把 score 写成模型可算的形式、如何用蒙特卡洛 score ascent 逃离局部最优、以及融合不完美数据的实验。开源实现
LeCAR-Lab/model-based-diffusion(JAX)。 - Full-Order Sampling-Based MPC for Torque-Level Locomotion Control via Diffusion-Style Annealing(Xue、Pan、Yi、Qu、Shi,ICRA 2025 最佳论文入围,arXiv:2409.15610)。DIAL-MPC 原始论文。重点读 bi-level 退火的设计、与 vanilla MPPI 的对比、以及真机带载跳跃的实验。开源实现
LeCAR-Lab/dial-mpc(JAX/Brax + MuJoCo MJX),含 Sim2Real 流程和后来加入的灵巧手 demo。
扩散模型基础(理解 §5.1 的来路):
- Denoising Diffusion Probabilistic Models(Ho、Jain、Abbeel,NeurIPS 2020)。DDPM 奠基论文,前向加噪 / 反向去噪的标准形式。
- Generative Modeling by Estimating Gradients of the Data Distribution(Song、Ermon,NeurIPS 2019)。score-based 视角的源头,把去噪理解为朝 score 上升。
- Diffusion Policy(Chi 等,2023)。把扩散模型用作机器人策略的代表作,理解 model-free 扩散的做法与局限(与 MBD 形成对照)。
统一视角与前沿(理解 §5.4):
- 把 MPPI、RL、扩散统一在 Gibbs 测度下的工作(Li 等,2025)——理解"三张面孔"的严格版本。
- Diffusion Model Predictive Control(D-MPC)(arXiv:2410.05364)——用扩散学动力学和动作提议、random shooting 规划,可运行时优化新奖励。
- Diffusion-MPC(arXiv:2510.04234)——把学习的扩散模型当近似动力学先验,反向步里融入奖励规划与约束投影,配交互式在线训练,用于腿足运动。
- Reference-Free Sampling-Based MPC(arXiv:2511.19204,2025 年底)——DIAL-MPC 的直接后续,用三次 Hermite 样条参数化 + 扩散启发退火,在纯 CPU 上仅用约 30 个样本即可实时运行(无需 GPU、无需参考步态),在 Go2 四足与 G1 人形上验证。读它能直观看到"降维如何把退火 MPC 的算力门槛大幅拉低",是理解 §5.4 前沿三的一手材料。
统一视角的数学基础(想深究 §5.1/§5.2 同构的读者):
- Tweedie 公式与去噪的关系:这是"score = 后验均值位移"的数学出处,在扩散模型的理论文献里被反复使用(如把去噪自编码器与 score 匹配联系起来的工作)。理解它能让你彻底看清"为什么免梯度的加权平均能逼近梯度方向"。
- 把控制问题写成"从 \(\exp(-J/\lambda)\) 采样"的视角,根子在第 1 章的自由能 / KL 控制与路径积分控制(Kappen、Theodorou 等的经典工作),本章只是把它接到了扩散的多步结构上。建议回看第 1 章相应部分,两章的目标分布是同一个。
离线 RL 基准(理解 D-MPC 等方法在什么上评测):
- D4RL 基准——离线强化学习的标准评测集,D-MPC 等 learned prior 方法常在其上与 RL 方法对比。了解它有助于你判断"某方法在 D4RL 上达到 SOTA"意味着什么、不意味着什么。
动手资源(强烈建议):
LeCAR-Lab/dial-mpc和LeCAR-Lab/model-based-diffusion两个仓库都是 JAX 实现,配有 demo 和(DIAL 的)Sim2Real 说明。clone 下来跑通、改改代价函数、看可视化的退火过程,是理解本章最快的路径——比反复读公式有效得多。- 本章所有 NumPy 小 demo(§5.1 退火对比、§5.2 MBD 免梯度、§5.5 绕墙 Mini 实现、§5.6 多方法对比)都只用到 numpy,几十行可跑。亲手把成功率调出来,远胜被动阅读。
阅读建议:先看 DIAL-MPC 和 MBD 的项目主页视频(直观感受退火过程和真机效果),再读 §5.1 在本章的同构论证打底,最后读论文细节。如果你要动手,直接 clone dial-mpc 跑通它的四足 demo,再对照伪代码理解每一级退火——比纯读论文快得多。
怎么在这个高产方向里筛选该读的论文(元建议):
这个方向每月都有新论文,全读不现实。用本章给你的框架做快速筛选,把时间花在真正有增量的工作上:
- 先用三问定位(§5.4/§5.7):读摘要时就问"目标分布是什么形式、score 从哪来、单步还是多步"。如果一篇论文在这三个维度上和 MBD/DIAL 完全重合、只换了个任务,它对你的认知增量就有限(除非你正好关心那个任务)。
- 找它在哪个维度上推动了边界(§5.6):真正值得读的工作,通常在某个维度上突破了现有边界——更省算力(如前沿三的 CPU/样条)、更长时域(如加终端价值函数)、更高维、或把 model-based 和 learned 更巧地结合。先识别"它突破了哪一格",再决定要不要深读。
- 警惕"新瓶装旧酒":有些工作换个名字、换套术语,内核还是你已经吃透的退火 + MPPI。用本章的"还原到已知"心法(§5.7),几分钟就能判断它是真有新意还是换了层包装。
- 优先读有真机 / 有开源的:这个方向仿真容易好看、真机才见真章。有真机实验、有可跑开源代码的工作(如 DIAL-MPC),可信度和学习价值都更高——你能 clone 下来验证,而非只信论文里的数字。
这套筛选法的价值,会随你在这个方向待得越久而越大:在一个论文产量远超阅读能力的领域,"会筛选"比"读得多"更决定你的成长速度。而筛选的底气,正来自本章给你的那套稳定框架——框架越清晰,你越能一眼看出哪篇是真增量。
一条务实的学习路线(综合以上资源):先用本章 §5.1 和 §5.5 的 NumPy demo 建立"退火 = MPPI + 由粗到精调度"的手感(半天),再读 MBD 和 DIAL-MPC 两篇论文的方法部分、对照 §5.2/§5.3 理解它们如何把这个手感推广到免训练优化和全阶控制(一到两天),最后 clone dial-mpc 跑通一个四足 demo、改改代价看行为怎么变(一天)。这条路线"先玩具吃透内核、再论文理解推广、最后真实代码上手",比任何单一资源都高效——它正是本章一直倡导的"动手优先、由简入繁"的学习方式的具体落地。如果时间实在有限,哪怕只完成第一步(跑通本章 §5.1/§5.5 的 NumPy demo、亲手把成功率从个位数调到满分),你对退火的理解也会甩开"只读过论文"的人一大截——因为"由粗到精"这件事,看一眼数字怎么随调度变化,胜过读十遍文字描述。
本章与后续章节的关系¶
本章在整个课程里处于"经典采样式 MPC"与"不确定性 / 交互式规划"之间的枢纽位置。理清它和后续的关系,能帮你建立全局地图:
与不确定性规划的关系(直接后继)。本章假设动力学和代价**已知且确定**,于是 score 能由模型干净地算出。后续的鲁棒 / 随机 MPC、机会约束、风险敏感(CVaR)等方法,处理的恰恰是这个假设不成立的情形——动力学有误差、状态有噪声、未来有随机性。
那时目标分布本身变得"模糊",不能再简单地写成 \(\exp(-J/\lambda)\) 并算其 score;需要在采样和优化里显式地纳入不确定性(如对扰动求期望、对最坏情况求鲁棒、对尾部风险求敏感)。本章"采样逼近目标分布"的视角仍然适用,但目标分布的定义要升级。
与博弈 / 多智能体规划的关系。当环境里有其他会反应的智能体(其他车、行人、对手),"代价"不再只取决于自己的动作,还取决于他人的策略。这把单方优化变成了博弈。本章的采样思想可以延伸过去(对他人策略也采样),但需要博弈论的新框架来定义"最优"。
与学习类方法的关系(已在 §5.4 部分接触)。本章主线是免训练的,但 §5.4 已经预告了 learned prior 的混合路线。后续若涉及模仿学习、离线 RL、世界模型,你会发现它们和本章的扩散视角在"用数据学一个生成式先验"这点上相通——本章的统一框架是理解那些方法如何与控制结合的基础。
一句话定位:本章是"确定性、免训练、用模型算 score"这条线的高峰;越过本章,课程要么走向"不确定性下目标分布如何定义"(鲁棒 / 随机 / 风险 / 博弈),要么走向"用数据补足模型算不出的部分"(学习类)。无论哪条,本章打下的"采样逼近目标分布 + 多步复合"的底子都用得上。
把这些关系连起来看,本章其实是一座承前启后的桥:向后,它回应并突破了第 4 章的高斯天花板;向前,它的"采样逼近目标分布 + 多步复合"视角,会成为你理解不确定性规划、博弈、学习类方法的共同底座。学完它,你不只是多会了两个算法,而是拿到了一把能打开后续多个方向的钥匙。
再放到更大的图景里看一眼:当下机器人智能大致有两条主线在交汇——一条是"学习"(用海量数据训练大模型/策略),一条是"优化与控制"(用模型和算法在线求解)。本章站在两条主线的交界处:它的内核是优化(采样式 MPC),却借用了生成式扩散这个本属于"学习"阵营的结构,并在 §5.4 进一步触及了二者的融合(learned prior)。理解本章,某种意义上是理解"模型驱动"与"数据驱动"如何握手——而这正是未来机器人系统最可能的形态:不是纯学习、也不是纯优化,而是两者按问题特性各取所长地结合。你在本章建立的"用统一框架看待不同方法、按问题选择工具"的能力,会是你在这个融合趋势里最稳的立足点。
故障排查手册¶
在实现扩散启发的退火采样 MPC 时,下面这些场景你大概率会遇到。每条给出"症状 → 可能原因 → 排查 / 解法":
场景一:退火版效果还不如单级 MPPI。 症状:明明加了多级退火,命中全局最优的比例、最终代价反而比单级差。 可能原因:(1) 退火调度方向写反了(温度/方差从小到大,变成"由精到粗");(2) 只缩温度不缩方差(或反之),退火不完整;(3) 末级方差还太大,无法精细收敛;(4) 问题本身近凸 / 低维,单级就够,退火只是徒增噪声。 排查 / 解法:打印每级 \((\lambda,\sigma)\) 确认**单调递减**;确保温度和方差**同步缩小**;适当调小末级 \(\sigma\) 让它能精修;在简单问题上本就不必退火(见累积项目里 CEM 的例子)。
场景二:高维任务下,无论单级还是退火都找不到好解。 症状:维度一上去(几十维力矩),代价居高不下、轨迹明显不合理。 可能原因:(1) 单级用了,撞维度灾难;(2) 退火级数 / 每级样本数不足;(3) warm-start 没用上,每周期从零冷启动;(4) 代价函数本身没设计好(高维下不良代价更致命)。 排查 / 解法:确认用了退火而非单级;按算力上限尽量加级数和每级样本(参考 DIAL-MPC 的 Nsample=2048、Ndiffuse=4、冷启动 Ndiffuse_init=10);务必启用 warm-start 利用时间连续性;先在低维子问题上验证代价函数合理,再上高维。
场景三:MBD / 退火过程中途"发散"或解突然跳变。 症状:去噪 / 退火到某一级,解突然大幅跳变到一个很差的地方,后续也回不来。 可能原因:(1) 某级温度 \(\lambda\) 过小,权重塌到极个别样本上(ESS 极低),更新被一两个噪声样本主导;(2) 该级方差过大,采到了灾难性样本又被错误地重权。 排查 / 解法:监控每级的有效样本数 ESS(第 2 章),过低说明温度太小、该级权重过硬;让温度的下降更平缓、级数更密;对代价做合理裁剪 / 归一化,避免极端代价主导权重。
场景四:单控制周期算不完,跟不上实时。 症状:把退火采样 MPC 上到实时回路,控制频率达不到要求、机器人动作卡顿。 可能原因:(1) 退火级数 × 每级样本数 × 单条 rollout 耗时 > 控制周期;(2) rollout 没并行(没用 GPU / 向量化);(3) 冷启动级数(更多级)用在了每一周期。 排查 / 解法:测单周期实际耗时,反推可行的级数 / 样本数预算;用 GPU 并行 rollout(DIAL-MPC 用 JAX/MJX);冷启动多级只在第一周期用,之后靠 warm-start 减少级数。
场景五:真机上 work 不起来,仿真里却很好(sim-to-real gap)。 症状:仿真里跑得漂亮,搬到真机就跟踪差、甚至失稳。 可能原因:采样式全阶 MPC 高度依赖动力学模型准确性,模型与真机有偏差时 rollout 算出的代价不可靠;状态估计噪声、执行器延迟也会放大问题。 排查 / 解法:提升动力学模型保真度(系统辨识、修正质量 / 摩擦参数);在代价里加鲁棒性裕度;考虑在线模型自适应;这正是 §5.3/§5.4 标注的开放挑战,没有银弹,需要针对性工程。
场景六:退火早期级根本没起到"全局探索"作用。 症状:加了退火,但解从一开始就被困在起点附近,高温级似乎没帮上忙。 可能原因:(1) 高温级的方差 \(\sigma_0\) 设得太小,"撒不远",探索范围不足以发现全局结构;(2) 高温级的温度 \(\lambda_0\) 太小,权重过硬,早期就被个别样本带偏、失去"温和大范围平均"的效果;(3) warm-start 的初值离全局解太远,而退火级数 / 方差不足以跨越。 排查 / 解法:把首级 \(\sigma_0\) 调大到能覆盖问题的全局尺度(参考 §5.5 用了 \(\sigma_0=2.5\) 而末级才 0.35);首级 \(\lambda_0\) 调大让早期权重软、做"看全局"的温和平均;打印首级的中间解终点(像 §5.5 那样),确认它已被带到全局正确区域,否则加大首级探索。
场景七:换了个新机器人 / 新任务,原来调好的退火参数完全失效。 症状:在四足上调好的退火调度,搬到机械臂 / 灵巧手就不工作了。 可能原因:退火的方差 / 温度尺度是和**问题的代价尺度、状态尺度**绑定的;换了系统,代价数量级、控制量范围、非凸程度都变了,原参数自然不匹配。 排查 / 解法:退火参数要随问题重标定——首级方差按新问题的控制量范围设、温度按新代价的数量级设。一个实用做法是先在新问题上跑单级 MPPI 找到一个能用的 \((\lambda,\sigma)\),再以它为"末级"、往上放大几倍作为"首级",构造退火调度。这也呼应 §5.4:算法可迁移(换模型即用),但**调度参数不是免标定的**,换问题要重调。
场景八:退火采样的结果每次跑都不一样,复现困难。
症状:同样的代码、不同的随机种子,结果差异较大,难以复现论文 / 自己之前的数字。
可能原因:(1) 采样式方法本质随机,单次结果有方差是正常的;(2) 每级样本数太少,蒙特卡洛噪声大,加剧了随机性;(3) 没固定随机种子,无法逐位复现。
排查 / 解法:评估时**跑多个种子取统计量**(成功率、均值±标准差),而非看单次结果——本章所有 demo 都是 30–50 个种子的统计,正是这个道理;加大每级样本数可降低单次方差;要逐位复现就固定种子(np.random.default_rng(seed))。记住:采样式方法谈的是"分布意义上的性能",单次跑偏不代表方法错,要用统计说话。
场景九:算法跑通了,但机器人行为"诡异"——能完成任务但方式离谱(如绕远路、剧烈抖动、贴着障碍走)。 症状:优化器收敛了、代价也降下去了,但实际动作不符合预期(明明有近路却绕远、动作剧烈不平滑、危险地紧贴障碍边缘)。 可能原因:几乎都是**代价设计问题**而非算法问题——(1) 漏了某个软约束(没有平滑项→动作抖动,没有避障裕度项→贴边走);(2) 权重配比失衡(某项权重过大压过其他,或安全项权重过小被交易掉);(3) 代价存在你没预料到的"漏洞最优解"(优化器找到了一个代价低但行为荒谬的解)。 排查 / 解法:把代价**逐项拆开**,单独看每一项在最终解上的取值,找出哪一项异常地大或小;对照 §5.5 代价设计的四个教训自查(漏约束?权重配错?硬约束当软约束?);安全攸关的约束改用硬性裁剪或约束投影,而非仅靠软惩罚权重;记住强优化器是"照妖镜",行为荒谬往往是代价在"诚实地"暴露漏洞。
概念与 API 速查表¶
本章以概念和算法为主(核心实现复用前几章的 MPPI 骨架),这里汇总关键对应关系和实现要点,供速查:
核心对应关系:
| 你想做的事 | 对应概念 / 操作 | 关键点 |
|---|---|---|
| 理解扩散为何强 | 多步去噪复合 | 每步仍高斯,威力在复合 |
| 把 MPPI 接到扩散 | MPPI 一步 = 单步去噪 | 加权平均 = 一步 score 上升 |
| 免训练做扩散优化 | MBD:用模型算 score | score = 采样加权估计,只需前向 rollout |
| 逃离局部最优 | 高→低噪声级退火 | 高噪声级平滑地形看全局 |
| 高维 / 全阶控制 | 多级退火(DIAL-MPC) | 多级聚焦替代"一次撒满" |
| 利用时间连续性 | warm-start | 上周期解平移作初值 |
| 注入数据里的隐式偏好 | learned prior(前沿) | 学习先验 + 采样精炼 |
退火采样 MPC 实现要点(在 MPPI 基础上):
- 退火调度:温度 \(\lambda\) 和采样方差 \(\sigma\)(或协方差 \(\Sigma\))都**单调递减**,通常按几何级数从高到低;用
np.geomspace(hi, lo, levels)生成。 - 每级一次 MPPI 更新:级内逻辑就是标准 MPPI(采扰动 → rollout 算代价 → 指数加权 → 加权平均),不改动。
- 级数与样本数:按实时预算定;高维 / 冷启动用更多级(参考 DIAL-MPC:常规 4 级、冷启动 10 级、每级 2048 样本)。
- warm-start:每控制周期用上周期解平移一格初始化,末端做合理填充并参与退火。
- 监控 ESS:每级监控有效样本数,过低说明该级温度太硬、易被个别样本主导。
- 并行 rollout:高维下必须向量化 / GPU 并行(NumPy 向量化起步,规模化用 JAX/PyTorch + 物理引擎如 MuJoCo MJX / Brax)。
调参起点(非凸 / 高维任务):
| 参数 | 起点 | 调节方向 |
|---|---|---|
| 退火级数 | 4(冷启动 8–10) | 非凸 / 高维↑,简单任务↓ 甚至 1(退化单级) |
| 每级样本数 | 数百~数千 | 维度↑则↑,受实时预算限制 |
| 温度调度 \(\lambda\) | 高→低,几何递减 | 发散 / ESS 过低则下降更平缓 |
| 方差调度 \(\sigma\) | 大→小,几何递减 | 末级太抖则末端 \(\sigma\) 调小 |
关于这些起点值的一句话:上表的数字是"能让你跑起来、不至于离谱"的安全起点,不是最优值。最优值依你的具体任务(非凸程度、维度、代价尺度、实时预算)而变,找它的方法是 §5.5 演示的消融——固定预算、扫一个超参、看曲线找甜区。把表里的值当"第一次尝试的锚点",而非"照搬就最优的配方",是用好任何调参表的正确姿势。
按问题特征快速调参(速查):
上面的"调参起点"给的是默认值,这张表则告诉你"当问题有某个特征时,往哪个方向调"——把本章散落各处的调参直觉汇成一处,供你对着自己的问题快速查阅:
| 你的问题有这个特征 | 该怎么调 | 出处 |
|---|---|---|
| 强非凸(需先远离目标再接近) | 加退火级数(4→8),起始方差 sig0 调大到覆盖全局尺度 |
§5.1/§5.5 |
| 近凸 / 低维 | 少退火甚至单级(1 级),别浪费 | §5.4 陷阱/累积项目 |
| 维度很高(几十维力矩) | 用控制节点参数化降维 + 退火,必要时上 GPU 并行 | §5.3 |
| 实时预算紧、没 GPU | 样条参数化把维度压到个位数,可 CPU 几十样本 | §5.4 前沿三 |
| 解每次跑都飘 | 加每级样本数降方差;用多种子统计评估而非看单次 | §5.7/§5.8 |
| 退火中途发散 / 跳变 | 监控 ESS,温度下降更平缓、级数更密;裁剪极端代价 | §5.3 故障场景三 |
| 滚动时域实时控制 | 必开 warm-start;冷启动用更多级、常规周期少级 | §5.3 |
| 行为诡异但代价在降 | 先查代价(漏约束?权重错?),别先查算法 | §5.5/§5.8 |
| 安全攸关的硬约束 | 用硬性裁剪 / 约束投影,别只靠软惩罚权重 | §5.5 |
| 换了新机器人参数全失效 | 退火参数随问题重标定(按代价/控制量尺度) | §5.3 故障场景七 |
| 要学难写成代价的隐式风格 | 退火搞不定,引入 learned prior(需数据) | §5.4 |
| 需要全局最优的数学保证 | 退火不保证,换分支定界等有保证(但慢)的方法 | §5.8 |
这张表的用法:拿你手上问题的特征去对,往往一次能命中两三行——把对应的调节方向叠加起来,就是一个合理的起手配置。它不替代理解(每一行的"为什么"在对应节里),但能在你动手时省去翻书的时间。
研究与实践建议¶
如果你想在这个方向上做研究或工程落地,几条建议:
动手优先于读论文。这个方向的直觉高度依赖"看到退火过程"。先 clone dial-mpc 跑通四足 demo、看可视化的退火 rollout,再回头读伪代码和论文,理解会快得多。本章的 NumPy 小 demo(退火 vs 单级、MBD 免梯度)也值得自己敲一遍,亲手把命中率从 2/30 调到 26/30,比读十遍推导都印象深。
先吃透"单步 = 去噪"再谈花哨。本章所有方法的地基都是 §5.1 那个同构。如果这一步没真正理解(能自己写出 MPPI 更新和去噪步并指出它们同构),后面的 MBD、DIAL、统一视角都会是空中楼阁。务必先把地基打牢。
把退火当成默认升级、而非高级特技。当你的单级 MPPI 在某个问题上调不动(高维、强非凸、易陷局部),第一反应应该是"试试退火",而不是"堆样本"或"放弃换 RL"。退火是低成本、免训练、即插即用的升级,应该进你的常规工具箱。
诚实对待免训练的边界。免训练很有吸引力,但它要求模型已知、目标分布写得清楚、能容忍在线计算。遇到"要学难以言说的风格""要毫秒级推理""动力学根本建不准"时,别硬扛免训练,该引入学习就引入(§5.4 的混合路线)。把"免训练"当适用条件、不当信仰。
关注 sim-to-real 这个真问题。如果你想做有真机影响力的工作,sim-to-real 鲁棒性、在线模型自适应是这个方向最现实、最有空间的切入点(§5.3/§5.4 反复标注)。仿真里再漂亮,过不了真机这关就难有实际价值。
用统一视角持续解码新论文。这个方向每月都有新工作。养成习惯:拿到一篇"扩散 + 控制"的论文,先问"目标分布是什么形式、score 从哪来、单步还是多步",迅速定位它在本章框架里的坐标。框架比单个算法活得久。
把"控制变量做消融"变成习惯。§5.5 那个级数消融(1→2→3→5→8→15)是个范例:固定总预算、只扫一个超参、画出"先升后降"的曲线找甜区。无论你调退火级数、样本数、温度调度,都该用这种方式而非凭感觉试——一次只动一个变量、用多种子的统计量说话、把结果画成曲线。这个习惯会让你的调参从"碰运气"变成"有依据",也是把玩具经验迁移到真实系统时最可靠的方法论。
带着"统一视角"读跨领域论文。本章揭示的 MPPI / RL / 扩散同构(§5.4),价值不止于本章——它给了你一张读懂"控制 + 生成模型 + 强化学习"交叉工作的通行证。当你读到一篇把生成模型用于决策、或把强化学习与规划结合的论文,试着用"它在逼近什么目标分布、score 从哪来、单步还是多步"去解码它。你会发现很多看似分属不同社区、用着不同术语的工作,骨子里在解同一个问题。这种跨领域的"翻译能力",在交叉方向越来越多的今天,是稀缺而值钱的——而本章正好给了你一个具体的、可迁移的统一框架作为起点。
把"调代价"当成和"调算法"同等重要的技能。本章和很多教程都把重心放在算法上,但真机工程里,调代价的时间常常远多于调算法(§5.5 代价设计实验演示了原因)。养成"代价逐项拆解、单独检查每项贡献"的习惯;对安全攸关的约束,别只靠软惩罚权重,用硬性裁剪或约束投影。一个朴素但有效的诊断准则:行为诡异时先怀疑代价、再怀疑算法。强优化器会忠实地利用代价的每个漏洞,所以代价的严谨程度,往往就是行为质量的上限。
版本信息速查¶
本章涉及的方法、实现与关键数字,按其来源时点列出(便于你判断信息的时效性):
| 项目 | 时点 / 版本 | 备注 |
|---|---|---|
| DDPM | NeurIPS 2020 | 扩散模型奠基 |
| score-based generative models | NeurIPS 2019 | score 视角源头 |
| Diffusion Policy | 2023 | model-free 扩散策略代表 |
| MBD(Model-Based Diffusion) | NeurIPS 2024(arXiv:2407.01573) | 免训练扩散式轨迹优化;比 PPO +59% |
| DIAL-MPC | arXiv:2409.15610;ICRA 2025 最佳论文入围 | 比 MPPI 跟踪误差低 13.4×、爬越比 RL +50%、接触奖励 +107.7% |
| DIAL-MPC 开源实现 | LeCAR-Lab/dial-mpc(JAX/Brax + MuJoCo MJX) |
Sim2Real 流程已开放;后加入 Allegro 灵巧手 demo |
| MBD 开源实现 | LeCAR-Lab/model-based-diffusion(JAX) |
免数据,可融合不完美数据 |
| Gibbs 测度统一 | 2025 | MPPI/RL/扩散统一视角 |
| D-MPC / Diffusion-MPC | arXiv:2410.05364 / 2510.04234 | learned prior 混合路线 |
数字均来自上述论文 / 开源仓库;这个方向演进很快,落地前请以最新论文和仓库为准。
顺带一提,本表按"工作首次公开的时点"排列,而非课程编写时点——这样即便未来有新版本、新成绩出现,你也能看清这条脉络的先后与因果(MBD 启发了 DIAL,DIAL 又启发了后续灵巧手扩展)。读这类时间线,看清"谁启发了谁"比记住具体日期更有价值。
也要提醒一句关于这些数字的态度(呼应误解八与 §5.7):表里的性能数字(13.4×、+50%、+59% 等)都来自各自论文在特定任务、特定基线下的报告,它们证明的是"这条路走得通、优势可观"这一**质的结论**,不是你换个任务就能照搬的承诺。引用时务必回到原始论文核对口径(和谁比、什么任务、什么指标),并以正式发表版为准——本章在 §5.3 就专门标注过 DIAL-MPC 早期摘要"+40%"与正式版"+50%"的差异,正是为了示范这种严谨。一个好习惯:转述论文数字时,连同它的对比对象和任务条件一起转述,而非孤零零甩一个倍数。
收束语¶
这一章,你跨过了从"经典采样式 MPC"到"扩散启发采样 MPC"的桥。
桥的两头看似隔着一整个新领域,但你已经看清:它们之间其实只隔着一个观念的转换。MPPI 的一步加权更新,就是扩散的一步去噪——认出这个同构,整个扩散 MPC 方向就接到了你已有的知识上,学习成本几乎为零。
而真正的新东西,不在任何单步——每一步仍是朴素的高斯采样——而在"如何把许多步组织起来":把单步沿退火调度复合成多级,就突破了第 4 章那个困住经典方法的高斯天花板,让采样式 MPC 第一次爬上了全阶力矩控制这样的高维战场;用已知模型直接算出去噪所需的 score,就摆脱了扩散模型对数据和训练的依赖,做出了免训练、可跨动力学迁移的优化器。
再往远看,你还瞥见了一个更大的统一:采样式控制、策略梯度、扩散去噪,骨子里都是在逼近同一个"\(\exp(\text{能量}/\text{温度})\)"形式的目标分布。这个视角,是本章送给你的、比任何单个算法都更持久的礼物——它让你能看穿表面各异的方法、认出共同的内核,也让你在面对层出不穷的新工作时,永远知道该问哪三个问题。
那三个问题,本章已经反复演练过:它在逼近什么形式的目标分布?它的 score 是算出来的还是学出来的?它是单步,还是多步的复合?带着这三问,任何一篇新的"扩散 + 控制"论文,你都能在读完摘要的几分钟内,把它准确地放进本章的框架里——这就是统一视角给你的底气。
同时,本章也希望你带走一份清醒:退火很强,但不是银弹。它把"找到全局最优"的概率从很低提到很高,却从不保证;它能更高效地优化你写下的代价,却救不了写错的代价;它让采样式 MPC 爬上了几十维,却仍有扛不住的极端高维。真正掌握一个方法,是既能用好它的强大、又能说清它的边界——对退火如此,对你将来学的任何方法都如此。把"它强在哪、又不保证什么"一起装进脑子,你才不会在它失灵时慌乱,也不会在它适用时却因疑虑而不敢用。
但这一章的所有方法,都站在一个安静的假设上:世界是确定的,模型是准的,未来是可算的。下一程,这个假设将被打破——动力学会有误差、环境会有噪声、他人会有自己的算盘。当目标分布本身因不确定性而变得模糊,"逼近一个确定的最优分布"就不再够用。如何在不确定的世界里做稳健、明智、甚至带博弈的决策,是接下来要面对的课题。本章打下的底子,会一路陪你走下去。
走到这里,回头看看你已经走了多远:从第 2 章一条朴素的 MPPI 更新,到本章把它认作扩散的一步去噪、堆成多级退火、爬上全阶力矩控制、再统一进 MPPI/RL/扩散的同一个数学骨架,最后还清醒地划出了它的边界。这一路,你收获的远不止"扩散启发采样 MPC"这一个主题——你练就的是一种看待控制方法的眼光:任何方法都在逼近某个目标分布,区别只在 score 从哪来、单步还是多步、要不要数据;任何"高深"的新名词,都能还原成你已经会的东西;任何强大的工具,都既有它的锋利、也有它的边界。带着这副眼光,下一程的不确定性、博弈、学习,对你都不再是全然陌生的新大陆,而是同一片海域里、用同一套航海术去探索的新航线。出发吧。
跨章综合应用¶
学完本章的全部内容,是时候把视野拉到整个采样式控制部分了。下面把第 1–5 章的工具串成一条完整的解题链,用一个具体情境演示它们如何协同。这不是新知识,而是帮你看清各章如何拼成一个整体——也是检验你是否真把这几章学成了"一棵知识树"而非"一堆散点"的好机会。
情境:你要给一台四足机器人做一个"跨越障碍后精确落到目标点"的动作,全阶力矩控制、无演示数据、动力学已知。
第 1 步——定义目标分布(第 1 章)。把任务写成代价 \(J\)(落点误差 + 障碍惩罚 + 控制能量 + 姿态约束),目标分布 \(\mathbb{P}^\star\propto e^{-J/\lambda}\)。这一步把"控制问题"变成"从一个分布采样"的问题,是后面一切的起点。
第 2 步——选基础采样器(第 2 章)。用 MPPI 作内核:采 rollout、按 \(e^{-J/\lambda}\) 加权、加权平均。这是你每一步更新的原子操作。
第 3 步——意识到单级不够(第 4 章)。这个任务强非凸(跨障要先抬腿、后蹬伸,是个"先远离再接近"的过程)且高维(全阶力矩几十维)。第 4 章告诉你:单级 MPPI 在这种地形 + 维度下会陷局部、撞维度灾难,且无论怎么调权重 / 噪声 / 协方差,高斯天花板都在。
第 4 步——上多级退火(第 5 章 §5.1–§5.3)。把 MPPI 一步理解为去噪一步,沿温度 / 方差调度堆成多级(DIAL-MPC):高温级让机器人"敢于"大幅尝试抬腿蹬伸(全局探索),低温级精修落点(局部收敛)。配 warm-start 利用控制周期间的连续性、bi-level 退火把样本花在刀刃上。score 全程由已知动力学算出,免训练。
第 5 步——按需考虑前沿 / 不确定性(§5.4 + 后续章节)。若想注入"自然的跳跃姿态"这种难以写成代价的偏好,可引入 learned prior(§5.4);若要上真机、动力学有误差,则进入后续不确定性 / 鲁棒规划的范畴。
第 6 步——诚实评估,不迷信(§5.8)。跑出结果后,用多种子统计(而非单次)评估退火的成功率,清醒地知道它不保证全局最优;检查行为是否真的合理(别被"代价降下去了"骗过——§5.5 的穿墙就是代价低但行为错的例子);如果遇到极端高维或退火扛不住的情形,考虑用降维或 learned prior 给它减负(§5.4)。这一步是把方法用对、而非用迷信的关键。
这条链清楚地展示了各章的分工:第 1 章给"目标",第 2 章给"原子操作",第 4 章给"诊断(为什么单级不行)",第 5 章给"升级(多步复合突破)"和"清醒的评估边界",后续给"应对不确定"。你手里的不是五个孤立的工具箱,而是一套能从问题定义一路走到高维实现的连贯方法论。
更重要的是,这条链展示的不是"五个算法的罗列",而是一种**面对新控制问题时的思考顺序**:先把问题写成目标分布(要优化什么),再选一个基础采样内核(怎么撒),诊断它在你的问题上会不会因非凸/高维而失效(第 4 章的天花板),需要时升级到多步退火(第 5 章的突破),最后判断是否要引入学习或应对不确定性。把这个顺序内化成习惯,比记住任何单个算法都重要——因为算法会更新换代,而"如何拆解一个控制问题、按其性质逐步选择工具"的思维方式会一直陪着你。这正是本章、也是整个采样式控制部分,最想留给你的东西。
跨章综合思考题¶
下面几题需要你调用多章知识综合作答,没有标准答案,重在论证过程。建议把它们当成"用写作倒逼理解"的练习——能把一个跨章问题论证清楚,往往比做对十道套公式的题更能暴露你哪里还没真懂。
-
(贯通 1–5 章的主线,⭐⭐⭐⭐) 用第 1 章的目标分布 \(\mathbb{P}^\star\propto e^{-J/\lambda}\) 作统一框架,把 CEM、MPPI、iCEM、Tsallis-MPC(第 4 章)、MBD、DIAL-MPC(第 5 章)全部纳入,逐一说明它们的三个区别维度:(i) 用什么提议分布;(ii) 单步还是多步复合;(iii) score / 更新方向从哪来(算出来还是隐含在加权里)。最后用两三句话概括:从第 4 章到第 5 章,这条线最根本的进步是什么?
-
(CoVO 遇上退火,⭐⭐⭐⭐) 第 4 章 §4.6 的 CoVO 给出了"按代价地形把单步协方差整形到最优"的思想,第 5 章给出了"沿调度把单步堆成多级退火"的思想。这两个思想正交吗?设想一个把它们结合的方法——每一级退火不仅缩小方差,还按该级(平滑后)地形把协方差整形到最优方向。论证:(a) 这在原理上是否合理(每级的"最优协方差"和退火的"由粗到精"会不会冲突)?(b) 收益是什么(更少级数达到同样效果?更快收敛?)?(c) 代价是什么(每级要估计 / 分解协方差,开销随维度增长)?(d) 在什么样的任务上这个结合最划算?
-
(免训练 vs 学习的边界,⭐⭐⭐⭐) 本章主线是免训练(MBD/DIAL),§5.4 引入了 learned prior 的混合路线。请综合全书论证:对一个具体的机器人控制问题,你会用哪三个判据来决定"纯免训练采样"还是"引入学习的先验"?(提示:考虑动力学是否已知且准确、是否有数据、目标分布能否写清楚、实时性要求、是否要泛化 / 迁移。)再举一个你认为"必须引入学习"的例子和一个"免训练明显更优"的例子,说清理由。
-
(向不确定性过渡,⭐⭐⭐⭐⭐,开放题) 本章所有方法都假设动力学和代价确定、目标分布 \(\propto e^{-J/\lambda}\) 能干净地算出 score。设想动力学带有不确定性(如质量 / 摩擦未知、有随机扰动)。此时"目标分布"该如何重新定义?MPPI 的加权更新 / 扩散的 score 估计还能不能直接用、要怎么改(提示:对扰动求期望?对最坏情况鲁棒?对尾部风险敏感?)?退火的"由粗到精"在不确定情形下还成立吗?这道题没有确定答案——它正是下一程"不确定性下的规划"要系统回答的问题,你现在的思考会成为理解那些方法的起点。
-
(代价设计的陷阱,⭐⭐⭐⭐,综合题) §5.5 的代价设计实验表明"强优化器会忠实利用代价漏洞"。请综合第 2 章(MPPI 代价)、第 4 章(不同权重函数)、本章(退火让优化器更强)论证:(a) 为什么"优化器越强,对代价错误越敏感"?(提示:弱优化器可能因找不到最优反而没暴露漏洞。)(b) 给定一个安全攸关任务(如机械臂不能撞到旁边的人),你会用"软惩罚 + 大权重"还是"硬性裁剪 / 约束投影"来编码这个安全约束?分别分析两种做法在"优化器拿约束做交易"这个风险上的区别。(c) 第 4 章的退火让优化器从单级变强,这对代价设计的严谨性提出了更高还是更低的要求?为什么?