跳转到正文

6.1 策略梯度定理

上一节我们亲手跑通了赌博机实验,看到策略网络从"随机乱选"进化到"坚定地选 B"。核心代码只有一行:loss = -log_prob * reward

但这就留下了一个更深层的问题:为什么这个简单的公式能做到这件事?log_prob 乘以 reward,为什么就能让网络"偏爱好的动作"?这件事不是显然的——至少不像"算出每个动作的 值然后取最大"那么直觉(回顾:Q(s,a):给动作打分)。

这一节我们就来拆解它。你会看到,这一行代码背后藏着一个优雅的数学定理——策略梯度定理。它是整个 Policy-Based RL 的理论基石,也是后续 PPO、GRPO 等大模型对齐算法的数学起点。

Value-Based 与 Policy-Based

在拆数学之前,值得先退一步,看清本章的方法和第 4 章的 DQN 有什么本质不同。这不是两条平行的路——它们在解决问题的方式、能处理的问题类型、以及工程特性上都有根本差异。

核心思路

Value-Based(第 4 章 DQN)的核心思路是打分:学一个 ,给每个动作打分,然后选分数最高的。策略是隐式的——不直接学"该做什么",而是通过 间接得到(回顾:Q(s,a) 与贪心策略)。

Policy-Based(本章)的核心思路是直接学策略:参数化 ,直接输出每个动作的概率,然后优化参数 使期望回报最大(回顾:策略目标 )。策略是显式的——不需要中间的打分步骤。

Value-Based(DQN)Policy-Based(策略梯度)
学什么:每个动作值多少分:每个动作该做多大概率
怎么选动作(取最高分) 中采样
策略形式确定性(永远选最高分)随机性(输出概率分布)
数学工具贝尔曼方程 + TD 学习策略梯度定理 + 梯度上升

动作空间

Value-Based 方法有一个硬限制:只能处理有限个离散动作 要求你把所有动作的 值都比较一遍——CartPole 只有 2 个动作,没问题;但机械臂的关节力矩是连续值 在无限个候选中根本算不出来。大模型生成文本更不可能——每一步要从几万个 token 里选,你没法为每种组合都存一个 值。

Policy-Based 方法没有这个限制。它不比较动作的分数,而是直接输出概率分布——离散动作用 Softmax,连续动作用高斯分布。同一个策略梯度公式,换一个输出层就能从"左/右"切换到"连续力矩"。

探索机制

DQN 的策略是确定性的(永远选 ),探索必须靠外部手段——第 4 章用的是 -greedy:以概率 随机选动作,否则选 值最大的。 需要手动调度,太大浪费,太小不够探索(回顾:DQN 的三个组件)。

策略梯度天然输出概率分布,探索是内建的——如果网络认为某个动作有 30% 的概率值得尝试,它就会以 30% 的概率去试。不需要额外的探索机制。上一节赌博机实验中,策略从均匀分布出发,逐渐收敛到"坚定选 B"——整个过程没有 调度,探索到利用的过渡是自然的。

数据利用

这是两条路线最实际的工程差异。DQN 是 off-policy 的:经验回放池里存着旧数据,可以反复拿来训练(回顾:经验回放)。一条经验可以被多个 batch 复用,数据效率高。

策略梯度是 on-policy 的:梯度估计中的 要求必须用当前策略 产生的数据来估计。策略一更新,旧数据就失效了。这意味着策略梯度的数据效率天然低于 DQN——也是它最大的工程短板。

小结

Value-BasedPolicy-Based
动作空间仅离散离散 + 连续
策略类型确定性随机性(天然探索)
数据利用Off-policy(可复用旧数据)On-policy(必须用新数据)
方差低(TD 目标稳定)高(蒙特卡洛回报波动大)
代表算法DQN(第 4 章)REINFORCE(本章) → PPO(第 5 章)

两条路线各有优劣。好消息是,它们并非水火不容——第 6 章的 Actor-Critic 会把两条路线合并:用策略网络做决策,用价值网络降低方差。不过在此之前,我们需要先把 Policy-Based 这条路的数学基础打扎实。

策略目标函数

在讲怎么优化之前,先要回答一个更基本的问题:什么是"好的策略"?

在第 3 章的 MDP 框架中,我们定义过状态价值函数 ——衡量"从状态 出发,遵循策略 ,期望能拿多少分"。现在我们把视角从"单个状态"拉到"整个策略"——不问"从某个状态出发好不好",而是问"这个策略整体上有多好"。这正是第 3 章引入的策略目标函数 的含义。答案很自然:在所有可能的起点上,策略 期望能累积的折扣总奖励

