1. 从“控制即推断”说起一个让最优控制与概率模型握手言和的思想第一次看到“Control as Inference”这个说法很多人会愣一下控制是控制推断是推断一个来自控制论和机器人学一个来自统计学习和概率图模型这两件事怎么能扯到一起我当初也是带着这个疑问啃完相关文献的啃完之后最大的感受是——这个视角一旦建立起来很多原本割裂的东西突然就通了。它本质上做的事情是把“求一个最优控制序列”这个优化问题重新表述成“在一个概率图模型里做后验推断”的问题。听起来有点绕但它的价值非常实在一旦控制问题变成了推断问题你就能直接借用变分推断、KL散度、消息传递这一整套成熟工具而且天然处理随机性、天然能和多任务、模仿学习、逆强化学习这些东西接上。这篇是系列的第一篇我只聊基本理论不铺开讲算法实现。目标读者是那些已经接触过最优控制比如LQR、MPC或者强化学习但还没系统理解“控制即推断”这套框架的人。如果你正在做机器人控制、轨迹优化、或者想把概率模型用到决策问题里这套理论值得你花时间搞明白。我会尽量用从业者之间聊天的口吻把核心概念、推导逻辑、以及我踩过的坑讲清楚而不是堆公式吓人。核心关键词会自然穿插在行文里Control as Inference、变分推断、KL散度、MPC、随机最优控制这些词你会在后面的章节反复遇到。先说结论性的直觉传统最优控制把控制输入当成一个待优化的确定性变量目标是最小化代价而Control as Inference把控制输入当成随机变量引入一个“最优性变量”然后问——在观测到“最优性变量为真”的条件下控制序列的后验分布是什么这个后验分布的众数或者均值就对应着最优控制。这个视角的妙处在于它把“硬约束的优化”软化成了“概率分布的推断”代价函数变成了概率分布的负对数KL散度自然登场变分推断成了求解工具。下面我分几个层面把它拆开。2. 核心思路拆解为什么要把控制问题写成推断问题2.1 传统最优控制的痛点在哪里在经典的最优控制里我们通常面对这样一个问题给定系统动力学 (x_{t1} f(x_t, u_t))找一个控制序列 (u_{1:T}) 使得累积代价 (\sum_t c(x_t, u_t)) 最小。确定性环境下这就是一个标准的优化问题LQR有解析解非线性情况用MPC滚动求解。这套框架非常成熟工业界用了几十年MPC模型预测控制在过程控制、自动驾驶里都是主力。但它有几个让我在实际项目里头疼的地方。第一随机性处理起来不自然。真实系统有过程噪声、观测噪声传统做法是把噪声当成干扰用鲁棒控制或者随机MPC去处理但噪声的统计特性往往没有被充分利用。第二约束是硬的。硬约束在数值上容易导致不可行问题尤其是系统接近边界的时候求解器经常报infeasible你得手动放松约束很烦。第三它和概率模型、学习方法的接口不顺畅。你想把学到的先验、示教数据融进去传统最优控制的框架里没有自然的位置放这些东西。2.2 推断视角的切入方式Control as Inference的核心操作是引入一个二值的“最优性变量” (O_t)在每一时刻(O_t 1) 表示“这一步是最优的”。然后我们定义一个条件概率 (p(O_t 1 | x_t, u_t) \propto \exp(-c(x_t, u_t)))也就是说代价越低这一步“最优”的概率越高。这个指数形式不是随便选的它和最大熵原理、和softmax、和统计物理里的玻尔兹曼分布都有深刻联系后面讲KL散度的时候会看到它的好处。有了这个定义整个轨迹的最优性概率就是 (\prod_t p(O_t | x_t, u_t))。控制问题就变成了在给定动力学先验 (p(x_{t1}|x_t,u_t)) 和初始状态分布的前提下求条件分布 (p(u_{1:T} | O_{1:T} 1))。这个后验分布就是我们要的东西。它的众数对应最优控制序列它的整个分布还告诉你不确定性有多大——这是传统最优控制给不了的。我第一次看到这个转换的时候觉得有点“多此一举”明明可以直接优化为什么要绕一圈做推断后来才明白绕这一圈换来的是整个概率工具箱的接入。变分推断、KL散度、期望传播、消息传递这些在概率图模型里打磨多年的方法现在可以直接拿来解控制问题。而且这个框架天然统一了滤波、平滑、控制——它们都变成了同一个图模型上的不同推断问题。2.3 和随机最优控制的关系这里必须提一下随机最优控制因为Control as Inference和它关系极深。经典的随机最优控制比如线性二次高斯LQG处理的是带噪声的系统目标是期望代价最小。而Control as Inference在引入最优性变量之后得到的后验分布其实对应着一个“软”版本的随机最优控制——代价函数被指数化硬的最小值变成了分布的峰值。具体来说如果你用变分推断去近似这个后验得到的ELBO证据下界里会出现两项一项是期望代价一项是熵。熵项就是“软”的来源它鼓励策略保持一定的随机性避免过早收敛到局部最优。这个熵正则化的形式和后来强化学习里大火的Soft Actor-Critic、最大熵RL是一脉相承的。所以如果你做RL理解Control as Inference能帮你把最大熵方法看得更透。3. 核心细节解析变分推断、KL散度与图模型结构3.1 概率图模型的搭建把Control as Inference画成概率图模型结构其实很清晰。节点包括状态 (x_t)、控制 (u_t)、最优性变量 (O_t)。边的话动力学给出 (x_t \to x_{t1}) 和 (u_t \to x_{t1})最优性给出 (x_t \to O_t) 和 (u_t \to O_t)。整个图是一个链状结构加上每个时刻的最优性节点。这个图模型有个特点(O_t) 是观测节点我们“观测到”所有 (O_t 1)。于是问题变成在这个观测条件下的后验推断。如果你熟悉隐马尔可夫模型或者卡尔曼滤波的图模型表示会发现结构很像只是多了一层最优性观测。这个相似性不是巧合——滤波平滑和控制在这个框架下确实是统一的。我建议你在纸上把这个图画一遍标上每个节点的条件概率。画完之后你会发现前向消息传递对应滤波后向消息传递对应平滑而控制就是在这个双向消息传递的基础上做决策。这个直觉对后面理解算法非常有帮助。3.2 变分推断为什么是自然工具后验分布 (p(u_{1:T} | O_{1:T}1)) 通常没法解析计算因为归一化常数涉及对所有轨迹积分维度太高。这时候变分推断登场找一个简单的分布 (q(u_{1:T}))让它在KL散度意义下尽量接近真实后验。KL散度 (D_{KL}(q | p)) 衡量两个分布的差异最小化它就等于最大化ELBO。ELBO的推导是这套理论的核心。我把它写出来但更重要的是理解每一项的含义[ \log p(O_{1:T}) \geq \mathbb{E}{q}[\log p(O{1:T}, x_{1:T}, u_{1:T})] - \mathbb{E}q[\log q(u{1:T})] ]右边第一项是联合对数似然的期望展开之后包含动力学项、代价项来自最优性似然、初始状态项第二项是变分分布的熵。整理之后最大化ELBO等价于最小化期望代价加上一个熵正则项。这就是为什么Control as Inference天然导出“软”最优控制。我第一次推这个ELBO的时候卡在动力学项的处理上。后来发现如果动力学是已知的确定性函数加上高斯噪声那动力学项就是一个高斯对数似然期望可以解析算出来。如果动力学未知那就得用模型学习的方法这是后续文章的内容。基本理论阶段先假设动力学已知。3.3 KL散度的角色与直觉KL散度在这套框架里出现两次一次是变分推断的目标函数一次是策略更新时的分布匹配。它的直觉是如果你用一个分布去近似另一个分布KL散度告诉你“信息损失”有多大。在控制里这个信息损失可以理解为“因为用了简化策略而多付出的代价”。有个细节值得注意KL散度不对称。(D_{KL}(q|p)) 和 (D_{KL}(p|q)) 行为不同。前者是变分推断常用的倾向于让q覆盖p的所有模式mass-covering后者倾向于让q集中在p的某个模式mode-seeking。在控制里选哪个取决于你想要一个保守的策略还是一个激进的策略。这个选择在实际项目里影响很大我后面在常见问题里会展开。3.4 和MPC模型预测控制的连接MPC模型预测控制的核心是滚动时域在每个时刻求解一个有限时域的最优控制问题只执行第一步然后重新求解。Control as Inference和MPC结合就得到所谓的“概率MPC”或者“推断式MPC”。做法是在每个滚动窗口里用变分推断求后验取均值或者采样作为控制输入。这个结合的好处是MPC的硬约束可以软化求解器不容易infeasible而且后验分布给出了控制的不确定性你可以据此做风险敏感的决策。我在一个移动机器人项目里试过这种方案相比传统MPC在接近障碍物时控制更平滑因为熵项让策略不会死盯着约束边界。当然代价是计算量增加因为变分推断通常需要迭代。4. 实操过程与核心环节从理论到可运行的推导4.1 线性高斯情况下的解析解理论讲多了容易飘我们拿线性高斯系统走一遍看看解析解长什么样。假设动力学 (x_{t1} A x_t B u_t w_t)(w_t \sim \mathcal{N}(0, \Sigma_w))代价 (c(x,u) \frac{1}{2} x^T Q x \frac{1}{2} u^T R u)。最优性似然 (p(O_t|x_t,u_t) \propto \exp(-c(x_t,u_t)))。在这个设定下后验分布是高斯分布可以用类似卡尔曼平滑的消息传递精确求出。前向消息是标准卡尔曼滤波后向消息是平滑然后控制后验的均值就是最优控制。这个结果和LQR是一致的——线性高斯情况下Control as Inference退化为LQR。这个验证很重要说明框架是自洽的。我建议你亲手推一遍这个线性高斯情况。推的过程中你会看到后验的精度矩阵里出现了Q和R的指数化版本均值里出现了A和B的转置。这些和Riccati方程里的项一一对应。推完之后你对整个框架的理解会扎实很多。4.2 非线性情况下的迭代求解非线性系统没有解析解得用迭代方法。常见的有两种一种是基于变分推断的梯度上升直接优化ELBO另一种是基于消息传递的期望传播用高斯近似做局部更新。前者实现简单后者收敛快但实现复杂。我一般先用梯度上升跑通因为PyTorch或者JAX自动微分一挂ELBO的梯度就出来了。具体步骤是参数化变分分布 (q(u_{1:T}))比如用高斯分布均值和方差作为可学习参数然后采样轨迹计算ELBO反向传播更新参数。这个过程和训练一个策略网络很像区别在于目标函数是ELBO而不是策略梯度。有个实操细节采样的时候用重参数化技巧这样梯度才能传回均值和方差。这个技巧在变分自编码器里很常见搬到控制里一样管用。我第一次实现的时候忘了重参数化结果梯度估计方差巨大训练根本不收敛排查了半天才发现问题。4.3 参数选择与计算过程变分分布的参数化方式影响很大。最简单的是对角高斯每个时刻的控制独立。但这样忽略了时间相关性得到的策略可能抖动。更好的做法是用一个RNN或者Transformer参数化整个序列的分布捕捉时间依赖。代价是参数量增加训练更慢。熵正则项的系数也需要调。系数太大策略太随机任务完成度低系数太小退化成确定性控制失去推断视角的优势。我的经验是从小系数开始比如0.01然后根据任务完成度和控制平滑度调整。这个系数在RL里通常叫温度参数和Soft Actor-Critic里的alpha是一个东西。计算复杂度方面如果时域长度是T状态维度是n控制维度是m那么每次ELBO计算的复杂度大致是O(T(n^2nmm^2))和卡尔曼滤波同阶。如果变分分布用全协方差复杂度会升到O(T(nm)^3)所以实践中对角或者低秩协方差更常用。5. 常见问题与排查技巧实录5.1 后验坍缩与模式寻求用变分推断最常见的问题是后验坍缩q退化成一个点熵项消失退化成确定性控制。这通常是因为KL散度选错了方向或者熵正则系数太小。解决办法是检查ELBO的推导确保熵项没有被意外约掉然后适当增大熵系数。如果还是不行可以试试用 (D_{KL}(p|q)) 的变体虽然计算麻烦点但不容易坍缩。5.2 数值不稳定与指数溢出最优性似然里的指数函数在代价很大时会溢出。我踩过这个坑代价函数没归一化数值直接爆掉。解决办法是对代价做归一化或者在对数空间计算。具体来说不要直接算 (\exp(-c))而是算 (-c) 然后在对数空间做消息传递。这个技巧在实现高斯消息传递时特别重要。5.3 与MPC结合时的时域选择推断式MPC的时域长度选择是个权衡。时域太短后验近似差控制效果不好时域太长计算量大实时性差。我的经验是时域至少覆盖系统的主要动态时间尺度比如对于一阶系统时域取3到5倍时间常数。如果计算资源紧张可以用滚动时域加终端代价终端代价用值函数近似这个和传统MPC的做法一致。5.4 常见问题速查表问题现象可能原因排查思路解决办法策略抖动严重变分分布忽略时间相关性检查q的参数化方式用RNN或Transformer参数化序列分布训练不收敛梯度估计方差大检查是否用了重参数化改用重参数化技巧数值溢出代价未归一化打印代价数值范围对数空间计算或归一化代价后验坍缩熵系数太小检查ELBO中熵项增大熵系数或换KL方向实时性差时域太长或迭代太多测量单步求解时间缩短时域或用终端代价5.5 独家避坑技巧第一个技巧在实现变分推断之前先用线性高斯情况验证你的消息传递代码。线性高斯有解析解可以逐项对比。我当初跳过这一步直接上非线性结果bug找了三天。第二个技巧ELBO的监控很重要。训练时同时打印期望代价和熵项如果熵项快速趋近于零说明后验在坍缩赶紧调系数。如果期望代价不降可能是变分分布表达能力不够换更强的参数化。第三个技巧和MPC结合时不要每步都重新初始化变分参数。用上一步的后验作为下一步的初始值收敛快很多。这个技巧在滚动时域里特别管用相当于热启动。6. 这个框架后续还能怎么扩展基本理论讲到这里核心的东西都覆盖了最优性变量的引入、概率图模型的搭建、变分推断和KL散度的角色、线性高斯解析解、非线性迭代求解、以及和MPC模型预测控制的连接。我个人在实际操作中的体会是Control as Inference最大的价值不是替代传统最优控制而是提供了一个统一的语言让控制、推断、学习三件事能在同一个框架下对话。你一旦习惯了用后验分布看控制问题很多原本孤立的方法——卡尔曼滤波、LQR、最大熵RL、模仿学习——都会显出内在联系。后续这个系列可以往几个方向走一是动力学未知时的模型学习把系统辨识和推断结合起来二是多任务和元学习用后验做任务推断三是和深度学习的结合用神经网络参数化变分分布处理高维状态。如果你对某个方向特别感兴趣可以顺着这个基本框架往下挖。最后分享一个小技巧读相关文献时重点关注他们怎么定义最优性变量和怎么选变分分布这两个选择基本决定了方法的性质和适用范围。