第 6 讲:策略梯度 I——从策略搜索到 REINFORCE

Reinforcement Learning · Lecture 06。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应:Stanford CS234 Lecture 5(Policy Search 1) 配套代码:code/lecture06/(前 4 个文件只需 numpy;第 5 个需要 torch 和 gymnasium) 预计阅读时间:4 小时


0. 本讲导航

0.1 本讲要回答的问题

能不能跳过价值函数,直接学习策略本身?怎样对”期望回报”求梯度?

到目前为止,所有控制算法都是基于价值的:先学 Q(s,a)Q(s, a),再用 arg⁡max⁡aQ(s,a)\arg\max_a Q(s, a)(加上 ε\varepsilon 的探索)得到策略。这一讲换一个思路:把策略写成一个带参数的函数 πθ(a∣s)\pi_\theta(a \mid s),直接调整 θ\theta,让期望回报尽量大。这类方法叫策略搜索(policy search),其中用梯度来调整参数的叫**策略梯度(policy gradient)**方法。

策略梯度是现代深度 RL 的另一大支柱:机器人控制中的 PPO、大语言模型对齐中的 RLHF(第 9 讲)、推理模型训练中的 GRPO(第 16 讲),都建立在本讲的基础之上。

0.2 学完本讲,你应该能够

  1. 说出基于价值的方法的几个局限,以及直接学习策略的优缺点。
  2. 写出 softmax 策略和高斯策略,推导它们的得分函数 ∇θlog⁡πθ(a∣s)\nabla_\theta \log \pi_\theta(a \mid s)。
  3. 用似然比技巧推导 ∇θEx∼pθ[f(x)]=E[f(x)∇θlog⁡pθ(x)]\nabla_\theta \mathbb{E}_{x \sim p_\theta}[f(x)] = \mathbb{E}[f(x) \nabla_\theta \log p_\theta(x)]。
  4. 推导轨迹上的策略梯度,解释为什么环境的转移概率会消失。
  5. 陈述策略梯度定理。
  6. 利用因果性(未来的动作影响不了过去的奖励)降低方差,写出 REINFORCE 算法。
  7. 证明基线不改变梯度的期望,并解释它为什么能降低方差。
  8. 用 PyTorch 实现带基线的 REINFORCE,理解”替代损失”、优势标准化等实现细节。
  9. 说出策略梯度方法的主要问题(高方差、同策略的低样本效率、步长敏感),为第 7 讲做准备。

0.3 先修知识

