前面几篇笔记主要沿着“先写贝尔曼方程,再做不动点求解”的路线前进。不论是值函数、最优方程、TD 还是 Q-learning,本质上都还是在围着 value function 转。
策略梯度则代表另一条路线:
不先求值函数,而是直接把策略本身参数化,然后对策略参数做优化。
它的数学骨架其实非常干净,几乎只靠两件工具就能立起来:
- 轨迹分布的因子分解;
- log-derivative trick。
而 baseline、reward-to-go、importance sampling 这些看起来像工程技巧的东西,本质上都围绕着两件事:降低方差与修正分布错位。
1. 我们到底在优化什么
设策略由参数 θ 控制,写成
πθ(a∣s).
在这条策略下,环境会生成随机轨迹
τ=(s0,a0,s1,a1,…,sT).
记一条轨迹的总回报为 R(τ),则目标函数定义为
J(θ)=Eτ∼pθ(τ)[R(τ)].
这里与值函数路线的区别很大:
- 值函数方法先求 Vπ 或 Qπ;
- 策略梯度方法直接问:整个轨迹期望回报对参数 θ 的梯度是什么?
2. 轨迹分布的分解是整个推导的支点
轨迹概率满足
pθ(τ)=p(s0)t=0∏T−1πθ(at∣st)p(st+1∣st,at).
这个分解极其关键,因为它告诉我们:
- 初始状态分布 p(s0) 与 θ 无关;
- 环境转移 p(st+1∣st,at) 与 θ 无关;
- 真正带参数的,只有策略项 πθ(at∣st)。
所以看似是在对整条轨迹分布求导,实际上只有 policy 部分需要负责。
3. 最基本的策略梯度推导
从目标函数出发,
∇θJ(θ)=∇θ∫pθ(τ)R(τ)dτ.
交换积分与梯度后,
∇θJ(θ)=∫∇θpθ(τ)R(τ)dτ.
此时使用关键恒等式
∇θpθ(τ)=pθ(τ)∇θlogpθ(τ),
得到
∇θJ(θ)=Eτ∼pθ[∇θlogpθ(τ)R(τ)].
再利用轨迹分解,
logpθ(τ)=logp(s0)+t=0∑T−1logπθ(at∣st)+t=0∑T−1logp(st+1∣st,at),
因此
∇θlogpθ(τ)=t=0∑T−1∇θlogπθ(at∣st).
最终得到最原始的策略梯度形式
∇θJ(θ)=Eτ∼pθ[(t=0∑T−1∇θlogπθ(at∣st))R(τ)].
这就是 REINFORCE 的理论起点。
4. 它为什么看起来像最大似然
如果在做行为克隆,目标通常是
θmaxi,t∑logπθ(at(i)∣st(i)),
它的梯度就是
i,t∑∇θlogπθ(at(i)∣st(i)).
而策略梯度的样本形式则是
i,t∑∇θlogπθ(at(i)∣st(i))R(τ(i)).
所以从形式上看,policy gradient 很像一类加权最大似然:
- MLE:每个动作样本权重都是 1;
- PG:每个动作样本权重由回报决定。
这也说明了两者的哲学差别:
- MLE 是模仿“数据里发生过什么”;
- PG 是放大“最终带来高回报的 sampled 行为”。
5. 为什么最原始的策略梯度高方差
记
Z(τ)=t∑∇θlogπθ(at∣st),g(τ)=Z(τ)R(τ).
则单条轨迹估计器的方差来自一个典型的乘积结构:本来就波动很大的 score function,再乘上本来就波动很大的总回报。
把总回报展开成逐时刻奖励,
R(τ)=u=0∑T−1ru,
于是得到双重求和
t∑u∑∇θlogπθ(at∣st)ru.
这暴露出 credit assignment 的粗糙性:时刻 t 的动作梯度,被整条轨迹上所有奖励都加权了,包括它根本不该负责的部分。
尤其对过去奖励 u<t,有
E[∇θlogπθ(at∣st)ru]=0,
它们对期望没有贡献,但会显著增加方差。
6. Baseline:减去一个不会改变期望的量
为了降低方差,可以把回报换成
Gt−b,
得到
∇θJ(θ)=E[t∑∇θlogπθ(at∣st)(Gt−b)].
这里最关键的是:减去 baseline 并不会改变期望。
因为在任意状态 s 下,
Ea∼πθ(⋅∣s)[∇θlogπθ(a∣s)]=0.
从而
E[∇θlogπθ(at∣st)b]=0.
所以 baseline 的作用纯粹是降方差,不引入偏差。
从统计视角看,它其实是在做一种中心化:把回报里“公共的平均部分”减掉,只保留相对基线的超额表现。
7. 为什么 baseline 自然会走向 advantage
如果 baseline 只是常数,那么它只能消除全局均值带来的波动;更强的做法是让 baseline 依赖状态:
bt=b(st)≈Vπ(st).
这时
Gt−b(st)
衡量的就是:
从状态 st 出发,这次 rollout 比平均水平好多少。
这就是 advantage 的自然来源。真正值得放大学习信号的,不是“绝对回报高”,而是“相对于当前状态的常规水平更好”。
8. 因果性:当前动作不该为过去负责
前面已经看到,最原始双重求和里有很多无关项。因为当前动作只会影响未来,不会反过来影响过去,所以应当删掉过去奖励部分,保留 reward-to-go:
Gt=u=t∑T−1ru.
于是策略梯度可以重写成
∇θJ(θ)=E[t∑∇θlogπθ(at∣st)Gt].
这一步通常被称为 causality 或 reward-to-go trick。它背后的直觉非常简单:
时刻 t 的动作,只该对它之后能影响到的奖励负责。
这一步往往能带来非常可观的方差下降。
9. Off-policy:能不能用别的策略采来的样本
on-policy 的一个痛点是:当前策略一变,旧数据很快就失配了。于是自然会问:
如果样本是由行为策略 μ 采来的,我还能不能估计目标策略 πθ 的梯度?
答案是可以,但需要重要性采样。
一般形式是
Ex∼p[f(x)]=Ex∼q[q(x)p(x)f(x)].
在轨迹层面,importance ratio 为
pμ(τ)pπ(τ)=t=0∏T−1μ(at∣st)π(at∣st),
因为环境转移项相除后会消掉。
于是最直接的 off-policy policy gradient 写成
∇θJ(θ)=Eτ∼pμ[pμ(τ)pπθ(τ)∇θlogpπθ(τ)R(τ)].
它是无偏的,但方差可能非常大,因为 ratio 是一串乘积。
10. Off-policy 下的 causality 与前缀比重
和 on-policy 一样,off-policy 也不该让时刻 t 的梯度背负整条轨迹的无关历史。于是可以把轨迹级比重局部化为前缀比重
ρ0:t=k=0∏tμ(ak∣sk)π(ak∣sk).
得到更局部的形式
∇θJ(θ)=Eμ[t∑ρ0:t∇θlogπθ(at∣st)Gt].
这和 reward-to-go 的精神完全一致:只保留和当前梯度真正相关的未来影响。
11. 最终统一形式
把前面几件事都合起来:
- reward-to-go;
- baseline;
- off-policy importance weight。
就得到统一表达
∇θJ(θ)=E[t∑wt∇θlogπθ(at∣st)(Gt−bt)],
其中
wt={1,ρ0:t,on-policy,off-policy.
若记
A^t=Gt−bt,
则得到最常见的 advantage 形式
∇θJ(θ)=E[t∑wt∇θlogπθ(at∣st)A^t].
这时候策略梯度就从一个高方差的轨迹公式,变成了一个可训练的局部加权更新。
12. 自动微分实现:surrogate objective 从哪里来
实践里,我们通常不手写梯度,而是构造一个 surrogate objective:
L(θ)=t∑wtlogπθ(at∣st)A^t.
于是 actor loss 可以写成
Lactor=−t∑stopgrad(wtA^t)logπθ(at∣st).
这里 stopgrad 的作用是让梯度只通过 logπθ 传播,而不把 advantage estimator 本身也卷进优化路径。
从工程视角看,这几乎就是一个带权重的 log-likelihood 目标:
- 普通最大似然:权重恒为 1;
- policy gradient:权重变成了 wtA^t。
13. 总结:策略梯度到底提供了什么
整条链条可以概括成:
- 从轨迹目标
J(θ)=Eτ∼pθ[R(τ)]
出发;
- 用 log-derivative trick 得到最基本的 score-function 形式;
- 发现原始估计器高方差;
- 用 causality 把总回报换成 reward-to-go;
- 用 baseline 做中心化降方差;
- 在 off-policy 场景下用 importance sampling 修正分布错位;
- 最终写成 advantage-weighted 的统一更新式。
如果只用一句话概括 policy gradient,我会写成:
它是在轨迹分布上做一种最大似然式的更新,但每个动作的学习强度由它对未来回报的贡献来决定。
这既抓住了它的数学结构,也抓住了它的算法直觉。
而当你继续走向 actor-critic、natural policy gradient、TRPO、PPO 时,会发现前面的值函数、TD、随机近似又会重新出现。因为最成功的策略优化方法,几乎从来不是纯粹抛弃值函数,而是让值函数负责降方差,让策略负责改变行为分布。
回看上一篇 Note 4,你会发现两条路线其实并没有那么远。一个在策略空间里做 noisy gradient ascent,一个在值函数空间里做 noisy fixed-point iteration;它们共享的深层语言,仍然是“期望目标 + 样本近似 + 噪声控制”。