这次我们来看一门硬核课程的核心章节:伯克利 2026 春季深度强化学习课程(CS 285 系列风格)的第 12 讲,主题是强化学习中的变分推断。
先说结论:这一讲不是教你调一个库,而是把强化学习重新放回概率图模型的框架里,用变分推断统一策略优化、探索和奖励设计。它最大的价值在于回答一个很多人没想透的问题——策略梯度方法到底在优化什么,以及为什么最大熵强化学习、SAC、MPO 这些算法会长得那么像。
如果你正在学深度强化学习,已经跑过 PPO、SAC,但总觉得公式推导是各讲各的,那这一讲的内容值得认真过一遍。本文会带你拆解 ELBO 推导、控制即推断(Control as Inference)建模、策略梯度与变分推断的统一视角,并给出可运行的 PyTorch 验证代码和常见学习误区排查。
1. 本讲核心内容速览
| 项目项 | 内容 |
|---|---|
| 课程来源 | 伯克利 2026 春季深度强化学习课程第 12 讲 |
| 核心主题 | 变分推断与强化学习的理论交叉 |
| 前置基础 | 概率图模型、策略梯度、动态规划基础 |
| 关键公式 | ELBO、最优性变量建模、变分策略分布 |
| 主要算法联系 | SAC、MPO、软 Q 学习、最大熵强化学习 |
| 工程价值 | 统一算法推导视角,指导策略优化与探索设计 |
| 适合读者 | 想深入理解深度强化学习理论的算法工程师、研究生 |
| 代码实践 | PyTorch 高斯变分推断、简化最大熵策略优化 |
| 计算要求 | CPU 即可完成验证,不需要 GPU 大规模训练 |
这一讲的理论密度很高,但受益也很直接。弄懂它之后,再看 SAC 或者 MPO 的论文,你会发现自己能快速抓住对方在优化哪个下界、哪个分布被近似、哪个 KL 项被约束。
2. 为什么要从变分推断的角度看强化学习
先抛出一个问题:经典策略梯度方法(REINFORCE、PPO)直接把期望回报当作目标函数,用梯度上升更新策略参数。这个视角当然能work,但它有一个隐患——回报只是一个标量,它并不显式地告诉你策略分布应该长什么样。
在奖励稀疏、多模态最优行为、需要显式探索的场景里,纯期望回报视角会显得很被动。变分推断则提供了一套语言:
- 把“好的行为”建模为潜在变量;
- 把“最优策略”建模为在某种最优性条件下的后验分布;
- 把策略优化转化为“用可参数化的变分分布去逼近这个后验”。
这样做的直接收益有三个。
第一,奖励设计有了概率语义。把奖励函数写成最优性变量的对数条件概率,奖励就变成了“观察到最优行为的似然”,于是奖励塑形和概率推断可以互相翻译。
第二,探索有了分布依据。变分推断天然需要计算 KL 散度,而 KL 散度会强制策略不要过早坍塌到单一动作。最大熵强化学习里的熵正则项,本质上就是为了维持后验逼近时的覆盖度。
第三,多模态行为可以被描述。期望回报最大化往往鼓励策略输出均值附近的动作,而变分后验可以保留多峰分布,对应强化学习里的多模态最优策略。
所以,这一讲并不是在“炫技”,而是给你一把能同时打开策略梯度、最大熵 RL、EM 式策略优化的钥匙。
3. 变分推断基础:从精确后验到 ELBO
在进入强化学习之前,先把变分推断本身的推导捋清楚。假设我们有观测变量 (x) 和隐变量 (z),联合分布为 (p(x, z)),我们关心的是后验 (p(z|x))。问题是,这个后验在很多模型里没有解析形式,计算它需要边际化:
[ p(x) = \int p(x, z) dz ]
这个积分在高维空间里通常不可解,所以引入一个变分分布 (q(z|x)),用 KL 散度衡量它和真实后验的距离:
[ \log p(x) = \mathbb{E}{q(z|x)}[\log p(x, z) - \log q(z|x)] + D{KL}(q(z|x) | p(z|x)) ]
其中第一项就是证据下界 ELBO:
[ \text{ELBO} = \mathbb{E}_{q(z|x)}[\log p(x, z) - \log q(z|x)] ]
因为 KL 散度非负,所以 (\log p(x) \ge \text{ELBO})。最大化 ELBO 等价于同时做两件事:
- 拉近 (q(z|x)) 和真实后验 (p(z|x)) 的距离;
- 提升数据的对数似然下界。
ELBO 还可以改写为另一种常见形式:
[ \text{ELBO} = \mathbb{E}{q(z|x)}[\log p(x|z)] - D{KL}(q(z|x) | p(z)) ]
这个形式更直观:第一项是重构似然,鼓励隐变量能解释数据;第二项是正则项,约束变分分布不要离先验太远。
这就是变分自编码器(VAE)的优化目标。如果之前对 VAE 的推导一知半解,现在可以把 ELBO 的两种写法记牢,后面强化学习里的策略优化会反复用到同样的结构。
4. 控制即推断:把强化学习写成概率图模型
第 12 讲的核心建模技巧,是把强化学习问题嵌入一个概率图模型。做法如下。
在标准 MDP 中,智能体在状态 (s_t) 下采取动作 (a_t),获得奖励 (r(s_t, a_t)),转移到 (s_{t+1})。现在引入一个二值最优性变量 (O_t),定义它的条件概率为:
[ p(O_t = 1 | s_t, a_t) = \exp(r(s_t, a_t)) ]
也就是说,奖励越高,观察到“这一步是最优的”这个事件的概率越大。这里做了指数变换,所以奖励可以是任意实数,但概率值始终在 ((0, 1]) 之间,不会越界。
整个轨迹的联合分布写作:
[ p(\tau, O_{1:T}) = p(s_1) \prod_{t=1}^{T} p(s_{t+1}|s_t, a_t) \pi(a_t|s_t) p(O_t=1|s_t, a_t) ]
其中 (\pi(a_t|s_t)) 是先验策略分布,(O_{1:T}) 表示整条轨迹都“最优”。
现在,强化学习的目标可以重新表述为:在给定整条轨迹最优的条件下,推断每个状态下应该采取的动作,即后验:
[ p(a_t | s_t, O_{1:T}) ]
这个后验在理论上就是“最优策略”。但它同样是不可解的,因为需要考虑未来所有时间步的最优性变量。于是变分推断登场:用一个参数化的策略分布 (q(a_t|s_t)) 去逼近这个后验。
这种视角下,(q) 不再只是一个策略网络,它同时承担了“变分分布”的角色。策略评估和策略改进,变成了变分推断中的 E 步和 M 步。
5. 策略梯度与变分推断的统一视角
很多人在学策略梯度时,记住的是 REINFORCE 的“高回报动作概率上升、低回报动作概率下降”的直观解释。但从变分推断角度看,事情还可以更深刻。
把轨迹的最优性概率当作观测数据,我们想最大化:
[ \log p(O_{1:T}) ]
对 (\log p(O_{1:T})) 做和 ELBO 相同的分解,引入轨迹分布 (q(\tau)) 作为变分分布:
[ \log p(O_{1:T}) \ge \mathbb{E}{q(\tau)}[\log p(\tau, O{1:T}) - \log q(\tau)] ]
如果我们把 (q(\tau)) 限制为“由策略 (q(a_t|s_t)) 和环境动态组成的轨迹分布”,也就是:
[ q(\tau) = p(s_1) \prod_{t} p(s_{t+1}|s_t, a_t) q(a_t|s_t) ]
把这一项代入 ELBO,会得到一个重要结论:
[ \log p(O_{1:T}) \ge \mathbb{E}{\tau \sim q}[\sum_t r(s_t, a_t)] + \sum_t \mathbb{E}{s_t \sim q}[\mathcal{H}(q(\cdot|s_t))] ]
如果忽略熵项,这就是标准的期望回报最大化。但变分推断视角会多出一个熵正则项,它要求策略不要过早确定性化。这正是最大熵强化学习的目标:
[ J(\pi) = \sum_t \mathbb{E}{(s_t, a_t) \sim \rho{\pi}}[r(s_t, a_t) + \alpha \mathcal{H}(\pi(\cdot|s_t))] ]
所以,Soft Actor-Critic 里面的熵项并不是拍脑袋加的正则,它可以从“用变分分布逼近最优性后验”这个目标里严格推导出来。
这里有一个很实用的启发:当你在调 SAC 的温度参数 (\alpha) 时,你实际上是在调节“策略分布离最优后验的 KL 约束有多紧”。(\alpha) 越大,策略越保守、探索越充分;(\alpha) 越小,策略越激进、越容易坍塌。
6. 变分推断视角下的策略优化:EM 式迭代
把变分推断的思路继续推进,可以得到一种 EM 式的策略优化框架。前面提到,变分分布 (q(a_t|s_t)) 逼近的是“在整条轨迹最优条件下的动作后验”。EM 的每一轮迭代分两步:
E 步:固定当前策略 (q),估计软 Q 函数,也就是在变分分布下计算带熵的期望回报。这一步对应策略评估。
M 步:更新策略分布,让它在每个状态下更贴近由软 Q 函数诱导出的目标分布:
[ q_{\text{new}}(a|s) \propto q_{\text{old}}(a|s) \exp\left(\frac{1}{\alpha} Q_{\text{soft}}(s, a)\right) ]
这一步对应策略改进。
把这个迭代过程展开,你会发现它同时统一了三种常见做法:
- 软策略迭代:交替执行软策略评估和软策略改进。
- SAC:用两个 Q 网络做 E 步估计,用最小化 KL 散度做 M 步更新。
- MPO(Maximum a Posteriori Policy Optimization):显式地构造了一个变分分布作为目标策略,再用 KL 约束把它投影回参数化策略族。
所以,这一讲的理论并不只停留在公式层面。如果你训练过 SAC,又看过 MPO 的论文,现在可以把它们放在同一张图里理解:所有基于最大熵的深度强化学习算法,本质都在做变分 EM 迭代。
7. 从理论到代码:用 PyTorch 验证变分推断
只看公式容易飘,最好动手写一个最小验证。下面给出一个完全可运行的 PyTorch 例子。它做的是最经典的任务:用变分分布逼近高斯混合模型的后验,观察 ELBO 的变化。
这个例子虽然简单,但能帮助你确认自己真的理解了 ELBO 的两个项分别起什么作用。代码不需要 GPU,CPU 就能跑。
import torch import torch.nn as nn import torch.optim as optim import math torch.manual_seed(0) # 真实后验:混合高斯 def true_log_prob(z): return torch.logsumexp(torch.stack([ -0.5 * ((z - 3.0) / 0.8) ** 2 - math.log(0.8), -0.5 * ((z + 2.0) / 1.2) ** 2 - math.log(1.2) ]), dim=0) # 变分分布:高斯 q(z) = N(mu, sigma) mu = nn.Parameter(torch.zeros(())) log_sigma = nn.Parameter(torch.zeros(())) optimizer = optim.Adam([mu, log_sigma], lr=0.05) def sample_q(n=1024): sigma = torch.exp(log_sigma) eps = torch.randn(n) return mu + sigma * eps def elbo_loss(): z = sample_q() log_q = -0.5 * ((z - mu) / torch.exp(log_sigma)) ** 2 - log_sigma - 0.5 * math.log(2 * math.pi) return -(true_log_prob(z).mean() - log_q.mean()) # 最大化ELBO -> 最小化负ELBO for step in range(1000): optimizer.zero_grad() loss = elbo_loss() loss.backward() optimizer.step() if step % 200 == 0: print(f"step {step}: ELBO={-loss.item():.4f}, mu={mu.item():.2f}, sigma={torch.exp(log_sigma).item():.2f}")运行之后可以看到,变分分布会逐渐逼近混合高斯的一个峰。如果初始值落在两个峰之间,最终结果会偏向概率质量更大的一侧。这个现象对应了变分推断的 mode-seeking 行为:KL(q||p) 倾向于找到一个覆盖较窄的模式,而不是完整描述多峰分布。
把这个行为迁移到强化学习场景:当你用高斯策略逼近多模态最优后验时,策略可能只捕捉其中一个模态。这就是为什么真实机器人控制里,常常需要更灵活的分布族(如流模型、扩散模型)来承担变分策略的角色。
8. 强化学习变分推断的边界与常见误区
这一部分容易被忽略,但对理解课程内容很关键。
先说适用边界。变分推断视角主要解决“算法推导的一致性问题”,它不会自动解决工程上的所有困难。比如:
- 奖励稀疏时,(\exp(r)) 的方差可能非常大,推断会不稳定;
- 高斯变分族表达力有限,面对多模态策略时会有天然的逼近误差;
- 变分推断的优化是高度非凸的,初始化对收敛结果影响很大。
再说学习中容易踩的误区。
第一个误区:认为 (\exp(r)) 就是策略。实际上它只是最优性变量的条件概率,不是行动分布。策略必须从后验推断中得到,直接拿奖励指数当策略既没有归一化,也没考虑动态转移。
第二个误区:混淆熵正则项和探索噪声。最大熵强化学习中的熵项,目的是维持策略分布对后验的覆盖度,而不是简单地在动作上加高斯噪声。高斯噪声只是加了随机性,熵正则项却会改变策略分布的形状,两者作用机制不同。
第三个误区:忽略先验策略项。在软 Q 学习里,如果先验策略 (\pi(a|s)) 不是均匀分布,那么策略更新的目标应该是“在 KL 约束下贴近软 Q 目标”,而不是直接最大化软 Q 值。很多论文复现失败,就是因为这里把先验当成了均匀分布。
9. 学习路线与验证清单
如果你准备把这一讲的内容真正消化掉,建议按下面的顺序操作。
第一步,先推导一遍 ELBO 的分解,确保自己能独立写出 (\log p(x) = \text{ELBO} + D_{KL}) 的完整过程。这一步不需要代码,但需要纸笔。
第二步,运行上面第 7 节的高斯变分推断代码,修改目标分布为单峰高斯,观察 ELBO 数值变化,再改回混合高斯,体会 mode-seeking 现象。
第三步,把最优性变量建模代入简单 MDP。比如一个两状态两动作的网格世界,手动写出软 Q 迭代过程。如果熟悉 NumPy,这一步可以用几十行代码完成。
第四步,回到 SAC 原始论文,把论文里的软策略改进公式和本讲的 M 步公式对照,确认二者只在符号上不同、数学上是同一件事。
第五步,如果精力充足,可以阅读 MPO 的论文,重点看它的 E 步和 M 步分别对应本文哪个公式,以及它为什么要引入 sample-based 的分布估计。
这套流程下来,你对深度强化学习算法的理解会发生一个明显变化:不再把 PPO、SAC、MPO 当成三个孤立算法,而是把它们看成“同一个变分推断框架下的不同参数化与近似策略”。
10. 总结与下一步
第 12 讲给出的最重要结论是:强化学习中的策略优化,本质上可以看成在概率图模型里做变分推断。最优性变量把奖励转化为观测似然,策略网络成为变分分布,策略评估与策略改进对应 EM 迭代,熵正则项则来源于 KL 距离约束。
这门课的深度在于,它不满足于“这样能跑通”,而是强调“为什么它会以这种形式出现”。如果你之后要设计新算法,或者要理解为什么某种探索机制能 work,这套变分推断语言会比盲目调参可靠得多。
建议先做两件事:第一,把 ELBO 的推导独立写一遍;第二,跑一遍第 7 节的最小代码,观察最大化 ELBO 的过程中分布是怎么移动的。前者建立直觉,后者验证直觉。
之后可以顺着最大熵强化学习和 MPO 继续往下钻。到那个时候,你再回头看第 12 讲的标题,会发现“变分推断”不是一个锦上添花的数学工具,而是理解现代深度强化学习算法的一条主干道。