跳转到正文

5.1 为什么需要策略梯度

本节导读

核心内容

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

DQN 做对了什么

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

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

动作Q(s,a)Q(s,a)
向左推0.80.8
向右推1.21.2

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

a=argmaxaQ(s,a)=argmax{0.8,  1.2}=向右推.a^* = \arg\max_a Q(s,a) = \arg\max\{0.8,\; 1.2\} = \text{向右推}.

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

动作个数需要算几个 QQargmax\arg\max 比较次数可行性
221轻松
443轻松
10001000999可行
10610^610610^6106110^6 - 1可行但慢
\infty\infty\infty不可能

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

argmax\arg\max 走不通的地方

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

机械臂:维度爆炸

机械臂的控制是典型例子。肩关节、肘关节、腕关节各有多个自由度,每个自由度能施加连续的力矩 τ[10,10]\tau \in [-10, 10]。假设有 6 个关节,动作空间是 [10,10]6[-10, 10]^6——一个六维连续空间中的无穷多个点。不可能为每个点都算一个 QQ 值,更不可能在无穷多个点中找 argmax\arg\max

一个自然的想法是:把连续空间离散化,再用 argmax\arg\max。比如每个关节只取 100 个力矩值,把连续空间近似成有限网格。6 个关节各取 100 个值,总动作数:

N=1006=1012.N = 100^6 = 10^{12}.

101210^{12} 个动作,每一个都要算一次 QQ 值。假设神经网络做一次前向传播需要 1μs1\mu\text{s}10610^{-6} 秒),那么一次动作选择的计算时间为:

T=1012×106s=106s11.6 天.T = 10^{12} \times 10^{-6}\text{s} = 10^6\text{s} \approx 11.6 \text{ 天}.

11.6 天才能做一个动作。对比之下,策略网络只需要一次前向传播——把状态输入网络,直接输出动作向量,耗时约 1ms1\text{ms}

方法一次动作选择的计算量耗时
DQN + 离散化101210^{12} 次前向传播11.6\approx 11.6
策略网络1 次前向传播,直接输出 μ=fθ(s)\mu = f_\theta(s)1ms\approx 1\text{ms}

而且这只是 6 个关节、每个关节只离散到 100 个值。实际机械臂关节数更多、精度要求更高时,离散化的动作数还会指数增长。这就是维度诅咒:每多一个关节,动作总数乘以一个因子。

大模型生成:概率分布优于贪心

大模型生成文本也面临类似的问题。每一步要从几万个 token 中选一个。假设词表大小为 50,000,argmax\arg\max 本身并不困难——只需比较 50,000 个数,计算量完全可以接受。问题不在于计算可行性,而在于生成质量。

假设当前要生成下一个词,网络输出了部分 token 的概率:

tokenP(token上下文)P(\text{token} \mid \text{上下文})
"是"0.400.40
"为"0.250.25
"乃"0.150.15
"系"0.100.10
......

argmax\arg\max(贪心解码)每次都选概率最高的 "是"。如果后面连续几个位置的概率分布类似,贪心解码会反复输出同一个字。而从概率分布中采样,有 25% 的概率选 "为",15% 的概率选 "乃"——这种随机性恰恰是流畅文本生成所需要的。策略网络天然输出概率分布 πθ(as)\pi_\theta(a|s),采样就是生成过程本身。

直接学习策略

既然"先打分再选"走不通,那就换一条路:跳过 QQ 值,直接学策略 πθ(as)\pi_\theta(a|s)。不问"每个动作值多少分",而是直接学"在什么情况下该做什么"。

这正是第 3 章路线二:策略目标 J(θ)J(\theta)的核心思路——定义一个策略目标函数 J(θ)J(\theta),然后直接优化参数 θ\theta 使 J(θ)J(\theta) 最大。

两种路线的区别可以用一个类比说清楚:Value-Based 方法像是一个美食评论家,给每道菜打分,然后选分数最高的那道;Policy-Based 方法像是一个经验丰富的厨师,不需要打分,直接知道在什么食材、什么场合下该做什么菜。

策略网络输出什么

策略网络 πθ(as)\pi_\theta(a|s) 的输出不是一个动作分数,而是一个概率分布。以 CartPole 为例:输入状态 s=[0.05,0.1,0.02,0.3]s = [0.05, 0.1, -0.02, 0.3],网络经过前向传播,最后通过 Softmax 层输出每个动作的概率:

πθ(s)=0.3,πθ(s)=0.7.\pi_\theta(\text{左} \mid s) = 0.3, \quad \pi_\theta(\text{右} \mid s) = 0.7.

符号含义
πθ\pi_\theta参数为 θ\theta 的策略网络
πθ(as)\pi_\theta(a \mid s)在状态 ss 下选择动作 aa 的概率
s=[0.05,0.1,0.02,0.3]s = [0.05, 0.1, -0.02, 0.3]当前状态(位置、速度、杆角度、角速度)
[0.3,0.7][0.3, 0.7]网络输出的动作概率向量

选动作的方式是采样而非比较。从 [0.3,0.7][0.3, 0.7] 的分布中采样:生成一个 [0,1)[0,1) 上的均匀随机数 uu,若 u<0.3u < 0.3 则向左推,否则向右推。比如 u=0.65u = 0.65,因为 0.65>0.30.65 > 0.3,选"向右推"。

与 DQN 的对比

在同一个状态下,两种方法走的路径完全不同:

DQN 路径: 网络输出 QQ\to argmax\arg\max \to 确定性动作

[0.8,  1.2]  argmax  向右推(永远选这个).[0.8,\; 1.2] \;\xrightarrow{\arg\max}\; \text{向右推} \quad (\text{永远选这个}).

策略网络路径: 网络输出概率 \to 采样 \to 随机动作