知识点用在哪里最低要求
第 2 讲:VπV^\pi、QπQ^\pi、策略改进第 5 节必须
第 3 讲:MC 回报、偏差–方差第 6、7 节必须
第 5 讲:梯度下降、神经网络、PyTorch 基础第 2、8 节必须
对数的导数 ddxlog⁡f(x)=f′(x)f(x)\frac{d}{dx} \log f(x) = \frac{f'(x)}{f(x)}第 4 节必须——本讲最核心的一步推导就是它
期望的线性性,E[c]=c\mathbb{E}[c] = c第 4–7 节会用即可

0.4 本讲地图

第1节 为什么直接学策略?(基于价值方法的局限)
   │
第2节 策略的参数化:softmax(离散)、高斯(连续);得分函数
   │
第3节 目标函数与策略搜索:不用梯度的方法、有限差分
   │
第4节 似然比技巧:对"期望"求梯度的万能钥匙
   │
第5节 轨迹上的策略梯度:环境的转移概率消失了;策略梯度定理
   │
第6节 利用因果性 → REINFORCE
   │
第7节 基线:不改变期望、降低方差
   │
第8节 实践:PyTorch 实现与消融实验
   │
第9节 策略梯度的问题 → 第7讲

1. 为什么直接学策略?

1.1 基于价值的方法有什么局限?

局限一:连续动作。 机器人关节的力矩、方向盘的角度、药物的剂量都是连续的。对 QQ 贪心需要求解 arg⁡max⁡aQ(s,a)\arg\max_a Q(s, a)——在连续空间里,这本身就是一个优化问题,每一步决策都要解一次。

局限二:策略变化不平滑。 QQ 值的微小变化可能让 arg⁡max⁡\arg\max 突然从一个动作跳到另一个动作。策略是价值的”不连续函数”,这让学习过程容易震荡。

局限三:最优策略可能是随机的。 对 QQ 贪心只能得到确定性策略(ε\varepsilon-贪心的随机性只是为了探索,大小是人手工设定的)。但有些问题中,最优策略本身就是随机的:

  • 博弈:石头剪刀布中,任何确定性策略都会被对手利用,最优策略是均匀随机。
  • 部分可观测:智能体分辨不出某些状态时,随机性能帮助它”碰运气”走出困境。

短走廊的例子(Sutton & Barto 例 13.1):

    [S] ⇄ [ 1 ] ⇄ [ 2 ] → [终点]     每步奖励 -1,γ = 1
     0   (反转)   2
  • 在状态 1,动作是反的:“右”会向左走,“左”会向右走;
  • 智能体分辨不出自己在哪个状态(三个状态的特征完全相同),所以只能在所有状态使用同一个策略:以概率 pp 选”右”。
策略起点的期望回报
p=1p = 1(总是选右):在状态 1 被送回状态 0,永远到不了终点−∞-\infty
p=0p = 0(总是选左):在状态 0 撞墙原地不动−∞-\infty
ε\varepsilon-贪心”主要向右”(p=0.95p = 0.95)−44.21-44.21
ε\varepsilon-贪心”主要向左”(p=0.05p = 0.05)−82.11-82.11
最优随机策略(p∗≈0.586p^* \approx 0.586)−11.66\mathbf{-11.66}

(代码 03_short_corridor.py 演示 1、2,每个 pp 的期望回报都是解 3 个状态的贝尔曼方程精确算出的。)

基于价值的方法在这里束手无策;直接学习 pp 的策略梯度方法则可以找到最优的随机策略。

1.2 直接学习策略的优缺点

优点缺点
天然支持连续动作(高斯策略)通常只能收敛到局部最优
可以学出随机策略,而且”多随机”是学出来的梯度估计方差很大
策略随参数平滑变化,收敛性质更好样本效率低(同策略,数据用一次就扔)
有时策略比价值函数简单得多(比如”一直往前走”)对步长敏感,一步走错可能崩溃

1.3 三类方法

回忆第 1 讲 5.4 节的分类:

类型学什么策略怎么来例子
基于价值VV 或 QQ隐式:arg⁡max⁡aQ\arg\max_a QQ-learning、DQN(第 4–5 讲)
基于策略πθ\pi_\theta显式REINFORCE(本讲)
Actor-Criticπθ\pi_\theta 和 VV / QQ显式;价值函数用来辅助策略学习A2C、PPO(第 7 讲)

本讲末尾加了价值基线的 REINFORCE,已经站在了 Actor-Critic 的门口。


2. 策略的参数化

2.1 softmax 策略(离散动作)

给每个状态–动作对一个”偏好” h(s,a;θ)h(s, a; \theta),用 softmax 变成概率:

πθ(a∣s)=exp⁡(h(s,a;θ))∑bexp⁡(h(s,b;θ))\pi_\theta(a \mid s) = \frac{\exp(h(s, a; \theta))}{\sum_{b} \exp(h(s, b; \theta))}

偏好可以是线性函数 h(s,a;θ)=θ⋅ϕ(s,a)h(s, a; \theta) = \theta \cdot \phi(s, a),也可以是神经网络的输出(叫 logits)。

θ\theta 的大小决定了策略有多”确定”(代码 01 演示 1,三个动作的偏好为 θ×[1,2,0.5]\theta \times [1, 2, 0.5]):

θ\theta 的倍数π\pi
0[0.333, 0.333, 0.333]
1[0.231, 0.629, 0.140]
3[0.047, 0.943, 0.011]
10[0.000, 1.000, 0.000]

偏好之间的差距越大,策略越接近确定性。策略梯度方法会自己学会该有多随机。

数值稳定性:直接计算 exp⁡(1000)\exp(1000) 会溢出成无穷大。标准技巧是先把所有偏好减去最大值再求指数(结果不变,因为分子分母同时除以了一个常数)。代码 01 演示 5 展示了不这样做的后果。

2.2 softmax 的得分函数

得分函数(score function)∇θlog⁡πθ(a∣s)\nabla_\theta \log \pi_\theta(a \mid s) 是策略梯度中最核心的量(第 4 节会看到为什么)。对线性 softmax:

log⁡πθ(a∣s)=θ⋅ϕ(s,a)−log⁡∑bexp⁡(θ⋅ϕ(s,b))\log \pi_\theta(a \mid s) = \theta \cdot \phi(s, a) - \log \sum_b \exp(\theta \cdot \phi(s, b))

对 θ\theta 求导:第一项得 ϕ(s,a)\phi(s, a);第二项用链式法则得 ∑bexp⁡(θ⋅ϕ(s,b))ϕ(s,b)∑bexp⁡(θ⋅ϕ(s,b))=∑bπθ(b∣s)ϕ(s,b)\frac{\sum_b \exp(\theta \cdot \phi(s, b)) \phi(s, b)}{\sum_b \exp(\theta \cdot \phi(s, b))} = \sum_b \pi_\theta(b \mid s) \phi(s, b)。所以

  ∇θlog⁡πθ(a∣s)=ϕ(s,a)−Eb∼πθ[ϕ(s,b)]  \boxed{\;\nabla_\theta \log \pi_\theta(a \mid s) = \phi(s, a) - \mathbb{E}_{b \sim \pi_\theta}[\phi(s, b)]\;}

直觉:“这个动作的特征”减去”平均而言的特征”。沿着这个方向调整 θ\theta,会让动作 aa 的概率上升。

特别地,对表格型 softmax(ϕ(s,a)\phi(s, a) 是独热向量,每个 (s,a)(s, a) 一个参数 θs,a\theta_{s,a}):∇θs,⋅log⁡π(a∣s)=ea−π(⋅∣s)\nabla_{\theta_{s, \cdot}} \log \pi(a \mid s) = e_a - \pi(\cdot \mid s)——被选中的动作的偏好 +(1−π(a∣s))+(1 - \pi(a \mid s)),其他动作的偏好 −π(b∣s)-\pi(b \mid s)。

代码验证:01_policy_parameterization.py 演示 2 用有限差分数值计算梯度,与手推公式的最大差异在 10−1010^{-10} 量级。写任何梯度代码时,用有限差分核对一次是非常好的习惯——梯度写错了,学习算法照样能跑,只是学不好,极难排查。

2.3 高斯策略(连续动作)

a∼N(μθ(s),σ2),μθ(s)=θ⋅ϕ(s)(或神经网络)a \sim \mathcal{N}(\mu_\theta(s), \sigma^2), \qquad \mu_\theta(s) = \theta \cdot \phi(s) \text{(或神经网络)}

对数概率 log⁡π(a∣s)=−(a−μ)22σ2−log⁡σ−12log⁡2π\log \pi(a \mid s) = -\frac{(a - \mu)^2}{2\sigma^2} - \log \sigma - \frac12 \log 2\pi,得分函数:

∇θlog⁡πθ(a∣s)=a−μθ(s)σ2 ϕ(s),∂log⁡π∂log⁡σ=(a−μ)2σ2−1\nabla_\theta \log \pi_\theta(a \mid s) = \frac{a - \mu_\theta(s)}{\sigma^2}\, \phi(s), \qquad \frac{\partial \log \pi}{\partial \log \sigma} = \frac{(a - \mu)^2}{\sigma^2} - 1

直觉:采样到的动作比均值大,就朝”增大均值”的方向走;偏离均值超过 σ\sigma,就倾向于增大 σ\sigma(“分布太窄了”),反之缩小 σ\sigma。

通常学习 log⁡σ\log \sigma 而不是 σ\sigma:log⁡σ\log \sigma 可以取任意实数,σ=elog⁡σ\sigma = e^{\log \sigma} 自动为正。

2.4 一个关键性质:得分函数的期望为 0

Ea∼πθ[∇θlog⁡πθ(a∣s)]=∑aπθ(a∣s)∇θπθ(a∣s)πθ(a∣s)=∇θ∑aπθ(a∣s)=∇θ1=0\mathbb{E}_{a \sim \pi_\theta}\left[ \nabla_\theta \log \pi_\theta(a \mid s) \right] = \sum_a \pi_\theta(a \mid s) \frac{\nabla_\theta \pi_\theta(a \mid s)}{\pi_\theta(a \mid s)} = \nabla_\theta \sum_a \pi_\theta(a \mid s) = \nabla_\theta 1 = 0

这个看似平凡的性质,是第 7 节”基线不引入偏差”的根本原因。代码 01 演示 3 用 10 万个样本验证了它。


3. 目标函数与策略搜索

3.1 我们要优化什么?

对回合制任务,目标是从初始状态出发的期望回报:

J(θ)=Vπθ(s0)=Eτ∼pθ[R(τ)],R(τ)=∑t=0T−1γtrtJ(\theta) = V^{\pi_\theta}(s_0) = \mathbb{E}_{\tau \sim p_\theta}\left[ R(\tau) \right], \qquad R(\tau) = \sum_{t=0}^{T-1} \gamma^t r_t

其中 τ=(s0,a0,r0,s1,a1,r1,… )\tau = (s_0, a_0, r_0, s_1, a_1, r_1, \dots) 是一条轨迹,pθ(τ)p_\theta(\tau) 是在策略 πθ\pi_\theta 下产生这条轨迹的概率。

策略搜索 = 找 θ∗=arg⁡max⁡θJ(θ)\theta^* = \arg\max_\theta J(\theta)。

3.2 不用梯度的方法

J(θ)J(\theta) 可以看成一个”黑箱”:给一个 θ\theta,跑一些回合,得到一个(带噪声的)分数。任何黑箱优化方法都能用:

  • 随机搜索 / 爬山法:随机扰动 θ\theta,如果分数变高就接受;
  • 交叉熵方法(CEM):从一个分布中采样很多 θ\theta,保留得分最高的一部分,用它们更新分布,反复迭代;
  • CMA-ES、遗传算法等进化策略。

这些方法简单、易并行,对 JJ 的性质几乎没有要求,在参数不多时效果常常出奇地好。但它们忽略了问题的时间结构(不知道哪一步做得好、哪一步做得差),参数多时效率很低。

3.3 有限差分

对 θ\theta 的每一维分别做扰动:

∂J∂θk≈J(θ+ϵek)−J(θ−ϵek)2ϵ\frac{\partial J}{\partial \theta_k} \approx \frac{J(\theta + \epsilon e_k) - J(\theta - \epsilon e_k)}{2\epsilon}

简单、对任何策略都适用(甚至不可微的策略),但:参数有 dd 维就要做 2d2d 次评估,每次评估本身又需要跑很多回合来减小噪声。神经网络有成千上万个参数时完全不可行。

我们需要一种用一批回合就能估计出所有参数梯度的方法。


4. 似然比技巧:对”期望”求梯度的万能钥匙

4.1 问题

J(θ)=Eτ∼pθ[R(τ)]J(\theta) = \mathbb{E}_{\tau \sim p_\theta}[R(\tau)]。难点在于:θ\theta 出现在”对谁求期望”的分布里,而不是被求期望的函数里。不能简单地把梯度放进期望里面。而且 R(τ)R(\tau) 往往不可微(奖励由环境给出,我们不知道它的公式)。

4.2 推导

先看最一般的形式:Ex∼pθ[f(x)]=∑xpθ(x)f(x)\mathbb{E}_{x \sim p_\theta}[f(x)] = \sum_x p_\theta(x) f(x)。

∇θEx∼pθ[f(x)]=∇θ∑xpθ(x)f(x)=∑x∇θpθ(x) f(x)(f 不依赖 θ)=∑xpθ(x)∇θpθ(x)pθ(x)f(x)(乘一个 1 = pθ/pθ)=∑xpθ(x) ∇θlog⁡pθ(x) f(x)(因为 ∇log⁡p=∇p/p)=Ex∼pθ[f(x) ∇θlog⁡pθ(x)]\begin{aligned} \nabla_\theta \mathbb{E}_{x \sim p_\theta}[f(x)] &= \nabla_\theta \sum_x p_\theta(x) f(x) = \sum_x \nabla_\theta p_\theta(x)\, f(x) && \text{($f$ 不依赖 $\theta$)}\\ &= \sum_x p_\theta(x) \frac{\nabla_\theta p_\theta(x)}{p_\theta(x)} f(x) && \text{(乘一个 1 = } p_\theta / p_\theta \text{)}\\ &= \sum_x p_\theta(x)\, \nabla_\theta \log p_\theta(x)\, f(x) && \text{(因为 } \nabla \log p = \nabla p / p \text{)}\\ &= \mathbb{E}_{x \sim p_\theta}\left[ f(x)\, \nabla_\theta \log p_\theta(x) \right] \end{aligned}   ∇θEx∼pθ[f(x)]=Ex∼pθ[f(x) ∇θlog⁡pθ(x)]  \boxed{\;\nabla_\theta \mathbb{E}_{x \sim p_\theta}[f(x)] = \mathbb{E}_{x \sim p_\theta}\left[ f(x)\, \nabla_\theta \log p_\theta(x) \right]\;}

这叫似然比技巧(likelihood ratio trick)或得分函数估计(score function estimator)。

它的神奇之处:

  1. 右边又是一个期望,可以用采样来估计:采 NN 个 xi∼pθx_i \sim p_\theta,梯度 ≈1N∑if(xi)∇θlog⁡pθ(xi)\approx \frac1N \sum_i f(x_i) \nabla_\theta \log p_\theta(x_i)。
  2. 只需要对 log⁡pθ\log p_\theta 求导,ff 完全不需要可微,甚至不需要知道它的公式——只要能得到 f(xi)f(x_i) 的值。

4.3 直觉

f(x)∇θlog⁡pθ(x)f(x) \nabla_\theta \log p_\theta(x):沿着”让 xx 更可能出现”的方向调整 θ\theta,调整的幅度正比于 f(x)f(x)。

  • f(x)f(x) 大:大幅提高 xx 的概率;
  • f(x)f(x) 小(或为负):少量提高(或降低)xx 的概率。

平均下来,好的结果变得更可能,差的结果变得不那么可能。这就是”试错学习”的数学形式。

4.4 最简单的例子:老虎机

老虎机只有一步:J(θ)=Ea∼πθ[r(a)]J(\theta) = \mathbb{E}_{a \sim \pi_\theta}[r(a)]。梯度 =E[r∇θlog⁡πθ(a)]= \mathbb{E}[r \nabla_\theta \log \pi_\theta(a)],单样本更新:

θ←θ+α r ∇θlog⁡πθ(a)\theta \leftarrow \theta + \alpha\, r\, \nabla_\theta \log \pi_\theta(a)

表格型 softmax 时,∇log⁡π(a)=ea−π\nabla \log \pi(a) = e_a - \pi。代码 02_bandit_policy_gradient.py 演示 1:5 个臂初始均匀,选中臂 2 得到 r=+1.5r = +1.5(α=0.5\alpha = 0.5)后,臂 2 的概率从 0.2 升到 0.346;选中臂 3 得到 r=−0.8r = -0.8 后,臂 3 的概率从 0.2 降到 0.144。


5. 轨迹上的策略梯度

5.1 环境的转移概率消失了

对 RL,把 xx 换成轨迹 τ\tau,ff 换成 R(τ)R(\tau):

∇θJ(θ)=Eτ∼pθ[R(τ) ∇θlog⁡pθ(τ)]\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim p_\theta}\left[ R(\tau)\, \nabla_\theta \log p_\theta(\tau) \right]

