控制作为变分推断:从贝叶斯视角统一强化学习与最优控制
发布时间:2026/9/28 1:27:26来源:尧图网络
研究强化学习的人迟早会遇到一句话控制问题可以被改写成概率推断问题。这句话在学术界已经流行了很多年但真正把它讲清楚、并能从推导一路走到深度学习算法实现的课程内容其实并不多。伯克利 2026 春季深度强化学习课程的第 13 讲主题就是“控制作为变分推断Control as Variational Inference”。这一讲不教你调 PID也不直接给某个网络的代码而是从贝叶斯推理的视角把最优控制、随机控制和现代强化学习算法重新组织到同一个数学框架下。这一讲的定位非常硬核但收益也很大。如果你已经学过策略梯度、Q 学习这类基础 RL 方法再看这一讲会发现很多算法背后的损失函数不是随便拍脑袋拍出来的而是从“最小化轨迹分布与期望分布之间的 KL 散度”一步步推出来的。整个讲座的核心卖点可以归纳为三点第一用概率图模型统一“预测、推断、控制”三个概念第二给出从最优控制到 KL 控制再到策略优化的一条完整推导链第三能解释 SAC、MPO 这类熵正则化或最大后验策略优化算法为什么要那样设计。本文会围绕四个问题展开控制为什么可以被看成变分推断“变分”到底变分在哪里KL 散度在这个框架里承担什么角色以及这套理论和我们熟悉的工程控制热词比如 PID 控制、FOC 控制、电机控制是什么关系。文章最后会给出一个最小化的 Python 教学示例方便你跑通一次基于变分推断的策略分布更新。如果你正在学习深度强化学习或者写论文时需要理解 SAC、MPO 这些算法的理论动机这一篇文章可以收藏备用。1. 讲座内容速览属性说明课程来源伯克利 2026 春季深度强化学习课程第 13 讲核心主题将控制问题转化为概率推断问题用变分推断统一最优控制与强化学习前置知识概率论、KL 散度、贝叶斯推断、最优控制基础、深度强化学习基础使用工具理论推导为主可配合 Python、PyTorch、NumPy 做最小复现主要难点变分下界推导、KL 方向选择、分布建模、与经典控制概念映射适合人群RL 研究者、控制理论入门者、研究生、算法工程师不涉及内容本讲不重点讲 PID 参数整定、FOC 磁场定向控制、PLC 梯形图等传统工程控制实现这里先给你一个判断标准如果你只是要做 STM32 直流电机调速、FPGA 相控阵相位控制、或者调试一套 PLC 系统那这一讲的实用性不强古典控制方法论已经足够好但如果你关心机械臂、四旋翼仿真、自动驾驶这类“状态多、约束强、策略需要自适应”的控制问题变分推断视角就是一套非常值得掌握的建模武器。2. 为什么“控制”可以看成“变分推断”要理解这一讲首先要接受一个思维模式的转换经典控制是在“找一个动作序列”变分推断下的控制是在“拟合一个轨迹分布”。经典最优控制的起点是状态方程和代价函数目标是最小化累积代价值。而概率推断的起点是一个关于轨迹的概率模型。我们可以把一条从初始状态到目标状态的轨迹看成随机变量它服从某个分布。贝尔曼最优性告诉我们最优策略应该让轨迹尽可能进入低代价区域变分推断则告诉我们最优策略应该让策略诱导出的轨迹分布尽可能接近某个“期望轨迹分布”。这时候控制问题就变成了一个分布逼近问题。假设我们有一个理想的轨迹分布 (p(\tau))它表示“好的、值得发生的轨迹”。我们当前策略 (\pi_\theta) 会诱导出一个实际的轨迹分布 (q(\tau))。我们希望调整 (\theta)让 (q(\tau)) 尽量接近 (p(\tau))。两个分布之间的距离最常用的度量就是 KL 散度[ \min_{\theta} \mathrm{KL}\left(q_\theta(\tau) | p(\tau)\right) ]展开写就是[ \mathrm{KL}\left(q_\theta(\tau) | p(\tau)\right) \mathbb{E}{q\theta}\left[\log q_\theta(\tau) - \log p(\tau)\right] ]看到这个式子你应该已经能感觉到它和策略梯度里常见的“最大化期望回报”其实是同一件事的不同表达。回报高的轨迹在 (p(\tau)) 里的概率大最小化 KL 散度就会让策略更倾向于产生高回报轨迹。这一讲之所以强调“变分推断”是因为直接计算后验轨迹分布通常是不可行的。状态空间一高轨迹组合数就是指数级的根本没法精确求和或积分。变分推断的思路是我们不去求精确后验而是从一族简单的分布里找一个最接近的。这个“找一个最接近的分布”的过程就是变分优化。放在控制里就是我们不去穷举所有可能的控制序列而是在参数化策略族中搜索最优策略。所以标题“控制作为变分推断”可以拆成两个层面控制的目标是推理出最理想的轨迹分布控制的计算过程是变分近似。这就是这一讲的骨架。3. 学习这一讲需要准备什么这一讲不是纯工程操作但要有足够的知识储备才能跟上推导。我建议你在进入第 13 讲之前先确认下面五块基础已经到位。3.1 数学基础最基础的是概率论里的条件概率、边缘化、贝叶斯公式。其次需要理解 KL 散度、交叉熵和期望。变分推断里常用到 Jensen 不等式推导证据下界ELBO但“控制作为变分推断”通常不会只讲静态概率模型它会把 KL 散度放进轨迹空间里因此你最好能习惯“轨迹上的积分”这种写法而不是仅仅会算一维分布。3.2 强化学习基础至少要知道马尔可夫决策过程MDP、策略、价值函数、Bellman 方程。因为第 13 讲一定会把变分推断和这些概念做映射。许多人在这里卡住是因为还没搞清楚“策略”和“轨迹分布”之间的区别。策略是条件概率 (\pi(a|s))轨迹分布是由动力学 (p(s|s,a)) 和策略共同诱导出来的联合分布。3.3 最优控制基础如果了解一点线性二次调节器LQR、模型预测控制MPC会很有帮助。变分推断视角可以看作对非线性、高维控制问题的另一种建模方式。你不一定需要会手推 LQR但要知道“最优控制的核心是找一组控制信号让代价函数最小”这个经典目标。3.4 编程环境虽然这一讲主要做理论但动手写代码能把抽象公式具象化。你只需要一个普通的 Python 环境装上 NumPy、PyTorch 和 matplotlib 就够做最小实验。# 安装最小依赖Python 3.9 环境即可 pip install numpy torch matplotlib3.5 资料获取方式伯克利这类公开课通常会在课程主页放出课件、视频和作业。你可以在搜索引擎里搜“Berkeley deep RL course spring 2026”或直接进入课程官网找到 Lecture 13 对应的 slides。这里不对 URL 做硬编码因为你可能找到镜像或者课程仓库以实际页面为准。4. 核心方法从最优控制到 KL 控制这一讲最重要的理论成果是把最优控制问题重写成一个 KL 最小化问题。整个过程可以分成三步随机化控制、定义目标分布、迭代更新策略分布。4.1 把确定性控制随机化经典控制里的控制信号通常是一个确定性函数 (u_t K(x_t))。但在变分推断框架下我们更希望把控制信号看作从一个条件概率分布 (u_t \sim \pi_\theta(\cdot|x_t)) 中采样。这样做有两个好处一是提供了探索机制二是让“策略分布”和“轨迹分布”之间有了明确的概率关系。随机化并不是丢掉确定性。当策略分布的方差趋于零时它就退化为确定性控制。所以 KL 控制框架实际上是经典确定性最优控制的一种推广它把“最优解”从一条轨迹变成一个分布族。4.2 定义目标轨迹分布变分推断需要一个目标。在概率图模型里轨迹上的概率可以写成[ p(\tau) \propto p(s_0) \prod_{t0}^{T-1} p(s_{t1}|s_t,a_t) \exp(-c(s_t,a_t)) ]这里 (p(s_{t1}|s_t,a_t)) 是环境动力学(\exp(-c(s_t,a_t))) 是代价项。代价越小轨迹概率越大。整个 (p(\tau)) 可以理解为“既符合物理规律又代价足够低”的轨迹分布。这就是目标分布。需要注意的是这个分布通常不是归一化的。变分推断处理未归一化分布时会引入一个配分函数这个配分函数在实际计算中往往可以忽略因为我们要最小化的是带归一化常数的 KL 散度优化过程对常数不敏感。4.3 KL 控制迭代公式假设我们当前策略诱导的轨迹分布为 (q_\theta(\tau))目标轨迹分布为 (p(\tau))KL 控制的目标是[ \min_\theta \mathrm{KL}(q_\theta | p) ]把 KL 散度展开后去掉与 (\theta) 无关的项等价于最小化[ \mathcal{L}(\theta)\mathbb{E}{q\theta}\left[ \log q_\theta(\tau) - \log p(\tau) \right] ]再进一步用代价函数替换 (\log p(\tau))[ \mathcal{L}(\theta)\mathbb{E}{q\theta}\left[ \log q_\theta(\tau) \sum_t c(s_t,a_t) \right] \text{const} ]这个形式已经非常接近强化学习里的损失函数了。第一项鼓励策略分布尽量大熵大第二项鼓励轨迹代价尽量低。所以 KL 控制本质上是“熵正则化最优控制”。你后面看到 SAC 里加上熵项就不会觉得奇怪了因为它在数学上和变分推断控制是相通的。一个典型的 KL 控制迭代流程可以写成这样# 伪代码KL 控制迭代更新 for iteration in range(max_iter): # 1. 从当前策略采样一批轨迹 trajectories policy.sample_trajectories(model, horizonH, num_samplesN) # 2. 估计每条轨迹的代价 costs [sum_cost(traj) for traj in trajectories] # 3. 计算每个轨迹的“重要性权重”近似目标分布 weights softmax(-costs) # 4. 用加权最大似然更新策略分布 policy.update(weighted_surrogate(trajectories, weights))这个流程非常像加权模仿学习只是“模仿”的目标不是专家的轨迹而是低代价轨迹的加权集合。它和 CEM交叉熵方法、MPPI模型预测路径积分也有很强的联系因为这些方法同样在反复采样、加权、更新分布。5. 从变分推断视角看现代强化学习算法第 13 讲不会只停留在 KL 控制理论它一定会把结论推广到现代深度强化学习算法。这里选三个典型例子。5.1 SAC最大熵策略与变分推断SACSoft Actor-Critic的损失函数里有一个显式的熵正则项。它的目标函数可以写成[ J(\pi)\mathbb{E}{(s,a) \sim \pi}\left[ r(s,a) \right] \alpha \mathbb{E}{s \sim \rho_\pi}\left[ \mathcal{H}(\pi(\cdot|s)) \right] ]从变分推断视角看这个熵正则项就是在控制“策略分布不要过早坍缩到某一条确定性轨迹”。它让策略在实现高回报的同时保持一定随机性。这和在 KL 控制里最小化 (\mathrm{KL}(q_\theta | p)) 的项是完全对应的。你可以把 SAC 理解成在有限模型表达力下用变分方式逼近目标轨迹分布的一种实现。5.2 MPO最大后验策略优化MPO 是 DeepMind 提出的离线强化学习算法它的名字“最大后验策略优化”本身就带有贝叶斯色彩。MPO 把策略优化拆成 E 步和 M 步E 步用变分推断估计动作的后验分布M 步让当前策略去拟合这个后验分布。这种写法直接继承了控制作为变分推断的思想。MPO 在处理离线数据时更稳定就是因为它考虑到了动作分布的不确定性而不仅是点估计。5.3 SVG可计算图上的变分策略优化如果你读论文读到 Stein Variational Policy GradientSVPG会发现它把策略参数本身当作随机变量用 Stein 变分梯度下降来更新参数分布。这也是变分推断在控制中的另一种应用不直接优化一个固定的策略参数而是维护参数的分布。这个方向更数学化但它的初衷仍然是“在不精确可解的情况下寻找一个近似的后验策略分布”。6. 最小可运行示例用变分推断更新高斯策略理论讲多了还是要动手。这里给一个教学级最小示例目的是让你直观感受“控制作为变分推断”的更新过程。我们假设一个一维状态的控制问题策略用一个高斯分布表示目标是通过 KL 最小化让策略收敛到某个理想的动作分布。6.1 定义一个高斯策略网络import torch import torch.nn as nn import torch.distributions as dist class GaussianPolicy(nn.Module): def __init__(self, dim1, hidden32): super().__init__() self.net nn.Sequential( nn.Linear(1, hidden), nn.ReLU(), nn.Linear(hidden, dim * 2) ) def forward(self, t): # t 是时间步离散控制问题中通常用不到但保留接口便于扩展 features torch.tensor([t], dtypetorch.float32) out self.net(features) mean out[:1] log_std torch.clamp(out[1:], min-5, max1) std log_std.exp() return dist.Normal(mean, std)这个网络输入时间步 (t)输出动作分布的均值和标准差。为了教学状态被简化成时间索引实际工程里应把状态向量喂进来。6.2 定义目标分布并最小化 KL我们假设某一步的“期望动作分布”是均值 2.0、标准差 0.5 的高斯分布。用 KL 散度作为损失函数更新策略。def train_kl_control(): policy GaussianPolicy() optimizer torch.optim.Adam(policy.parameters(), lr0.01) target dist.Normal(torch.tensor([2.0]), torch.tensor([0.5])) for step in range(500): current policy(t1) # 只更新一步的控制分布简化的教学场景 loss dist.kl_divergence(current, target).mean() optimizer.zero_grad() loss.backward() optimizer.step() if step % 100 0: print(fstep {step}, loss{loss.item():.4f}, fmean{current.mean.item():.4f}, std{current.std.item():.4f}) train_kl_control()这个示例非常简化但它说明了变分推断控制的核心通过最小化策略诱导分布与目标分布之间的 KL 散度策略会逐渐把分布移动到目标区域。你运行后会看到 loss 下降均值接近 2.0标准差接近 0.5。6.3 实验配置模板真实项目里你会希望把超参数和路径放在配置文件中。{ horizon: 10, dt: 0.05, state_dim: 1, action_dim: 1, target_trajectory_file: ./targets/demo.npy, policy: { type: gaussian, hidden_size: 32, log_std_clip: [-5, 1] }, train: { epochs: 500, lr: 0.01, kl_weight: 1.0, seed: 42 } }如果你要做批量实验可以写一个循环读取多个 JSON 配置自动跑不同 seed 或不同目标分布。但要注意这只是教学模板接入真实控制环境时目标分布不可能是一个固定高斯它应该来自环境动力学和代价函数的组合。7. 变分推断控制与经典控制热词的对照搜索热词里高频出现的“PID 控制”“FOC 控制”“电机控制”“PLC 控制系统设计”代表的是工业界最常用的确定性控制方法。很多人会问学了变分推断控制是不是以后可以用它替代 PID答案很明确不是替代而是互补。PID 控制适合模型不确定但有明确误差信号的系统它的优势是简单、可解释、计算开销几乎为零。FOC 控制需要把三相电流变换到旋转坐标系再对 id/iq 电流做 PI 调节它的成功依赖电机的物理模型。PLC 设计梯形图则完全属于逻辑控制和顺序控制和概率推断几乎没有交集。变分推断控制的目标并不是这些细分场景而是高维、非线性、强耦合的决策问题。比如机械臂避障、四旋翼滑模控制、麦克纳姆轮运动学控制、交通信号灯强化学习控制这些场景的状态量多、约束复杂很难手工设计出一套 PID 参数。这时把控制看成变分推断就能借用深度学习工具在轨迹分布空间里搜索策略。可以把两者的适用边界列一个表维度经典控制PID、FOC 等变分推断控制模型需求低维线性或局部线性可离线整定可处理非线性、高维模型实时性微秒到毫秒级计算极轻通常需要 GPU 加速或离线训练可解释性每个参数物理意义明确策略分布和代价函数结构可解释但网络参数难解释数据需求不依赖大数据靠反馈闭环依赖环境交互或离线数据适用场景伺服电机、电源模块、机器人底层驱动自动驾驶决策、机械臂规划、多智能体协同如果你在做底层电机控制继续用 FOC 和级联 PID 就好。如果你在写“基于强化学习和图注意力网络的交通信号灯控制方法”或者做“ai 控制机械臂”这类研究变分推断视角会给你提供理论支撑。8. 常见理解误区和排查方法这里列几个初学者最容易踩的坑以及对应的排查思路。误区可能原因排查方式解决方案把“变分推断”当成“预测”混淆后验估计和轨迹生成重读贝叶斯推断定义明确“推断”是求后验分布不是仿真轨迹KL 散度方向写反不理解 forward KL 和 reverse KL 的区别检查损失函数是 (KL(q|p)) 还是 (KL(p|q))控制问题通常用 (KL(q|p)) 让策略集中在低代价区域策略分布过于简单高斯分布无法表达多模态轨迹分布检查采样的轨迹是否覆盖多个模式改用混合高斯或标准化流显存不足批量采样轨迹过多降低 num_samples 或 horizon用重要性采样和重复使用样本训练不收敛KL 权重过大或学习率过高检查 loss 曲线看是否震荡降低学习率先固定 KL 权重再训练代码示例无法复现只抄了示例但没有适配环境动力学对比目标分布是否来自真实代价根据实际模型重新定义 p(tau)特别提醒一点实现时一定要先确认 KL 方向。在变分推断控制里使用 (\mathrm{KL}(q_\theta | p)) 还是 (\mathrm{KL}(p | q_\theta)) 会导致完全不同的策略行为。前者会促使策略概率密度尽量落在代价低的区域后者会要求策略覆盖所有高概率轨迹哪怕那条轨迹代价不高。SAC 等算法本质上在近似前者的优化路径。9. 工程实践与学习路径建议把这讲内容真正消化不能只靠看视频需要配合推导和实验。第一建议先手推一遍 KL 控制的最简形式。从一维状态、单步控制开始写出概率模型代入高斯分布推导 KL 散度关于策略参数的梯度。这个过程能让你彻底明白“变分”是在变什么。第二去复现一个已知算法。最简单的是 SAC 或类似带熵正则的策略优化算法。你不需要从头实现整个环境可以用 OpenAI Gym 的 Pendulum-v1 做测试。复现完再回到这一讲的理论你会看到每个损失项都有概率解释。第三学完理论后做一个扩展实验。把第 6 节的示例从固定目标分布替换成“环境动力学 代价函数”诱导的目标分布。你可以给轨迹循环加上代价项比如越靠近目标点的轨迹权重越高然后观察策略分布是否逐渐向目标区域移动。第四建立术语映射表。把“最优控制”“回报最大化”“对数后验”“KL 散度”“熵正则化”这些概念放在一起对比你会更容易在不同课程和论文之间迁移。如果你是工程向的读者建议不要直接把这套方法搬到实时控制器上。变分推断控制目前更适合离线训练、仿真验证、以及样本效率敏感的研究场景。工业落地时可以先在仿真环境里训练再结合 MPC 作为安全兜底。10. 总结与下一步这一讲最值得花时间的点是它给你提供了一套统一语言控制不是找一条轨迹而是拟合一个分布强化学习不是单纯最大化回报而是逼近理想轨迹分布。这个视角能解释很多现有算法设计也能帮你设计新算法。第 13 讲之后建议你先用第 6 节的最小示例跑通一次高斯策略的 KL 更新再回到公式推导把 (KL(q_\theta|p)) 展开到最后感受一下“策略分布 - 目标分布 - 代价函数”三者之间的循环关系。最容易踩的坑就是不要急着跳过数学直接调库。变分推断控制的推导链比较长任何一个符号理解错了代码里的 loss 曲线都会变得不可解释。下一步你可以重点关注两个方向一是把这套思想用在 MPC 里把轨迹优化问题改成交替采样和加权更新二是研究离线强化学习里的 MPO 类算法它们会把“控制作为变分推断”变成更工程化的实现。连续体控制、多主体控制、机械臂自适应控制这类复杂问题也会是这套理论未来的主要应用场景。
网站建设高端定制企业官网