对应:Stanford CS234 Lecture 5(Policy Search 1)
配套代码:code/lecture06/(前 4 个文件只需 numpy;第 5 个需要 torch 和 gymnasium)
预计阅读时间:4 小时
0. 本讲导航
0.1 本讲要回答的问题
能不能跳过价值函数,直接学习策略本身?怎样对”期望回报”求梯度?
到目前为止,所有控制算法都是基于价值的:先学 Q(s,a),再用 argmaxaQ(s,a)(加上 ε 的探索)得到策略。这一讲换一个思路:把策略写成一个带参数的函数 πθ(a∣s),直接调整 θ,让期望回报尽量大。这类方法叫策略搜索(policy search),其中用梯度来调整参数的叫**策略梯度(policy gradient)**方法。
策略梯度是现代深度 RL 的另一大支柱:机器人控制中的 PPO、大语言模型对齐中的 RLHF(第 9 讲)、推理模型训练中的 GRPO(第 16 讲),都建立在本讲的基础之上。
0.2 学完本讲,你应该能够
- 说出基于价值的方法的几个局限,以及直接学习策略的优缺点。
- 写出 softmax 策略和高斯策略,推导它们的得分函数 ∇θlogπθ(a∣s)。
- 用似然比技巧推导 ∇θEx∼pθ[f(x)]=E[f(x)∇θlogpθ(x)]。
- 推导轨迹上的策略梯度,解释为什么环境的转移概率会消失。
- 陈述策略梯度定理。
- 利用因果性(未来的动作影响不了过去的奖励)降低方差,写出 REINFORCE 算法。
- 证明基线不改变梯度的期望,并解释它为什么能降低方差。
- 用 PyTorch 实现带基线的 REINFORCE,理解”替代损失”、优势标准化等实现细节。
- 说出策略梯度方法的主要问题(高方差、同策略的低样本效率、步长敏感),为第 7 讲做准备。
0.3 先修知识
| 知识点 | 用在哪里 | 最低要求 |
|---|
| 第 2 讲:Vπ、Qπ、策略改进 | 第 5 节 | 必须 |
| 第 3 讲:MC 回报、偏差–方差 | 第 6、7 节 | 必须 |
| 第 5 讲:梯度下降、神经网络、PyTorch 基础 | 第 2、8 节 | 必须 |
| 对数的导数 dxdlogf(x)=f(x)f′(x) | 第 4 节 | 必须——本讲最核心的一步推导就是它 |
| 期望的线性性,E[c]=c | 第 4–7 节 | 会用即可 |
0.4 本讲地图
第1节 为什么直接学策略?(基于价值方法的局限)
│
第2节 策略的参数化:softmax(离散)、高斯(连续);得分函数
│
第3节 目标函数与策略搜索:不用梯度的方法、有限差分
│
第4节 似然比技巧:对"期望"求梯度的万能钥匙
│
第5节 轨迹上的策略梯度:环境的转移概率消失了;策略梯度定理
│
第6节 利用因果性 → REINFORCE
│
第7节 基线:不改变期望、降低方差
│
第8节 实践:PyTorch 实现与消融实验
│
第9节 策略梯度的问题 → 第7讲
1. 为什么直接学策略?
1.1 基于价值的方法有什么局限?
局限一:连续动作。 机器人关节的力矩、方向盘的角度、药物的剂量都是连续的。对 Q 贪心需要求解 argmaxaQ(s,a)——在连续空间里,这本身就是一个优化问题,每一步决策都要解一次。
局限二:策略变化不平滑。 Q 值的微小变化可能让 argmax 突然从一个动作跳到另一个动作。策略是价值的”不连续函数”,这让学习过程容易震荡。
局限三:最优策略可能是随机的。 对 Q 贪心只能得到确定性策略(ε-贪心的随机性只是为了探索,大小是人手工设定的)。但有些问题中,最优策略本身就是随机的:
- 博弈:石头剪刀布中,任何确定性策略都会被对手利用,最优策略是均匀随机。
- 部分可观测:智能体分辨不出某些状态时,随机性能帮助它”碰运气”走出困境。
短走廊的例子(Sutton & Barto 例 13.1):
[S] ⇄ [ 1 ] ⇄ [ 2 ] → [终点] 每步奖励 -1,γ = 1
0 (反转) 2
- 在状态 1,动作是反的:“右”会向左走,“左”会向右走;
- 智能体分辨不出自己在哪个状态(三个状态的特征完全相同),所以只能在所有状态使用同一个策略:以概率 p 选”右”。
| 策略 | 起点的期望回报 |
|---|
| p=1(总是选右):在状态 1 被送回状态 0,永远到不了终点 | −∞ |
| p=0(总是选左):在状态 0 撞墙原地不动 | −∞ |
| ε-贪心”主要向右”(p=0.95) | −44.21 |
| ε-贪心”主要向左”(p=0.05) | −82.11 |
| 最优随机策略(p∗≈0.586) | −11.66 |
(代码 03_short_corridor.py 演示 1、2,每个 p 的期望回报都是解 3 个状态的贝尔曼方程精确算出的。)
基于价值的方法在这里束手无策;直接学习 p 的策略梯度方法则可以找到最优的随机策略。
1.2 直接学习策略的优缺点
| 优点 | 缺点 |
|---|
| 天然支持连续动作(高斯策略) | 通常只能收敛到局部最优 |
| 可以学出随机策略,而且”多随机”是学出来的 | 梯度估计方差很大 |
| 策略随参数平滑变化,收敛性质更好 | 样本效率低(同策略,数据用一次就扔) |
| 有时策略比价值函数简单得多(比如”一直往前走”) | 对步长敏感,一步走错可能崩溃 |
1.3 三类方法
回忆第 1 讲 5.4 节的分类:
| 类型 | 学什么 | 策略怎么来 | 例子 |
|---|
| 基于价值 | V 或 Q | 隐式:argmaxaQ | Q-learning、DQN(第 4–5 讲) |
| 基于策略 | πθ | 显式 | REINFORCE(本讲) |
| Actor-Critic | πθ 和 V / Q | 显式;价值函数用来辅助策略学习 | A2C、PPO(第 7 讲) |
本讲末尾加了价值基线的 REINFORCE,已经站在了 Actor-Critic 的门口。
2. 策略的参数化
2.1 softmax 策略(离散动作)
给每个状态–动作对一个”偏好” h(s,a;θ),用 softmax 变成概率:
πθ(a∣s)=∑bexp(h(s,b;θ))exp(h(s,a;θ))
偏好可以是线性函数 h(s,a;θ)=θ⋅ϕ(s,a),也可以是神经网络的输出(叫 logits)。
θ 的大小决定了策略有多”确定”(代码 01 演示 1,三个动作的偏好为 θ×[1,2,0.5]):
| θ 的倍数 | π |
|---|
| 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) 会溢出成无穷大。标准技巧是先把所有偏好减去最大值再求指数(结果不变,因为分子分母同时除以了一个常数)。代码 01 演示 5 展示了不这样做的后果。
2.2 softmax 的得分函数
得分函数(score function)∇θlogπθ(a∣s) 是策略梯度中最核心的量(第 4 节会看到为什么)。对线性 softmax:
logπθ(a∣s)=θ⋅ϕ(s,a)−logb∑exp(θ⋅ϕ(s,b))
对 θ 求导:第一项得 ϕ(s,a);第二项用链式法则得 ∑bexp(θ⋅ϕ(s,b))∑bexp(θ⋅ϕ(s,b))ϕ(s,b)=∑bπθ(b∣s)ϕ(s,b)。所以
∇θlogπθ(a∣s)=ϕ(s,a)−Eb∼πθ[ϕ(s,b)]
直觉:“这个动作的特征”减去”平均而言的特征”。沿着这个方向调整 θ,会让动作 a 的概率上升。
特别地,对表格型 softmax(ϕ(s,a) 是独热向量,每个 (s,a) 一个参数 θs,a):∇θs,⋅logπ(a∣s)=ea−π(⋅∣s)——被选中的动作的偏好 +(1−π(a∣s)),其他动作的偏好 −π(b∣s)。
代码验证:01_policy_parameterization.py 演示 2 用有限差分数值计算梯度,与手推公式的最大差异在 10−10 量级。写任何梯度代码时,用有限差分核对一次是非常好的习惯——梯度写错了,学习算法照样能跑,只是学不好,极难排查。
2.3 高斯策略(连续动作)
a∼N(μθ(s),σ2),μθ(s)=θ⋅ϕ(s)(或神经网络)
对数概率 logπ(a∣s)=−2σ2(a−μ)2−logσ−21log2π,得分函数:
∇θlogπθ(a∣s)=σ2a−μθ(s)ϕ(s),∂logσ∂logπ=σ2(a−μ)2−1
直觉:采样到的动作比均值大,就朝”增大均值”的方向走;偏离均值超过 σ,就倾向于增大 σ(“分布太窄了”),反之缩小 σ。
通常学习 logσ 而不是 σ:logσ 可以取任意实数,σ=elogσ 自动为正。
2.4 一个关键性质:得分函数的期望为 0
Ea∼πθ[∇θlogπθ(a∣s)]=a∑πθ(a∣s)πθ(a∣s)∇θπθ(a∣s)=∇θa∑πθ(a∣s)=∇θ1=0
这个看似平凡的性质,是第 7 节”基线不引入偏差”的根本原因。代码 01 演示 3 用 10 万个样本验证了它。
3. 目标函数与策略搜索
3.1 我们要优化什么?
对回合制任务,目标是从初始状态出发的期望回报:
J(θ)=Vπθ(s0)=Eτ∼pθ[R(τ)],R(τ)=t=0∑T−1γtrt
其中 τ=(s0,a0,r0,s1,a1,r1,…) 是一条轨迹,pθ(τ) 是在策略 πθ 下产生这条轨迹的概率。
策略搜索 = 找 θ∗=argmaxθJ(θ)。
3.2 不用梯度的方法
J(θ) 可以看成一个”黑箱”:给一个 θ,跑一些回合,得到一个(带噪声的)分数。任何黑箱优化方法都能用:
- 随机搜索 / 爬山法:随机扰动 θ,如果分数变高就接受;
- 交叉熵方法(CEM):从一个分布中采样很多 θ,保留得分最高的一部分,用它们更新分布,反复迭代;
- CMA-ES、遗传算法等进化策略。
这些方法简单、易并行,对 J 的性质几乎没有要求,在参数不多时效果常常出奇地好。但它们忽略了问题的时间结构(不知道哪一步做得好、哪一步做得差),参数多时效率很低。
3.3 有限差分
对 θ 的每一维分别做扰动:
∂θk∂J≈2ϵJ(θ+ϵek)−J(θ−ϵek)
简单、对任何策略都适用(甚至不可微的策略),但:参数有 d 维就要做 2d 次评估,每次评估本身又需要跑很多回合来减小噪声。神经网络有成千上万个参数时完全不可行。
我们需要一种用一批回合就能估计出所有参数梯度的方法。
4. 似然比技巧:对”期望”求梯度的万能钥匙
4.1 问题
J(θ)=Eτ∼pθ[R(τ)]。难点在于:θ 出现在”对谁求期望”的分布里,而不是被求期望的函数里。不能简单地把梯度放进期望里面。而且 R(τ) 往往不可微(奖励由环境给出,我们不知道它的公式)。
4.2 推导
先看最一般的形式:Ex∼pθ[f(x)]=∑xpθ(x)f(x)。
∇θEx∼pθ[f(x)]=∇θx∑pθ(x)f(x)=x∑∇θpθ(x)f(x)=x∑pθ(x)pθ(x)∇θpθ(x)f(x)=x∑pθ(x)∇θlogpθ(x)f(x)=Ex∼pθ[f(x)∇θlogpθ(x)](f 不依赖 θ)(乘一个 1 = pθ/pθ)(因为 ∇logp=∇p/p)
∇θEx∼pθ[f(x)]=Ex∼pθ[f(x)∇θlogpθ(x)]
这叫似然比技巧(likelihood ratio trick)或得分函数估计(score function estimator)。
它的神奇之处:
- 右边又是一个期望,可以用采样来估计:采 N 个 xi∼pθ,梯度 ≈N1∑if(xi)∇θlogpθ(xi)。
- 只需要对 logpθ 求导,f 完全不需要可微,甚至不需要知道它的公式——只要能得到 f(xi) 的值。
4.3 直觉
f(x)∇θlogpθ(x):沿着”让 x 更可能出现”的方向调整 θ,调整的幅度正比于 f(x)。
- f(x) 大:大幅提高 x 的概率;
- f(x) 小(或为负):少量提高(或降低)x 的概率。
平均下来,好的结果变得更可能,差的结果变得不那么可能。这就是”试错学习”的数学形式。
4.4 最简单的例子:老虎机
老虎机只有一步:J(θ)=Ea∼πθ[r(a)]。梯度 =E[r∇θlogπθ(a)],单样本更新:
θ←θ+αr∇θlogπθ(a)
表格型 softmax 时,∇logπ(a)=ea−π。代码 02_bandit_policy_gradient.py 演示 1:5 个臂初始均匀,选中臂 2 得到 r=+1.5(α=0.5)后,臂 2 的概率从 0.2 升到 0.346;选中臂 3 得到 r=−0.8 后,臂 3 的概率从 0.2 降到 0.144。
5. 轨迹上的策略梯度
5.1 环境的转移概率消失了
对 RL,把 x 换成轨迹 τ,f 换成 R(τ):
∇θJ(θ)=Eτ∼pθ[R(τ)∇θlogpθ(τ)]
轨迹的概率是一连串概率的乘积:
pθ(τ)=μ(s0)t=0∏T−1πθ(at∣st)P(st+1∣st,at)
取对数,乘积变求和:
logpθ(τ)=logμ(s0)+t=0∑T−1[logπθ(at∣st)+logP(st+1∣st,at)]
对 θ 求导——初始分布 μ 和转移概率 P 都不依赖 θ,导数为 0:
∇θlogpθ(τ)=t=0∑T−1∇θlogπθ(at∣st)
所以:
∇θJ(θ)=Eτ∼pθ[R(τ)t=0∑T−1∇θlogπθ(at∣st)]
这是本讲最重要的结果:计算策略梯度完全不需要知道环境的模型。只需要:(1) 按策略跑回合,得到 R(τ);(2) 对自己的策略求 ∇logπ。环境是什么样子、奖励怎么给,统统不用知道。
5.2 策略梯度定理
更一般的形式(Sutton et al., 2000):
∇θJ(θ)=s∑ηπ(s)a∑∇θπθ(a∣s)Qπ(s,a)=Eπ[t∑γtQπ(st,at)∇θlogπθ(at∣st)]
其中 ηπ(s)=∑tγtPr(st=s) 是从起点出发的折扣访问量。
解读:在每个状态,沿着”让好动作(Q 大)更可能”的方向调整策略,按这个状态被访问的频率加权。注意公式里没有”状态分布对 θ 的导数”——虽然改变策略会改变访问哪些状态,但这个影响已经被 Qπ 自动包含了。这是定理最不平凡的地方。
代码验证:04_gradient_variance.py 演示 2 在一个 5 状态的回合制火星车上(表格型 softmax,10 个参数,γ=0.9),用两种完全独立的方法计算精确梯度:
- 有限差分:直接对精确的 J(θ)(解线性方程组得到)做数值求导,不依赖任何理论;
- 策略梯度定理公式:∂J/∂θs,b=η(s)π(b∣s)(Q(s,b)−V(s))。
两者在全部 10 个分量上的最大差异为 7.7×10−10。
6. 利用因果性:REINFORCE
6.1 问题:用整条轨迹的回报给每一步打分
5.1 节的公式中,每一步的 ∇logπ(at∣st) 都乘以整条轨迹的回报 R(τ)——包括在 t 时刻之前获得的奖励。但现在的动作不可能影响过去的奖励!这些项只会增加噪声。
6.2 只用未来的回报
可以证明,对于 t′<t:
E[rt′∇θlogπθ(at∣st)]=0
证明:先固定到 t 时刻为止的历史(包括 rt′ 和 st),对 at 求条件期望。rt′ 已经确定,可以提到外面;剩下 Eat∼π(⋅∣st)[∇logπ(at∣st)]=0(2.4 节)。所以整体期望为 0。□
把这些期望为 0 的项去掉,梯度不变,但方差减小:
∇θJ(θ)=E[t=0∑T−1∇θlogπθ(at∣st)t′=t∑T−1γt′rt′]=E[t=0∑T−1γtGt∇θlogπθ(at∣st)]
其中 Gt=∑t′≥tγt′−trt′ 是第 3 讲的”从 t 开始的回报”(也叫 reward-to-go)。
由于 E[Gt∣st,at]=Qπ(st,at),这正是策略梯度定理的采样版本。
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 起名时颇费了一番心思)。
它本质上是蒙特卡洛方法:需要完整的回合才能计算 Gt,估计无偏但方差大(第 3 讲)。
关于 γt 因子:严格的梯度需要乘 γt,但几乎所有实际代码都省略了它,直接用 Gt∇logπ(at∣st)。省略后的估计量不再是 J(θ) 的真正梯度(有偏),可以理解为”把每一步都当作新的起点来优化”,更重视后面的时间步。实践中这通常可以接受,但要知道它的含义(6.5 节的实验会测量这个偏差)。
6.4 短走廊上的 REINFORCE
从 π(右)=0.05(期望回报约 −82)出发,参数 θ=[θ左,θ右],1000 个回合(代码 03 演示 3):
| 设置 | 第 1–10 回合 | 11–50 | 51–100 | 101–300 | 301–600 | 601–1000 | 最终 p 中位数 | 塌缩到 0/1 |
|---|
| A 无基线 α=2−13 | −74.1 | −56.7 | −35.9 | −23.2 | −15.4 | −12.8 | 0.476 | 0% |
| B 无基线 α=2−12 | −74.1 | −39.1 | −24.4 | −16.5 | −12.7 | −11.7 | 0.572 | 0% |
| C 无基线 α=2−9 | −492.7 | −799.1 | −866.3 | −901.2 | −942.7 | −1000.0 | 1.000 | 100% |
| D 有基线 α=2−9 | −61.6 | −18.7 | −12.4 | −11.8 | −12.2 | −11.8 | 0.581 | 0% |
(A、B、D 为 30 次运行平均;C 的回合大多跑满 1000 步上限,非常耗时,为 10 次运行。)
REINFORCE 成功地学到了接近最优的随机策略(p∗≈0.59,期望回报 −11.66)。但注意 C:不用基线时调大学习率,策略会塌缩——一次很长的回合(回报 −几百)产生巨大的梯度,把 p 一下子推到 0 或 1,策略变成确定性的,再也到不了终点,也就再也学不回来。第 7 节的基线解决了这个问题。
6.5 数值实验:三种估计量的偏差与方差
代码 04 演示 3:在 5 状态回合制火星车上(每步 −1 的时间成本,走出左边界 +1、右边界 +10,γ=0.9),在一个固定的 θ 处用 20000 个回合比较四种估计量:
| 估计量 | 偏差大小 | 总方差 |
|---|
| (a) G0⋅∑t∇logπ(at∣st)(整条回报) | 0.164 | 229.3 |
| (b) ∑tγtGt∇logπ(at∣st)(未来回报) | 0.049 | 49.0 |
| (c) ∑tγt(Gt−V(st))∇logπ(at∣st)(再减基线) | 0.039 | 34.3 |
| (d) ∑t(Gt−V(st))∇logπ(at∣st)(去掉 γt) | 3.078 | 110.0 |
(“偏差大小”是样本均值与精确梯度之差的长度;20000 个样本下,无偏估计量也会有约 总方差/20000 量级的随机误差,例如 (a) 约为 0.11。)
- (a)(b)(c) 都是无偏的,而方差逐级下降:利用因果性让方差降到约 1/5,再减基线又降了约 1/3。
- (d) 明显有偏:去掉 γt 后,它不再是 J(θ) 的梯度。
- 一个补充观察:如果把时间成本从 −1 改成 −0.2,“动作之前的奖励”很小,(a) 和 (b) 的方差就几乎一样(21.8 vs 22.1)。利用因果性的收益,取决于”过去的奖励”带来了多少噪声。
7. 基线:不改变期望,降低方差
7.1 问题:所有奖励都是正的怎么办?
在 REINFORCE 中,如果所有回报都是正的(比如 CartPole 每步 +1),那么每个被执行的动作的概率都会提高——只是提高得多少不同。“好”和”差”只能通过”提高得多”和”提高得少”来区分,信号很弱,噪声很大。
更直观的做法:比平均好的动作提高概率,比平均差的降低概率。也就是减去一个”平均水平” b。
7.2 基线不引入偏差
对任意只依赖状态(不依赖动作)的函数 b(s):
Ea∼πθ(⋅∣s)[b(s)∇θlogπθ(a∣s)]=b(s)Ea∼πθ[∇θlogπθ(a∣s)]=b(s)⋅0=0
(用到了 2.4 节的性质。)所以把 Gt 换成 Gt−b(st),梯度的期望不变:
∇θJ(θ)=E[t∑γt(Gt−b(st))∇θlogπθ(at∣st)]
注意:b 不能依赖当前动作 at,否则它就不能提到期望外面,会引入偏差。代码 02 中,基线必须用”这一步之前”的平均奖励计算,不能把当前的奖励 r 也算进去。
7.3 基线为什么能降低方差?
梯度估计的每一项是 (Gt−b)∇logπ。∇logπ 本身的期望为 0、有正有负;(Gt−b) 越接近 0,乘积的波动就越小。选择 b≈E[Gt∣st]=Vπ(st),就让 (Gt−b) 平均而言尽量小。
一个自然的选择是用另一个函数逼近器学习 V(s)(用第 3 讲的 MC 方法:以 Gt 为目标做回归),用它作为基线。这时 Gt−V(st) 是 Qπ(st,at)−Vπ(st) 的估计,这个量叫优势函数(advantage):
Aπ(s,a)=Qπ(s,a)−Vπ(s)
“在状态 s 选动作 a,比按策略平均而言好多少”。优势函数是第 7 讲的核心概念。
(严格来说,使方差最小的基线并不恰好是 Vπ(s),而是一个以 ∥∇logπ∥2 加权的平均回报;但 Vπ(s) 简单、效果好,是实践中的标准选择。)
7.4 实验:基线的效果
老虎机(代码 02 演示 2、3;5 个臂,真实平均奖励 [0.2,0.5,1.0,0.0,0.3],α=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−b 只看”比平均好多少”。
直接测量梯度估计(固定 θ,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(θ)=−N1t∑logπθ(at∣st)⋅At
其中 At 被当作常数(不求导)。对它求梯度:∇θL=−N1∑tAt∇θlogπθ(at∣st)——恰好是策略梯度估计的相反数。所以最小化这个”损失”,就是沿着策略梯度做梯度上升。
注意:这个损失的数值本身没有物理意义(它不是回报,下降了也不代表策略变好了),不要用它来判断训练进度。
8.3 实现细节
- 用 logits 构造分布:
torch.distributions.Categorical(logits=...) 内部用数值稳定的方式计算 log 概率。自己先算概率再取 log,概率接近 0 时会得到 −∞。
- 优势要 detach:基线只是一个”参照点”,策略的梯度不应流进价值网络。
- 优势标准化:减均值、除标准差。让每批数据的”打分”尺度一致,学习率更好调。注意”减均值”本身就相当于用”这批数据的平均回报”作为一个常数基线——所以即使不用价值网络,只要开着标准化,仍然有一个较粗糙的基线。
- 同策略:每批数据用完就扔。旧策略收集的数据不能直接用来估计新策略的梯度(第 7 讲会讨论如何用重要性采样部分地复用数据)。
8.4 实验:CartPole 上的消融
05_reinforce_cartpole.py:策略网络和价值网络都是两层 64 单元的 MLP(tanh),每次迭代收集 8 个回合,共 200 次迭代,γ=0.99。3 个随机种子。“首次解决”指连续 5 次迭代的平均训练回报 ≥ 475:
| 设置 | 未来回报 | 价值基线 | 标准化 | 首次解决的迭代(3 个种子) | 最后 20 次迭代平均回报 |
|---|
| A(默认) | ✓ | ✓ | ✓ | 55, 45, 41 | 489, 500, 480 |
| B | ✓ | | ✓ | 39, 34, 42 | 491, 500, 489 |
| C | ✓ | | | 67, 116, 89 | 498, 460, 462 |
| D(最原始的 REINFORCE) | | | | 从未解决 | 258, 83, 315 |
| E | | ✓ | ✓ | 50, 55, 53 | 478, 486, 499 |
解读:
- 最原始的 REINFORCE(D)学不会:用整条轨迹的回报、没有任何基线,200 次迭代后仍远未达到满分。
- 只加上”未来回报”(C)就能学会,但慢而不稳定(平均 91 次迭代)。
- 有基线或标准化(A、B、E)就快得多(平均 38~53 次迭代)。在基线存在的情况下,“未来回报 vs 整条回报”的差别变小了(A vs E)。
- 一个诚实的观察:在 CartPole 上,学出来的价值基线(A)并不比标准化带来的”批量平均”基线(B)更好——B 甚至稍快。原因之一是 CartPole 中不同状态的回报差别不大,而价值网络本身也需要时间来学。在状态之间差别很大的问题上,依赖状态的基线 V(s) 的优势会更明显。不要从一个简单问题上的消融得出普遍结论。
9. 策略梯度的问题:通往第 7 讲
REINFORCE 能工作,但有三个明显的问题:
-
方差大:它是蒙特卡洛方法,每个梯度估计都依赖整条(剩余的)轨迹。基线有帮助,但远远不够。
→ 第 7 讲:Actor-Critic——用 TD 的思想,以 r+γV(s′) 代替 Gt,用偏差换方差;GAE 在两者之间平滑插值(回忆第 3 讲的 n 步 TD 和 TD(λ))。
-
样本效率低:同策略,每批数据只用一次就扔掉。
→ 第 7 讲:用重要性采样对旧数据做修正,让一批数据可以被多次利用。
-
步长难选:参数空间中的一小步,可能让策略发生巨大的变化;一次坏的更新让策略变差,变差的策略又收集到更差的数据……可能再也恢复不过来(回忆短走廊中的设置 C)。
→ 第 7 讲:TRPO / PPO——限制每次更新后新旧策略的差异(KL 散度或概率比的裁剪),保证”每一步都不会走得太远”。
10. 本讲总结
10.1 核心概念清单
- 策略搜索:直接参数化 πθ,最大化 J(θ)=Eτ[R(τ)]。适合连续动作、能学随机策略,但局部最优、方差大、样本效率低。
- softmax / 高斯策略;得分函数 ∇logπ:softmax 为 ϕ(s,a)−Eb[ϕ(s,b)],高斯为 σ2a−μϕ(s)。
- 得分函数的期望为 0:Ea∼π[∇logπ(a∣s)]=0。
- 似然比技巧:∇Epθ[f]=Epθ[f∇logpθ];f 不需要可微。
- 轨迹上的策略梯度:∇logpθ(τ)=∑t∇logπθ(at∣st),环境的转移概率消失,不需要模型。
- 策略梯度定理:∇J=E[∑tγtQπ(st,at)∇logπ(at∣st)]。
- 因果性:现在的动作影响不了过去的奖励,只用未来回报 Gt → REINFORCE。
- 基线:减去任何只依赖状态的 b(s) 不改变期望、降低方差;b=V(s) 时得到优势 A=Q−V。
- 实现:替代损失 −mean(logπ⋅A)、logits、detach、优势标准化(隐含常数基线)、同策略。
- 问题:方差大、样本效率低、步长敏感 → 第 7 讲。
10.2 公式速查表
| 名称 | 公式 |
|---|
| softmax 策略 | πθ(a∣s)=exp(h(s,a;θ))/∑bexp(h(s,b;θ)) |
| softmax 得分函数 | ∇logπθ(a∣s)=ϕ(s,a)−∑bπθ(b∣s)ϕ(s,b) |
| 高斯得分函数 | ∇θlogπ=σ2a−μθ(s)ϕ(s) |
| 得分函数期望 | Ea∼π[∇logπ(a∣s)]=0 |
| 目标函数 | J(θ)=Eτ∼pθ[R(τ)] |
| 似然比技巧 | ∇Ex∼pθ[f(x)]=Ex∼pθ[f(x)∇logpθ(x)] |
| 轨迹对数概率的梯度 | ∇logpθ(τ)=∑t∇logπθ(at∣st) |
| 策略梯度(整条回报) | ∇J=E[R(τ)∑t∇logπθ(at∣st)] |
| 策略梯度定理 | ∇J=∑sηπ(s)∑a∇πθ(a∣s)Qπ(s,a) |
| REINFORCE 更新 | θ←θ+αγtGt∇logπθ(at∣st) |
| 带基线 | θ←θ+αγt(Gt−b(st))∇logπθ(at∣st) |
| 优势函数 | Aπ(s,a)=Qπ(s,a)−Vπ(s) |
| 替代损失 | L(θ)=−N1∑tlogπθ(at∣st)⋅At(At 视为常数) |
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) 石头剪刀布等零和博弈:任何确定性策略都会被对手针对,最优策略是均匀随机;对 Q 贪心只能给出确定性策略。
(2) 部分可观测问题(如短走廊):智能体分辨不出若干状态,不同状态需要的动作不同,确定性策略会在某个状态”卡死”;随机策略能以一定概率走出去。
ε-贪心虽然有随机性,但随机性的大小是人为设定的探索参数,不是为了最大化回报而学出来的。
练习 2(得分函数):一个状态、3 个动作,表格型 softmax,θ=[0,ln2,0]。(a) 写出 π;(b) 写出选中动作 1 时的得分函数 ∇θlogπ(1);(c) 验证 ∑aπ(a)∇logπ(a)=0。
参考答案
(a) exp(θ)=[1,2,1],π=[0.25,0.5,0.25]。
(b) ∇logπ(1)=e1−π=[−0.25,0.5,−0.25]。
(c) ∇logπ(0)=[0.75,−0.5,−0.25],∇logπ(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] ✓。
练习 3(似然比技巧):设 x∼N(θ,1),f(x)=x2。(a) 直接计算 E[f(x)] 并对 θ 求导;(b) 用似然比技巧写出梯度的期望形式,并验证两者相等。
参考答案
(a) E[x2]=θ2+1,导数为 2θ。
(b) ∇θlogpθ(x)=x−θ,所以梯度 =E[x2(x−θ)]。令 x=θ+z,z∼N(0,1):E[(θ+z)2z]=E[θ2z+2θz2+z3]=0+2θ+0=2θ ✓。
练习 4(转移概率为何消失):如果环境的转移概率也依赖于 θ(例如,θ 同时控制着机器人的某个物理参数),5.1 节的推导在哪一步会失效?这时还能不用模型计算梯度吗?
参考答案
在”logP(st+1∣st,at) 对 θ 的导数为 0”这一步失效。此时 ∇logpθ(τ) 会多出 ∑t∇θlogPθ(st+1∣st,at) 这一项,而计算它需要知道转移概率的形式——也就是需要模型。标准的策略梯度能”无模型”,正是因为参数只出现在智能体自己的策略里。
练习 5(基线):证明:如果基线依赖于当前动作,比如 b=b(st,at),那么一般来说 E[b(st,at)∇logπ(at∣st)]=0。举一个具体的例子。
参考答案
Ea[b(s,a)∇logπ(a∣s)]=∑a∇π(a∣s)b(s,a),一般不为 0(只有 b 与 a 无关时才能提出来变成 b⋅∇∑aπ=0)。
例:单状态、两个动作、表格型 softmax、θ=[0,0],π=[0.5,0.5]。取 b(a)=1[a=0]。∇logπ(0)=[0.5,−0.5],所以期望 =0.5×1×[0.5,−0.5]+0.5×0=[0.25,−0.25]=0。
(注:第 7 讲会看到,用 Q(s,a) 这类依赖动作的量时,需要把它们放在”被乘的权重”里,而不是当作基线减掉。)
练习 6(因果性):一个 2 步的回合:r0,r1,γ=1。写出”整条回报”和”未来回报”两种估计量各自对 ∇logπ(a1∣s1) 乘的权重。为什么去掉的那一项期望为 0?
参考答案
整条回报:(r0+r1)∇logπ(a1∣s1);未来回报:r1∇logπ(a1∣s1)。去掉的是 r0∇logπ(a1∣s1)。给定 s1 以及之前发生的一切(包括 r0),a1 按 π(⋅∣s1) 采样,Ea1[∇logπ(a1∣s1)]=0,而 r0 此时是常数,所以 E[r0∇logπ(a1∣s1)]=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 因子带来的偏差。
13. 下一讲预告
REINFORCE 用完整回合的回报 Gt 来估计”动作有多好”,方差大、样本效率低、对步长敏感。下一讲我们把前面所有讲次的思想汇聚起来:
- Actor-Critic:用 TD 目标 r+γV(s′) 代替 Gt(第 3 讲 TD 的思想),用一点偏差换取大幅降低的方差;
- 广义优势估计(GAE):在 TD 与 MC 之间平滑插值(第 3 讲 TD(λ) 的思想);
- 性能差异引理:新旧策略的价值差可以用旧策略的优势函数精确表示;
- TRPO 与 PPO:限制每次更新的幅度,保证策略稳步改进——PPO 是目前最常用的策略梯度算法,也是 RLHF 的核心。
下一讲之前,建议你:跑通 code/lecture06/ 下的 5 个脚本,完成练习 2、3、5,并尝试练习 7、8。