外观
策略梯度方法
一句话定位:这一页讲清楚策略梯度(Policy Gradient)方法——不学"每个动作值多少",而是直接学"该怎么做"的策略网络;从 REINFORCE 的高方差,到 baseline/advantage,再到 PPO 的裁剪目标与 GAE;读完后你能讲清策略梯度定理的直觉、写对 PPO 的损失函数,并知道连续动作空间怎么配分布。
一、为什么需要直接学策略:价值学习的三条短板
价值学习(学 Q → argmax 出策略)有三个天生局限:
| 短板 | 价值学习的问题 | 策略梯度的解法 |
|---|---|---|
| 连续动作 | argmax Q 在连续空间没法算 | 策略网络直接输出连续动作分布 |
| 随机最优策略 | Q 只能导出确定性动作 | 策略梯度天然输出概率分布(扑克、博弈需要随机性) |
| 状态高维/冗余 | 每个状态都要精确估 Q 值 | 策略只关注"该做什么",天然更省 |
| 动作空间含约束 | 难以表达"不能做 X" | 可在分布层面建模(mask、约束) |
价值学习适合"离散动作、可评估每个动作的 Q"的场景;策略梯度更通用,是 PPO/SAC 等现代主流算法的骨架。两者最终在 Actor-Critic 里合流(见Actor-Critic 家族)。
直觉类比
价值学习像"给每道菜打分,然后点分数最高的";策略梯度像"直接学习'什么情况点什么菜'的厨艺"。前者需要能遍历所有菜,后者不需要。
二、策略网络与目标函数
1. 策略网络 π_θ(a|s)
用参数 $\theta$ 的神经网络表示策略:输入状态 $s$,输出动作概率分布。分类两种动作空间:
text
离散动作:输出 softmax 概率向量
[π(a1|s), π(a2|s), ..., π(aK|s)]
连续动作:输出高斯分布参数(均值 + 方差)
均值 μ_θ(s),方差 σ_θ(s) → a ~ N(μ, σ²)2. 目标函数:最大化期望回报
策略梯度方法直接优化期望折扣回报:
$$ J(\theta) = \mathbb{E}{\tau \sim \pi\theta} \left[ \sum_{t=0}^{T} \gamma^t r_t \right] = \mathbb{E}{\tau \sim \pi\theta}[R(\tau)] $$
其中轨迹 $\tau = (s_0, a_0, r_1, s_1, \dots)$。注意:期望是对"用 π_θ 采样的轨迹"取的——目标函数值取决于"样本是怎么采出来的"。这是策略梯度与监督学习最本质的区别,也是它方差大的根源。
三、策略梯度定理:直觉第一
1. 最朴素的直觉
我们想让 $J(\theta)$ 上升,就按 $\nabla_\theta J(\theta)$ 走梯度。问题:目标函数里的期望依赖 $\theta$(采样分布变了),没法直接对期望求导。策略梯度定理给出一个巧妙的重写:
$$ \nabla_\theta J(\theta) = \mathbb{E}{\tau \sim \pi\theta} \left[ \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t \mid s_t) , R(\tau) \right] $$
关键公式(REINFORCE 用的就是这个形式)。逐项解读:
- $\nabla_\theta \log \pi_\theta(a_t|s_t)$:把"概率上升"的方向求出来——概率每增加一点,就沿这个方向推动参数;
- $R(\tau)$:整条轨迹的总回报,作为"这条轨迹值不值得重复"的权重。
合起来的话:回报高的轨迹,我们就把产生它的动作概率调高;回报低的轨迹,就把动作概率压低。这就是策略梯度的全部直觉——"让高回报动作的概率上升,低回报动作的概率下降"。
2. log 从哪来?
$\nabla_\theta \log \pi_\theta$ 来自"分数函数技巧"(score function trick / REINFORCE trick):
$$ \nabla_\theta \mathbb{E}{\pi\theta}[R] = \mathbb{E}{\pi\theta}[R \cdot \nabla_\theta \log \pi_\theta] $$
它把"对分布求导"变成"对 $\log$ 概率求导再乘回报",从而可以在样本上用 Monte Carlo 估计。这是整个策略梯度家族的数学地基。
记住这个类比
策略梯度 = "篮球投篮训练":投进(高回报)的姿势多练(概率上升),投丢(低回报)的姿势少用(概率下降)。注意它不看"这一投值多少分",只看"这一局赢了还是输了"($R(\tau)$ 是整局回报)。
四、REINFORCE:最朴素的策略梯度
1. 算法
REINFORCE(Williams, 1992)用整条轨迹的回报更新:
python
def reinforce(env, policy, episodes=1000, gamma=0.99, lr=0.01):
for _ in range(episodes):
# 1. 用当前策略采样一整条轨迹
trajectory = collect_episode(env, policy) # [(s, a, r), ...]
# 2. 反向计算每一步的折扣回报 G_t
G = 0.0
for t, (s, a, r) in reversed(list(enumerate(trajectory))):
G = r + gamma * G # 回报 G_t
# 3. 沿"log 概率 × 回报"的梯度更新
policy.update(s, a, lr * G * grad_log_prob(s, a))2. 高方差问题:REINFORCE 的根本缺陷
REINFORCE 用整局回报 $R(\tau)$ 加权。问题在于:
- $R(\tau)$ 里混着"策略好坏"和"环境运气":同一策略,运气好的一局回报 100,运气差的一局 0;
- 于是梯度方向被运气主导,方差爆炸;
- 方差大的估计需要海量样本才收敛——REINFORCE 在稍复杂任务上基本跑不动。
亲手体会高方差
在渐进式教程:Gymnasium 三版跑起来的版本二,你会亲手实现 REINFORCE 并看到它的学习曲线:要么震荡剧烈,要么根本不涨。这不是 bug,是策略梯度的天生方差。
五、Baseline 与 Advantage:给回报"去均值"
1. 直觉:判断好坏需要一个参照物
"回报 10 是好是坏?"——取决于整体水平。如果所有轨迹平均回报是 50,那 10 是差;如果平均是 -5,那 10 是极好。REINFORCE 直接用绝对回报加权,忽略了这个参照系。
Baseline 技巧:从回报中减掉一个不依赖当前动作的基线 $b(s_t)$:
$$ \nabla_\theta J(\theta) = \mathbb{E}\left[ \sum_t \nabla_\theta \log \pi_\theta(a_t|s_t) , \big( R(\tau) - b(s_t) \big) \right] $$
因为 $\mathbb{E}[\nabla_\theta \log \pi_\theta \cdot b(s_t)] = 0$(可证明:基线对梯度的期望贡献为零),所以减基线不改变梯度期望(无偏),只降低方差。
2. Advantage 函数:最自然的基线
最好的基线是状态价值函数 $V^\pi(s_t)$。于是得到优势函数(advantage function):
$$ A^\pi(s_t, a_t) = Q^\pi(s_t, a_t) - V^\pi(s_t) $$
直觉:$A$ 回答"这个动作相对平均水平好在哪"——Q 是这个动作的期望回报,V 是所有动作的平均回报,差为正说明这个动作比平常好。用 advantage 代替总回报,梯度变为:
$$ \nabla_\theta J(\theta) = \mathbb{E}\left[ \sum_t \nabla_\theta \log \pi_\theta(a_t|s_t) , A(s_t, a_t) \right] $$
3. 怎么估计 A?——需要第二个网络
问题:$A = Q - V$,我们连 Q 都没有。工程解法:
- 方案一(Actor-Critic):学一个价值网络 $V_\phi(s)$ 当基线,用"单步回报"近似 advantage:
$$ \hat A_t = r_{t+1} + \gamma V_\phi(s_{t+1}) - V_\phi(s_t) $$
这正是 TD 误差的形式(见价值学习的 TD 一节)!**Actor(策略网络)+ Critic(价值网络)**的组合就是 Actor-Critic 架构,详见Actor-Critic 家族。
- 方案二(GAE):把多步 advantage 加权组合,见下面第六节。
六、GAE:广义优势估计
1. 从 TD 误差出发
定义单步 TD 误差:
$$ \delta_t = r_{t+1} + \gamma V(s_{t+1}) - V(s_t) $$
GAE(Generalized Advantage Estimation, Schulman et al., 2016)把 n 步 advantage 用指数衰减加权组合起来:
$$ \hat A^{GAE(\gamma,\lambda)}t = \sum^{\infty} (\gamma\lambda)^l , \delta_{t+l} $$
2. 直觉:λ 是一个"偏差-方差"旋钮
| λ 取值 | 等价于 | 偏差 | 方差 |
|---|---|---|---|
| λ=0 | 只看 1 步 TD(自举强) | 高 | 低 |
| λ=1 | 看整条轨迹(MC 风格) | 低(无偏) | 高 |
| λ=0.95 | 折衷(PPO/SAC 常用) | 中 | 中 |
直觉:λ 控制"未来要相信多少步"——λ 小(0)只信一步经验(快但有偏),λ 大(1)信到轨迹结束(慢但无偏)。GAE 是 MC 与 TD 之间的连续插值。
工程默认值
PPO/SAC 里 λ 通常取 0.95~0.99。λ 是"涨方差 vs 跌偏差"的直接开关,调参时这是前三个要动的旋钮之一。
七、TRPO:为什么要信任域
1. 问题:策略梯度大步长导致崩溃
普通策略梯度以固定学习率更新参数。但参数空间的距离 ≠ 策略分布的距离:参数动 0.01,策略分布可能已经天翻地覆(尤其 softmax 在高维时对参数极敏感)。更新太大 → 策略瞬间崩坏 → 再难恢复。这就是"策略梯度学崩了"的常见原因。
2. TRPO 的答案:约束步长
TRPO(Trust Region Policy Optimization, Schulman et al., 2015)把更新限制在一个信任域内——用 KL 散度约束新旧策略不要差太远:
$$ \max_\theta \mathbb{E}\left[ \frac{\pi_\theta(a|s)}{\pi_{\theta_{old}}(a|s)} \hat A_t \right] \quad \text{s.t.} \quad \mathbb{E}\left[ D_{KL}(\pi_{\theta_{old}} | \pi_\theta) \right] \le \delta $$
直觉:每次更新都保证"新策略和旧策略的 KL 距离不超 δ",于是不会一步走飞。TRPO 理论漂亮但实现繁琐(需要共轭梯度解约束问题)。
3. TRPO 的继承者:PPO
PPO(Proximal Policy Optimization, Schulman et al., 2017)用裁剪近似 TRPO 的信任域效果,实现简单得多,成为工业界事实标准。
八、PPO 裁剪目标:公式与实现
1. 核心目标函数
定义概率比(importance sampling ratio):
$$ \rho_t(\theta) = \frac{\pi_\theta(a_t | s_t)}{\pi_{\theta_{old}}(a_t | s_t)} $$
PPO 的 clip 目标:
$$ L^{CLIP}(\theta) = \mathbb{E}_t \left[ \min\left( \rho_t(\theta) \hat A_t, ; \operatorname{clip}(\rho_t(\theta), 1-\epsilon, 1+\epsilon) , \hat A_t \right) \right] $$
- $\rho_t \hat A_t$:普通策略梯度项(比值 × 优势);
- $\operatorname{clip}(\rho_t, 1-\epsilon, 1+\epsilon)$:把比值限制在 $[1-\epsilon, 1+\epsilon]$;
- $\min$:取两者较小值。
2. 为什么 clip 有效:直觉拆解
分四种情况(假设 ε=0.2,$\hat A_t>0$ 时想提高这个动作概率,$\hat A_t<0$ 时想降低):
| 情况 | ρ 的含义 | clip 效果 |
|---|---|---|
| A>0, 概率在上升(ρ>1) | 新策略更喜欢此动作 | ρ 被钳到 1.2,限制不要贪多 |
| A>0, 概率在下降(ρ<1) | 新策略不喜欢此动作 | 梯度鼓励上升,不限(反正要涨) |
| A<0, 概率在上升(ρ>1) | 该动作其实不好 | 梯度不惩罚(min 取 clip 侧)→ 不鼓励也不强制 |
| A<0, 概率在下降(ρ<1) | 正确方向 | 钳到 0.8,限制单步改动太大 |
一句话:"好消息别太得意,坏消息别太沮丧"——PPO 允许把坏动作概率压低、好动作概率抬高,但每一步都不许改过头(超过 ±ε 的部分梯度截断)。这把 TRPO 的"全局 KL 约束"换成了"逐样本裁剪",简单且稳。
3. PPO 的完整损失:三部分求和
$$ L^{PPO}(\theta) = \underbrace{L^{CLIP}}{\text{策略}} - c_1 \underbrace{L^{VF}}{\text{价值}} + c_2 \underbrace{\mathcal{H}[\pi_\theta]}_{\text{熵正则}} $$
- $L^{VF}$:Critic(价值网络)的回归损失 $(V_\phi(s_t) - \hat R_t)^2$;
- $\mathcal{H}$:策略熵项,系数 $c_2$ 控制探索强度(见探索与利用的熵正则)。
PPO 有两种变体:clip 版(上述,最常用)与 KL penalty 版(把 KL 当惩罚项,类似 TRPO 软约束)。实践上 clip 版是默认。
4. PPO 训练循环(伪代码)
python
def ppo_iteration(env, actor, critic, n_steps=2048, epochs=10, eps_clip=0.2):
# 1. 用旧策略采样一批轨迹(rollout)
batch = collect_rollouts(env, actor, n_steps) # n_steps 条 (s,a,r,s',done)
# 2. 计算 advantage(GAE)
adv = compute_gae(batch, critic, gamma=0.99, lam=0.95)
# 3. 在 batch 上做多轮小批量梯度上升
for _ in range(epochs):
for mb in sample_minibatches(batch):
ratio = actor.prob(mb.a) / actor_old.prob(mb.a) # ρ
loss = -torch.min(ratio * mb.adv,
torch.clamp(ratio, 1-eps_clip, 1+eps_clip) * mb.adv)
loss += -0.01 * actor.entropy(mb.s) # 熵正则
loss += critic_loss(mb) # 价值网络
optimizer.step(loss)
# 4. 把 actor 参数拷贝为 actor_old,下一轮再用要点:多轮小批量(比 REINFORCE 的单次更新数据效率高很多)是 PPO 稳且快的工程关键之一。
PPO 的常见坑
- clip 阈值 ε 默认 0.2,但对奖励量级敏感:奖励巨大时 A 巨大,clip 都兜不住,要先做 advantage 归一化(减均值除标准差);
- 熵系数 c_2 不调:大则策略永远随机、小则过早坍缩,通常 0~0.01 之间扫;
- GAE 的 λ 与 γ 要一起想:γ 决定"看得多远",λ 决定"信多少步经验";
- done 的处理(终止状态不 bootstrap)在 PPO 里同样容易错。
九、连续动作空间:分布选择与实现要点
1. 高斯策略:默认选择
连续动作默认用对角高斯分布:网络输出均值 $\mu_\theta(s)$ 与标准差 $\sigma_\theta(s)$(或 log 标准差),采样 $a \sim \mathcal{N}(\mu, \sigma^2 I)$。
text
连续策略网络输出(双头):
┌─────────┐ ┌─────┐
│ s 输入 │ ─────▶ │ μ(s)│ → 动作均值(tanh 压缩到动作范围)
│ │ ├─────┤
│ │ ─────▶ │ σ(s)│ → 探索方差(可学可固定)
└─────────┘ └─────┘2. 关键实现细节
| 细节 | 为什么重要 |
|---|---|
| log 标准差初始值 | 初始 σ 太小 → 早期探索不足;通常初始化为 -1~-2(对应小探索) |
| tanh 压缩 | 把高斯采样值映射到动作边界 [-1,1],但要用 Jacobian 修正 log 概率 |
| 熵计算 | 高斯熵是闭式公式 $\frac{1}{2}\ln(2\pi e \sigma^2)$,用它对 c_2 调探索 |
| 方差可学 vs 固定 | 可学方差不稳但自适应;固定方差简单但需手调 |
3. 离散动作与混合空间
- 离散:softmax 输出类别概率(Categorical);
- 混合(离散+连续,如"选工具 + 移动方向"):拆成多个分布输出,log 概率求和。
十、实践建议表
| 场景 | 推荐 | 理由 |
|---|---|---|
| 初学理解 | REINFORCE(教程版) | 最短代码看清梯度本质,见渐进式教程 |
| 通用离散/连续任务 | PPO | 稳、实现普及、超参少 |
| 样本效率优先 | SAC(见Actor-Critic 家族) | off-policy,样本省 10-100 倍 |
| 机器人 Sim2Real | PPO/SAC + 域随机化 | 见机器人控制与 Sim2Real |
| 大规模并行训练 | PPO + 大量环境 | PPO 天然支持并行 rollout |
面试高频"为什么 PPO 取代 TRPO?"
TRPO 需要解带约束的二次规划(共轭梯度),工程复杂、计算贵;PPO 用一阶 clip 近似同样的"信任域"效果,实现 20 行、又快又稳。工程世界选择了简单。
延伸阅读
- Actor-Critic 家族 —— 策略网络 + 价值网络的合流:A2C、DDPG、TD3、SAC
- 价值学习:从动态规划到 DQN —— 价值网络的 TD 误差正是 advantage 估计的原材料
- 探索与利用 —— 熵正则、参数噪声等策略梯度家族的内置探索
- 机器人控制与 Sim2Real —— PPO/SAC 在真实机器人上的主角地位
- 经典论文精读 —— PPO 论文逐段精读与面试问答
- 渐进式教程:Gymnasium 三版跑起来 —— 从 REINFORCE 到 PPO 的手写实现
参考资料
- Williams, R. J. (1992). Simple statistical gradient-following algorithms for connectionist reinforcement learning. Machine Learning, 8(3-4), 229-256. REINFORCE 原始论文。
- Sutton, R. S., McAllester, D., Singh, S., & Mansour, Y. (1999). Policy Gradient Methods for Reinforcement Learning with Function Approximation. NeurIPS. 策略梯度定理的证明。
- Schulman, J., Levine, S., Abbeel, P., Jordan, M., & Moritz, P. (2015). Trust Region Policy Optimization. ICML. arXiv:1502.05477
- Schulman, J., Wolski, P., Dhariwal, P., Radford, A., & Klimov, O. (2017). Proximal Policy Optimization Algorithms. arXiv:1707.06347
- Schulman, J., Moritz, P., Levine, S., Jordan, M., & Abbeel, P. (2016). High-Dimensional Continuous Control Using Generalized Advantage Estimation. ICLR. arXiv:1506.02438
- OpenAI Spinning Up. Intro to Policy Optimization. https://spinningup.openai.com/en/latest/spinningup/rl_intro3.html