先认识一下公式里的"角色":

符号角色大白话
策略参数神经网络的权重——调它们就改变策略的行为
策略函数给定状态,输出每个动作的概率分布
目标函数策略的"成绩单"——参数为 的策略平均能拿多少分
期望按策略 行动很多很多次,取平均
折扣奖励 步的奖励,越远未来的奖励越"不值钱"

就是我们的北极星——目标很简单:找到让 最大的参数 。整个策略梯度方法就是在回答"怎么找到这个 "。

梯度上升

怎么让 变大?深度学习里最经典的招数:沿着梯度方向走。

符号角色大白话
梯度"参数往哪个方向调,能让策略的成绩提升最多"
学习率"每一步走多大"——太大就震荡,太小就磨叽
梯度上升注意是加号不是减号——我们要最大化,不是最小化

但问题来了: 怎么算?

目标函数 里面有一个期望 ——理论上它要求你把所有可能的轨迹都跑一遍然后取平均。但在任何现实场景中,可能的轨迹数量都是天文数字,你不可能全部跑遍。这就好比你想知道全校学生的平均身高——你不可能量遍每一个人,但你可以随机抽 100 个人来估计。

策略梯度定理

这就是策略梯度定理出场的地方。1992 年,Ronald Williams 在他的 REINFORCE 论文中证明了一件不可思议的事:那个看似无法计算的梯度 ,可以被转化为一个可以用采样来估计的形式 [1]。后来 Sutton 等人在 2000 年进一步推广和系统化了这一结果 [2]

别被这个公式的长度吓到,让我们逐项认识它:

符号角色大白话
求梯度"参数该往哪调"
对数概率在状态 下,策略选择动作 的对数概率
对数概率的梯度"参数怎么调能改变这个动作被选中的概率"
累积回报从时刻 到结束的总奖励——"做了这个动作后最终拿了多少分"
外层 期望"跑很多次取平均"——用采样来近似

翻译成一句话:如果一个动作导致了好的结果( 大),就增加再做这个动作的概率;如果导致了坏的结果( 小),就降低它的概率。

这和你上一节在赌博机里看到的现象完全一致——选 B 经常赢( 大),所以选 B 的概率逐渐上升;选 A 偶尔赢,但不够多,概率就上不去。策略梯度定理只是把这个直觉用精确的数学语言表达了出来。

对数导数技巧

你可能觉得奇怪:为什么不直接写成 ,非要多一个

这是一个非常聪明的数学技巧,叫做对数导数技巧(Log-Derivative Trick)。根据链式法则:

这个"除以 "的操作恰好抵消了期望计算中隐含的 因子,让整个公式变得干净且可计算。从工程角度看,概率 之间,直接对概率求梯度可能产生极小的数值,影响训练稳定性。 映射到 ,梯度数值更稳定、更好用。

数学推导:从目标函数到策略梯度定理

目标函数的梯度需要对轨迹的概率分布求导:

其中 是一条轨迹, 是策略产生轨迹 的概率。梯度只能作用于 (奖励不依赖参数):

关键一步:利用恒等式 (两边除以 再乘以 ):

轨迹概率可以分解为:。取对数后对 求梯度,环境转移概率 不依赖于 ,所以只剩策略部分:

代回期望中,就得到了策略梯度定理。这个过程最妙的地方在于:环境动力学(状态转移概率)在求导时被消掉了。这意味着策略梯度不需要知道环境的模型——这是它比动态规划方法灵活得多的根本原因。

REINFORCE 算法

策略梯度定理告诉了我们梯度的形式。REINFORCE 就是这个定理最朴素的实现——用蒙特卡洛采样来估计期望(回顾:MC 方法的核心就是"跑完一整趟再回头看")。算法流程出奇地简单:

  1. 用当前策略 跑完一个完整的 episode,记录每一步的状态、动作和奖励
  2. 对每一步,计算从那一步到 episode 结束的累积回报
  3. 用采样来估计梯度:
  4. 沿梯度方向更新参数:

在 PyTorch 中,这可以写成一行:

python
loss = -log_prob * G_t  # 负号因为 PyTorch 默认做梯度下降(最小化),而我们要梯度上升(最大化)

回头看上一节赌博机的代码,loss = -log_prob * reward 就是 REINFORCE 在单步情况下的特例(,因为赌博机只有一步,没有后续)。

