
1. 从“控制”到“推断”一个视角的转换第一次接触Control as Inference这个概念是在啃一本强化学习的专著时。当时我正在做一个机械臂抓取的项目用传统的MPC模型预测控制框架调参调得头大——代价函数里的权重稍微变一点抓取轨迹就完全走样每次都要重新整定非常痛苦。后来一位做概率图模型的朋友跟我说“你干嘛不把控制问题当成推断问题来做”这句话当时没太听懂但后来顺着这条线摸下去发现这背后是一整套优雅的理论体系而且和变分推断、KL散度这些工具紧密相连。Control as Inference直译过来就是“控制即推断”。它的核心思想一句话可以概括把最优控制问题重新表述为概率推断问题用推断的工具去求解控制策略。传统最优控制是“给定动力学找一个控制序列使代价最小”而Control as Inference是“给定动力学找一个控制序列使某个概率分布最大”。听起来只是换了个说法但实际带来的好处非常多——它天然处理随机性、天然支持不确定性量化、天然和现代机器学习工具链兼容。这篇文章适合谁看如果你做机器人控制、强化学习、或者对随机最优控制感兴趣但一直觉得传统MPC的调参太玄学或者觉得强化学习的策略梯度方法方差太大那Control as Inference这条路线值得你花时间搞清楚。我会从最基本的理论出发把变分推断、KL散度、MPC这几块怎么串起来讲清楚尽量用生活化的类比让没有概率图模型背景的读者也能跟上。2. 为什么要把控制问题变成推断问题2.1 传统最优控制的痛点在哪里先说说传统最优控制是怎么做的。以最经典的有限时域最优控制为例我们有一个动力学系统x_{t1} f(x_t, u_t) w_t其中w_t是过程噪声。目标是找到一个控制序列u_{0:T-1}使得期望代价最小J E[ sum_{t0}^{T-1} c(x_t, u_t) c_T(x_T) ]在确定性情况下这就是一个优化问题可以用动态规划或者直接法求解。但在随机情况下事情就变得复杂了——你需要考虑噪声的分布需要处理期望而且如果噪声不是高斯的解析解基本不存在。更麻烦的是传统最优控制框架下你很难自然地表达“不确定性”。比如机械臂抓取时你不知道物体的精确质量传统做法是鲁棒控制或者自适应控制但这些方法要么保守要么复杂。而Control as Inference的视角下不确定性直接编码在概率分布里推断过程自动处理了这些不确定性。还有一个痛点传统MPC每一步都要在线求解一个优化问题计算量不小。而Control as Inference可以把控制问题转化成一个推断问题用变分推断的方法离线学习一个策略网络在线只需要前向推理计算效率高很多。2.2 概率视角下的控制问题长什么样Control as Inference的核心构造是这样的引入一个二值随机变量O_t表示“在时刻t是否最优”。定义p(O_t 1 | x_t, u_t) ∝ exp(-c(x_t, u_t))这个式子是整个框架的基石。它的含义是代价越小O_t1的概率越大。换句话说最优控制问题等价于寻找一个控制序列使得O_{0:T}1的概率最大。这个构造的巧妙之处在于它把代价函数变成了概率分布的负对数。代价最小化变成了概率最大化。而概率最大化问题我们有大量的工具可以用——变分推断、期望传播、消息传递等等。但这里有个技术难点我们真正关心的是p(u_t | x_t, O_{0:T}1)即在“最优”条件下控制量的后验分布。这个后验分布通常难以直接计算因为需要边缘化掉未来的状态和观测。这时候变分推断就派上用场了。2.3 变分推断为什么适合这个场景变分推断的基本思想是用一个简单的分布q去近似复杂的后验分布p通过最小化KL散度来优化q。在Control as Inference中我们通常用一个参数化的策略分布q(u_t | x_t)来近似最优控制的后验。为什么变分推断适合因为控制问题天然是序列决策问题而变分推断可以自然地处理序列结构。你可以把整个轨迹(x_{0:T}, u_{0:T})看成一个高维随机变量用因子分解的变分分布去近似后验。而且变分推断的优化目标——证据下界ELBO——可以写成期望形式用采样来估计这和强化学习中的策略梯度方法天然兼容。我个人的体会是变分推断给控制问题带来的最大好处是“可解释的不确定性”。传统MPC给你一条轨迹你不知道这条轨迹有多可靠。而变分推断给你一个分布你可以看到哪些控制量是确定的哪些是模糊的。这在安全关键的应用中非常重要。3. 核心理论拆解从KL散度到最优控制3.1 KL散度衡量两个分布有多“像”KL散度是Control as Inference中最重要的工具之一。它的定义是KL(q || p) E_q[ log q(x) - log p(x) ]直观理解如果你用分布q去编码数据但真实分布是p那么你平均要多花多少比特。KL散度越小两个分布越像。在Control as Inference中我们通常要最小化KL(q(τ) || p(τ | O_{0:T}1))其中τ表示整个轨迹。这个KL散度衡量的是我们用来近似最优控制的变分分布q和真实的最优控制后验分布p之间有多大的差距。但直接最小化这个KL散度有个问题p(τ | O1)本身是未知的因为它涉及到归一化常数p(O1)。这个归一化常数需要对所有可能的轨迹积分通常不可计算。所以我们需要换个思路。3.2 证据下界ELBO绕开归一化常数把KL散度展开KL(q(τ) || p(τ | O1)) E_q[ log q(τ) ] - E_q[ log p(τ, O1) ] log p(O1)注意最后一项log p(O1)和q无关所以最小化KL散度等价于最小化E_q[ log q(τ) ] - E_q[ log p(τ, O1) ]这个量就是负的ELBO。最大化ELBO等价于最小化KL散度。ELBO可以进一步分解。假设轨迹的联合分布可以分解为p(τ, O1) p(x_0) ∏_t p(x_{t1} | x_t, u_t) p(O_t1 | x_t, u_t)而变分分布通常分解为q(τ) q(x_0) ∏_t q(x_{t1} | x_t, u_t) q(u_t | x_t)把这些代入ELBO经过一番推导可以得到一个非常直观的结果最大化ELBO等价于最小化期望代价加上一个熵正则项。具体来说如果q(u_t | x_t)是高斯分布那么ELBO中的熵项就是高斯的熵正比于log σ。这意味着变分推断自动引入了探索——方差越大熵越大ELBO越高。这和强化学习中的最大熵RL是同一个道理。3.3 从推断到控制策略提取一旦我们优化好了变分分布q(u_t | x_t)就可以用它来做控制了。最简单的方式是取q的均值作为控制量u_t E_q[u_t | x_t]但更好的方式是采样因为采样天然处理了不确定性。如果你在做MPC可以在每一步从q中采样多个控制序列然后选代价最小的那个执行。这种做法在随机环境中比取均值更鲁棒。这里有一个重要的细节变分分布q的形式选择。通常我们用高斯分布因为高斯分布的KL散度有解析形式优化起来方便。但如果控制量有约束比如关节角度有限制可以用截断高斯或者Beta分布。我试过在机械臂项目里用截断高斯效果比直接裁剪高斯采样好很多因为裁剪会引入偏差而截断高斯是精确的。3.4 和MPC的关系在线推断 vs 离线学习Control as Inference和MPC的关系很微妙。传统MPC是在线求解一个有限时域优化问题每一步都重新求解。而Control as Inference可以离线学习一个策略在线只做推断。但两者也可以结合用Control as Inference的框架来做MPC。具体来说在每一步把当前状态作为起点用变分推断求解一个有限时域的最优控制问题然后只执行第一步下一步重新推断。这种做法比传统MPC更灵活因为推断过程自动处理了不确定性而且可以用随机优化方法避免陷入局部最优。我实测下来在非线性系统上基于推断的MPC比传统MPC的鲁棒性更好尤其是在模型有误差的情况下。因为推断过程会考虑模型的不确定性而传统MPC通常假设模型是精确的。4. 实操过程从零实现一个简单的Control as Inference4.1 问题设定倒立摆为了让大家能动手复现我选一个经典的控制问题倒立摆。状态是角度θ和角速度θ_dot控制量是力矩u。动力学方程θ_ddot (g sin θ - cos θ * u) / (l * (4/3 - m cos²θ / (m M)))代价函数c(θ, θ_dot, u) θ² 0.1 θ_dot² 0.01 u²目标是把摆稳定在竖直位置。4.2 变分分布的参数化我选择变分分布q(u_t | x_t)为高斯分布均值用神经网络参数化方差用一个可学习的全局参数也可以状态相关但全局参数更简单。神经网络结构输入是状态x_t2维隐藏层64维ReLU激活输出是均值1维。方差初始化为0.1用softplus保证正性。为什么用神经网络而不是线性策略因为倒立摆是非线性的线性策略在远离平衡点时效果很差。神经网络可以拟合非线性策略。4.3 ELBO的蒙特卡洛估计ELBO的表达式是ELBO E_q[ log p(τ, O1) - log q(τ) ]用蒙特卡洛采样估计从q中采样N条轨迹计算每条轨迹的log p(τ, O1) - log q(τ)然后取平均。具体实现时我用重参数化技巧u_t μ(x_t) σ * ε其中ε ~ N(0,1)。这样梯度可以通过μ和σ反向传播。轨迹采样时我用的是随机动力学x_{t1} f(x_t, u_t) w_t其中w_t ~ N(0, 0.01)。这样ELBO的估计是无偏的。4.4 训练细节和超参数优化器用Adam学习率1e-3。每轮采样10条轨迹每条轨迹长度200步。批量大小是10条轨迹。训练过程中我监控三个量平均代价、策略熵、KL散度。平均代价应该逐渐下降策略熵应该先增后减初期探索后期收敛KL散度应该逐渐减小。这里有个坑如果方差参数初始化太小策略会过早收敛到局部最优。我试过初始化方差为0.01结果策略直接卡在某个次优解。后来改成0.1效果好很多。所以方差初始化很关键建议不要小于0.05。另一个坑轨迹长度不能太短。如果轨迹长度只有50步ELBO的估计方差很大训练不稳定。我建议至少200步如果计算资源允许500步更好。4.5 策略提取和在线控制训练完成后策略就是q(u_t | x_t)的均值。在线控制时每一步取u_t μ(x_t)。如果想更鲁棒可以采样多个u_t选代价最小的。我实测下来在倒立摆上基于推断的策略比传统LQR在远离平衡点时表现更好因为LQR是线性的而神经网络策略是非线性的。但在平衡点附近LQR更平滑因为神经网络策略有轻微的抖动。5. 常见问题与排查技巧实录5.1 训练不收敛怎么办这是最常见的问题。首先检查ELBO的估计方差。如果方差太大增加采样轨迹数。其次检查学习率太大容易震荡太小收敛慢。我一般从1e-3开始如果震荡就降到1e-4。还有一个容易被忽略的点代价函数的尺度。如果代价函数值太大比如1e6梯度会爆炸。建议把代价函数归一化到1附近。我通常先跑一遍随机策略统计平均代价然后用这个值做归一化。5.2 策略过早收敛到次优解这是变分推断的经典问题——KL散度的“模式寻求”行为。因为KL(q||p)倾向于让q覆盖p的某个模式而不是所有模式。如果p是多峰的q可能只学到其中一个峰。解决方法用KL(p||q)代替KL(q||p)也就是期望传播。但期望传播计算更复杂。另一个方法是增加策略的熵比如在ELBO中加一个熵 bonus。我试过加0.01的熵 bonus效果不错。5.3 在线控制时抖动严重这通常是因为策略的方差太小导致控制量变化剧烈。解决方法在在线控制时不要直接用均值而是用均值加上一个小噪声或者用低通滤波平滑控制量。我通常用一阶低通滤波u_filtered α * u_new (1-α) * u_oldα取0.3左右。这样控制量平滑很多代价略有增加但可以接受。5.4 和传统MPC的对比维度传统MPCControl as Inference计算方式在线优化离线学习在线推断不确定性需要显式建模自动处理调参难度高权重大量整定中方差初始化关键实时性依赖优化求解器前向推理快最优性局部最优全局近似这个表是我个人经验的总结不一定适用于所有场景。但大体上Control as Inference在不确定性和实时性上有优势传统MPC在确定性和最优性上有优势。5.5 一个容易被忽略的细节时间步长时间步长的选择对Control as Inference影响很大。如果步长太大动力学离散化误差大ELBO估计有偏。如果步长太小轨迹长度增加计算量变大。我通常用系统最快时间常数的1/10作为步长。倒立摆的时间常数大约是0.5秒所以步长取0.05秒。这个经验规则在大多数机械系统上都适用。6. 从理论到实践一些个人体会Control as Inference这个框架我用了大概半年时间从理论推导到代码实现踩了不少坑。最大的体会是它不是一个“即插即用”的方法而是一个思考问题的视角。当你把控制问题看成推断问题时很多传统方法里棘手的问题——比如不确定性、探索、鲁棒性——都变得自然了。但也不要迷信它。在确定性、线性、无约束的问题上传统LQR和MPC仍然是最优选择。Control as Inference的优势在于非线性、随机、有不确定性的场景。另外变分推断只是推断工具箱里的一种。期望传播、粒子滤波、MCMC都可以用。选择哪种取决于问题的规模和实时性要求。对于高维状态空间变分推断是唯一可行的对于低维粒子滤波可能更准确。最后分享一个小技巧如果你在实现ELBO时遇到数值不稳定试试用log-sum-exp技巧。具体来说把log p(τ, O1) - log q(τ)写成log p(τ, O1) - log q(τ)然后用logsumexp计算期望。这个技巧在轨迹很长时特别有用因为log p(τ, O1)可能非常负直接指数会下溢。这个方向后续还可以扩展比如和扩散模型结合用扩散模型做变分分布或者和Transformer结合用注意力机制参数化策略。这些都是最近比较活跃的方向有兴趣的读者可以继续深挖。