轨迹的概率是一连串概率的乘积:

pθ(τ)=μ(s0)∏t=0T−1πθ(at∣st) P(st+1∣st,at)p_\theta(\tau) = \mu(s_0) \prod_{t=0}^{T-1} \pi_\theta(a_t \mid s_t)\, P(s_{t+1} \mid s_t, a_t)

取对数,乘积变求和:

log⁡pθ(τ)=log⁡μ(s0)+∑t=0T−1[log⁡πθ(at∣st)+log⁡P(st+1∣st,at)]\log p_\theta(\tau) = \log \mu(s_0) + \sum_{t=0}^{T-1} \left[ \log \pi_\theta(a_t \mid s_t) + \log P(s_{t+1} \mid s_t, a_t) \right]

对 θ\theta 求导——初始分布 μ\mu 和转移概率 PP 都不依赖 θ\theta,导数为 0:

∇θlog⁡pθ(τ)=∑t=0T−1∇θlog⁡πθ(at∣st)\nabla_\theta \log p_\theta(\tau) = \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t \mid s_t)

所以:

  ∇θJ(θ)=Eτ∼pθ[R(τ)∑t=0T−1∇θlog⁡πθ(at∣st)]  \boxed{\;\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim p_\theta}\left[ R(\tau) \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t \mid s_t) \right]\;}

