1. 从一次“玄学”调参说起:为什么要把规划看成推断
做机器人轨迹优化这些年,我经常遇到一个很“玄学”的问题:同一个目标函数,用样条参数化跑得好好的,换成多项式参数化,收敛速度直接掉一个数量级。参数没改、约束没改、求解器没改,唯一变的只是轨迹的表达方式。过去我只会说“这组基更适配这个问题”,但为什么适配、什么才算适配,说不出一条像样的理由。直到我把研究重心转向 Planning as Inference(规划即推断),又从信息几何里翻出 Dually Flat Geometry(对偶平坦几何)那一套之后,才慢慢明白:参数化问题本质上是一个坐标选择问题,而坐标选得好不好,取决于你所在的空间是不是“对偶平坦”的。
在展开技术细节之前,先把结论放这:Planning as Inference 的核心,是把“最小化代价”这个优化命题重写为“寻找高概率轨迹”的推断命题;而 Dually Flat Geometry 能提供的,是一套研究这类推断问题的几何语言。适合谁读呢?如果你做过运动规划、MPC、或者概率图模型方向的推断算法,这篇文章应该能帮你在两个领域之间搭一座桥;如果你只是好奇信息几何怎么和机器人控制发生关系,可以从第二节开始读,前面第一节更多是铺垫。我会尽量把公式留在必要的位置,把精力放在解释“为什么”上。
1.1 同样的目标函数,换个参数化速度差十倍
先讲现象。假设你在做二维平面上的点质量运动规划,起点和终点固定,中间要绕开几个圆形障碍物。目标函数是三项:一个平滑项,让轨迹不要抖;一个碰撞代价,让轨迹离障碍物远一点;再加一个终点到达的软约束。这个目标函数用三阶B样条参数化,配合少量控制点,通常几十次迭代内就能收敛;但如果你很自然地把轨迹直接表示成时间序列上的一堆离散位置,而不做任何基函数收缩,同一个问题可能需要上千次迭代。离散点维度拉高之后,梯度下降经常卡在锯齿状的地方,必须加很大的平滑正则项才勉强能用。
这个现象暴露的其实是几何问题:离散位置坐标下,轨迹分布之间的“距离感”被扭曲了。你小幅修改某一个点,对最终轨迹分布的影响在数学上和修改另一个完全不同维度的点并不一样,但欧氏梯度下降把所有维度都当成等权处理。换到B样条参数化,实际上等于用一个更接近问题本征结构的坐标系统,各方向之间的耦合变小,迭代自然变快。问题是,大多数时候我们并不知道什么样的参数化才是接近本征的,只能靠试。信息几何给出的回答是:如果你愿意把轨迹当作一个概率分布来处理,那么“本征坐标”不是凭空猜的,而是由分布的统计结构自然决定——这就是自然参数和矩参数。
1.2 概率重写:把代价函数变成势能
把规划问题重写成概率推断,思路非常直接。原来的目标是最小化总代价:
$$J(\tau) = \sum_t c_t(\tau_t) + \text{cost}_{\text{prior}}(\tau)$$
现在把它变成最大化一个未归一化的概率密度:
$$p(\tau) \propto \exp(-J(\tau))$$
这里为什么可以这样写?因为 exp(-J) 是一个非负函数,虽然积分起来不一定收敛到 1,但我们可以随时归一化。只要 J 有下界,exp(-J) 就有峰;J 越小的轨迹,对应概率越高;J 最大的轨迹,概率按指数级衰减。于是“最小化代价”就等价于“寻找高概率轨迹”,严格说是寻找概率分布众数(MAP 估计)。刚才说的碰撞代价,变成似然项;平滑先验,变成概率先验;动力学约束,变成条件概率转移。
这个转变表面看只是取了个负号再取指数,并不改变优化问题的解,但它打开了两个过去容易被忽略的空间。第一,概率工具可以进来了:后验分布做变分推断、消息传递、蒙特卡洛采样,都不是新东西,可以直接拿过来用。第二,硬约束有机会变软约束:以前必须在约束边界上做精确投影,现在只要在似然里把违反约束的代价拉高即可,实现起来简单得多。很多基于采样的运动规划器和概率图模型就是这么结合起来的。可以说,这一步是整个框架最不值得争论的地方——它不是魔法,只是一个视角转换。
1.3 最优控制与最大后验估计其实是一回事
这一点值得单独说,因为它是后续所有几何讨论的基础。以线性二次问题为例。假设系统的状态转移是线性的,加上高斯噪声,代价只包含状态和控制的二次型。在概率重写下,先验来自线性高斯动力学,似然来自二次代价,乘积之后依然是一个高斯分布。对这个高斯分布取最大后验估计,计算出来的轨迹,和用经典 LQR 解出来的最优轨迹完全一致。
这意味着什么?意味着各种经典控制结论在概率框架下可以重新表达:MAP 推断等价于最优控制,协方差估计对应着风险敏感控制,边缘化对应着部分可观测系统下的置信传播。一旦使用非线性模型或者非二次代价,后验不再是高斯,但“推断”的视角依然成立,只是求解难度上去了。于是研究者的工具箱就变了:优化器换成了推断器,步长换成了测地线,代价函数换成了势能,约束集换成了流形上的子流形。接下来所有关于“几何”的讨论,都是围绕这个“把分布当对象”的新视角展开的。
2. 对偶平坦到底在说什么:给轨迹分布一把好用的尺子
Dually Flat Geometry 这个名字听起来吓人,其实骨架很简单:它研究的是在概率分布族构成的空间里,用什么坐标最自然、怎么度量两个分布之间的距离、以及在约束集上如何高效投影。
2.1 统计流形:把概率分布当成空间里的点
先把空间讲清楚。所有可能的轨迹概率分布,组成了一个空间,叫统计流形。直接讨论所有分布太难,实际工程中我们通常只关心某个参数化分布族,比如高斯分布族、马尔可夫随机场分布族。每一个具体的分布,就是流形上的一个点。点本身不是轨迹,而是“轨迹的概率规律”。
这个视角最大的好处,是所有熟悉的几何直觉都能复用。以前在欧氏空间里优化一个向量,现在在统计流形上优化一个分布:连续的迭代过程可以看成点在流形上移动,约束条件变成流形上的曲面,优化目标变成定义在流形上的标量函数。剩下的问题就是:这个流形太抽象,怎么给它配坐标、配度量,才能让优化过程直观且高效?对偶平坦几何给出的答案,是指数分布族天然带有一对互为对偶的平坦坐标,在这对坐标下,大部分优化算法都有非常清晰的几何解释。
2.2 一个高斯分布,为什么值得两套坐标
具体看高斯分布。高斯一般写作 N(μ, σ²),我们习惯用均值和方差两个参数描述它。但从信息几何的角度,更好的做法是把高斯重新排列成指数族的标准形式:
$$p(x; \theta) = \exp\left(\theta_1 x + \theta_2 x^2 - A(\theta)\right)$$
其中 θ₁ 和 θ₂ 是自然参数,θ₁ = μ/σ²,θ₂ = -1/(2σ²)。与之对应还有一套矩参数 η:η₁ = E[x] = μ,η₂ = E[x²] = μ² + σ²。两套坐标之间通过 Legendre 变换互相转换。这个对偶关系就像物理里的位置和动量:自然参数像“动量坐标”,矩参数像“位置坐标”,同一个物理状态可以用任意一套描述,但有些公式在动量坐标下简单,有些公式在位置坐标下简单。
这里最关键的几何性质叫做 e-平坦和 m-平坦。e-平坦是指,在自然参数 θ 坐标下,任意两个分布之间连一条直线,直线上的每个点都仍然属于高斯分布族;m-平坦是指在矩参数 η 坐标下,任意两个分布之间连一条直线,直线上的每个点对应一个混合的分布。注意,混合分布不一定还在高斯族里,所以 m-平坦直线的“直线性”是定义在参数空间里的。这两套平坦结构配合起来,让高斯族这个流形变得特别好用:很多在一般流形上极其难算的问题,在这个流形上都能退化成线性问题。
2.3 投影、KL散度与毕达哥拉斯:最小化“差多少”的规则
有了坐标,还得有距离。统计流形上最常用的距离不是欧氏距离,而是 KL 散度。KL 散度不是对称的,D(p||q) 和 D(q||p) 通常不相等,这一点正是很多算法分歧的根源。例如变分推断用前者,期望传播用后者,求出来的近似分布形状完全不同。对偶平坦流形上,KL 散度可以被表达成 Bregman 散度,于是很多关于距离的直觉复活了:一个点向一个约束集做投影,投影点是使某种 KL 散度达到最小的点;并且投影过程满足类似勾股定理的分解关系——三个点和垂足之间有一条“毕达哥拉斯”等式。可以说,对偶平坦几何让概率空间里的投影获得了欧氏空间投影的优美性质。
这对规划的意义是:当我们在轨迹分布流形上加上“必须满足动力学”或“必须避开障碍物”等约束时,每个约束都定义了一个子流形。求解后验,就是不断在这些子流形之间做交替投影。只要投影是良定义的,收敛行为就比瞎猜参数化稳定得多。这也是我后来面对“换参数化速度差十倍”的问题时,第一反应不再是调梯度缩放,而是检查我到底在哪个坐标空间里做事情。
3. 从几何到算法:自然梯度、镜像下降与消息传递
几何讲再多,最终还是得落到算法。这一节讲三件我实际用过、并且觉得确实让问题更清楚的事:如何把轨迹优化建模成投影问题,自然梯度和镜像下降为什么在这个框架下顺理成章,以及消息传递和交替投影的关系。
3.1 把轨迹优化问题变成流形上的投影问题
具体做法如下。假设我们要寻找一个轨迹分布 q(τ),它既要接近一个先验 p0(τ),又要满足带代价的最优性条件。从变分推断的角度,目标函数写成:
$$\min_q KL(q(\tau) | p(\tau)), \quad p(\tau) \propto p_0(\tau) \exp(-V(\tau))$$
这个式子非常好懂:V(τ) 就是总代价,exp(-V(τ)) 把代价变成势能;如果 V 很大,这一项对概率贡献小;如果 V 很小,这一项把质量推高。优化的目标,是找一个分布 q,让它尽量接近“修正后的”分布 p。由于 p 通常只在低维子流形上有显著质量,直接采样困难,所以我们要限制 q 在一个易于处理的分布族里,然后在约束集上做投影。
从这里可以看出,规划即推断框架下的求解,本质上就是一个带约束的变分推断问题。经典控制器的区别在于:前者直接迭代轨迹数值,后者迭代的是轨迹的统计量。统计量迭代的好处是,你始终知道自己手里是一个分布,后续做风险评估或者闭环控制时,不确定性是从头带到尾的,而不是解完轨迹后再临时估计的。这也是为什么近年带 KL 正则项的模型预测控制能流行起来——它本质上就是在用变分推断的语言做规划。
3.2 自然梯度:听起来高级,实现起来并不含糊
自然梯度是很多文章喜欢用的名词,但它的操作其实很具体。普通梯度下降的更新公式是 θ ← θ - α∇L(θ),它对参数的坐标系统非常敏感;参数化一变,梯度方向在几何上就变了,收敛速度也随之变化。自然梯度则把更新方向用 Fisher 信息矩阵做了修正:
$$\theta \leftarrow \theta - \alpha I(\theta)^{-1} \nabla L(\theta)$$
其中 I(θ) 是 Fisher 信息矩阵,也就是统计流形上的度量张量。直观理解,普通梯度是在“欧氏坐标纸”上走,自然梯度是在“流形本征坐标纸”上走,每一步都考虑到了参数不同方向上的尺度差异。在指数族分布上,自然梯度还有一个更好用的等价形式:它等于在矩参数空间的普通梯度。也就是说,你不需要真的求逆一个高维矩阵,只要把坐标从自然参数 θ 切换到矩参数 η,直接用 η 梯度更新就行。这在轨迹分布维数很高时非常有价值。
我在实际实现里通常的做法是,高斯均值参数下直接做自然梯度,协方差参数的更新用一个阻尼 Riemannian 近似,结合镜像下降那一套。镜像下降的思想是:不在原参数空间里硬走,而是通过对偶函数映射到“镜像空间”里做一次局部线性化再映射回来。KL 散度作为 Bregman 散度天然支持这种镜像操作,所以 KL 正则化的模型预测控制算法里,很多更新步骤写出来长得就像镜像下降。它保证了每一轮迭代都不会把分布推出可行区域太多,这对有碰撞代价的问题尤其重要。
3.3 消息传递是廉价版的交替投影
如果轨迹模型是链式或者树状的因子图,还有一条工程上更友好、计算复杂度更低的路:消息传递。消息传递算法里,每个节点在局部做一次“投影”,然后把结果以消息形式传给邻居。顺着因子图结构遍历下来,全局后验的统计量就逐渐被逼近。在无环图上,消息传递收敛到精确后验;在有环图(实际问题几乎都有环)上,它只是一个近似,但工程上通常够用。
这里我想强调一个容易被忽略的点:消息传递里每一步其实都是在对偶平坦流形上的局部 e-投影或 m-投影。之所以消息算法在概率图模型里如此稳健,和这种“每次只投影一小块、且投影方向是被 KL 方向定义的”结构有关。真把这种理解落到编程里,你会发现很多看起来花哨的更新规则,其实都是同一套几何在因子图上的展开。你甚至可以在同一个框架里同时容纳高斯消息、离散消息和神经网络参数化的变分分布,只是投影的闭合解会变少,需要数值求解。
4. 三个让我吃过大亏的假设:不确定性、KL方向与高维坍缩
理论部分讲完,下面聊聊实际工程里翻过车的几个地方。说多了都是泪,但每一条都值得后来的人早点看见。
4.1 单峰高斯的尴尬:两个绕行通道,均值却撞墙
我第一次在二维导航里做规划即推断时,用了高斯分布参数化的轨迹分布,后验里同时存在左右两条绕过圆形障碍物的可行通道。由于高斯是单峰的,变分推断在压缩 KL(q||p) 时会倾向于把概率质量集中到其中一个峰,但初始迭代里两个峰的能量接近,它最终会把均值放在两条通道的中间——正好穿过障碍物中心。
这个问题不是因为推断算法写错了,而是指数族分布的表达能力天然受限。解决办法有三条路:一是先用聚类或上层的路径选择把多模态拆开,每个模态单独跑一个单峰推断;二是用混合高斯模型,把模态数量显式建模;三是在代价函数里加一个狭窄的“走廊惩罚”,迫使分布在这个阶段只考虑单条通道。三条路我都试过,工程上第一条最稳,第三条最容易快速验证。记住,当你看到规划结果“抄近路穿墙”时,先别怀疑碰撞代价写错了,想想你的分布族是不是在强行用单峰表达双峰世界。
4.2 KL方向选反了,轨迹会“过度自信”
KL 散度不对称,这个事实在教科书里很不起眼,在工程里却非常致命。变分推断用的是 D(q||p),q 在 p 质量高的地方聚集,结果是一个尖峰,保守但可能太窄;期望传播(EP)用的是 D(p||q),让 q 尽量覆盖 p 的所有质量区域,结果是分布变宽,边界含糊。同样的代价函数,两个方向求出来的最优轨迹会有肉眼可见的差别。
在障碍物边缘的场景里,D(q||p) 求出来的轨迹往往贴着障碍物边缘走,方差很小,似乎非常有把握;D(p||q) 求出来的轨迹会离障碍物远一些,方差更大,看起来更“瞻前顾后”。如果你的下游任务对不确定性特别敏感——比如用这个分布去做风险评估或者概率占位地图判断——一定要刻意检查 KL 方向的选择。我有一次就是默认用了变分方向,结果概率碰撞检测严重低估了风险,差点让机器人从一个很窄的缝隙里挤过去。方向没有绝对的好坏,但它必须和任务的风险偏好匹配。
4.3 高维约束流形上的数值坍缩与阻尼处理
轨迹分布维度上去以后,第二个容易翻车的地方是 Fisher 信息矩阵(或协方差矩阵)的病态。在几十个控制点、每个控制点二维的高斯分布里,协方差矩阵的维度已经有上百。约束条件会把概率质量约束在一个很低的子流形上,导致协方差矩阵某些方向的特征值接近零。这时如果照搬自然梯度更新公式,Fisher 逆会把很小的特征值放大成巨大的步长,迭代直接发散。
我的处理经验是:对 Fisher 信息矩阵做阻尼,更新时加上一个很小的正则项 λI;另外对参数更新的步长用线搜索或自适应方法限制。几何上的解释是:在近似奇异的子流形上,自然梯度的“微商”方向本身不可靠,阻尼相当于在零方向上给了一点惯性,避免系统被数值噪声带走。这个坑很难在低维玩具问题里暴露,一旦上真系统就会非常痛苦,所以建议在实现阶段就预留阻尼接口,不要把步长写死。
5. 落地实操:一个2D轨迹优化示例与参数建议
理论部分适度即可,真正能带走的东西,还是代码和调参经验。最后给一个最小可复现的示例。
5.1 最小可复现示例:点质量、圆形障碍与概率轨迹
场景设为一个点质量需要从起点到终点,中间避让一个圆心在 (1.0, 0.8)、半径 0.35 的圆形障碍物。轨迹用 T 个离散状态点表示,状态为二维位置。先验是相邻点速度的高斯先验,代价包括一个二次碰撞代价和一个终端代价。
在概率框架下,定义未归一化后验:
$$p(\tau) \propto \exp\left(-(\text{平滑代价} + \text{碰撞代价} + \text{终端代价})\right)$$
用一个高斯分布 q(τ) = N(μ, Σ) 去逼近它,直接用自然梯度迭代。每次迭代需要计算对数后验关于 μ 和 Σ 的梯度,并用 Fisher 矩阵做缩放。由于整个问题是高斯加软代价,Fisher 可以近似取为先验的逆协方差矩阵加上一个常数阻尼,不需要真的求逆一个稠密矩阵——利用先验的带状结构,求解线性系统即可。
# 伪码:高斯分布的轨迹推断 mu = initial_trajectory() # T x 2 cov = smooth_prior_cov_inv() # 稀疏矩阵或算子 for k in range(max_iter): g_mu = gradient_log_post(mu, cov, obstacles) g_cov = grad_cov_approx(mu, cov, obstacles) fisher = prior_precision + damping * I mu = mu + lr * solve(fisher, g_mu) cov = update_cov(cov, g_cov, lr) # 需保证对称正定严格说这是最朴素的版本,连协方差更新都做了近似。如果你只想验证几何视角对收敛性的影响,可以把自然梯度版本和普通梯度版本写在一起,比较各自的迭代轨迹。我实测下来,自然梯度版本在中等噪声条件下稳定收敛的迭代数大约是普通梯度版本的 1/3 到 1/5,尤其是在碰撞代价比较尖锐的时候。
5.2 与经典规划器的对比:什么时候值得换成推断框架
什么时候值得用这套框架,而不是继续用 LQR、MPC 或者采样规划器?我的判断标准可以列成一个表:
| 维度 | LQR/MPC(经典控制) | 规划即推断+变分求解 |
|---|---|---|
| 硬约束处理 | 需要额外约束处理模块 | 天然软约束,工程上更灵活 |
| 不确定性表达 | 一般只在状态估计层体现 | 轨迹分布直接给出 |
| 多模态处理 | 不擅长 | 需要显式扩展分布族 |
| 收敛稳定性 | 成熟、依赖问题结构 | 依赖 KL 方向和参数化,但可解释 |
| 实现成本 | 低,工业界成熟 | 中,需要概率图模型基础 |
结论是:如果你的任务只是在线跑一个标准的二次代价 MPC,不需要风险评估,不需要多模态处理,那完全没有必要引入这套几何框架,LQR/MPC 足够好。但如果你需要处理复杂约束、需要量化轨迹不确定性、或者想在一个统一框架下同时处理状态估计和规划,Planning as Inference 这套思路就有很明显的优势。Dually Flat Geometry 框架更多是给这些算法提供“为什么会收敛、该怎么选步长和坐标”的底层解释。
5.3 调参清单与我的个人经验
最后一节整理一下实用清单,都是我自己调过的坑:
- 初始分布。不要从零开始;用经典 RRT 或者直线插值先给一条初始轨迹,把 μ 初始化到那里,方差先设成一个中等大小的常数。方差设太大,前期迭代会漂移;设太小,容易锁死在局部。
- 碰撞代价的锐度。exp(-V) 里的 V 如果太小,概率后验几乎没有峰,优化结果会糊成一团;如果太大,梯度近乎脉冲,任何步长算法都难收敛。先调锐度,再调步长。
- 更新方向。默认用变分方向 D(q||p) 求模式;如果要做风险敏感规划,换成覆盖方向的投影,并接受更大的方差估计。
- 停止判据。不要只看 KL 下降量,加一个“碰撞代价变化量”监视器,两个量同时变小才算真正收敛。
- 阻尼系数。在做自然梯度更新时,把 Fisher 信息矩阵的阻尼系数 λ 设置为当前协方差估计最大特征值的 0.1 倍左右,能有效避免发散。
我个人最后再说一个被反复验证过的小技巧:先把问题压到二维或者三维,把投影路径手动画出来,观察每次迭代的均值和协方差如何移动。这一步能让“对流形上的投影”这个抽象概念变得非常直观;跑顺了再升维,否则高维空间里出问题,你很难判断是算法写错还是参数没调好。
以上这些,就是我在这套理论里从概念到落地过程中,觉得最值得分享的内容。理论不会直接消灭调参,但它会把你从“瞎调”变成“知道自己在调哪个坐标”,这已经是非常大的进步了。