python
# REINFORCE 核心(多步版本)
for t in range(len(rewards)):
    G_t = sum(gamma ** k * rewards[t + k] for k in range(len(rewards) - t))
    loss += -log_probs[t] * G_t

optimizer.zero_grad()
loss.backward()
optimizer.step()

REINFORCE 的方差问题

REINFORCE 看起来简洁优雅,但它有一个几乎让它"不可用"的问题——方差太大

为什么?因为 是从时刻 到 episode 结束的累积回报——它包含了这段路径上的所有随机性。同一个动作,不同的采样轨迹可能给出截然不同的

情况实际发生了什么
好运气后续每步都恰好拿了高分很大
坏运气后续每步都恰好拿了低分很小

问题在于,策略梯度用 来判断"这个动作好不好"——但 的波动意味着,同一个好的动作可能因为运气差而被惩罚,同一个差的动作可能因为运气好而被奖励。这就像用一次考试的成绩来判断一个学生的水平——考砸了不代表学得差,可能只是那天状态不好。

在上一节的赌博机实验中你已经看到了这种现象的具象化——训练曲线不是平滑上升的,而是充满了锯齿和波动。把学习率调大(比如从 0.01 改到 0.1),策略会在 A 和 B 之间剧烈摇摆,永远无法稳定。这就是高方差的直接后果。

离散与连续动作空间

本章实验用的是离散动作空间(选 A 或选 B),但策略梯度定理对连续动作空间同样成立。这个区别不只是理论细节——它决定了策略网络的"输出头"怎么设计:

离散动作空间连续动作空间
例子CartPole 左/右、LLM 选词机器人关节角度、方向盘转角
输出层Softmax(每个动作的概率)高斯分布参数(均值 和标准差
采样方式按 Softmax 概率随机选 采样
的计算log_softmax高斯分布的对数密度公式

这个区别很关键——同一个 PPO 算法,换一个输出层就能从 LLM 对齐(离散 token 选择)切换到机器人控制(连续力矩输出)。这就是策略梯度方法比 Value-Based 方法灵活得多的地方:DQN 的 在连续空间中根本算不出来(你不可能对无限多个连续值逐一比较),而策略梯度直接对概率密度求梯度,天然适用于连续空间。

思考题:REINFORCE 和 Q-Learning 的更新有什么本质区别?

Q-Learning 更新的是价值函数 ("这个动作值多少分"),策略是通过 隐式得到的——先有分数表,再从中挑最好的。REINFORCE 直接更新策略参数 ,跳过了 Q 值这一步——不问"值多少分",直接学"该做什么"。

这个区别带来了两个关键后果:Q-Learning 是 off-policy 的(可以用旧数据反复训练),REINFORCE 是 on-policy 的(必须用当前策略的新数据);Q-Learning 只能处理离散动作(需要遍历所有动作取 max),REINFORCE 可以处理连续动作(直接对概率密度求梯度)。

思考题:为什么 REINFORCE 要跑完整个 episode 才能更新?

因为 需要从时刻 到 episode 结束的所有奖励。不跑到终点,你就不知道 的完整值。这就像你不知道一部电影好不好看,直到你看完最后一幕——中间退出无法给出公正的评价。

这也暗示了一个优化方向:如果我们能用一个更稳定的估计来替代 ,就可以不必等到 episode 结束就能更新。这个"更稳定的估计"从哪来?答案是第 3 章学的价值函数——用 作为基线,就能把"绝对回报"变成"相对回报"。这就是下一节基线实验和下一章 Actor-Critic 要做的事情。

REINFORCE 能工作,但"高方差"让它几乎不可用。好在策略梯度定理有一个奇妙的性质:你可以在梯度估计中减去一个不依赖于动作的"基线",既不改变梯度的期望方向,又能大幅降低方差。这个发现直接导向了 Actor-Critic 架构。让我们在下一章——Actor-Critic 架构——中看看它是怎么做到的。



参考文献
  1. Williams, R. J. (1992). Simple statistical gradient-following algorithms for connectionist reinforcement learning. Machine Learning, 8(3-4), 229-256. DOI ↩︎

  2. Sutton, R. S., et al. (1999). Policy gradient methods for reinforcement learning with function approximation. Advances in Neural Information Processing Systems, 12. ↩︎

现代强化学习实战课程

个人非商业离线镜像 · 内容版权归 WalkingLabs 所有,依 CC BY-NC-SA 4.0 授权 · 查看原文