这是本讲最重要的结果:计算策略梯度完全不需要知道环境的模型。只需要:(1) 按策略跑回合,得到 R(τ)R(\tau);(2) 对自己的策略求 ∇log⁡π\nabla \log \pi。环境是什么样子、奖励怎么给,统统不用知道。

5.2 策略梯度定理

更一般的形式(Sutton et al., 2000):

∇θJ(θ)=∑sηπ(s)∑a∇θπθ(a∣s) Qπ(s,a)=Eπ[∑tγt Qπ(st,at) ∇θlog⁡πθ(at∣st)]\nabla_\theta J(\theta) = \sum_s \eta^{\pi}(s) \sum_a \nabla_\theta \pi_\theta(a \mid s)\, Q^{\pi}(s, a) = \mathbb{E}_{\pi}\left[ \sum_{t} \gamma^t\, Q^{\pi}(s_t, a_t)\, \nabla_\theta \log \pi_\theta(a_t \mid s_t) \right]

其中 ηπ(s)=∑tγtPr⁡(st=s)\eta^\pi(s) = \sum_t \gamma^t \Pr(s_t = s) 是从起点出发的折扣访问量。

解读:在每个状态,沿着”让好动作(QQ 大)更可能”的方向调整策略,按这个状态被访问的频率加权。注意公式里没有”状态分布对 θ\theta 的导数”——虽然改变策略会改变访问哪些状态,但这个影响已经被 QπQ^\pi 自动包含了。这是定理最不平凡的地方。

代码验证:04_gradient_variance.py 演示 2 在一个 5 状态的回合制火星车上(表格型 softmax,10 个参数,γ=0.9\gamma = 0.9),用两种完全独立的方法计算精确梯度:

  • 有限差分:直接对精确的 J(θ)J(\theta)(解线性方程组得到)做数值求导,不依赖任何理论;
  • 策略梯度定理公式:∂J/∂θs,b=η(s) π(b∣s) (Q(s,b)−V(s))\partial J / \partial \theta_{s,b} = \eta(s)\, \pi(b \mid s)\, (Q(s,b) - V(s))。

两者在全部 10 个分量上的最大差异为 7.7×10−107.7 \times 10^{-10}。


6. 利用因果性:REINFORCE

6.1 问题:用整条轨迹的回报给每一步打分

5.1 节的公式中,每一步的 ∇log⁡π(at∣st)\nabla \log \pi(a_t \mid s_t) 都乘以整条轨迹的回报 R(τ)R(\tau)——包括在 tt 时刻之前获得的奖励。但现在的动作不可能影响过去的奖励!这些项只会增加噪声。

6.2 只用未来的回报

可以证明,对于 t′<tt' < t:

