跳转到正文

6.1 为什么需要策略梯度

本节导读

核心内容

  • 回顾第 4 章 DQN 的核心思路:学 ,用 选动作。
  • 理解 Value-Based 方法的根本局限:只能处理有限个离散动作。
  • 说明 Policy-Based 方法为什么直接学习 ,以及两种路线在动作空间、探索机制和数据利用上的本质差异。

DQN 做对了什么

第 4 章的 DQN 走了一条清晰的路线:先用神经网络近似 ,给每个动作打分,再用 选分数最高的。这条路线的底层逻辑是:不直接学"该做什么",而是先学"每个动作值多少分",再从中挑最好的。策略是隐式的——它藏在 值表的 里。

用 CartPole 的一个具体时刻来看这个过程。假设当前小车状态为 (位置、速度、杆角度、角速度),DQN 网络对这个状态做一次前向传播,输出两个 值:

动作
向左推
向右推

就是逐一比较然后取最大值对应的动作:

这个过程的关键前提是:动作集合有限且个数不多,所以能把每个动作的 值都算出来再比较。CartPole 只有 2 个动作,比较 2 个数;LunarLander 有 4 个动作,比较 4 个数。如果把动作扩展到 10 个、100 个、甚至 1000 个, 仍然可行——只是需要多算几个 值,做更多比较,但计算量线性增长,没有原则性困难。

动作个数需要算几个 比较次数可行性
221轻松
443轻松
10001000999可行
可行但慢
不可能

最后一行就是问题所在。当动作空间是连续的,动作个数无穷多,不可能为每个动作都算一个 值,更不可能在无穷多个数中找最大值。

走不通的地方

要求把所有动作的 值都比较一遍。只要动作个数有限,这件事没有问题。但很多实际任务的动作空间是连续的,动作个数无穷多。

维度爆炸

机械臂的控制是典型例子。肩关节、肘关节、腕关节各有多个自由度,每个自由度能施加连续的力矩 。假设有 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 算法

现代强化学习实战课程