经常有人问我,为什么近几年强化学习里到处都是 (\pi(a|s)\propto\exp(Q(s,a)/\alpha)) 这种写法,还有SAC里那个自动调节的温度系数到底从哪来的。追根溯源,答案基本都落在同一个理论框架上——Control as Inference,翻译过来就是“控制即推理”或“控制作为概率推断”。我第一次读到这个词的时候也是一头雾水:控制不是在解一个最优问题吗,怎么变成推断问题了?后来把 Todorov、Toussaint、Levine 的经典论文串起来读,才慢慢明白,这套理论是把“最优性”本身当作一个概率事件来处理,再用贝叶斯推断的机器去推出最优策略。
这篇是系列的第一篇,先不聊复杂的近似求解算法,只把基本理论讲清楚。我会从概率图模型的搭建开始,推导后验轨迹分布,说明为什么变分推断之后会自然冒出熵正则化项,最后用一个能心算的单步决策例子把整个链路走一遍。如果你是正准备读那些经典论文但被符号劝退的人,或者已经跑了SAC但想知道它为什么有效,这篇文章应该能帮你省下不少力气。
1. 核心思想:把“最优动作”变成一次贝叶斯推断
1.1 从MDP的经典目标说起
先回到最熟悉的设定。离散时间马尔可夫决策过程里有状态 (s_t)、动作 (a_t)、奖励 (r(s_t,a_t)),以及动力学 (p(s_{t+1}|s_t,a_t))。经典控制/强化学习的任务是找一个策略最大化累积奖励,最典型的写法就是贝尔曼方程:(Q^*(s,a)=r(s,a)+\gamma\mathbb{E}[V^*(s')]),然后对着这个 (Q^*) 做 (\arg\max_a)。
这个路径没什么问题,但它的气质是“硬”的——每一步都要比较动作,然后挑最好的。一旦状态动作空间变高维、动力学变复杂,精确的比较和最大化成本非常高,而且和我们在实际系统里观察到的那种“多种方案都不错、应该带点随机性”的行为习惯不太吻合。
Control as Inference 换了个思路:我不直接求最优动作,而是先定义一个随机事件“当前这一步是好的/最优的”,把奖励转换成这个事件发生的条件概率。然后整个控制问题就变成了:给定“我每一步都很优”这个观测,反推轨迹应该是什么分布。这就不是寻优问题了,是概率图模型里的经典后验推断问题。
1.2 引入最优性变量 (O_t)
具体做法是给每个时刻引入一个二值变量 (O_t \in {0,1}),(O_t=1) 表示“在状态 (s_t) 下采取动作 (a_t) 这件事是令人满意的”。奖励信息通过条件概率进入模型:
[ p(O_t=1|s_t,a_t)=\exp(r(s_t,a_t)) ]
注意这里用的是指数形式。这意味着奖励高的动作,其“最优性为真”的可能性指数级地高于低奖励动作。之后我们把所有时刻的观测都固定为 (O_{1:T}=1),表示我们关心的是一条从头到尾都表现良好的轨迹。此时要求的就是后验:
[ p(\tau | O_{1:T}=1) ]
也就是在“全程最优”这个条件下,状态-动作轨迹会怎样分布。
很多初学者看到这个 (O_t) 会觉得多此一举。其实这个变量是整个框架最关键的转换器:它把“数值有多大”的奖励,变成了“事件有多可能”的概率,让控制问题可以直接借用概率推断的工具箱。后面你会看到,这个转换还会顺带解释为什么最大熵策略长成 softmax 的样子。
1.3 为什么这种转换是值得的
我自己的体会是,这个建模方式解决了一个很实际的痛点:最优控制通常只输出一个解,但真实系统里我们想要的是“一组都不错的备选行为”。奖励函数越平滑,这组行为分布越宽;奖励越尖锐,分布越集中。概率图模型天然适合表达这种不确定性。
另一个好处是,把控制问题和感知问题放进了同一个语言体系。机器人领域里,感知通常就是概率推断(贝叶斯滤波、SLAM),现在控制也能用同一套推断语言描述,这对做系统性融合的人来说是极其舒服的。Levine 在 2018 年的综述里把这个观点讲得很透:控制即推理,本质上是把“我想要什么”和“世界会怎样”都放进了同一个联合概率分布。
2. 核心推导:从概率图模型到后验轨迹分布
2.1 联合分布长什么样
假设轨迹为 (\tau=(s_0,a_0,s_1,a_1,\dots,a_{T-1},s_T)),加上最优性变量后,联合分布可以写成:
[ p(\tau,O_{1:T})=p(s_0)\prod_{t=0}^{T-1} p(s_{t+1}|s_t,a_t)\prod_{t=0}^{T-1} p(O_t|s_t,a_t) ]
这个式子非常规整:第一项是初始状态先验,第二项是环境动力学,第三项是奖励转换过来的最优性条件概率。整个结构就是一个标准的动态贝叶斯网络,每一时刻的节点 (s_t,a_t) 同时连接下一时刻的状态和当前时刻的最优性观测。
现在施加“全程最优”的观测条件,也就是令所有 (O_t=1),然后写出后验:
[ p(\tau|O_{1:T}=1)
\frac{p(s_0)\prod_t p(s_{t+1}|s_t,a_t)\prod_t p(O_t=1|s_t,a_t)} {p(O_{1:T}=1)} ]
把 (p(O_t=1|s_t,a_t)=\exp(r(s_t,a_t))) 代入,分子变成:
[ p(\tau|O_{1:T}=1) \propto p(s_0)\prod_t p(s_{t+1}|s_t,a_t)\ \exp\left(\sum_t r(s_t,a_t)\right) ]
这个式子值得多看几秒。它告诉我们:在“全程最优”条件下,轨迹的概率由动力学先验和奖励的指数累积共同决定。高奖励的轨迹概率更高,但同时不能违背动力学规律。
2.2 分母的意义和配分函数
分母 (p(O_{1:T}=1)) 在推断视角下只是归一化常数,但在物理和统计物理视角下,它就是对整个轨迹空间做指数加权积分:
[ Z=\int p(s_0)\prod_t p(s_{t+1}|s_t,a_t)\ \exp\left(\sum_t r(s_t,a_t)\right)d\tau ]
这个 (Z) 就是配分函数。你看它长得跟统计力学里吉布斯分布一模一样。温度参数 (\alpha) 暂时还没出现,但如果你在奖励前面加一个 (1/\alpha),它的作用就会立刻清晰:(\alpha) 相当于是玻尔兹曼分布里的温度,控制后验分布的“尖锐程度”。
这也是为什么后来在各种算法里看到的温度系数不是谁拍脑袋加的。它是这个概率模型自带的尺度参数,决定奖励和探索熵之间的换算关系。
2.3 三个直觉理解
第一,采样视角。如果你从这个后验里采样轨迹,采出来的轨迹会往高奖励区域聚集,但又不会完全无视动力学。这就好比在有雾的山里找路,每个采样点都偏向好走且价值高的路径,而不是机械地选择单条最优点。
第二,退火视角。当奖励的尺度很大(相当于 (\alpha\to 0)),指数项急剧分化,后验分布逐步收缩到最优点附近,退化成经典的最优控制。当奖励尺度温和,后验分布较宽,策略保持随机性和探索性。Control as Inference 给出的不是一个点解,而是一族随“温度”变化的软最优解。
第三,因果视角。整个图模型相当于在说:先有环境和动作,然后“是否最优”作为一个被奖励决定的观测冒出来。我们想反推什么样的轨迹更可能导致“全程最优”。这和贝叶斯滤波在逻辑上是同构的——只不过把“传感器观测”换成了“奖励观测”。
3. 从后验到策略:变分推断与软最优的诞生
3.1 精确后验为什么算不出来
后验分布写出来很漂亮,但实际没法用。原因在于分母 (Z) 是一个积分,对高维连续空间求这个积分几乎不可能。你没法逐点枚举所有轨迹来算归一化常数,所以必须走近似推断的路子。
概率推断里处理这种问题有几类常规武器:马尔可夫链蒙特卡洛、变分推断、消息传递。控制问题里最常用的是变分推断,因为它给你一个可以直接优化的函数,而且最后得到的策略形式非常干净。另一条路是消息传递,在树状图模型上能给出精确的 softmax 值函数,这个在 Toussaint 2019 那派的工作里比较多。工业界常见的 SAC、MPO 这类最大熵算法,本质上也都是在做这个变分近似。
3.2 变分推断的推导
我们想用一个容易处理的分布 (q(\tau)) 去近似真实后验 (p(\tau|O_{1:T}=1))。在控制设定里,自然的选择是把 (q(\tau)) 拆成:
[ q(\tau)=p(s_0)\prod_t p(s_{t+1}|s_t,a_t)\prod_t \pi(a_t|s_t) ]
也就是说,转移概率保持环境动力学不变,只是把动作部分的先验换成一个参数化的策略 (\pi(a_t|s_t))。现在最小化 (D_{\mathrm{KL}}(q(\tau)|p(\tau|O_{1:T}=1))),等价于最大化下面的证据下界:
[ \mathbb{E}{q(\tau)}\left[\sum_t r(s_t,a_t)\right] + \mathbb{E}{q(\tau)}\left[\sum_t \log \pi(a_t|s_t)\right]
- \text{常数} ]
注意第二项的符号。(\mathbb{E}[\log \pi]) 前面没有负号,这意味着我们要同时最大化奖励期望和 (\log \pi)。但 (\log \pi) 越大,通常策略越确定,所以这看起来像是奖励和确定性在互相打架。
这里需要再理一步。上面这个式子里 (\pi) 同时扮演了两个角色:既是我们采样的策略,又是目标里的“先验动作分布”。如果我把动作先验看成均匀分布或者把它吸收到常数里,再用负熵的形式重新整理,就得到更常见的写法:
[ J(\pi)=\mathbb{E}_{\tau\sim\pi}\left[\sum_t r(s_t,a_t)+\alpha,\mathcal{H}(\pi(\cdot|s_t))\right] ]
这就是最大熵强化学习的标准目标函数。所以你看,熵正则化项不是凭空加的,而是从“控制即推理”的变分近似里自然长出来的。当你让 (q(\tau)) 去逼近真实后验时,KL 散度本身就把熵带进来了。
3.3 温度参数 (\alpha) 的真正含义
很多文章说 (\alpha) 是“探索系数”,这个说法不算错,但在概率模型里它有一个更本质的意义:它是奖励和熵之间的汇率。
在 (\mathbb{E}[\sum r]) 和 (\mathcal{H}) 之间直接相加,单位都不一致。奖励可能很大,熵可能很小,直接加会导致数值失衡。引入温度参数后,目标变成 (\mathbb{E}[r_t]+\alpha\mathcal{H}),(\alpha) 就负责把熵调整到和奖励同一数量级。(\alpha) 越大,策略越倾向于均匀探索;(\alpha) 越小,奖励主导,策略越接近贪心。
这也是理解 SAC 自动温度调节的钥匙。SAC 的想法不是说“探索应该多还是少”,而是说“我希望熵保持在一个预设水平,(\alpha) 应该被调到能维持这个水平的值”。这个观点从 Control as Inference 的角度看非常自然,因为它本来就源于对分布宽度的控制。
3.4 精确解的形式:softmax 策略
如果我们把问题限定在标准 RL 设定里,可以进一步推导出最优策略的闭式形式。在最大熵目标下,最优策略满足:
[ \pi^*(a|s)\propto \exp\left(\frac{Q^*(s,a)}{\alpha}\right) ]
这里的 (Q^*) 是软 Q 函数,满足 soft 贝尔曼方程。这个式子说明两件事:第一,策略确实是一个 Boltzmann 分布;第二,(Q) 值本身是“软”的——它已经把未来熵计入价值。这也是为什么 Soft Q-Learning 和 SAC 在做策略更新时都在朝着这个 softmax 形状去拟合。
我把“硬”最优和“软”最优放一起对比会特别清楚:
| 对比维度 | 经典最优控制 / 硬最优 | Control as Inference / 软最优 |
|---|---|---|
| 优化对象 | 确定性最优动作 (u^*(s)) | 策略分布 (\pi^*(a|s)) |
| 输出形式 | 一个点 | 一个分布 |
| 核心方程 | 贝尔曼最优性方程 | soft 贝尔曼方程 |
| 目标函数 | (\mathbb{E}[\sum r]) | (\mathbb{E}[\sum r + \alpha\mathcal{H}]) |
| 温度参数 | 无 | 有,控制分布锐度 |
| 典型算法 | DDPG、DDP | SQL、SAC、MPO |
这种对比也解释了为什么最大熵策略在实际任务里更鲁棒:它在多峰价值区域不会强行选一个单点,而是把概率质量分散到多个可行解上,这对训练稳定性是有实际帮助的。
4. 用一个小例子穿透理论:单步决策的数值实践
4.1 手算 softmax 策略
理论符号看多了容易飘,做一个能实际算出来的小例子。假设系统只有一个状态,两个可选动作 (a_1,a_2),奖励分别是 (r(a_1)=1),(r(a_2)=2)。没有状态转移,先验动作分布设为均匀。温度 (\alpha=1)。
在这个设定下,后验动作分布就是:
[ \pi(a_i)\propto \exp(r(a_i)/\alpha) ]
代入数值:
[ \pi(a_1)=\frac{e^1}{e^1+e^2}\approx\frac{2.718}{10.107}\approx 0.269 ]
[ \pi(a_2)=\frac{e^2}{e^1+e^2}\approx\frac{7.389}{10.107}\approx 0.731 ]
可以看到,奖励差一倍,选择概率差了接近三倍。这就是指数加权放大的效果。现在把温度调低到 (\alpha=0.5),再算一次:
[ \pi(a_2)=\frac{e^{4}}{e^{2}+e^{4}}\approx\frac{54.598}{61.987}\approx 0.881 ]
温度降低后,分布明显向高奖励动作收缩。如果继续让 (\alpha\to 0),概率趋近于把全部质量压到 (a_2),这就回到经典最优控制。这个例子虽然简单到有点无聊,但它把整篇理论的逻辑闭环了:奖励通过指数进入概率,温度决定分布锐度,归一化之后就是策略。
4.2 从单步到多步:贝尔曼结构自然出现
单步例子里没有状态转移,所以看不出“推理”和“动态规划”的关系。多步情况下,如果我有两个时刻,用变分推断去推后验,就会得到类似递归的结构:最后一步的 softmax 策略向上传递,形成 soft 贝尔曼方程。这也是为什么说“控制即推理”和“动态规划”在结果上是一致的,只是推导语言的差异。
我建议对理论感兴趣的读者做一件事:用一个两时间步的玩具 MDP,手动写出联合分布,然后分别用“动态规划的贝尔曼递归”和“后验推断的变量消元”去求解,你会看到最终表达式完全一致。这个过程能帮你把两个领域的概念彻底打通。
4.3 和真实算法的对应关系
说清楚这个小例子之后,再回头看实际算法就很清晰了:
- Soft Q-Learning 就是试图让 Q 函数满足 soft 贝尔曼方程,然后用 softmax 得到策略。
- SAC 的核心更新和 SQL 一致,但它额外引入了自动温度调节和一个独立策略网络,训练更稳定。
- MPO 的 E 步和 M 步分别对应变分推断里的“算权重”和“更新策略”。
- 基于模型的概率 MPC 方法则直接在高斯过程或神经网络动力学上做模型预测控制,把 Control as Inference 的思想应用到连续控制中。
这些算法实现细节千差万别,但理论源头都能追到这一篇讲的框架上。我在读这些算法论文时,最先做的绝不是看公式,而是先问一句:“这论文里的策略是用什么形式定义的?它对应的后验分布是什么样的?温度参数在哪里?”想清楚这三个问题,整个算法的主干就清晰了大半。
5. 常见误解与避坑:我学习 Control as Inference 踩过的坑
5.1 (\exp(r)) 不是合法概率,别较真
理论上,(p(O_t=1|s_t,a_t)=\exp(r(s_t,a_t))) 在 (r>0) 时会大于 1,严格来说不是一个合法的伯努利概率。很多刚接触的人在这里会被卡住:奖励为正时概率怎么会大于 1?
文献里的处理方式是心照不宣的:把它当作未归一化的伪似然。推导后验时,多余的比例常数会被分母吸收。如果你需要严格的概率解释,可以通过减去一个常数或者显式除以最大值来修正。但记住,修正带来的变化会被温度参数吸收,所以不影响最终策略形式。这个点想通了,之后读论文会顺畅很多。
5.2 后验轨迹分布不等于策略
另一个高频误区是把 (p(\tau|O_{1:T}=1)) 直接当成策略 (\pi(a_t|s_t))。这两个东西不是一回事。后验轨迹分布是整条链路的联合分布,包括动力学和状态变迁;策略是你站在某个状态时对动作的条件分布。要从后验中得到策略,通常需要做进一步的变分近似或迭代求解。
最简单的区分方式是看条件变量:策略里条件是当前状态 (s_t),后验轨迹分布里条件是全链路的“最优性观测”。一个是局部条件,一个是全局条件。这个区别在推导变分下界时特别重要,别混。
5.3 奖励尺度和温度的关系
我在第一次实现最大熵类算法时犯过一个低级错误:奖励范围比较大(比如 0-100),温度还是默认的 1,结果策略几乎变成了 uniform。原因就是 (\alpha) 没有和奖励尺度匹配起来。在 Control as Inference 框架里,奖励进入概率之前除以温度,本质上是在做归一化。实际工程里,很多实现会预先对奖励做 scaling,或者直接用 SAC 式的自动温度调节,原因就在这里。
我个人的建议是,如果手写的代码,先把奖励统计一下,看它的典型范围和分布。如果奖励普遍在几十的量级,温度至少也要几十起步才合理。别一上来就用 1,那是拿理论模型里的“自然单位”套到工程数值上,必然会翻车。
5.4 读经典论文时的符号混乱
不同学者用符号习惯差异很大。Todorov 那篇更偏控制,用 (u) 表示控制量,关心的是 KL 散度控制;Toussaint 那篇更偏概率图模型,强调消息传递;到了 Levine 的综述,又回到强化学习语言写 (Q,V,\pi)。读之前如果不统一符号体系,很容易在“后验”“策略”“软值函数”之间迷失。
我的做法是拿到一篇论文先做一次翻译:把它的 (Q_{\mathrm{soft}})、后验分布、策略分布分别对应到统一框架里,画一个对照表,然后再往下读。这样看起来慢,其实整体省时间,因为你不会中途反复倒回去猜某个符号的含义。
5.5 动作为什么必须是分布的
还有一个小细节值得提醒:动态规划输出的 (u^*(s)) 是确定性动作,控制即推理输出的 (\pi^*(a|s)) 是条件分布。这个差别不是数学游戏。在真实物理系统上,多峰奖励分布非常常见,一个动作可能因为目标不同而产生多个同等优秀的解。确定性策略只能选其中一个,而概率策略保留多种可能,让上层规划器或者人类操作员有更大的决策空间。这也是这套理论在机器人学里特别受关注的原因之一。
我个人学这套理论最深的体会是:想要真正理解它,光看书不够,一定要找一个最简化的例子,把联合分布、后验、变分目标、温度参数从头到尾手推一遍。我当初就是用上面那个单步决策的小例子把整个链路走通之后,再去读 Todorov 2009 和 Levine 2018,突然就觉得所有公式都顺了。建议你也拿一个两状态的 MDP 试试,把奖励设计成有重叠的形状,亲眼看温度如何改变策略分布。这个练完之后,再回头跑 SAC 或者分析其他最大熵算法,你会看到完全不一样的东西。系列第二篇我准备写变分推断的具体求解步骤和一个小规模的数值算例,把这篇留下的公式真正落到可运行的代码上。