E[rt′ ∇θlog⁡πθ(at∣st)]=0\mathbb{E}\left[ r_{t'}\, \nabla_\theta \log \pi_\theta(a_t \mid s_t) \right] = 0

证明:先固定到 tt 时刻为止的历史(包括 rt′r_{t'} 和 sts_t),对 ata_t 求条件期望。rt′r_{t'} 已经确定,可以提到外面;剩下 Eat∼π(⋅∣st)[∇log⁡π(at∣st)]=0\mathbb{E}_{a_t \sim \pi(\cdot \mid s_t)}[\nabla \log \pi(a_t \mid s_t)] = 0(2.4 节)。所以整体期望为 0。□\square

把这些期望为 0 的项去掉,梯度不变,但方差减小:

∇θJ(θ)=E[∑t=0T−1∇θlog⁡πθ(at∣st)∑t′=tT−1γt′rt′]=E[∑t=0T−1γt Gt ∇θlog⁡πθ(at∣st)]\nabla_\theta J(\theta) = \mathbb{E}\left[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t \mid s_t) \sum_{t'=t}^{T-1} \gamma^{t'} r_{t'} \right] = \mathbb{E}\left[ \sum_{t=0}^{T-1} \gamma^t\, G_t\, \nabla_\theta \log \pi_\theta(a_t \mid s_t) \right]

其中 Gt=∑t′≥tγt′−trt′G_t = \sum_{t' \ge t} \gamma^{t' - t} r_{t'} 是第 3 讲的”从 tt 开始的回报”(也叫 reward-to-go)。

由于 E[Gt∣st,at]=Qπ(st,at)\mathbb{E}[G_t \mid s_t, a_t] = Q^\pi(s_t, a_t),这正是策略梯度定理的采样版本。

6.3 REINFORCE 算法

Williams(1992)提出的 REINFORCE:

算法:REINFORCE(蒙特卡洛策略梯度)
初始化策略参数 θ
重复:
    用 π_θ 生成一个回合 s_0, a_0, r_0, ..., s_{T-1}, a_{T-1}, r_{T-1}
    对 t = 0, 1, ..., T-1:
        G_t ← Σ_{k=t}^{T-1} γ^{k-t} r_k
        θ ← θ + α γ^t G_t ∇_θ log π_θ(a_t | s_t)

名字是 “REward Increment = Nonnegative Factor × Offset Reinforcement × Characteristic Eligibility” 的缩写(Williams 起名时颇费了一番心思)。

它本质上是蒙特卡洛方法:需要完整的回合才能计算 GtG_t,估计无偏但方差大(第 3 讲)。

关于 γt\gamma^t 因子:严格的梯度需要乘 γt\gamma^t,但几乎所有实际代码都省略了它,直接用 Gt∇log⁡π(at∣st)G_t \nabla \log \pi(a_t \mid s_t)。省略后的估计量不再是 J(θ)J(\theta) 的真正梯度(有偏),可以理解为”把每一步都当作新的起点来优化”,更重视后面的时间步。实践中这通常可以接受,但要知道它的含义(6.5 节的实验会测量这个偏差)。

6.4 短走廊上的 REINFORCE

从 π(右)=0.05\pi(\text{右}) = 0.05(期望回报约 −82)出发,参数 θ=[θ左,θ右]\theta = [\theta_\text{左}, \theta_\text{右}],1000 个回合(代码 03 演示 3):

设置第 1–10 回合11–5051–100101–300301–600601–1000最终 pp 中位数塌缩到 0/1
A 无基线 α=2−13\alpha = 2^{-13}−74.1−56.7−35.9−23.2−15.4−12.80.4760%
B 无基线 α=2−12\alpha = 2^{-12}−74.1−39.1−24.4−16.5−12.7−11.70.5720%
C 无基线 α=2−9\alpha = 2^{-9}−492.7−799.1−866.3−901.2−942.7−1000.01.000100%
D 有基线 α=2−9\alpha = 2^{-9}−61.6−18.7−12.4−11.8−12.2−11.80.5810%

(A、B、D 为 30 次运行平均;C 的回合大多跑满 1000 步上限,非常耗时,为 10 次运行。)

REINFORCE 成功地学到了接近最优的随机策略(p∗≈0.59p^* \approx 0.59,期望回报 −11.66)。但注意 C:不用基线时调大学习率,策略会塌缩——一次很长的回合(回报 −几百)产生巨大的梯度,把 pp 一下子推到 0 或 1,策略变成确定性的,再也到不了终点,也就再也学不回来。第 7 节的基线解决了这个问题。

6.5 数值实验:三种估计量的偏差与方差

代码 04 演示 3:在 5 状态回合制火星车上(每步 −1 的时间成本,走出左边界 +1、右边界 +10,γ=0.9\gamma = 0.9),在一个固定的 θ\theta 处用 20000 个回合比较四种估计量:

估计量偏差大小总方差
(a) G0⋅∑t∇log⁡π(at∣st)G_0 \cdot \sum_t \nabla \log \pi(a_t \mid s_t)(整条回报)0.164229.3
(b) ∑tγtGt∇log⁡π(at∣st)\sum_t \gamma^t G_t \nabla \log \pi(a_t \mid s_t)(未来回报)0.04949.0
(c) ∑tγt(Gt−V(st))∇log⁡π(at∣st)\sum_t \gamma^t (G_t - V(s_t)) \nabla \log \pi(a_t \mid s_t)(再减基线)0.03934.3
(d) ∑t(Gt−V(st))∇log⁡π(at∣st)\sum_t (G_t - V(s_t)) \nabla \log \pi(a_t \mid s_t)(去掉 γt\gamma^t)3.078110.0

(“偏差大小”是样本均值与精确梯度之差的长度;20000 个样本下,无偏估计量也会有约 总方差/20000\sqrt{\text{总方差}/20000} 量级的随机误差,例如 (a) 约为 0.11。)

  • (a)(b)(c) 都是无偏的,而方差逐级下降:利用因果性让方差降到约 1/5,再减基线又降了约 1/3。
  • (d) 明显有偏:去掉 γt\gamma^t 后,它不再是 J(θ)J(\theta) 的梯度。
  • 一个补充观察:如果把时间成本从 −1 改成 −0.2,“动作之前的奖励”很小,(a) 和 (b) 的方差就几乎一样(21.8 vs 22.1)。利用因果性的收益,取决于”过去的奖励”带来了多少噪声。

7. 基线:不改变期望,降低方差

7.1 问题:所有奖励都是正的怎么办?

在 REINFORCE 中,如果所有回报都是正的(比如 CartPole 每步 +1),那么每个被执行的动作的概率都会提高——只是提高得多少不同。“好”和”差”只能通过”提高得多”和”提高得少”来区分,信号很弱,噪声很大。

更直观的做法:比平均好的动作提高概率,比平均差的降低概率。也就是减去一个”平均水平” bb。

7.2 基线不引入偏差

对任意只依赖状态(不依赖动作)的函数 b(s)b(s):

Ea∼πθ(⋅∣s)[b(s) ∇θlog⁡πθ(a∣s)]=b(s) Ea∼πθ[∇θlog⁡πθ(a∣s)]=b(s)⋅0=0\mathbb{E}_{a \sim \pi_\theta(\cdot \mid s)}\left[ b(s)\, \nabla_\theta \log \pi_\theta(a \mid s) \right] = b(s)\, \mathbb{E}_{a \sim \pi_\theta}\left[ \nabla_\theta \log \pi_\theta(a \mid s) \right] = b(s) \cdot 0 = 0

(用到了 2.4 节的性质。)所以把 GtG_t 换成 Gt−b(st)G_t - b(s_t),梯度的期望不变:

∇θJ(θ)=E[∑tγt(Gt−b(st))∇θlog⁡πθ(at∣st)]\nabla_\theta J(\theta) = \mathbb{E}\left[ \sum_t \gamma^t \big( G_t - b(s_t) \big) \nabla_\theta \log \pi_\theta(a_t \mid s_t) \right]

注意:bb 不能依赖当前动作 ata_t,否则它就不能提到期望外面,会引入偏差。代码 02 中,基线必须用”这一步之前”的平均奖励计算,不能把当前的奖励 rr 也算进去。

7.3 基线为什么能降低方差?

梯度估计的每一项是 (Gt−b) ∇log⁡π(G_t - b)\, \nabla \log \pi。∇log⁡π\nabla \log \pi 本身的期望为 0、有正有负;(Gt−b)(G_t - b) 越接近 0,乘积的波动就越小。选择 b≈E[Gt∣st]=Vπ(st)b \approx \mathbb{E}[G_t \mid s_t] = V^\pi(s_t),就让 (Gt−b)(G_t - b) 平均而言尽量小。

一个自然的选择是用另一个函数逼近器学习 V(s)V(s)(用第 3 讲的 MC 方法:以 GtG_t 为目标做回归),用它作为基线。这时 Gt−V(st)G_t - V(s_t) 是 Qπ(st,at)−Vπ(st)Q^\pi(s_t, a_t) - V^\pi(s_t) 的估计,这个量叫优势函数(advantage):

Aπ(s,a)=Qπ(s,a)−Vπ(s)A^\pi(s, a) = Q^\pi(s, a) - V^\pi(s)

“在状态 ss 选动作 aa,比按策略平均而言好多少”。优势函数是第 7 讲的核心概念。

(严格来说,使方差最小的基线并不恰好是 Vπ(s)V^\pi(s),而是一个以 ∥∇log⁡π∥2\lVert \nabla \log \pi \rVert^2 加权的平均回报;但 Vπ(s)V^\pi(s) 简单、效果好,是实践中的标准选择。)

7.4 实验:基线的效果

老虎机(代码 02 演示 2、3;5 个臂,真实平均奖励 [0.2,0.5,1.0,0.0,0.3][0.2, 0.5, 1.0, 0.0, 0.3],α=0.1\alpha = 0.1,200 次运行平均选中最优臂的比例):

设置第 10 步第 100 步第 250 步第 1000 步
奖励 +0,无基线22.2%56.7%88.1%98.8%
奖励 +0,有基线20.1%56.3%89.7%98.6%
奖励 +10,无基线18.7%25.9%27.1%28.4%
奖励 +10,有基线21.3%51.6%87.3%98.8%

把所有奖励都加 10(问题本质完全没变,最优臂还是同一个),无基线的版本几乎学不会:每次的奖励都约为 10,“被选中就大幅加分”压倒了”好的多加、差的少加”,策略很快锁定在某个早期随机选中的臂上。有基线的版本完全不受影响——r−br - b 只看”比平均好多少”。

直接测量梯度估计(固定 θ\theta,20 万个样本):奖励 +10 且无基线时,总方差为 87.1;用平均奖励作基线后降到 0.86——约 100 倍。四种情况的样本均值都约等于精确梯度(无偏)。


8. 实践:PyTorch 实现 REINFORCE

8.1 算法(批量 + 价值基线)

算法:带基线的 REINFORCE(批量版本)
初始化策略网络 π_θ、价值网络 V_φ
重复:
    1. 用 π_θ 收集 N 个完整回合
    2. 对每一步计算未来回报 G_t
    3. 优势 A_t = G_t - V_φ(s_t)(不对 φ 求导);可选:标准化 A
    4. 策略更新:对 L(θ) = -mean_t[ log π_θ(a_t|s_t) · A_t ] 做一步梯度下降
    5. 基线更新:对 L(φ) = mean_t[ (V_φ(s_t) - G_t)² ] 做一步梯度下降

8.2 “替代损失”是什么?

深度学习框架只会”最小化一个损失”。策略梯度不是某个显式损失的梯度,怎么办?构造一个替代损失(surrogate loss):

L(θ)=−1N∑tlog⁡πθ(at∣st)⋅AtL(\theta) = -\frac{1}{N} \sum_t \log \pi_\theta(a_t \mid s_t) \cdot A_t

其中 AtA_t 被当作常数(不求导)。对它求梯度:∇θL=−1N∑tAt∇θlog⁡πθ(at∣st)\nabla_\theta L = -\frac1N \sum_t A_t \nabla_\theta \log \pi_\theta(a_t \mid s_t)——恰好是策略梯度估计的相反数。所以最小化这个”损失”,就是沿着策略梯度做梯度上升。

注意:这个损失的数值本身没有物理意义(它不是回报,下降了也不代表策略变好了),不要用它来判断训练进度。

8.3 实现细节

  • 用 logits 构造分布:torch.distributions.Categorical(logits=...) 内部用数值稳定的方式计算 log 概率。自己先算概率再取 log,概率接近 0 时会得到 −∞-\infty。
  • 优势要 detach:基线只是一个”参照点”,策略的梯度不应流进价值网络。
  • 优势标准化:减均值、除标准差。让每批数据的”打分”尺度一致,学习率更好调。注意”减均值”本身就相当于用”这批数据的平均回报”作为一个常数基线——所以即使不用价值网络,只要开着标准化,仍然有一个较粗糙的基线。
  • 同策略:每批数据用完就扔。旧策略收集的数据不能直接用来估计新策略的梯度(第 7 讲会讨论如何用重要性采样部分地复用数据)。

8.4 实验:CartPole 上的消融

05_reinforce_cartpole.py:策略网络和价值网络都是两层 64 单元的 MLP(tanh),每次迭代收集 8 个回合,共 200 次迭代,γ=0.99\gamma = 0.99。3 个随机种子。“首次解决”指连续 5 次迭代的平均训练回报 ≥ 475:

设置未来回报价值基线标准化首次解决的迭代(3 个种子)最后 20 次迭代平均回报
A(默认)✓✓✓55, 45, 41489, 500, 480
B✓✓39, 34, 42491, 500, 489
C✓67, 116, 89498, 460, 462
D(最原始的 REINFORCE)从未解决258, 83, 315
E✓✓50, 55, 53478, 486, 499

解读:

  1. 最原始的 REINFORCE(D)学不会:用整条轨迹的回报、没有任何基线,200 次迭代后仍远未达到满分。
  2. 只加上”未来回报”(C)就能学会,但慢而不稳定(平均 91 次迭代)。
  3. 有基线或标准化(A、B、E)就快得多(平均 38~53 次迭代)。在基线存在的情况下,“未来回报 vs 整条回报”的差别变小了(A vs E)。
  4. 一个诚实的观察:在 CartPole 上,学出来的价值基线(A)并不比标准化带来的”批量平均”基线(B)更好——B 甚至稍快。原因之一是 CartPole 中不同状态的回报差别不大,而价值网络本身也需要时间来学。在状态之间差别很大的问题上,依赖状态的基线 V(s)V(s) 的优势会更明显。不要从一个简单问题上的消融得出普遍结论。

9. 策略梯度的问题:通往第 7 讲

REINFORCE 能工作,但有三个明显的问题:

  1. 方差大:它是蒙特卡洛方法,每个梯度估计都依赖整条(剩余的)轨迹。基线有帮助,但远远不够。 → 第 7 讲:Actor-Critic——用 TD 的思想,以 r+γV(s′)r + \gamma V(s') 代替 GtG_t,用偏差换方差;GAE 在两者之间平滑插值(回忆第 3 讲的 nn 步 TD 和 TD(λ))。

  2. 样本效率低:同策略,每批数据只用一次就扔掉。 → 第 7 讲:用重要性采样对旧数据做修正,让一批数据可以被多次利用。

  3. 步长难选:参数空间中的一小步,可能让策略发生巨大的变化;一次坏的更新让策略变差,变差的策略又收集到更差的数据……可能再也恢复不过来(回忆短走廊中的设置 C)。 → 第 7 讲:TRPO / PPO——限制每次更新后新旧策略的差异(KL 散度或概率比的裁剪),保证”每一步都不会走得太远”。


10. 本讲总结

10.1 核心概念清单

  1. 策略搜索:直接参数化 πθ\pi_\theta,最大化 J(θ)=Eτ[R(τ)]J(\theta) = \mathbb{E}_\tau[R(\tau)]。适合连续动作、能学随机策略,但局部最优、方差大、样本效率低。
  2. softmax / 高斯策略;得分函数 ∇log⁡π\nabla \log \pi:softmax 为 ϕ(s,a)−Eb[ϕ(s,b)]\phi(s,a) - \mathbb{E}_b[\phi(s,b)],高斯为 a−μσ2ϕ(s)\frac{a - \mu}{\sigma^2} \phi(s)。
  3. 得分函数的期望为 0:Ea∼π[∇log⁡π(a∣s)]=0\mathbb{E}_{a \sim \pi}[\nabla \log \pi(a \mid s)] = 0。
  4. 似然比技巧:∇Epθ[f]=Epθ[f∇log⁡pθ]\nabla \mathbb{E}_{p_\theta}[f] = \mathbb{E}_{p_\theta}[f \nabla \log p_\theta];ff 不需要可微。
  5. 轨迹上的策略梯度:∇log⁡pθ(τ)=∑t∇log⁡πθ(at∣st)\nabla \log p_\theta(\tau) = \sum_t \nabla \log \pi_\theta(a_t \mid s_t),环境的转移概率消失,不需要模型。
  6. 策略梯度定理:∇J=E[∑tγtQπ(st,at)∇log⁡π(at∣st)]\nabla J = \mathbb{E}[\sum_t \gamma^t Q^\pi(s_t, a_t) \nabla \log \pi(a_t \mid s_t)]。
  7. 因果性:现在的动作影响不了过去的奖励,只用未来回报 GtG_t → REINFORCE。
  8. 基线:减去任何只依赖状态的 b(s)b(s) 不改变期望、降低方差;b=V(s)b = V(s) 时得到优势 A=Q−VA = Q - V。
  9. 实现:替代损失 −mean(log⁡π⋅A)-\mathrm{mean}(\log \pi \cdot A)、logits、detach、优势标准化(隐含常数基线)、同策略。
  10. 问题:方差大、样本效率低、步长敏感 → 第 7 讲。

10.2 公式速查表

名称公式
softmax 策略πθ(a∣s)=exp⁡(h(s,a;θ))/∑bexp⁡(h(s,b;θ))\pi_\theta(a \mid s) = \exp(h(s,a;\theta)) / \sum_b \exp(h(s,b;\theta))
softmax 得分函数∇log⁡πθ(a∣s)=ϕ(s,a)−∑bπθ(b∣s)ϕ(s,b)\nabla \log \pi_\theta(a \mid s) = \phi(s,a) - \sum_b \pi_\theta(b \mid s) \phi(s,b)
高斯得分函数∇θlog⁡π=a−μθ(s)σ2ϕ(s)\nabla_\theta \log \pi = \frac{a - \mu_\theta(s)}{\sigma^2} \phi(s)
得分函数期望Ea∼π[∇log⁡π(a∣s)]=0\mathbb{E}_{a \sim \pi}[\nabla \log \pi(a \mid s)] = 0
目标函数J(θ)=Eτ∼pθ[R(τ)]J(\theta) = \mathbb{E}_{\tau \sim p_\theta}[R(\tau)]
似然比技巧∇Ex∼pθ[f(x)]=Ex∼pθ[f(x)∇log⁡pθ(x)]\nabla \mathbb{E}_{x \sim p_\theta}[f(x)] = \mathbb{E}_{x \sim p_\theta}[f(x) \nabla \log p_\theta(x)]
轨迹对数概率的梯度∇log⁡pθ(τ)=∑t∇log⁡πθ(at∣st)\nabla \log p_\theta(\tau) = \sum_t \nabla \log \pi_\theta(a_t \mid s_t)
策略梯度(整条回报)∇J=E[R(τ)∑t∇log⁡πθ(at∣st)]\nabla J = \mathbb{E}[R(\tau) \sum_t \nabla \log \pi_\theta(a_t \mid s_t)]
策略梯度定理∇J=∑sηπ(s)∑a∇πθ(a∣s)Qπ(s,a)\nabla J = \sum_s \eta^\pi(s) \sum_a \nabla \pi_\theta(a \mid s) Q^\pi(s,a)
REINFORCE 更新θ←θ+αγtGt∇log⁡πθ(at∣st)\theta \leftarrow \theta + \alpha \gamma^t G_t \nabla \log \pi_\theta(a_t \mid s_t)
带基线θ←θ+αγt(Gt−b(st))∇log⁡πθ(at∣st)\theta \leftarrow \theta + \alpha \gamma^t (G_t - b(s_t)) \nabla \log \pi_\theta(a_t \mid s_t)
优势函数Aπ(s,a)=Qπ(s,a)−Vπ(s)A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s)
替代损失L(θ)=−1N∑tlog⁡πθ(at∣st)⋅AtL(\theta) = -\frac1N \sum_t \log \pi_\theta(a_t \mid s_t) \cdot A_t(AtA_t 视为常数)

10.3 中英术语对照表

中文英文中文英文
策略搜索Policy search策略梯度Policy gradient
基于策略Policy-based执行者–评论者Actor-critic
参数化策略Parameterized policy偏好 / 对数几率Preference / Logits
得分函数Score function似然比技巧Likelihood ratio trick
高斯策略Gaussian policy目标函数Objective function
交叉熵方法Cross-entropy method (CEM)进化策略Evolution strategies
有限差分Finite difference策略梯度定理Policy gradient theorem
折扣访问量Discounted state visitation因果性Causality
未来回报Reward-to-go蒙特卡洛策略梯度Monte Carlo policy gradient
基线Baseline优势函数Advantage function
替代损失Surrogate loss优势标准化Advantage normalization
局部最优Local optimum梯度检验Gradient check

11. 练习题

练习 1(概念):列举两个”最优策略是随机的”场景,并解释为什么基于价值的贪心方法在其中会失败。

参考答案

(1) 石头剪刀布等零和博弈:任何确定性策略都会被对手针对,最优策略是均匀随机;对 QQ 贪心只能给出确定性策略。 (2) 部分可观测问题(如短走廊):智能体分辨不出若干状态,不同状态需要的动作不同,确定性策略会在某个状态”卡死”;随机策略能以一定概率走出去。 ε\varepsilon-贪心虽然有随机性,但随机性的大小是人为设定的探索参数,不是为了最大化回报而学出来的。

练习 2(得分函数):一个状态、3 个动作,表格型 softmax,θ=[0,ln⁡2,0]\theta = [0, \ln 2, 0]。(a) 写出 π\pi;(b) 写出选中动作 1 时的得分函数 ∇θlog⁡π(1)\nabla_\theta \log \pi(1);(c) 验证 ∑aπ(a)∇log⁡π(a)=0\sum_a \pi(a) \nabla \log \pi(a) = 0。

参考答案

(a) exp⁡(θ)=[1,2,1]\exp(\theta) = [1, 2, 1],π=[0.25,0.5,0.25]\pi = [0.25, 0.5, 0.25]。 (b) ∇log⁡π(1)=e1−π=[−0.25,0.5,−0.25]\nabla \log \pi(1) = e_1 - \pi = [-0.25, 0.5, -0.25]。 (c) ∇log⁡π(0)=[0.75,−0.5,−0.25]\nabla \log \pi(0) = [0.75, -0.5, -0.25],∇log⁡π(2)=[−0.25,−0.5,0.75]\nabla \log \pi(2) = [-0.25, -0.5, 0.75]。加权和:0.25×[0.75,−0.5,−0.25]+0.5×[−0.25,0.5,−0.25]+0.25×[−0.25,−0.5,0.75]=[0.1875−0.125−0.0625,−0.125+0.25−0.125,−0.0625−0.125+0.1875]=[0,0,0]0.25 \times [0.75, -0.5, -0.25] + 0.5 \times [-0.25, 0.5, -0.25] + 0.25 \times [-0.25, -0.5, 0.75] = [0.1875 - 0.125 - 0.0625, -0.125 + 0.25 - 0.125, -0.0625 - 0.125 + 0.1875] = [0, 0, 0] ✓。

练习 3(似然比技巧):设 x∼N(θ,1)x \sim \mathcal{N}(\theta, 1),f(x)=x2f(x) = x^2。(a) 直接计算 E[f(x)]\mathbb{E}[f(x)] 并对 θ\theta 求导;(b) 用似然比技巧写出梯度的期望形式,并验证两者相等。

参考答案

(a) E[x2]=θ2+1\mathbb{E}[x^2] = \theta^2 + 1,导数为 2θ2\theta。 (b) ∇θlog⁡pθ(x)=x−θ\nabla_\theta \log p_\theta(x) = x - \theta,所以梯度 =E[x2(x−θ)]= \mathbb{E}[x^2 (x - \theta)]。令 x=θ+zx = \theta + z,z∼N(0,1)z \sim \mathcal{N}(0, 1):E[(θ+z)2z]=E[θ2z+2θz2+z3]=0+2θ+0=2θ\mathbb{E}[(\theta + z)^2 z] = \mathbb{E}[\theta^2 z + 2\theta z^2 + z^3] = 0 + 2\theta + 0 = 2\theta ✓。

练习 4(转移概率为何消失):如果环境的转移概率也依赖于 θ\theta(例如,θ\theta 同时控制着机器人的某个物理参数),5.1 节的推导在哪一步会失效?这时还能不用模型计算梯度吗?

参考答案

在”log⁡P(st+1∣st,at)\log P(s_{t+1} \mid s_t, a_t) 对 θ\theta 的导数为 0”这一步失效。此时 ∇log⁡pθ(τ)\nabla \log p_\theta(\tau) 会多出 ∑t∇θlog⁡Pθ(st+1∣st,at)\sum_t \nabla_\theta \log P_\theta(s_{t+1} \mid s_t, a_t) 这一项,而计算它需要知道转移概率的形式——也就是需要模型。标准的策略梯度能”无模型”,正是因为参数只出现在智能体自己的策略里。

练习 5(基线):证明:如果基线依赖于当前动作,比如 b=b(st,at)b = b(s_t, a_t),那么一般来说 E[b(st,at)∇log⁡π(at∣st)]≠0\mathbb{E}[b(s_t, a_t) \nabla \log \pi(a_t \mid s_t)] \ne 0。举一个具体的例子。

参考答案

Ea[b(s,a)∇log⁡π(a∣s)]=∑a∇π(a∣s)b(s,a)\mathbb{E}_a[b(s,a) \nabla \log \pi(a \mid s)] = \sum_a \nabla \pi(a \mid s) b(s,a),一般不为 0(只有 bb 与 aa 无关时才能提出来变成 b⋅∇∑aπ=0b \cdot \nabla \sum_a \pi = 0)。 例:单状态、两个动作、表格型 softmax、θ=[0,0]\theta = [0, 0],π=[0.5,0.5]\pi = [0.5, 0.5]。取 b(a)=1[a=0]b(a) = \mathbb{1}[a = 0]。∇log⁡π(0)=[0.5,−0.5]\nabla \log \pi(0) = [0.5, -0.5],所以期望 =0.5×1×[0.5,−0.5]+0.5×0=[0.25,−0.25]≠0= 0.5 \times 1 \times [0.5, -0.5] + 0.5 \times 0 = [0.25, -0.25] \ne 0。 (注:第 7 讲会看到,用 Q(s,a)Q(s, a) 这类依赖动作的量时,需要把它们放在”被乘的权重”里,而不是当作基线减掉。)

练习 6(因果性):一个 2 步的回合:r0,r1r_0, r_1,γ=1\gamma = 1。写出”整条回报”和”未来回报”两种估计量各自对 ∇log⁡π(a1∣s1)\nabla \log \pi(a_1 \mid s_1) 乘的权重。为什么去掉的那一项期望为 0?

参考答案

整条回报:(r0+r1)∇log⁡π(a1∣s1)(r_0 + r_1) \nabla \log \pi(a_1 \mid s_1);未来回报:r1∇log⁡π(a1∣s1)r_1 \nabla \log \pi(a_1 \mid s_1)。去掉的是 r0∇log⁡π(a1∣s1)r_0 \nabla \log \pi(a_1 \mid s_1)。给定 s1s_1 以及之前发生的一切(包括 r0r_0),a1a_1 按 π(⋅∣s1)\pi(\cdot \mid s_1) 采样,Ea1[∇log⁡π(a1∣s1)]=0\mathbb{E}_{a_1}[\nabla \log \pi(a_1 \mid s_1)] = 0,而 r0r_0 此时是常数,所以 E[r0∇log⁡π(a1∣s1)]=0\mathbb{E}[r_0 \nabla \log \pi(a_1 \mid s_1)] = 0。

练习 7(动手)★:在 02_bandit_policy_gradient.py 中,把奖励平移从 +10 改成 −10。无基线的版本会怎样?和 +10 的情况对比,解释原因。

提示

奖励都约为 −10 时,每次被选中的臂的概率都会被大幅降低,于是策略会不断”逃离”刚刚选过的臂——哪个臂被选得多,就被压得越低。好臂和差臂都被”惩罚”,区别只在惩罚得多少,信号同样被淹没。有基线的版本仍然不受影响。

参考结果(200 次运行平均,第 1000 步选中最优臂的比例):无基线约 31%,有基线约 99%。

练习 8(动手)★:运行 05_reinforce_cartpole.py --no-baseline --no-normalize --full-return,对照默认设置,观察训练回报曲线。然后只去掉 --full-return,结果如何?这和讲义 8.4 节的表格一致吗?

参考答案

应当与表格中的 D(从未解决)和 C(能解决但较慢、不稳定)一致。具体数字可能因 PyTorch / Gymnasium 版本不同而略有差异,但趋势应当相同:未来回报让原本学不会的问题变得可以学会;基线 / 标准化进一步大幅加速。


12. 延伸阅读

  • Sutton & Barto,Reinforcement Learning: An Introduction(第 2 版):第 13 章(策略梯度方法:短走廊例子、REINFORCE、带基线的 REINFORCE、策略梯度定理的证明);第 2.8 节(梯度老虎机算法)。
  • CS234 Spring 2024 Lecture 5 录像与课件。
  • Williams (1992),Simple Statistical Gradient-Following Algorithms for Connectionist Reinforcement Learning:REINFORCE 原始论文。
  • Sutton, McAllester, Singh & Mansour (2000),Policy Gradient Methods for Reinforcement Learning with Function Approximation:策略梯度定理。
  • OpenAI Spinning Up:Part 3: Intro to Policy Optimization——对策略梯度推导和实现细节讲得非常清楚。
  • Nota & Thomas (2020),Is the Policy Gradient a Gradient?:讨论省略 γt\gamma^t 因子带来的偏差。

13. 下一讲预告

REINFORCE 用完整回合的回报 GtG_t 来估计”动作有多好”,方差大、样本效率低、对步长敏感。下一讲我们把前面所有讲次的思想汇聚起来:

  • Actor-Critic:用 TD 目标 r+γV(s′)r + \gamma V(s') 代替 GtG_t(第 3 讲 TD 的思想),用一点偏差换取大幅降低的方差;
  • 广义优势估计(GAE):在 TD 与 MC 之间平滑插值(第 3 讲 TD(λ) 的思想);
  • 性能差异引理:新旧策略的价值差可以用旧策略的优势函数精确表示;
  • TRPO 与 PPO:限制每次更新的幅度,保证策略稳步改进——PPO 是目前最常用的策略梯度算法,也是 RLHF 的核心。

下一讲之前,建议你:跑通 code/lecture06/ 下的 5 个脚本,完成练习 2、3、5,并尝试练习 7、8。

← 返回课程目录