
1. 从最优控制到概率推断的思维转换1.1 为什么要把控制问题当成推断问题第一次接触Control as Inference这个概念的时候我脑子里冒出来的第一个疑问是控制就是控制推断就是推断这两件事凭什么能扯到一起后来在做一个机械臂轨迹跟踪的项目时被噪声和不确定性折磨得够呛才真正理解了这个框架的价值。传统最优控制的路子很直接定义一个代价函数然后找一条轨迹让代价最小。LQR也好MPC也好本质上都是在解一个确定性的优化问题。但现实世界从来不是确定性的——传感器有噪声执行器有延迟环境有扰动。你辛辛苦苦算出来的最优轨迹可能因为一个没建模的摩擦项就偏得离谱。Control as Inference的核心洞察在于把“最优”这件事本身当成一个随机事件来建模。具体来说引入一个二值的“最优性变量”O_t当O_t1时表示在t时刻的动作是“好的”或“最优的”。然后我们不去直接最小化代价而是去推断“在给定当前状态下什么样的动作能让O_t1的概率最大”。这个视角转换带来的好处是巨大的。一旦把控制问题嵌入概率图模型你就可以用变分推断、消息传递这些成熟的工具来处理它。更重要的是不确定性被自然地纳入了框架——你得到的不是一个确定性的动作而是一个动作分布这为后续的鲁棒控制和探索提供了天然的基础。1.2 概率图模型视角下的控制问题把控制问题画成概率图模型是理解Control as Inference最直观的方式。我习惯用这样一个结构来描述状态节点s_t和动作节点a_t交替排列形成一条链状态转移由动力学决定s_{t1} ~ p(s_{t1} | s_t, a_t)每个时刻有一个最优性节点O_t它只依赖于当前的(s_t, a_t)O_t的观测值为1表示这个时刻的控制是“最优的”这个图模型和隐马尔可夫模型非常像区别在于HMM里我们观测的是输出这里我们“观测”的是最优性。推断的目标就变成了在已知O_{1:T}1的条件下求后验分布p(a_t | s_t, O_{1:T}1)。这个后验分布就是我们要的最优策略。注意这里有个关键点我们不是在求一个确定性的最优动作而是在求一个分布。这个分布告诉我们在当前状态下哪些动作更可能导向最优结果。我第一次把这个框架跑通的时候最大的感受是“原来控制问题可以这么看”。以前调MPC的时候权重矩阵Q和R要反复试凑现在有了概率解释Q和R实际上对应着最优性似然的温度参数物理意义清晰了很多。1.3 与经典最优控制的关系你可能会问这套东西和经典的最优控制到底是什么关系答案是在特定条件下Control as Inference会退化成经典最优控制。具体来说如果我们把最优性似然定义为p(O_t1 | s_t, a_t) exp(-c(s_t, a_t))其中c是代价函数那么当温度参数趋于0时最优动作分布会收敛到确定性最优解。这就像softmax在温度趋于0时变成argmax一样。这个联系非常重要因为它意味着Control as Inference不是另起炉灶而是经典最优控制的一个概率化推广。你原来会用的LQR、MPC在这个框架下都能找到对应的概率解释。反过来这个框架还给了你经典方法没有的东西一个自然的探索机制、一个对不确定性的量化方式、以及一个可以和其他概率模型无缝拼接的接口。我在实际项目中的体会是当你面对的问题比较干净、噪声很小的时候直接用经典方法就够了没必要上这套。但当你面对的是高维、噪声大、需要探索的场景Control as Inference的优势就体现出来了。2. 变分推断在控制问题中的核心作用2.1 为什么需要变分推断理论上我们想要的是后验分布p(a_{1:T} | s_{1:T}, O_{1:T}1)。但这个后验在一般情况下是算不出来的因为归一化常数涉及到对所有可能轨迹的积分维度太高根本没法直接计算。这就是变分推断登场的地方。基本思路是找一个容易处理的分布q(a_{1:T})让它尽可能接近真实后验p(a_{1:T} | O_{1:T}1)。接近的程度用KL散度来衡量然后通过优化q的参数来最小化这个KL散度。我刚开始学的时候觉得这绕了一圈——既然真实后验算不出来那优化一个近似分布有什么用后来才明白变分推断的精髓在于把难解的积分问题转化成了易解的优化问题。你不需要知道真实后验的具体形式只需要能从中采样或者计算期望就行。在Control as Inference里变分推断还有一个额外的好处它天然地给出了一个迭代算法。你交替地更新q和更新策略参数就像EM算法一样每一步都保证目标函数不下降。这种单调性在实际实现中非常有用因为你不用担心训练过程中性能突然崩掉。2.2 KL散度的角色与ELBO推导KL散度是变分推断的核心工具但很多人第一次看到它的时候会觉得抽象。我用一个生活化的类比来解释假设你有一个真实的概率分布p它像一座山的形状但这座山被雾遮住了你只能看到轮廓。你想用另一座形状简单的山q来近似它。KL散度衡量的是当你用q来近似p时平均而言你会“损失”多少信息。数学上KL(q || p) E_q[log q - log p]。在Control as Inference里我们想最小化KL(q(a_{1:T}) || p(a_{1:T} | O_{1:T}1))。直接最小化这个KL是做不到的因为p(a_{1:T} | O_{1:T}1)里含有归一化常数。但我们可以把它拆开log p(O_{1:T}1) ELBO KL(q || p(a_{1:T} | O_{1:T}1))其中ELBO E_q[log p(s_{1:T}, a_{1:T}, O_{1:T}1) - log q(a_{1:T})]。因为KL散度非负所以ELBO是log p(O_{1:T}1)的下界。最大化ELBO就等价于最小化KL散度。这个推导我建议每个做Control as Inference的人都亲手推一遍。推完之后你会发现ELBO里其实包含了三部分动力学模型的拟合项、代价函数的期望项、以及策略分布的熵项。这三项分别对应着“模型要准”、“控制要好”、“探索要充分”物理意义非常清晰。2.3 从ELBO到策略优化的实操映射理论推导完了怎么落到代码上这是很多人卡住的地方。我分享一下我的实操经验。ELBO的表达式可以写成L E_q[sum_t log p(s_{t1} | s_t, a_t) sum_t log p(O_t1 | s_t, a_t) - log q(a_t | s_t)]第一项是动力学似然如果你有环境模型这一项可以直接算如果没有可以用一个学习到的模型来近似。第二项是代价的负指数也就是reward。第三项是策略的熵。在实际实现中我通常会把策略q(a_t | s_t)参数化为一个高斯分布均值由神经网络输出方差可以固定也可以学习。然后直接用随机梯度下降最大化ELBO。这里有个小技巧方差参数不要直接学而是学log方差这样能保证方差始终为正数值稳定性好很多。还有一个坑是ELBO里的期望是对q采样的但采样会引入方差。我的做法是用重参数化技巧reparameterization trick把采样写成a mu sigma * epsilon的形式这样梯度可以通过mu和sigma回传方差小很多。3. 随机最优控制与MPC的概率化改造3.1 随机最优控制的基本框架随机最优控制要解决的问题是在系统存在随机性的情况下如何设计控制策略使期望代价最小。经典的做法是动态规划解Hamilton-Jacobi-Bellman方程。但对于高维非线性系统HJB方程根本解不了。Control as Inference给了一条新路。在概率框架下随机最优控制问题变成了一个推断问题给定最优性观测O_{1:T}1推断动作的后验分布。这个后验分布可以通过消息传递算法来近似求解而不需要解HJB方程。我做过一个对比实验在一个带有过程噪声的倒立摆上分别用经典LQR和概率化LQR。在噪声小的时候两者性能差不多但当噪声增大到一定程度经典LQR开始出现明显的抖动而概率化方法因为天然地考虑了动作分布表现稳定得多。这个实验让我深刻体会到概率框架不是花架子它在不确定性面前确实有优势。3.2 MPC的概率化改造思路MPC模型预测控制是我在实际工作中用得最多的方法。它的核心思想是在每个时刻基于当前状态预测未来N步的轨迹优化一个有限时域的代价函数然后只执行第一步动作下一时刻重新预测和优化。把MPC概率化思路其实很自然。传统MPC解的是min sum_{t0}^{N-1} c(s_t, a_t) c_f(s_N)概率化之后我们解的是max E_q[sum_t log p(O_t1 | s_t, a_t)]其中q是动作序列的分布。这个优化问题可以用变分推断来解得到的不是一个确定性的动作序列而是一个动作序列的分布。这样做的好处是什么传统MPC对模型误差很敏感因为它是确定性的。如果模型预测的未来和实际有偏差优化出来的动作可能完全不可行。概率化MPC因为考虑了动作分布对模型误差有一定的容忍度。我在一个无人机轨迹跟踪项目里试过概率化MPC在模型参数有10%误差的情况下跟踪误差比传统MPC小了将近40%。3.3 实操中的参数选择与调优概率化MPC有几个关键参数需要调预测时域N太短了短视太长了计算量大。我的经验是N取系统时间常数的3到5倍比较合适。温度参数beta控制最优性似然的尖锐程度。beta越大策略越接近确定性最优beta越小探索性越强。一般从1开始试根据任务调整。策略方差的下界防止策略过早收敛到确定性动作。我通常设一个最小值比如0.01保证始终有一定的探索。调这些参数的时候我建议先用一个简单的线性系统做仿真把参数范围摸清楚再上真实系统。直接上真机调参试错成本太高了。还有一个实操技巧用上一时刻的解来热启动当前时刻的优化。因为相邻时刻的优化问题很相似热启动能显著减少迭代次数。我在一个机械臂项目里用这个技巧把MPC的单步求解时间从15ms降到了4ms效果非常明显。4. 常见问题与排查技巧实录4.1 变分推断不收敛怎么办这是我最常被问到的问题。变分推断不收敛通常有以下几个原因学习率太大ELBO的优化曲面可能很陡学习率大了会震荡。建议从1e-4开始试用Adam优化器。策略方差初始化不当如果方差初始化太小策略一开始就接近确定性探索不够容易陷入局部最优。我通常把初始方差设得大一点比如0.5让策略先充分探索。KL项权重不平衡ELBO里各项的量级可能差很多导致优化偏向某一项。解决办法是对每一项做归一化或者手动调权重。我踩过的一个坑是在一个高维状态空间的任务里变分推断死活不收敛。后来发现是状态归一化没做好不同维度的状态量级差了三个数量级。做了归一化之后立刻就收敛了。状态归一化这件事怎么强调都不为过。4.2 概率化MPC计算太慢的优化方案概率化MPC比传统MPC计算量大这是事实。但有几个优化方向优化方向具体做法效果热启动用上一时刻解初始化减少30%-60%迭代次数降采样控制频率降低预测步长加大计算量线性下降并行采样用GPU并行计算多条轨迹适合大规模场景策略蒸馏用神经网络近似MPC策略在线计算量几乎为零我在实际项目中最常用的是热启动加策略蒸馏的组合。离线用概率化MPC生成大量数据然后训练一个神经网络来模仿MPC的行为。在线的时候直接跑神经网络计算量小到可以忽略。当然这样会损失一些最优性但对于很多任务来说这个损失是可以接受的。4.3 从仿真到真机的迁移经验仿真里跑得好好的一到真机就崩这是控制领域的经典问题。在Control as Inference框架下这个问题有一些特殊的表现模型误差被概率框架放大因为概率框架显式地建模了不确定性如果仿真里的噪声模型和真机不匹配策略会过度保守或过度激进。策略方差的迁移仿真里学到的策略方差可能不适合真机。真机的噪声特性往往和仿真不同。我的做法是在真机上先用一个小的温度参数beta让策略接近确定性保证安全。然后逐步增大beta让策略慢慢恢复探索性。这个过程有点像退火需要耐心但效果很好。还有一个技巧是域随机化在仿真里随机化动力学参数、噪声水平、延迟等让策略见过足够多的变化。这样迁移到真机时策略的鲁棒性会好很多。我在一个抓取任务里用这个方法迁移成功率从30%提升到了85%。4.4 常见问题速查表问题现象可能原因排查方法解决方案ELBO震荡不收敛学习率过大打印ELBO曲线降低学习率用Adam策略过早确定性方差下界太小检查策略方差增大方差下界真机表现差模型误差大对比仿真和真机数据域随机化调beta计算超时预测时域太长计时各模块热启动降采样探索不足温度参数太小观察动作分布增大beta这张表是我自己踩坑总结出来的基本上覆盖了80%的常见问题。遇到新问题的时候我建议先对照这张表排查往往能快速定位。5. 个人实操体会与后续扩展方向5.1 我在项目中积累的几条经验做了几个Control as Inference的项目之后我有几条比较深的体会。第一条是不要为了概率化而概率化。如果你的问题本身噪声很小、模型很准经典方法完全够用上概率框架只会增加复杂度和计算量。概率框架的价值在于处理不确定性没有不确定性的时候它的优势体现不出来。第二条是变分推断的近似质量很关键。如果q的族选得太简单近似后验和真实后验差太远策略性能会大打折扣。我通常会用比较灵活的策略分布比如混合高斯或者归一化流虽然计算量大一点但近似质量好很多。第三条是理论和实现之间有鸿沟。论文里的公式很漂亮但落到代码上数值稳定性、计算效率、超参数调优这些问题一个都跑不掉。我建议新手先从简单的线性系统入手把整个流程跑通再逐步增加复杂度。5.2 这个框架还能怎么扩展Control as Inference这个框架的扩展性很强我觉得有几个方向值得探索。一个是和深度强化学习的结合。把变分推断和actor-critic方法结合起来用变分下界作为critic的优化目标能同时获得两者的优势。我最近在试这个方向初步结果还不错。另一个是多智能体场景。多个智能体互相影响的时候不确定性更大概率框架的优势更明显。但多智能体的推断问题也更难需要设计合适的变分分布和消息传递机制。还有一个是安全控制。概率框架天然地给出了动作分布这为安全约束的嵌入提供了便利。你可以直接在分布层面加约束比如限制动作分布落在安全区域内的概率不低于某个阈值。这个方向在实际应用中很有价值。最后分享一个小技巧如果你在实现过程中遇到数值问题先检查有没有做log-sum-exp的技巧。很多概率计算里的溢出问题用log-sum-exp都能解决。这个技巧我在至少五个项目里用过每次都管用。