[0.3,  0.7]  采样  {向左推概率 0.3向右推概率 0.7[0.3,\; 0.7] \;\xrightarrow{\text{采样}}\; \begin{cases} \text{向左推} & \text{概率 } 0.3 \\ \text{向右推} & \text{概率 } 0.7 \end{cases}

两者最关键的区别在于:DQN 在训练好之后对同一个状态永远输出同一个动作(确定性策略);策略网络对同一个状态有可能输出不同的动作(随机性策略)。这种随机性不是缺陷,而是特性——它天然包含探索,不需要额外的 ε\varepsilon-greedy。

对于连续动作空间,策略网络的输出方式换成高斯分布的参数。比如机械臂需要输出 6 个关节的力矩,策略网络输出均值向量 μθ(s)R6\mu_\theta(s) \in \mathbb{R}^6 和标准差 σθ(s)R6\sigma_\theta(s) \in \mathbb{R}^6,然后从 N(μθ(s),  diag(σθ2(s)))\mathcal{N}(\mu_\theta(s),\; \text{diag}(\sigma_\theta^2(s))) 中采样得到动作。不需要离散化,不需要 argmax\arg\max,一次前向传播即可。

两条路线的差异

Value-Based(DQN)Policy-Based(策略梯度)
学什么Q(s,a)Q(s,a):每个动作值多少分πθ(as)\pi_\theta(a|s):每个动作该做多大概率
怎么选动作argmaxaQ(s,a)\arg\max_a Q(s,a)(取最高分)πθ(s)\pi_\theta(\cdot|s) 中采样
策略形式确定性(永远选最高分)随机性(输出概率分布)
动作空间仅离散离散 + 连续
探索机制外部添加(ε\varepsilon-greedy)内建(概率分布天然包含探索)
数据利用Off-policy(经验回放池可复用旧数据)On-policy(必须用当前策略的新数据)
方差低(TD 目标相对稳定)高(蒙特卡洛回报波动大)
代表算法DQN(第 4 章)REINFORCE(本章) → PPO(第 7 章)

逐行解释关键差异。

动作空间——这是选择路线的主要依据。DQN 的 argmax\arg\max 在连续空间中根本算不出来。策略梯度直接输出概率分布——离散动作用 Softmax,连续动作用高斯分布,换一个输出层就行。

探索机制——DQN 的策略是确定性的(永远选 argmax\arg\max),探索靠 ε\varepsilon-greedy(回顾:DQN 的三个组件)。ε\varepsilon 需要手动调度,太大浪费,太小不够探索。策略梯度天然输出概率分布,探索是内建的——如果网络认为某个动作有 30% 的概率值得尝试,它就会以 30% 的概率去试。

数据利用——这是两条路线最实际的工程差异。DQN 是 off-policy 的:经验回放池里存着旧数据,可以反复拿来训练。策略梯度是 on-policy 的:梯度估计中的 Eπθ\mathbb{E}_{\pi_\theta} 要求必须用当前策略产生的数据。策略一更新,旧数据就失效了。数据效率天然低于 DQN,是策略梯度最大的工程短板。

同一场景下两条路线的数值对比

用一个具体场景走一遍两条路线的全过程。场景设定:3 个状态 {s1,s2,s3}\{s_1, s_2, s_3\},2 个动作 {a1,a2}\{a_1, a_2\},折扣因子 γ=0.9\gamma = 0.9

DQN 路线:学 QQ 值,argmax\arg\max 选动作

假设经过训练,DQN 学到了如下的 QQ 表:

状态Q(s,a1)Q(s, a_1)Q(s,a2)Q(s, a_2)
s1s_11.51.52.32.3
s2s_20.80.80.4-0.4
s3s_33.13.12.92.9

在每个状态上执行 argmax\arg\max

π(s1)=argmax{1.5,  2.3}=a2,\pi(s_1) = \arg\max\{1.5,\; 2.3\} = a_2,

π(s2)=argmax{0.8,  0.4}=a1,\pi(s_2) = \arg\max\{0.8,\; -0.4\} = a_1,

π(s3)=argmax{3.1,  2.9}=a1.\pi(s_3) = \arg\max\{3.1,\; 2.9\} = a_1.

结果是一张确定的策略表:每个状态永远选同一个动作。如果需要探索,必须额外叠加 ε\varepsilon-greedy,比如 ε=0.1\varepsilon = 0.1 时以 10% 概率随机选:

状态a1a_1 的概率a2a_2 的概率
s1s_10.1×0.5=0.050.1 \times 0.5 = 0.050.9+0.1×0.5=0.950.9 + 0.1 \times 0.5 = 0.95
s2s_20.9+0.1×0.5=0.950.9 + 0.1 \times 0.5 = 0.950.1×0.5=0.050.1 \times 0.5 = 0.05
s3s_30.9+0.1×0.5=0.950.9 + 0.1 \times 0.5 = 0.950.1×0.5=0.050.1 \times 0.5 = 0.05

ε\varepsilon-greedy 的探索是均匀的:10% 的随机探索在 a1a_1a2a_2 之间平均分配。即使 Q(s3,a2)=2.9Q(s_3, a_2) = 2.9Q(s3,a1)=3.1Q(s_3, a_1) = 3.1 差距很小(两个动作接近一样好),探索概率的分配方式也和差距很大的 s1s_1 完全一样。

策略梯度路线:学 πθ(as)\pi_\theta(a|s),采样选动作

假设策略网络学到了如下的概率分布:

状态π(a1s)\pi(a_1 \mid s)π(a2s)\pi(a_2 \mid s)
s1s_10.20.20.80.8
s2s_20.90.90.10.1
s3s_30.550.550.450.45

s3s_3 上,策略网络认为两个动作接近一样好(0.550.55 vs 0.450.45),探索比例自然高;在 s1s_1s2s_2 上,优劣分明,探索比例自然低。不需要手动调 ε\varepsilon,概率分布本身就编码了"该探索多少"。

把两条路线的关键数字放在一起:

对比维度DQN 在 s3s_3策略梯度在 s3s_3
网络输出Q(s3,a1)=3.1Q(s_3, a_1) = 3.1, Q(s3,a2)=2.9Q(s_3, a_2) = 2.9π(a1s3)=0.55\pi(a_1 \mid s_3) = 0.55, π(a2s3)=0.45\pi(a_2 \mid s_3) = 0.45
选动作方式argmax{3.1,2.9}=a1\arg\max\{3.1, 2.9\} = a_1采样:55% 概率 a1a_1,45% 概率 a2a_2
探索外加 ε\varepsilon-greedy(均匀随机)内建(概率分布自适应)
连续动作空间适用不适用(需要离散化后算 QQ 值网格)适用(直接输出高斯参数)

核心差异在最后一行:DQN 的 argmax\arg\max 把动作空间限制在了有限离散集合;策略梯度跳过了"给每个动作打分"这一步,直接输出"怎么选动作"的概率分布,连续动作空间不再有障碍。

两条路线不是对立的

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

下一节从策略目标函数开始,推导策略梯度定理,引出 REINFORCE 算法:REINFORCE 算法

现代强化学习实战课程