想象你是深夜山林里的一位寻宝者。山体漆黑一片,地形高低起伏,你只有一盏只能照亮脚下几步的灯。你有一套固定的“步伐习惯”,用一串数字 θ 描述——心情低落时步子偏大,遇到陡坡时爱往左绕。每次进山,你都会走出不同的路线,站到不同的海拔上,而海拔高低就是这一趟的回报。你可以反复进山,但山总在变:落石、风向、土质都会捣乱。所以单次走得高不算本事,真正重要的是“长期平均下来你能站多高”。 现在向导递来一张数学地图,上面写着一个叫“策略梯度定理”的结论。它回答的问题非常具体:我怎么根据已经走过的路,调整步伐参数 θ,让长期平均海拔涨得最快? 整张地图的路线是先写下“平均收获”的数学表达式,再用一把叫“对数导数”的扳手把藏在概率乘积里的梯度一寸寸撬出来,最后惊喜地发现——环境的地质细节全被消掉了,只剩“把每一步动作的对数概率往高回报轨迹的方向推一推”。这就是 REINFORCE 的来历,也是 PPO 等现代强化学习算法的理论地基。
学懂这段推导,你就拿到了强化学习策略优化方法的“源代码”:REINFORCE、Actor-Critic、PPO 不再需要死记公式,而是能顺着数学逻辑自己推出来。
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
Step 1: 期望回报的微分 梯度与积分交换 → 对概率密度求导 将梯度算子移入积分号内,对概率密度求导 Step 2: 轨迹联合概率分解 J(θ) = ∫ p(τ;θ) · R(τ) dτ 期望回报 = 所有轨迹的概率 × 回报 的积分 策略梯度定理推导可视...
目标函数建立
想象你是深夜山林里的一位寻宝者。山体漆黑一片,地形高低起伏,你手里有一盏只能照亮几步路的灯。你有一套固定的“步伐习惯”,用一串数字 θ 描述:心情低落时步伐稍大,地形陡峭时爱往左绕。每次进山,你都会因为这套习惯走出各种路线,最后站在不同海拔上——海拔的高低就是这次“寻宝”的回报。山上总有落石、风向等随机因素,所以单次走得高不算本事,真正重要的是“长期平均下来你能站多高”。
这个“长期平均海拔”就是强化学习里的期望回报 J(θ)。策略 π_θ(a|s) 是你在状态 s 下选择动作 a 的概率分布,θ 是策略网络的权重。一条完整的轨迹 τ = (s₀, a₀, s₁, a₁, …, s_T) 记录了你从起点到终点的全部经历。期望回报就是对所有可能轨迹的“概率 × 回报”加权和:
问题来了:J(θ) 是一个积分,θ 藏在内层概率密度里。我们不能直接对积分号外的 J 求导,只能想办法把对 θ 的求导“穿过”积分。整篇文章就是围绕“如何安全地把梯度搬进期望”展开的:先拆开轨迹概率,再用对数导数搬动梯度,最后化简成能采样的形式。
寻宝者像是在问向导:“我该往左挪还是往右挪?”——但这个问题的答案藏在所有可能路线的加权和之中,无法一眼看穿。策略梯度定理就是这位向导即将递来的地图。
- 期望符号$\mathbb{E}_{\tau \sim p_\theta(\tau)}[\cdot]$ 表示轨迹 $\tau$ 按概率密度 $p_\theta(\tau)$ 随机抽样后的平均。
- 积分展开把期望展开成轨迹空间上的积分,积分核是“轨迹概率 × 回报”。
轨迹概率拆解
一条路线不是瞬间生成的。回想你进山的每一步:起点入口由山林随机决定;站在某个位置 s_t,你按习惯迈出一步 a_t;这一步踩下后,地形(泥土松软、岩石光滑)把你带到新位置 s_{t+1};然后你继续迈步……整条路就是“你——山——你——山”交替出来的。每一步只取决于当前的脚印和这一步的选择,不回头看更早的历史——这就是马尔可夫链的结构。
把这段直觉写成数学,轨迹的联合概率 p_θ(τ) 能拆成三块相乘:初始状态分布 p(s₀)、策略项 π_θ(a_t|s_t)(你,含参数 θ)、状态转移项 p(s_{t+1}|s_t,a_t)(山,不含 θ):
这个分解是整个推导的地基:它告诉我们 θ 只出现在每步的 π_θ 因子中。环境项虽然影响轨迹的分布,但不直接贡献对 θ 的梯度——这为后面的“消去”埋下伏笔。
寻宝者把走过的每一步都记在账本上,标清“哪一步是自己选的、哪一步是地形推的”。这份账本,正是下一节要对它求导的原料。
- 初始状态分布轨迹第一个状态 $s_0$ 由环境的初始分布决定,与策略无关。
- 策略项每一步在状态 $s_t$ 选择动作 $a_t$ 的概率,包含全部参数 $\theta$。
- 转移项地形把 $(s_t,a_t)$ 变成 $s_{t+1}$ 的概率,即环境模型。
- 连乘结构三部分相乘构成完整的轨迹概率链,是马尔可夫决策过程的直接体现。
对数导数技巧
现在你盯着账本上的连乘式发愁:直接对一大串乘积求导,会拖出又长又乱的表达式。但你发现账本的每一行都能取“对数”——对数有个神奇特性:把乘法变成加法。一串数的乘积取对数,就是每位对数相加。而导数就像个“灵敏度探测器”,加总结构的灵敏度显然比连乘结构好算得多。
数学上这招叫对数导数。对任意正函数 f 有 f'/f = (log f)'。所以概率的梯度可以改写为:
从目标函数视角看,原本“对积分内的 p_θ(τ) 求导”被换成了“对 log p_θ(τ) 求导后乘回 p_θ(τ)”。前者难算,后者却因为 log 能拆连乘而变得可行。这个技巧在统计里被称为得分函数(score function),核心思想是“用对数概率的梯度去表示概率本身的梯度”。
寻宝者手里多了一把“对数钥匙”——用这把钥匙,锁在乘积里的决策灵敏度会一道一道被拧开。
- 对数求导公式因为 $\frac{\mathrm{d}}{\mathrm{d}\theta}\log f(\theta) = \frac{f'(\theta)}{f(\theta)}$,把 $f(\theta) = p_\theta(\tau)$ 代入。
- 两侧同乘概率将分母 $p_\theta(\tau)$ 乘到等号另一边,得到梯度的改写式。
期望梯度化简
钥匙已经插进锁里。现在把对数导数搬进 J(θ) 的梯度:原来积分号外面求导,导数必须攻击整块概率;替换后,攻击目标变成 log 轨迹概率,而原概率被“转指”为采样的权重。这样梯度就钻进了期望内部,变成“采样后取平均”的形式。
对 J(θ) 求梯度,再把上一节的等式代入:
接着展开 $\nabla_\theta\log p_\theta(\tau)$:连乘取对数变连加,然后逐项求导。真正精彩的时刻来了——初始分布和转移概率都不依赖 θ,求导后等于零:
“环境模型消失”是整个推导最常被误解的地方。注意:被消掉的是“环境模型的梯度”,不是环境模型的概率。我们依然要在真实环境里跑轨迹来采样,只是计算梯度时不需要知道转移概率的解析形式——这正是策略梯度方法能用于机器人、游戏等黑盒环境的根本原因。
寻宝者发现:原来优化步伐根本不需要知晓山体的完整地质图!只要把自己每一步动作的对数灵敏度记录下来就够了。
- 梯度搬入期望把 $\nabla_\theta p_\theta(\tau)$ 替换为 $p_\theta(\tau)\nabla_\theta\log p_\theta(\tau)$,原积分重写为期望。
- 对数展开轨迹$\log p_\theta(\tau)$ 拆成三段对数之和。
- 无关项求导归零不含 θ 的项对 θ 求导均为 0。
- 求和保留策略项只剩 $\sum_t\nabla_\theta\log\pi_\theta(a_t|s_t)$。
回报加权梯度
把前两节拼起来,定理终于露出全貌。寻宝者手里握着一份“动作灵敏度清单”(每一步的对数概率梯度),还有每条路线的海拔回报。两者相乘、再做期望——于是路线海拔高,清单上的每个动作都会被向上推;路线海拔低,清单上的动作就被向下压。这就是策略梯度定理的标准形式:
由于期望无法解析计算,REINFORCE 算法用蒙特卡洛采样来估计这个梯度:跑 N 条轨迹,取平均:
直观解释:如果某条轨迹回报很高,说明这条轨迹上的动作“值得多做”,于是沿 $\nabla_\theta\log\pi_\theta$ 上升让这些动作概率变大;回报为负则反向。注意 $R(\tau)$ 在采样后是常数,不参与对 θ 的求导——这一点常被初学者搞混。
回到深夜山林:走完几十条路线后,寻宝者把脚印、动作和最终海拔一起汇总,高原之路上的每个步伐都被加强,低谷之路上的步伐被削弱——下一次进山,他就自然地更贴近金矿了。
- 定理形式把上一节化简结果代回期望梯度,得到回报加权式。
- 梯度上升更新参数沿估计梯度方向移动,$\alpha$ 为学习率。
- 采样平均估计用 N 条轨迹的样本均值来近似数学期望。
- 概率推动直觉高回报轨迹的 $\log\pi$ 梯度方向被放大,低回报被抑制。
基线降方差
直接用海拔当权重有个麻烦。山里起雾、风向突变都可能让某条路虚高,而一条本不错的路线也可能因为一块滚石跌入低谷。这些纯运气成分会放大梯度估计的噪声,让寻宝者忽左忽右。解决办法是找一个“参考海拔线”:从每条轨迹的回报里减掉这条基线,剩下“比起平均情况多出来的部分”。
基线 b(s_t) 可以依赖于当前状态 s_t,但绝不能依赖当前动作 a_t。于是新的梯度估计为:
为什么减掉基线不改变期望?因为对所有动作求和时,概率分布的总和是 1,梯度之和为 0:
基线不只是理论把戏。REINFORCE with baseline 在实践中让方差成倍下降,训练曲线平滑许多。带基线的式子再进一步,就是 Actor-Critic 家族的基础:用一个神经网络估计 V(s) 作为基线,同时学策略。这也是通往现代算法的桥梁。
有了参考海拔线,寻宝者不再被一时运气牵着走——他看的是“这条路比通常的路线高多少”,而不是“路的绝对海拔是多少”。真正的宝藏之路,就这样从噪声中浮现出来。
- 权重改写把 $R(\tau)$ 换成 $R(\tau)-b(s_t)$,代回定理。
- 动作求和消零对动作空间求和时 $\sum_a\nabla_\theta\pi_\theta(a|s) = \nabla_\theta 1 = 0$,所以基线项期望为零。
- 优势函数最常用的基线是状态价值 $V(s_t)$,于是权重成为优势。
PPO更新关联
裸 REINFORCE 还有一个隐患:步子太大容易在黑夜中踩空。每轮更新如果直接把策略权重推得太远,可能让模型立刻崩溃。PPO 给出的解法像个“安全围栏”:更新时只允许新步伐与旧步伐保持接近,用重要性采样的比值作为桥梁,再对比值进行裁剪,防止单次更新越界。
PPO 先收集旧策略 π_θk 的样本,然后用重要性采样比 r_t(θ) = π_θ(a_t|s_t) / π_θk(a_t|s_t) 衡量新旧策略的偏离程度,目标是最大化带裁剪的期望:
策略梯度定理是 PPO 的引擎,重要性采样和裁剪是它的安全装置。现代的 RLHF、游戏 AI 训练几乎都跑在 PPO 上,而它的理论基础,就是我们从 J(θ) 出发一步步搬出来的这个梯度表达式。
寻宝者终于配齐了装备:策略梯度给了方向,基线给了清晰度,PPO 的裁剪则给了安全感。深夜山林里,他可以放开脚步向金矿冲刺了。
- 重要性采样比$r_t(\theta)$ 衡量新旧策略在动作 $a_t$ 上的概率比值。
- 优势加权比值乘以优势 $\hat{A}_t$,方向与策略梯度一致。
- 裁剪限幅将比值限制在 $[1-\epsilon, 1+\epsilon]$,超出部分被截断。
- 保守取小min 选取原始值与裁剪值中较保守的一个,保证更新不过冲。
AI 应用场景
游戏 AI 训练(Dota 2 / 围棋)
阶段:策略优化与样本效率改进
解决的问题:传统规则 AI 靠人工设计行为逻辑,无法应对高维动作空间;策略梯度让 AI 直接从对局胜负中学习“哪类动作值得加强”,而不需要人工标注每步的好坏。
具体案例:OpenAI Five 早期用带基线的策略梯度(对应正文第 6 节)训练,在 Dota 2 中通过对局采样估计梯度,逐步提高胜率。每条对局是一条轨迹,胜利与否是回报,策略梯度告诉模型每个操作该被加强还是削弱。
大语言模型 RLHF 对齐
阶段:奖励建模后的策略更新
解决的问题:监督微调只能模仿人类回答风格,无法直接优化“人类满意度”;依赖策略梯度类方法(PPO)把奖励信号传导到生成概率上。
具体案例:InstructGPT / ChatGPT 对齐阶段用 PPO 更新语言模型,生成一个 token 相当于动作,整句回答是一条轨迹,人类偏好模型的打分是回报。策略梯度定理保证了“把高分回答中的 token 概率调高”这一操作在数学上是合理的。
自动驾驶决策策略学习
阶段:连续控制策略优化
解决的问题:换道、超车等决策动作是连续的,基于价值的算法在高维连续动作中失效;高斯策略 + 策略梯度天然适合连续动作空间。
具体案例:仿真环境中用带基线策略梯度训练换道模型,每条完整驾驶轨迹的到达效率作为回报,更新策略均值。正文第 6 节的基线和第 7 节的 PPO 裁剪,帮助训练在复杂路况中保持稳定。
Python 演示
import mathimport random def terrain(x): """双峰地形函数, 在 x=0.70 附近主峰最高(金矿)""" return (0.10 + 0.55 * math.exp(-((x - 0.70) / 0.10) ** 2) + 0.25 * math.exp(-((x - 0.30) / 0.16) ** 2)) def reinforce(num_episodes=800, lr=0.05, sigma=0.18): center = 0.30 for ep in range(num_episodes): actions = [random.gauss(center, sigma) for _ in range(24)] rewards = [terrain(a) for a in actions] baseline = sum(rewards) / len(rewards) grad = 0.0 for a, r in zip(actions, rewards): grad += (r - baseline) * (a - center) / (sigma ** 2) center += lr * grad / len(actions) if ep % 100 == 0: avg = sum(rewards) / len(rewards) print("episode %d, center=%.3f, avg_reward=%.3f" % (ep, center, avg)) return center if __name__ == "__main__": final_center = reinforce() print("learned center: %.3f (target 0.700)" % final_center)
actions = [random.gauss(center, sigma) for _ in range(24)]高斯策略:一批采样 24 个动作,模拟策略 π_θ。rewards = [terrain(a) for a in actions]与环境交互:每个动作获得地形高度回报,对应 R(τ)。baseline = sum(rewards) / len(rewards)用本批均值做基线,对应正文第 6 节的降方差技巧。grad += (r - baseline) * (a - center) / (sigma ** 2)对数概率梯度乘优势累加,正是定理的蒙特卡洛估计。center += lr * grad / len(actions)梯度上升更新策略参数,对应 $θ ← θ + α·ĝ$。
常见误区
误区“推导里环境概率项都被消掉了,说明策略梯度算法不需要环境,直接在脑子里算梯度就行。”
正解消掉的是环境模型的“导数”,不是环境模型的“概率”。采样得到的轨迹仍然由转移概率决定,你依然要在真实环境里跑数据。就像寻宝者不需要山的施工图,但必须亲自踩在山上才能记下路线。梯度表达式里没有 ∂p/∂θ,但期望本身仍按环境的轨迹分布取样。
为何常见:看到推导中环境项求导归零,就误以为环境连采样都不需要了,把“不需要模型梯度”偷换成了“不需要模型”。
误区“回报是动作产生的,所以回报也要对策略参数求导,梯度里应该出现 ∂R/∂θ。”
正解在 REINFORCE 中,被采样的 R(τ) 当作常数,不参与对 θ 的求导。真正的梯度是对期望(积分)求导,期望里的概率密度是 θ 的函数,而回报函数 R(τ) 完全由环境给定,不依赖 θ。如果把 R 也求导,等于把环境梯度硬塞进来,反而违背了推导的初衷。
为何常见:直觉上觉得“动作影响回报”,就容易把回报也求导,混淆了“轨迹分布”与“回报函数”对 θ 的依赖关系。
误区“我随便给回报减一个常数,比如 10,也能降低方差。”
正解任何与当前动作无关的基线都不改变期望(无偏),但方差可能降低也可能升高。只有贴近该状态下回报期望的基线(如 V(s))才能有效压噪声。一个离群的常数可能反而加大波动,就像减错海拔参考线,让本来就模糊的路径信号更乱。
为何常见:只记住了“基线不改变期望”的证明,忽略方差分析,把“不偏”和“一定降方差”画了等号。
误区“梯度方向是上升方向,更新后 J(θ) 必然增加,训练曲线必然一路向上。”
正解梯度上升只保证无穷小步长下单调。实际用蒙特卡洛估计梯度,本身带随机噪声,步长稍大就可能让回报下降。这正是 PPO 加裁剪、保守更新存在的原因——寻宝者单次迈步可能踩空,护栏的意义就在于此。
为何常见:高数里“梯度方向函数增长最快”的直觉被过度外推,忽略了随机估计误差和有限步长的影响。
面试题
Q1. 策略梯度优化的目标函数通常是?
- A.状态价值的期望和
- B.策略参数的期望回报← 正确答案
- C.动作价值函数的最大
- D.状态动作对的收益总和
答案:B。策略梯度优化的对象是“期望回报” J(θ)=E[R(τ)],它是以策略参数 θ 为自变量的函数。A 是价值函数而非目标,C 是贪婪策略选动作的方式,D 描述的是 Q 值。就像寻宝者追求的是长期平均海拔,而不是某一步踩得有多高。
Q2. 对数导数技巧的核心等式是?
- A.∇p = p∇logp← 正确答案
- B.∇logp = p∇p
- C.∇p = logp∇p
- D.∇logp = ∇p·logp
答案:A。由链式法则 $\nabla\log p = \nabla p / p$,两边乘 p 得 ∇p = p∇log p。它把“乘积概率的梯度”改写成“概率乘对数梯度”,这正是给锁在乘法链条里的 θ 装上钥匙的过程。其余选项方向或变量位置不对。
Q3. 轨迹联合概率中与策略参数无关的是?
- A.动作选择的概率分布
- B.初始状态的分布概率← 正确答案
- C.累计回报的最终数值
- D.策略网络的输出概率
答案:B。轨迹概率 $p_\theta(\tau)=p(s_0)\prod\pi_\theta(a_t|s_t)p(s_{t+1}|s_t,a_t)$ 中,初始状态分布 p(s0) 和转移概率都不含 θ。动作选择概率和策略网络输出都依赖 θ。就像起点入口和地形反应不由你的步伐习惯决定。
Q4. REINFORCE 估计期望梯度使用的方法是?
- A.时序差分误差收敛
- B.蒙特卡洛采样平均← 正确答案
- C.贝尔曼方程迭代回溯
- D.动态规划全空间搜索
答案:B。REINFORCE 直接采样 N 条完整轨迹,用 $\frac{1}{N}\sum\nabla\log\pi·R$ 近似期望梯度。TD 和动态规划都需要价值函数迭代,而 REINFORCE 不需要环境模型,只靠轨迹样本平均,对应寻宝者用走过的路统计最优方向。
Q5. 以下哪些操作可以降低策略梯度的方差?
- A.使用优势函数作为权重← 正确答案
- B.增加每次采样的轨迹数量← 正确答案
- C.对回报做低通滤波
- D.引入状态相关的基线← 正确答案
答案:ABD。优势函数(回报减基线)是标准降方差手段;增加样本量直接减小蒙特卡洛方差;状态相关基线正是正文第 6 节的核心。低通滤波回报会引入偏差且不属于策略梯度常规做法。就像多走几条路、去掉天气虚高,才能看清真正的高产路线。
Q6. 基线函数不引入偏差的充要条件是?
- A.与当前动作无关的任意函数← 正确答案
- B.必须是状态价值的精确值
- C.必须是动作价值的估计值
- D.只能取固定的正数常数
答案:A。只要基线不依赖当前动作 a_t,对动作求和时 $\sum_a\nabla\pi_\theta(a|s)=0$,基线项期望必为零。它可以是任意与动作无关的函数,不限于 V(s) 正数常数。就像参考海拔线放在山的任何位置都不改变“相对高度差”的含义。
Q7. 策略梯度算法的典型特点包括以下哪些?
- A.参数空间内直接优化策略← 正确答案
- B.无需建立环境转移模型← 正确答案
- C.更新依赖完整轨迹样本← 正确答案
- D.保证每轮回报单调递增
答案:ABC。策略梯度直接在参数空间优化 π_θ,推导中环境梯度被消掉所以无需环境模型,REINFORCE 用完整轨迹做蒙特卡洛更新。但受采样噪声影响,并不保证每轮回报单调递增,D 不选。
Q8. 推导中环境模型消失的准确含义是?
- A.完全不需要环境交互学习
- B.转移概率梯度不会出现← 正确答案
- C.状态空间信息被完全忽略
- D.回报函数无需任何设计
答案:B。消失的是 $\nabla_\theta\log p(s_{t+1}|s_t,a_t)$ 这一环境梯度项,转移概率本身仍参与轨迹采样。不与环境交互就无法获得数据,所以 A 错;状态信息仍用于决策,C 错;回报设计始终必要,D 错。
Q9. 策略梯度更新时梯度方向取决于什么?
- A.回报加权后的概率梯度← 正确答案
- B.状态转移矩阵的逆变换
- C.回报函数的二阶导数项
- D.动作空间内的随机游走
答案:A。策略梯度方向是 $\sum\nabla\log\pi_\theta(a_t|s_t)·R(\tau)$,即“回报加权的对数概率梯度”。它告诉参数朝哪个方向移动能让高回报动作更可能发生。转移矩阵逆、二阶导和随机游走都与定理形式无关。
Q10. PPO 相比原始 REINFORCE 的改进措施是?
- A.使用重要性采样比值← 正确答案
- B.对新旧比值进行裁剪← 正确答案
- C.改用值函数迭代更新
- D.限制策略更新的步幅← 正确答案
答案:ABD。PPO 用新旧策略比值 r_t(θ) 做重要性采样,用 clip 将比值限制在 [1-ε, 1+ε],从而限制单步更新幅度。它仍然是策略梯度家族而非值迭代,所以 C 不选。就像给寻宝者装上护栏,既指对方向又限制步子别迈太大。