
这次我们来看一个推导密集、但在深度强化学习里绕不开的主题强化学习中的变分推断。标题来自伯克利 2026 春季深度强化学习课程的第 12 讲。它既不是“顺带提一下生成模型”也不是纯粹炫数学而是把深度强化学习里最核心的一类问题摆到桌面上策略分布、奖励分布、熵正则化、KL 散度这些名词到底是怎么被同一个目标函数串起来的。这一讲真正值得记住的东西可以压缩成三句话第一变分推断解决的是“我要近似一个复杂分布”的问题第二当这个复杂分布由奖励或 Q 值函数定义时策略学习就变成了一次变分推断第三SAC、MPO、模仿学习、世界模型乃至离线强化学习里的一堆技巧都可以在这套框架下找到统一位置。如果你是从零开始学强化学习这一篇可以直接当课程笔记看。如果你已经调过 PPO、SAC但一直没想明白“为什么 SAC 要加熵项”“为什么策略更新有时要朝 Q 值做回归”这篇文章也会把公式补上。文章内容按“数学核心 - 算法地图 - 最小实现 - 训练排错”的顺序展开不涉及具体工程部署但对科研和算法调试很有用。多说一句课程具体到每学期编排可能会有变动。这篇文章不逐页复述幻灯片顺序而是按“变分推断与深度强化学习”这条主线把第 12 讲背后真正要传递的知识拆开讲。下面直接从核心知识点开始。1. 核心知识点速览先给一张总览表。这一讲涉及的概念很多但每个概念都有明确的 RL 对应物不必被名字吓到。概念数学对象在强化学习中的对应典型算法/方法变分推断用优化近似一个难解后验分布把“奖励诱导出的目标分布”近似成策略分布控制即推断、变分策略搜索证据下界 ELBO对数证据的下界拆成“似然项 KL 项”带熵正则的策略优化目标SAC、AWR、LLM 强化学习中的 KL 正则重参数化技巧把随机采样变成确定性函数加噪声让随机策略的梯度可以反向传播VAE、SAC、Dreamer 世界模型摊销推断用神经网络对每个输入生成变分参数策略网络直接输出动作分布参数几乎所有深度策略模型控制即推断把最优控制看成概率推理奖励越高轨迹被采样的概率越大Kober 的原始策略搜索、Todorov 框架KL 投影把最优分布投影回参数化策略族在策略更新中加 KL 约束TRPO、MPO、V-MPO这一讲希望你在听完后能做到三件事能推导出最小化 KL 散度等价于最大化 ELBO能理解“软策略更新”π(a|s) ∝ exp(Q(s,a)/α)是从哪里来的能把 SAC、MPO、GAIL、世界模型、离线强化学习里常见的模型目标统一到变分推断视角。2. 这一讲要解决的核心问题先回答一个最直接的问题我们已经有了策略梯度、DQN、Actor-Critic为什么还要引入“变分推断”这个概率图模型的工具原因可以压缩成三点。第一很多强化学习目标本质上要求“根据某个打分函数恢复一个分布”。Q 函数告诉你某个动作好不好但策略必须输出的是一个动作概率分布。要从 Q 值得到概率分布需要对exp(Q/α)做归一化而连续动作空间上这个积分基本不可解。这时候你就需要变分推断而不是直接算积分。第二强化学习里大量模型存在隐变量。世界模型要从未知状态预测未来模仿学习要推测专家背后的意图分层强化学习要推断子任务。隐变量无法直接观测只能通过变分推断来近似后验。第三策略学习经常要考虑多模态和探索。真实的最优策略在连续动作空间上往往是多峰的但简单高斯策略只能表达单峰分布。变分推断可以显式地控制“策略熵”和“当前策略与目标分布的距离”这正好对应深度强化学习里的探索-利用权衡。这三种情况对应三种不同的算法诉求从 Q 值恢复策略、从观测推断潜变量、在更新时保持探索。变分推断在深度强化学习里反复出现不是因为大家喜欢贝叶斯而是因为它恰好能同时处理这三种问题。3. 变分推断的数学核心ELBO 推导这一节是整讲的地基。先从概率模型角度推导证据下界ELBO再说明它如何与强化学习目标对应。假设有一个观测变量x我们希望最大化它的对数边缘似然log p(x)。直接计算需要对隐变量z积分log p(x) log ∫ p(x, z) dz这个积分在高维空间里通常不可解。变分推断引入一个可参数的分布q(z)用它来近似真实后验p(z|x)然后利用 Jensen 不等式得到一个下界log p(x) ≥ E_{z~q(z)}[ log p(x, z) ] H[q(z)]右边就是证据下界。通常写成更常见的形态ELBO E_{z~q(z)}[ log p(x|z) ] - KL( q(z) || p(z) )因为log p(x) - ELBO KL(q(z) || p(z|x))所以最大化 ELBO 等价于最小化变分分布和真实后验之间的 KL 散度。这里要注意一个方向问题。如果最小化KL(q||p)得到的q会倾向盖住p的主要模式这叫“模式覆盖”如果最小化反向KL(p||q)q可能只抓住p的一个峰这叫“模式坍缩”。强化学习中策略更新大多用KL(q||p)或者它的变体所以要多峰问题时必须小心策略表达能力。变分分布q(z)可以简单到对角高斯也可以复杂到归一化流。神经网络的版本叫“摊销变分推断”用网络参数φ对每个输入x生成分布参数即q_φ(z|x)。这个做法和策略网络π_θ(a|s)完全同构。下面是术语对照表变分推断里的数学对象几乎能逐一映射到强化学习组件。变分推断术语强化学习对应观测x状态s或观测o隐变量z动作a或潜在状态z似然项 E_q[log p(xz)]先验p(z)动作先验或旧策略变分分布 q(zx)熵项H[q]策略熵正则化如果先不看细节只记一个结论变分推断在强化学习里做的事情就是给“策略优化目标”加上一个熵正则并把策略推向由奖励定义的隐含分布。4. 从推断到控制软策略更新怎么来的这一节是第 12 讲里最容易让人“啊”一声的部分最优策略的公式为什么长成 softmax 的样子。先把问题从概率图模型搬回控制。我们定义一个“轨迹的概率”正比于exp(奖励)即把奖励当成轨迹对数概率来用p(轨迹) ∝ exp( Σ_t r(s_t, a_t) / α )其中α是温度系数控制奖励对分布的影响强度。于是“找到最优策略”就变成了“从奖励定义的分布中采样”。这就是控制即推断的核心思路常用在概率最优控制、基于模型的规划等领域。在这个设定下可以推导出软返回和软 Q 函数的贝尔曼方程。软化版本的值函数更新依然按动态规划进行只是每步都带一个熵项Q_soft(s, a) r(s, a) γ E_{s}[ V_soft(s) ] V_soft(s) α log ∫ exp( Q_soft(s, a) / α ) da对 Q 值做变分优化能得到一个显式的最优策略π(a|s) ∝ exp( Q_soft(s, a) / α )这就是 SAC 里“软策略”的由来。它说明最优策略不是直接取 Q 最大的动作而是按 Q 值指数加权让次优动作也有一定概率。温度系数α越大分布越平滑探索更多α越小策略越接近确定性。但在深度强化学习里策略网络不能直接表示exp(Q/α)这个任意分布。我们只能把这个目标分布投影回一个参数化策略族比如高斯分布。这种投影就是变分更新π_new ← argmin_{π∈Π} KL( π(a|s) || exp(Q_soft(s,a)/α) )展开后策略更新目标变成J(π) E_{a~π}[ α log π(a|s) - Q_soft(s, a) ]最小化这个目标会让策略在 Q 值高的动作附近集中同时保留一定熵。这个公式和 SAC 的实际损失只有一步之差SAC 里最小的策略损失正是α log π(a|s) - Q(s,a)。所以这一讲最重要的收获是策略梯度方法是对奖励直接做梯度上升而变分推断方法是在参数化策略族里投影一个由 Q 值诱导出的最优分布。前者更新幅度不可控后者天然带 KL 约束和熵正则训练更稳定。5. 强化学习中的变分推断算法地图变分推断不是某一个算法而是一套建模方法。下面按常见深度强化学习算法家族分类看看各自在哪个环节用到了变分推断。5.1 最大熵强化学习与 SACSAC 是最典型的变分强化学习算法。它把策略熵加入奖励学习目标变成J(π) Σ_t E[ r(s_t, a_t) α H(π(·|s_t)) ]最大化这个目标等价于在每一轮做一次变分推断把策略调向“奖励 熵”共同定义的分布。SAC 的软 Q 更新在数学上就是软贝尔曼方程的样本版本策略更新就是上文的 KL 投影。这个视角解释了 SAC 为什么不容易过早坍缩成确定性策略它始终在往带熵的最优分布上靠。5.2 MPO带 KL 约束的变分策略搜索从变分推断视角看 MPO它做的是两步迭代第一步从当前 Q 值中构造目标分布第二步把目标分布投影回策略族并且加一个 KL 约束π_new argmin_π E_{a~q}[ log π(a|s) - log π_old(a|s) ] 约束: E_s[ KL(π_new(·|s) || π_old(·|s)) ] ≤ ε这个做法比 SAC 更接近传统变分推断因为它显式限制新旧策略距离更新永远不离开旧策略太远。MPO、V-MPO 后来在连续控制和离线强化学习里表现稳定很大程度归功于这种 KL 约束结构。5.3 模仿学习中的变分方法GAIL模仿学习的任务是让策略模仿专家轨迹。GAIL 把这个问题建模为“逆向强化学习 生成对抗”的组合判别器负责区分专家轨迹和策略轨迹策略负责骗过判别器。从变分角度看GAIL 实际上是在最小化策略轨迹分布与专家轨迹分布的某种 f-divergence目标里有变分下界的形式。当判别器输出接近 0.5说明策略轨迹与专家轨迹难以区分模仿完成。5.4 基于模型的强化学习世界模型与 VAE在基于模型的强化学习中变分推断更是直接参与建模。以 Dreamer 这一系工作为例智能体要在像素级观测上做规划第一步就是从历史观测中学习一个潜在状态模型。学习目标用的是变分自编码器ELBO E_{q(z|o)}[ log p(o|z) ] - KL( q(z|o) || p(z) )这里q(z|o)是编码器p(o|z)是生成模型。用重参数化技巧训练。规划时智能体在潜在空间而不是像素空间里推演后续动作显著降低计算成本。这和第 12 讲的核心逻辑完全一致潜变量不可观测就用变分推断去近似。5.5 离线强化学习RWR、AWR 与 IQL离线强化学习要求只用旧数据训练不能和真实环境交互。这时随机策略普遍存在分布外动作被高估的问题。RWR 和 AWR 的做法非常“变分”从行为策略采样的数据点计算权重exp(Q/α)再用加权回归去拟合新策略等价于把新策略拉向 Q 值诱导的经验分布。IQL 虽然不是显式变分方法但也走了类似路线它利用期望回归只保留优势为正的数据信息相当于对隐式分布做截断。这些都表明离线强化学习算法正在大量复用“用变分分布近似奖励诱导分布”这一第 12 讲的母题。6. 最小实现PyTorch 演示变分策略更新理解公式之后最好看一遍最小实现。下面给出两个与第 12 讲直接相关的代码片段分别演示“重参数化技巧”和“SAC 风格的变分策略更新”。代码只展示最小路径省略优先经验回放和自动温度调节细节。6.1 重参数化技巧随机策略采样本身不可导需要用重参数化把随机性转移到独立噪声上import torch import torch.nn as nn import torch.distributions as td class GaussianPolicy(nn.Module): def __init__(self, state_dim, action_dim): super().__init__() self.net nn.Sequential( nn.Linear(state_dim, 128), nn.ReLU(), nn.Linear(128, 128), nn.ReLU(), ) self.mean_head nn.Linear(128, action_dim) self.log_std_head nn.Linear(128, action_dim) def forward(self, obs): h self.net(obs) mean self.mean_head(h) log_std self.log_std_head(h).clamp(-20, 2) std log_std.exp() return td.Independent(td.Normal(mean, std), 1) def rsample(self, obs): dist self.forward(obs) action dist.rsample() # 重参数化采样 log_prob dist.log_prob(action) return action, log_probrsample内部等价于action mean std * torch.randn_like(std)这样梯度可以经过均值和标准差回传随机性只来自外在噪声。6.2 SAC 风格的变分策略更新SAC 的策略损失就是“负 Q 值 熵正则”def update_policy(policy, q_net, alpha, obs_batch): # 从当前策略采样动作并计算 log 概率 actions, log_probs policy.rsample(obs_batch) # 用 Q 网络评估这批动作 q_values q_net(obs_batch, actions) # 变分策略更新J alpha * log_prob - Q policy_loss (alpha * log_probs - q_values).mean() policy_optimizer.zero_grad() policy_loss.backward() policy_optimizer.step()其中q_net是 soft Q 网络。这个目标与第 4 节推导的 KL 投影一致。alpha就是温度系数控制策略熵权重。如果想看更接近 MPO 的版本可以改成两步先用旧策略采样一批动作用 Q 值计算权重再对权重做 softmax然后带 KL 约束地更新新策略# MPO 风格把最优分布投影回策略族 with torch.no_grad(): old_action, old_log_prob old_policy.rsample(obs_batch) q_values q_net(obs_batch, old_action) weights torch.softmax(q_values / alpha, dim0) # 加权拟合新策略并加入 KL 约束 new_dist new_policy(obs_batch) old_dist old_policy(obs_batch) kl_loss torch.distributions.kl.kl_divergence(new_dist, old_dist).mean() policy_loss - (weights * new_dist.log_prob(old_action)).mean() beta * kl_loss这两个代码片段都不算完整算法但足以让读者看清变分推断在策略更新中的两种典型用法SAC 风格直接对采样动作做梯度反传MPO 风格先构造权重再投影策略。7. 训练稳定性调参、诊断与资源观察看完公式和代码还要知道跑实验时怎么观察训练效果。变分推断在强化学习里最常见的失败不是梯度算错而是“分布不匹配”和“熵系数不合适”。第一是温度系数α的调节。α过大策略熵很高Q 值被平滑得很厉害策略接近随机探索α过小策略退化成确定性策略失去变分推断带来的探索收益。SAC 的自动温度调节本质上是在更新一个约束让策略熵不低于预设目标熵。所以实际训练时观察熵的曲线比只观察奖励曲线更直接。如果熵掉得很快说明α太小如果熵一直贴着上限说明α太大。第二是多峰分布问题。高斯策略族只能表达单峰分布。如果最优分布有两个明显模态变分推断会把策略拟合到两个模态之间结果 Q 值不稳定策略跳跃。这时可以把策略分布换成混合高斯、归一化流或者干脆把动作表示成条件隐变量的解码结果。看到 Q 值和奖励震荡剧烈时优先怀疑策略表达力不够而不是盲目调学习率。第三是 KL 约束的作用。TRPO、MPO 等算法在每次更新里加 KL 约束是让策略更新步长可控。约束太小策略更新太慢约束太大容易崩。实践中常用“旧策略采样、新策略算 KL”的方式离线监控每隔几个回合打印新旧策略 KL 散度如果 KL 在快速上升说明每次更新步长过大。从资源角度看低维连续控制任务通常在 CPU 上就能跑。用 Pendulum、HalfCheetah 这类环境的话一个训练的瓶颈主要在环境仿真步数而不是显存。如果从像素输入训练世界模型或图像策略显存需求才显著上升典型路径是策略网络 编码器 生成解码器同时驻留显存显存占用会随批次大小和图像尺寸上升。这些数字要按实际实验配置观察不要照搬别人的单次记录。另外值得监控的还有 Q 值分布。变分策略更新会把策略推向高 Q 区域但 Q 网络是逼近器会有误差。如果 Q 值一直偏大、策略熵突然下降说明出现了 Q 值过估计。可以在日志里同时输出 Q 均值、熵均值、奖励均值三者的相对变化比单独看任何一个都更能暴露问题。8. 常见误区与排查方法这一讲知识密度高学习时容易带出不少误解。下面把最常见的问题列成表格。常见误区原因正确理解排查方法变分推断只用在生成模型里只见过 VAE没见过控制问题策略优化常常就是一次变分推断看 SAC 策略损失是否等于α logπ - Q策略熵越大越好把“熵正则”理解成“熵最大化”熵是正则项要和 Q 值平衡观察 KL 散度和熵曲线而不是只看奖励最优策略就是argmax Q只熟悉 DQN 的确定性最优策略变分框架给出π ∝ exp(Q/α)对比 DQN 和 SAC 在高维连续空间的表现高斯策略一定能覆盖多峰最优分布忽略策略族的表达力高斯策略是单峰分布多峰时会失真复现一个双峰奖励环境观察动作分布KL 散度越小越好只看到 KL 是距离忽略方向性KL(p加了变分推断就能解决探索问题以为熵项万能熵项只解决一定程度的探索复杂剧情仍需随机网络在稀疏奖励环境中做对比实验软 Q 更新一定比硬 Q 更新稳定忽略温度系数和网络容量影响要配合自动温度调节和收敛检查打印 Q 均值方差、熵值、更新前后 KL排查问题的时候稳定性要优先于绝对奖励。先确认熵和 KL 散度是否正常再检查 Q 值是否过估计最后才调整网络结构。顺序反了经常会把架构问题当成学习率问题来调。9. 在课程中的位置与下一步延伸第 12 讲放在深度强化学习课程中通常是已经讲过策略梯度、价值函数、Actor-Critic 之后进入更高级话题的位置。变分推断在这里承担的作用是“统一视角”前几讲的策略优化可以看成某种 KL 约束下的变分更新后面的模仿学习、基于模型的强化学习、离线强化学习又会重新用到隐变量和分布匹配。顺着这讲继续延伸可以考虑几个方向。第一个方向是模仿学习。把专家状态-动作对当成观测数据把专家策略当成后验分布训练策略去匹配专家分布。GAIL 和相关对抗式模仿方法都是这条路。理解好变分推断再看 GAIL 的判别器目标就不会只是“对抗生成”这一层。第二个方向是基于模型的强化学习。用 VAE 架构学习潜在状态再用潜在状态做规划。Dreamer 系列就是把变分自编码器和模型预测控制结合起来的代表。第 12 讲的 ELBO 推导几乎是读懂世界模型论文的必备前提。第三个方向是大语言模型强化学习。LLM 的强化学习常把策略看作在 token 序列上的分布并用 KL 正则约束策略不偏离初始模型。只要出现过 RLHF 相关的工作你看到KL(π || π_ref)时应该立刻想到这就是用变分推断控制的策略分布偏离程度和第 12 讲的熵正则项同源。当然LLM 策略的输入是离散 token 序列和连续动作空间的具体形式略有不同但核心公式并无本质差异。第四个方向是多智能体强化学习和机器人强化学习。多个智能体同时做变分推断时代价函数不再是单智能体的奖励还要考虑其他智能体策略带来的耦合。当前一些机器人操作任务会显式建模时序生成模型和分层策略这些工作本质上都是用隐变量解释状态变化再用策略近似后验。变分推断学好之后再读这些论文会轻松很多。10. 总结与下一步这一讲值得记住的其实是三个公式。第一个是 ELBOELBO E_q[log p(x|z)] - KL(q(z) || p(z))第二个是由 Q 值诱导出的软策略形式π(a|s) ∝ exp(Q_soft(s,a) / α)第三个是参数化策略的 KL 投影π_new ← argmin_π KL(π(a|s) || exp(Q_soft(s,a)/α))把这三个公式放在一起SAC 的熵项、MPO 的 KL 约束、GAIL 的对抗目标、世界模型里的 VAE 损失、离线强化学习里的加权回归全部都能归入同一个变分推断视角。这是第 12 讲最直接的实际价值。如果读完只想做一件事建议先在 Pendulum 或简单的双峰奖励环境上复现 SAC 风格的最小策略更新。不用写完整算法只要写一个策略网络、一个 Q 网络再套用上面第 6 节的代码观察不同α设置下动作分布散度和策略熵的变化。只要能解释清楚“为什么α变大策略更随机α变小策略更贪婪”这一讲的核心就算掌握到位了。最容易踩的坑有两个一是把变分推断当成离散的贝叶斯知识来学而没有联系策略更新二是把 KL 散度当成“距离”忽略了方向差异。先解决这两个问题再去看后续课程里的模仿学习、离线强化学习和基于模型的强化学习思路会顺畅很多。建议收藏备用。后续章节如果继续接触世界模型、多智能体、RLHF 或机器人策略学习都可以回来翻第 3 节和第 4 节的公式推导。