6.1 为什么需要策略梯度
本节导读
核心内容
- 回顾第 4 章 DQN 的核心思路:学 ,用 选动作。
- 理解 Value-Based 方法的根本局限:只能处理有限个离散动作。
- 说明 Policy-Based 方法为什么直接学习 ,以及两种路线在动作空间、探索机制和数据利用上的本质差异。
DQN 做对了什么
第 4 章的 DQN 走了一条清晰的路线:先用神经网络近似 ,给每个动作打分,再用 选分数最高的。这条路线的底层逻辑是:不直接学"该做什么",而是先学"每个动作值多少分",再从中挑最好的。策略是隐式的——它藏在 值表的 里。
用 CartPole 的一个具体时刻来看这个过程。假设当前小车状态为 (位置、速度、杆角度、角速度),DQN 网络对这个状态做一次前向传播,输出两个 值:
| 动作 | |
|---|---|
| 向左推 | |
| 向右推 |
就是逐一比较然后取最大值对应的动作:
这个过程的关键前提是:动作集合有限且个数不多,所以能把每个动作的 值都算出来再比较。CartPole 只有 2 个动作,比较 2 个数;LunarLander 有 4 个动作,比较 4 个数。如果把动作扩展到 10 个、100 个、甚至 1000 个, 仍然可行——只是需要多算几个 值,做更多比较,但计算量线性增长,没有原则性困难。
| 动作个数 | 需要算几个 值 | 比较次数 | 可行性 |
|---|---|---|---|
| 2 | 2 | 1 | 轻松 |
| 4 | 4 | 3 | 轻松 |
| 1000 | 1000 | 999 | 可行 |
| 可行但慢 | |||
| 不可能 |
最后一行就是问题所在。当动作空间是连续的,动作个数无穷多,不可能为每个动作都算一个 值,更不可能在无穷多个数中找最大值。
走不通的地方
要求把所有动作的 值都比较一遍。只要动作个数有限,这件事没有问题。但很多实际任务的动作空间是连续的,动作个数无穷多。
维度爆炸
机械臂的控制是典型例子。肩关节、肘关节、腕关节各有多个自由度,每个自由度能施加连续的力矩 。假设有 6 个关节,动作空间是 ——一个六维连续空间中的无穷多个点。不可能为每个点都算一个 值,更不可能在无穷多个点中找 。
一个自然的想法是:把连续空间离散化,再用 。比如每个关节只取 100 个力矩值,把连续空间近似成有限网格。6 个关节各取 100 个值,总动作数:
个动作,每一个都要算一次 值。假设神经网络做一次前向传播需要 ( 秒),那么一次动作选择的计算时间为:
11.6 天才能做一个动作。对比之下,策略网络只需要一次前向传播——把状态输入网络,直接输出动作向量,耗时约 :
| 方法 | 一次动作选择的计算量 | 耗时 |
|---|---|---|
| DQN + 离散化 | 次前向传播 | 天 |
| 策略网络 | 1 次前向传播,直接输出 |
而且这只是 6 个关节、每个关节只离散到 100 个值。实际机械臂关节数更多、精度要求更高时,离散化的动作数还会指数增长。这就是维度诅咒:每多一个关节,动作总数乘以一个因子。
大模型生成 与 概率分布优于贪心
大模型生成文本也面临类似的问题。每一步要从几万个 token 中选一个。假设词表大小为 50,000, 本身并不困难——只需比较 50,000 个数,计算量完全可以接受。问题不在于计算可行性,而在于生成质量。
假设当前要生成下一个词,网络输出了部分 token 的概率:
| token | |
|---|---|
| "是" | |
| "为" | |
| "乃" | |
| "系" | |
| ... | ... |
(贪心解码)每次都选概率最高的 "是"。如果后面连续几个位置的概率分布类似,贪心解码会反复输出同一个字。而从概率分布中采样,有 25% 的概率选 "为",15% 的概率选 "乃"——这种随机性恰恰是流畅文本生成所需要的。策略网络天然输出概率分布 ,采样就是生成过程本身。
直接学习策略
既然"先打分再选"走不通,那就换一条路:跳过 值,直接学策略 。不问"每个动作值多少分",而是直接学"在什么情况下该做什么"。
这正是第 3 章路线二:策略目标 的核心思路——定义一个策略目标函数 ,然后直接优化参数 使 最大。
两种路线的区别可以用一个类比说清楚:Value-Based 方法像是一个美食评论家,给每道菜打分,然后选分数最高的那道;Policy-Based 方法像是一个经验丰富的厨师,不需要打分,直接知道在什么食材、什么场合下该做什么菜。
策略网络输出什么
策略网络 的输出不是一个动作分数,而是一个概率分布。以 CartPole 为例:输入状态 ,网络经过前向传播,最后通过 Softmax 层输出每个动作的概率:
| 符号 | 含义 |
|---|---|
| 参数为 的策略网络 | |
| 在状态 下选择动作 的概率 | |
| 当前状态(位置、速度、杆角度、角速度) | |
| 网络输出的动作概率向量 |
选动作的方式是采样而非比较。从 的分布中采样:生成一个 上的均匀随机数 ,若 则向左推,否则向右推。比如 ,因为 ,选"向右推"。
与 DQN 的对比
在同一个状态下,两种方法走的路径完全不同:
DQN 路径: 网络输出 值 确定性动作
策略网络路径: 网络输出概率 采样 随机动作
两者最关键的区别在于:DQN 在训练好之后对同一个状态永远输出同一个动作(确定性策略);策略网络对同一个状态有可能输出不同的动作(随机性策略)。这种随机性不是缺陷,而是特性——它天然包含探索,不需要额外的 -greedy。
对于连续动作空间,策略网络的输出方式换成高斯分布的参数。比如机械臂需要输出 6 个关节的力矩,策略网络输出均值向量 和标准差 ,然后从 中采样得到动作。不需要离散化,不需要 ,一次前向传播即可。
两条路线的差异
| Value-Based(DQN) | Policy-Based(策略梯度) | |
|---|---|---|
| 学什么 | :每个动作值多少分 | :每个动作该做多大概率 |
| 怎么选动作 | (取最高分) | 从 中采样 |
| 策略形式 | 确定性(永远选最高分) | 随机性(输出概率分布) |
| 动作空间 | 仅离散 | 离散 + 连续 |
| 探索机制 | 外部添加(-greedy) | 内建(概率分布天然包含探索) |
| 数据利用 | Off-policy(经验回放池可复用旧数据) | On-policy(必须用当前策略的新数据) |
| 方差 | 低(TD 目标相对稳定) | 高(蒙特卡洛回报波动大) |
| 代表算法 | DQN(第 4 章) | REINFORCE(本章) → PPO(第 5 章) |
逐行解释关键差异。
动作空间——这是选择路线的主要依据。DQN 的 在连续空间中根本算不出来。策略梯度直接输出概率分布——离散动作用 Softmax,连续动作用高斯分布,换一个输出层就行。
探索机制——DQN 的策略是确定性的(永远选 ),探索靠 -greedy(回顾:DQN 的三个组件)。 需要手动调度,太大浪费,太小不够探索。策略梯度天然输出概率分布,探索是内建的——如果网络认为某个动作有 30% 的概率值得尝试,它就会以 30% 的概率去试。
数据利用——这是两条路线最实际的工程差异。DQN 是 off-policy 的:经验回放池里存着旧数据,可以反复拿来训练。策略梯度是 on-policy 的:梯度估计中的 要求必须用当前策略产生的数据。策略一更新,旧数据就失效了。数据效率天然低于 DQN,是策略梯度最大的工程短板。
同一场景下两条路线的数值对比
用一个具体场景走一遍两条路线的全过程。场景设定:3 个状态 ,2 个动作 ,折扣因子 。
DQN 路线:学 值, 选动作
假设经过训练,DQN 学到了如下的 表:
| 状态 | ||
|---|---|---|
在每个状态上执行 :
结果是一张确定的策略表:每个状态永远选同一个动作。如果需要探索,必须额外叠加 -greedy,比如 时以 10% 概率随机选:
| 状态 | 选 的概率 | 选 的概率 |
|---|---|---|
-greedy 的探索是均匀的:10% 的随机探索在 和 之间平均分配。即使 与 差距很小(两个动作接近一样好),探索概率的分配方式也和差距很大的 完全一样。
策略梯度路线:学 ,采样选动作
假设策略网络学到了如下的概率分布:
| 状态 | ||
|---|---|---|
在 上,策略网络认为两个动作接近一样好( vs ),探索比例自然高;在 和 上,优劣分明,探索比例自然低。不需要手动调 ,概率分布本身就编码了"该探索多少"。
把两条路线的关键数字放在一起:
| 对比维度 | DQN 在 | 策略梯度在 |
|---|---|---|
| 网络输出 | , | , |
| 选动作方式 | 采样:55% 概率 ,45% 概率 | |
| 探索 | 外加 -greedy(均匀随机) | 内建(概率分布自适应) |
| 连续动作空间适用 | 不适用(需要离散化后算 值网格) | 适用(直接输出高斯参数) |
核心差异在最后一行:DQN 的 把动作空间限制在了有限离散集合;策略梯度跳过了"给每个动作打分"这一步,直接输出"怎么选动作"的概率分布,连续动作空间不再有障碍。
两条路线不是对立的
两条路线各有优劣,但它们并非水火不容。第 6 章的 Actor-Critic 会把两条路线合并:用策略网络做决策,用价值网络降低方差。不过在此之前,我们需要先把 Policy-Based 这条路的数学基础打扎实。
下一节从策略目标函数开始,推导策略梯度定理,引出 REINFORCE 算法:REINFORCE 算法。