这次我们来看伯克利 2026 春季深度强化学习课程的第 11 讲变分推断。先说结论这是一节理论课但它不是那种“听完只知道公式、不知道往哪用”的推导课。变分推断Variational Inference, VI在深度强化学习里的地位比多数人想的要实在得多。你熟悉的最大熵算法 SAC本质上是一个变分推断过程Dreamer 这类基于模型的强化学习算法训练世界模型时用的也是变分自编码器那一套 ELBO 目标策略优化里常见的 KL 正则化、Trust Region、VMPO、AWR背后都是同一个分布逼近框架。所以这讲的价值在于把“推断问题”和“策略优化”之间的桥梁打通。读完你就能理解为什么 SAC 的目标函数里要加一个熵项为什么 VMPO 的策略更新要写成带 KL 约束的优化为什么世界模型里的隐变量要变成后验采样而不是直接前向预测。这篇文章会把第 11 讲的核心逻辑拆成几个模块先建立变分推断的数学镜头然后把它映射到策略优化再推进到 SAC、VMPO 和模型类算法的具体形式最后给出一套工程层面的验证和调试方法。适合正在读强化学习论文、准备复现 SAC/Dreamer、或者想给自己的算法加约束正则的读者。1. 本讲核心信息速览项目说明课程来源伯克利 2026 春季深度强化学习课程本讲主题变分推断及其在深度强化学习中的应用前置要求概率论基础、贝叶斯公式、基础深度强化学习策略梯度、Q 学习、PyTorch 使用经验核心数学工具ELBO、KL 散度、重参数化技巧、拉格朗日对偶对应算法SAC、VMPO、AWR、Dreamer、TD-MPC适合读者强化学习研究者、算法工程师、对深度强化学习算法原理感兴趣的研究生学习方式公式推导 算法映射 开源仓库代码对照验证方式在连续控制环境如 HalfCheetah、Walker2d上对比熵正则开关、KL 约束系数变化需要说明的是这不是一个一行命令就能跑起来的工具类项目而是算法原理课。但原理可以直接落到你的策略优化代码上SAC 的温度系数、Dreamer 世界模型的 KL 损失、PPO 的 clipped surrogate都可以用本讲的镜头重新理解。2. 为什么深度强化学习需要变分推断先看一个看起来不相关的问题假设你有一个隐变量模型观测到数据 x想要知道隐变量 z 的后验分布 p(z|x)。贝叶斯公式给出了答案p(z|x) p(x|z) p(z) / p(x)难点在分母 p(x)也就是证据。当 z 是高维连续变量时这个积分通常算不出来。于是变分推断的思路是找一个容易计算的分布 q(z)让它尽量逼近真实后验 p(z|x)。这就是第 11 讲的第一块核心拼图用一个代理分布替代真实后验这个代理分布就叫变分分布。现在切换到强化学习。如果你把策略 π(a|s) 看成是一个条件分布把强化学习的目标看成是寻找最优分布你会发现两者的结构几乎一模一样变分推断里q(z) 逼近 p(z|x)。策略优化里π_new(a|s) 逼近一个基于指数优势权重的目标分布。更具体地说在最大熵强化学习里最优策略的形式是π*(a|s) ∝ exp(Q*(s,a) / α)这个形式不是凭空造出来的。它就是一个“隐式后验”——给定状态 s 和回报 Q 时动作的后验分布。于是求最优策略变成了求后验分布而策略网络就是那个变分分布 q。SAC 等算法训练的每一步都相当于在做一次变分推断。这就是整讲课的核心论题深度强化学习中的一大类策略优化问题可以被重新理解为变分推断问题。理解了 ELBO就等于理解了策略更新的本质。3. 变分推断的数学镜头从 ELBO 开始变分推断的目标是让 q(z) 接近 p(z|x)。直接最小化 KL 散度无法计算因为里面还是含有 p(x)。所以常规做法是最大化证据下界 ELBO。推导过程很简洁。对 log p(x) 做分解log p(x) E_{q(z)}[log p(x, z)] - E_{q(z)}[log q(z)] KL(q(z) || p(z|x))调换顺序得到log p(x) ELBO(q) KL(q(z) || p(z|x))其中ELBO(q) E_{q(z)}[log p(x | z)] - KL(q(z) || p(z))这个式子说明ELBO 包括两项。第一项是重构项鼓励隐变量 z 能很好地重建观测 x。放在强化学习里对应的是策略选择的动作能获得较高回报。第二项是 KL 项限制变分分布不要偏离先验太多。放在强化学习里对应的是策略更新不能离旧策略太远也就是 Trust Region 的思想来源。关于 KL 方向的细节值得单独提出来。变分推断中严格写是 KL(q || p)但在实际推导里因为 p(z|x) 不可计算等价使用的目标是最大化 ELBO而 ELBO 展开后真实的 KL 项是 KL(q(z) || p(z|x))。在强化学习里常见的正则约束用 KL(π_new || π_old)方向选择会影响梯度估计和实际效果。很多人在 SAC 和 VMPO 的代码里看到 KL 散度方向不一致时感到困惑第 11 讲明确这一点就能省很多排查时间。4. 从推断到策略优化变分推断如何映射到深度强化学习把变分推断的框架搬到策略优化需要做一组对应变分推断强化学习隐变量 z动作 a观测 x状态回报或状态-动作对的长期价值变分分布 q(z)策略 π_θ(a先验 p(z)参考策略或初始策略重构项 log p(xz)证据 log p(x)最优策略对应的最大价值函数KL 正则策略更新步长约束在这个映射下策略优化问题就有了一个统一写法在每个状态 s 下最大化E_{a ~ π_new}[Q(s,a)] - α · KL(π_new(·|s) || π_old(·|s))这是一个典型的“回报提升 分布距离惩罚”问题。使用拉格朗日乘子或者直接求闭式解可以得到π_new(a|s) ∝ π_old(a|s) · exp(Q(s,a) / α)这个表达式和你在 VMPO、AWR、MPO 论文里看到的策略更新形式高度一致。它说明了一件事所谓策略优化本质是在“带约束的条件下求一个更好分布”。指数优势权重是目标分布策略网络是变分分布KL 约束是安全护栏。由此深度强化学习算法可以按变分推断的实现方式分成两类关闭式解 损失拟合先计算目标分布的形状再用监督学习去拟合。VMPO、AWR 走这条路。直接梯度优化把 ELBO 的整体形式作为损失函数让网络端到端更新。SAC 的软策略迭代走这条路。两类方法在数学上没有本质区别区别在工程实现和梯度方差。5. 从 ELBO 到 SAC软策略迭代的推导线索SAC 是最能体现变分推断思想的深度强化学习算法之一。本讲如果没有把它作为主要案例至少也会在应用部分反复引用。这一节我们把推导线索理清楚。SAC 的优化目标是最大熵目标J(π) Σ_t E[(r(s_t,a_t) α H(π(·|s_t)))]策略评估步骤中使用软贝尔曼算子T^π Q(s,a) r(s,a) γ E_{s~p, a~π}[Q(s,a) - α log π(a|s)]策略改进步骤中新的策略在给定状态下求解π_new arg min_{π} D_KL( π(·|s) || exp(Q^π(s,·) / α) / Z^π(s) )这里 Z^π(s) 是配分函数仅用于归一化不参与对策略参数的梯度。展开 KL 后SAC 的策略损失函数为L_π(θ) E_{s ~ D, a ~ π_θ}[ α log π_θ(a|s) - Q_φ(s,a) ]仔细看这个损失和 ELBO 的对应关系Q 项对应重构项 / 回报项α log π 对应 KL 正则。SAC 训练时温度系数 α 会自动调节相当于给 KL 约束项动态加权。这种做法和变分推断里的 free bits、KL annealing 在精神上完全一致。实际复现 SAC 时最值得观察的就是 α 的变化趋势。α 持续增大说明策略熵收益显著算法希望更大胆探索α 掉到接近零说明任务后期策略已经收敛熵约束不再重要。用变分推断的话说KL 正则项在训练后期逐渐失去约束力优化重心完全转移到价值提升上。6. 变分策略优化VMPO 与 KL 约束的闭式解VMPOVariational Maximum Penalized Policy Optimization是变分推断进入策略优化最直接的例子。它的目标不是直接最大化回报而是最大化一个带惩罚的变分下界。VMPO 的策略更新分成两个步骤。第一步构建目标分布对每个状态计算从当前策略出发用指数优势权重放大的目标策略π_target(a|s) ∝ π_old(a|s) · exp(A(s,a) / α)第二步拟合变分分布用监督学习让策略网络逼近这个目标分布同时控制 KL 距离不超过阈值 εmin E_s KL( π_θ(·|s) || π_target(·|s) ) s.t. E_s KL( π_θ(·|s) || π_old(·|s) ) ≤ ε这个带约束的优化用拉格朗日乘子处理后更新方向和 ELBO 的梯度方向一致。相比 PPO 的 clip 机制VMPO 是一种更“分布化”的更新规则它先定义了一个目标分布然后做分布匹配。离线强化学习算法 AWR 其实也是同一种思路只是把策略约束和优势权重做得更轻量。在代码实现上VMPO 的关键损失函数可以写成# VMPO 风格策略更新示意实际实现需要按仓库接口调整 def vmpo_policy_loss(log_probs_old, log_probs_new, advantages, alpha, kl_limit): # 目标分布权重指数优势 weights torch.exp(advantages / alpha).detach() # 拟合目标分布负对数似然 fit_loss -(weights * log_probs_new).mean() # KL 约束 kl (log_probs_old.exp() * (log_probs_old - log_probs_new)).sum(-1).mean() # 简单实现KL 超过阈值则加入惩罚 penalty torch.clamp(kl - kl_limit, min0.0) * 10.0 return fit_loss penalty这里不需要在意代码细节是否和论文严格一致重要的是理解结构目标分布产生权重策略网络做分布拟合KL 控制更新步长。这就是变分推断在深度强化学习落地时的标准三件套。7. 基于模型强化学习中的变分推断从 Dreamer 到隐空间规划变分推断在深度强化学习里另一大块应用是基于模型的算法代表是 Dreamer 系列和 TD-MPC。这些算法训练世界模型时核心问题就是“从图像观测中学习一个紧凑隐状态”这和变分自编码器训练几乎一样。以 Dreamer 系列的世界模型为例观测 o_t 由隐状态 z_t 通过解码器生成隐状态由循环网络建模p(o_t | z_t) 是重建观测的似然 p(z_t | z_{t-1}, a_{t-1}) 是状态转移先验 q(z_t | z_{t-1}, a_{t-1}, o_t) 是编码后验世界模型训练目标就是最大化如下形式的 ELBOL Σ_t [ E_q[ log p(o_t | z_t) ] - β · KL( q(z_t | ...) || p(z_t | ...) ) ]这个形式和前面纯理论推导一模一样。训练时需要注意 KL 项的处理如果 β 设置过大模型可能退化成忽略隐变量只靠 decoder 生成模糊平均图像这叫 posterior collapse。如果 β 设置过小隐变量可能携带过多噪声信息预测不稳定。常用的缓解技巧包括 KL loss 截断free bits、KL annealing、以及把 KL 项拆成两个方向分别加权。在实现世界模型的重点观察项上建议按下面的角度逐项检查重构误差是否持续下降能否看到清晰的图像重建画面。KL 散度项的数量级是否合理是否出现接近零的“塌缩”现象。隐空间 rollout 的预测轨迹是否在前期几步保持合理不会立刻发散。在真实环境交互时基于隐状态规划的回报是否正确反映环境变化。如果已经跑过 DreamerV2 或 TD-MPC 的官方实现可以打开训练日志重点看 KL loss 和 reconstruction loss 的变化曲线。这两条曲线的此消彼长就是变分推断训练的直接体现。8. 工程实现要点损失函数、重参数化与训练日志理论最终要落到代码。无论你是想复现 SAC、VMPO 还是 Dreamer下面几个和变分推断直接相关的工程点都需要注意。8.1 重参数化技巧从高斯分布采样得到动作或隐变量时直接采样会导致梯度无法回传到均值和方差参数。标准解法是z μ σ ⊙ ε, ε ~ N(0, I)PyTorch 中可以利用torch.distributions.Normal.rsample()完成这一步。import torch def reparameterized_sample(mu, log_std): std torch.exp(log_std) eps torch.randn_like(std) return mu std * eps这是变分推断在深度强化学习工程中最常见的代码形态SAC 的高斯策略和 Dreamer 的隐状态采样都在用。8.2 高斯分布之间的 KL 散度如果变分分布和先验都是高斯分布KL 项可以解析计算不需要蒙特卡洛采样。闭式公式为KL(N(μ1, σ1²) || N(μ2, σ2²)) log(σ2/σ1) (σ1² (μ1 - μ2)²) / (2σ2²) - 0.5实现时注意数值稳定性在 log_std 上做 clamp防止指数爆炸。def gaussian_kl(mu_q, log_std_q, mu_p, log_std_p): std_q torch.exp(log_std_q) std_p torch.exp(log_std_p) kl torch.log(std_p / std_q) (std_q**2 (mu_q - mu_p)**2) / (2 * std_p**2) - 0.5 return kl.sum(-1).mean()8.3 训练过程中需要观察的关键指标用变分推断视角跑强化学习算法别只盯着 reward 曲线。下列指标同样重要指标观察目的异常信号policy entropy策略是否还在探索过早降到 0可能陷入确定性局部最优温度系数 α熵约束的权重变化快速增大说明回报不稳定持续为 0 则熵调节失效KL(qp)Q 值范围回报与熵项的尺度匹配和 α 数量级差太多需要调整奖励缩放重构误差世界模型是否学到有效隐变量下降太慢检查 KL 是否塌缩8.4 熵系数与奖励尺度的匹配SAC 这类算法最阴间的调参问题就是奖励尺度和温度系数 α 不匹配。如果任务奖励动辄上千而 α 初始化只有 0.2熵正则几乎无效。反过来奖励尺度在 0.001 级别α 初始 0.2策略会被迫维持高熵难以收敛到精确控制。从变分推断的角度理解Q 函数对应 ELBO 重构项α 对应 KL 项的拉格朗日乘子。两项的数值范围必须处于可比数量级。修正方法有统一缩放奖励到合理范围比如 [-1, 1] 附近。初始化 α 时参考 Q 值的初始量级可简单打印一次 Q loss 和 policy loss 的数值对比。开启自动调节 α 时设置目标熵为-dim_action这也是 SAC 官方实现常见的默认值。9. 常见理解误区与排查清单第 11 讲涉及大量符号和方向约定新手很容易在几个地方卡住。下面用表格直接给出症状和解法。问题现象可能原因排查方式解决方案KL 散度方向看不懂混淆 KL(qp) 与 KL(p策略损失收敛但回报不涨熵正则过强策略一直保持高随机性查看 entropy 是否长期不降降低 α 初始化值或调低目标熵ELBO 重构项正常但 KL 为 0posterior collapse观察 z 的方差是否退化为 0用 free bits 截断 KL或增大 KL 权重世界模型预测漂移严重隐空间动力学误差累积比较预测轨迹和真实轨迹增加 KL 项权重使用更长的隐空间 rolloutα 一直增长奖励尺度与熵项不一致打印 Q loss 和 α·logπ 数值缩放奖励或改 α 学习率策略更新后性能骤降KL 约束过弱更新步长过大检查 kl 数值是否超过阈值增大 KL 惩罚系数或降低学习率VMPO 拟合损失波动大目标分布权重方差过高打印 advantage 分布对优势做标准化或 clip 极端权重10. 最佳实践与应用建议从第 11 讲往后走变分推断不是一门“听完就忘”的数学工具而是一套可以长期复用的认知框架。下面几条是落地时比较实用的建议。第一给代码里加 KL 散度日志。很多强化学习仓库只输出 reward 和 loss但变分推断相关算法里KL 才是策略更新行为最有指示性的信号。把 KL 拆分类别打印策略 KL、世界模型 KL、约束 KL。长期记录后你会发现很多训练不稳定的问题在 reward 出问题之前就已经先出现在 KL 曲线上。第二先跑通一个最小变分推断流程再往大型算法上迁移。可以用一个 toy 高斯分布拟合实验验证自己的 ELBO 实现是否正确再把它搬到 SAC 或 Dreamer 上。这个最小流程建议包含定义一个简单先验分布。定义一个参数化变分分布。用重参数化采样。计算重构误差和 KL。反向传播更新参数。第三比较实验不要只开一个种子。变分推断涉及随机采样单种子波动很大。至少跑 3 个随机种子看 KL 和 reward 的中位数曲线。如果只跑一次很可能把采样噪声当成改进。第四公开仓库的默认参数不要乱改。SAC 的目标熵、Dreamer 的 KL 权重、VMPO 的 KL 阈值这些参数是平衡稳定性和探索性的关键。想调参之前先理解它在 ELBO 里对应哪一项的权重否则调参就是在猜。第五注意版权和数据边界。课程讲义中的公式与算法思想为公开学术内容可以自由学习、复现和在自己项目中使用。如果复现算法时借用了第三方仓库代码按对应开源协议保留声明。涉及真实环境、用户数据或商业场景时要确保数据来源合法、使用范围经授权尤其是涉及隐私信息时必须做匿名化和合规评估。11. 总结与下一步这讲内容最有价值的不是那几个公式本身而是它把强化学习和概率推断两个领域连成了一张图SAC 的熵项是 KL 约束VMPO 的策略拟合是变分分布对目标分布的逼近Dreamer 的世界模型是 ELBO 最直接的工程化落地。有了这张图你再去看新论文里的目标函数会更容易判断它的更新本质是什么。如果你是研究者下一步建议把 VMPO、AWR、MPO 三篇论文放在一起对比整理各自的“目标分布构造方式”和“约束实现方式”你会发现它们在变分推断框架下高度统一。如果你是工程方向最快的学习路径是打开 SAC 的 cleanrl 实现把 α 的自动调节代码和策略损失单独摘出来对照第 5 节的公式逐行阅读。跑通 HalfCheetah 之后再尝试在环境奖励上乘以一个有偏系数观察 α 曲线的反应。这一套验证流程走完变分推断就不再是抽象概念了。后续想往深处走可以继续关注离线强化学习里保守 Q 学习和变分推断的关系、基于能量模型的策略表示、以及扩散模型作为策略分布时和变分推断的结合。这些方向都是第 11 讲框架的直接延伸。