跳转至

第 6 章 策略梯度与演员-评论家

值函数方法先学"每个动作值多少",再从价值里读出动作;连续动作下这个读出步骤没有闭式解。另一条路把策略本身参数化,直接对"期望回报"求梯度——不需要枚举动作,也不需要环境可微。策略梯度是这条路的地基,演员-评论家与 PPO 是它在工程上的落地形态。

1. 目标函数与策略梯度定理

参数化策略 \(\pi_\theta(a\mid s)\) 定义一个目标:

\[ J(\theta)=\mathbb E_{\tau\sim p_\theta}\left[\sum_{t=0}^{T}\gamma^t r_t\right] \]

其中 \(\tau=(s_0,a_0,r_0,\dots)\) 是一条轨迹,\(p_\theta(\tau)=\rho_0(s_0)\prod_t\pi_\theta(a_t\mid s_t)P(s_{t+1}\mid s_t,a_t)\) 是它的概率。对 \(\theta\) 求导时,只有策略项含 \(\theta\),转移与初始分布都消掉了:

\[ \nabla_\theta J(\theta)=\mathbb E_{\pi_\theta}\left[\sum_t\nabla_\theta\log\pi_\theta(a_t\mid s_t)\,G_t\right] \]

这条式子就是策略梯度定理。它的实用价值有两条:梯度只用到采样到的动作与回报,不需要知道转移概率;也不需要环境对动作可微,所以物理仿真、真机这类黑箱都能用。

工程上再进一步:\(G_t\) 只累加 \(t\) 之后的回报,而不是整条轨迹的总回报。期望不变,方差显著下降——这就是"因果性"带来的收益,因为 \(t\) 之前发生的事与该步动作的贡献无关。

2. 方差缩减与优势

策略梯度的方差大,源头是回报本身的随机性。减方差的第一步是减基线:把 \(G_t\) 换成 \(G_t-b(s_t)\),其中 \(b\) 不依赖动作。由于

\[ \mathbb E_{a\sim\pi_\theta}\left[\nabla_\theta\log\pi_\theta(a\mid s)\,b(s)\right] =b(s)\sum_a\nabla_\theta\pi_\theta(a\mid s)=b(s)\nabla_\theta 1=0 \]

减去它不改变期望,却能把回报的公共部分抵消。基线取状态价值 \(V(s)\) 时,剩下的就是优势 \(A=Q-V\)。

第二步是广义优势估计(generalized advantage estimation, GAE)。它用 TD 残差 \(\delta_t=r_t+\gamma V_\phi(s_{t+1})-V_\phi(s_t)\) 做指数加权:

\[ \hat A_t=\sum_{l=0}^{\infty}(\gamma\lambda)^l\,\delta_{t+l} \]

\(\lambda=0\) 时退化为单步 TD 误差(低方差、高偏差),\(\lambda=1\) 时退化为蒙特卡洛回报(高方差、无偏)。\(\lambda\) 是这两端之间的折中旋钮,机器人控制常用 0.95 附近。

坑:截断回合的 GAE 自举

回合因时间上限被截断时,\(\delta_t\) 的最后一步仍应包含 \(\gamma V_\phi(s_{T})\);只有真终止才把该项置零。把两者混为一谈,会在回合末尾引入系统性偏差。

3. 演员-评论家

策略梯度只需要一个可用的 \(G_t\) 或优势估计,价值函数正好提供它。把两者放进同一个循环:演员 \(\pi_\theta\) 给动作,评论家 \(V_\phi\) 估价值,用 TD 误差或 GAE 当优势,演员按策略梯度更新、评论家按回归误差更新。这就是演员-评论家(actor-critic)。

flowchart LR
    env["环境"] -->|"s_t"| actor["演员 π_θ"]
    actor -->|"a_t"| env
    env -->|"r_t, s_{t+1}"| critic["评论家 V_φ"]
    actor -->|"log π(a_t|s_t)"| pg["策略损失<br/>-Â_t log π"]
    critic -->|"δ_t"| gae["GAE 优势"]
    gae --> pg
    critic --> vl["价值损失<br/>(V_φ(s_t) - 回报)²"]
    pg --> upd["更新 θ"]
    vl --> updv["更新 φ"]

两个网络的输入与尺度不同,机器人任务通常分开建:演员吃观测输出动作均值,评论家吃观测输出标量。共享主干能省参数、让表征共享,但两条损失的量级不同,容易一边压倒另一边;分开建更省心,代价是显存与计算翻倍。

评论家只承担"给演员一个低方差的指导信号",它的精度不必完美。这也解释了为什么演员-评论家允许评论家有偏:偏差由演员的持续采样慢慢纠正,方差却是每步都要承受的。

4. PPO 的裁剪目标

策略梯度的步长很难定:步长小则慢,步长大则策略跳变、采样分布随之剧变,训练崩掉。信赖域方法(TRPO)用 KL 散度约束新旧策略的距离,但要在二阶信息上求解约束优化,实现复杂。

近端策略优化(proximal policy optimization, PPO)用一阶目标近似这个约束。记新旧策略的概率比为

\[ r_t(\theta)=\frac{\pi_\theta(a_t\mid s_t)}{\pi_{\theta_{\text{old}}}(a_t\mid s_t)} \]

裁剪后的替代目标是

\[ L^{\mathrm{CLIP}}(\theta)=\mathbb E_t\left[\min\left(r_t\hat A_t,\ \mathrm{clip}(r_t,1-\epsilon,1+\epsilon)\hat A_t\right)\right] \]

裁剪的作用是:优势为正时,比值涨过 \(1+\epsilon\) 就不再给额外收益;优势为负时,比值跌破 \(1-\epsilon\) 也不再给额外惩罚。策略因此不会在单批数据上走太远。

同一批数据可以被复用多轮(num_learning_epochs),这是 PPO 样本效率高于朴素策略梯度的主要原因;但复用越多,\(r_t\) 偏离 1 越远,裁剪开始生效,收益递减。实践中的两个配套手段是价值损失裁剪(把价值更新也限制在旧值附近)与熵奖励(保持探索、防止策略过早确定性化)。

import torch

def ppo_loss(obs, act, logp_old, adv, v_old, ret, policy, value, clip=0.2):
    dist = policy(obs)
    logp = dist.log_prob(act).sum(-1)                  # 多维动作取各维之和
    ratio = (logp - logp_old).exp()                    # π_θ / π_old
    pg = -torch.min(ratio * adv,
                    ratio.clamp(1 - clip, 1 + clip) * adv).mean()
    v = value(obs).squeeze(-1)
    v_clip = v_old + (v - v_old).clamp(-clip, clip)     # 价值也裁到旧值附近
    vl = torch.max((v - ret) ** 2, (v_clip - ret) ** 2).mean()
    entropy = dist.entropy().sum(-1).mean()
    return pg + 0.5 * vl - 0.01 * entropy               # 熵项鼓励探索

裁剪是"软约束":它不保证 KL 不超限,只让超限后没有梯度收益。要硬约束,可在每轮更新后检查近似 KL,超过阈值就提前结束该批的复用。

5. 连续动作的高斯策略

连续控制的标准策略是各维独立的高斯:

\[ \pi_\theta(a\mid s)=\mathcal N\left(\mu_\theta(s),\operatorname{diag}(\sigma_\theta^2)\right) \]

对数概率为

\[ \log\pi_\theta(a\mid s)=-\frac12\sum_i\left[\frac{(a_i-\mu_i)^2}{\sigma_i^2}+2\log\sigma_i+\log2\pi\right] \]

标准差有两种参数化:作为与状态无关的可学习向量(每个动作维一个 log_std),或由网络随状态输出。前者参数少、训练稳,是多数实现的默认;后者能表达"某些状态下更确定",但更容易塌缩。标准差塌缩到很小会让探索消失,通常用下限或熵奖励约束。

动作常被限制在 \([-1,1]\)。做法是让网络输出无界的 \(u\),再取 \(a=\tanh(u)\);此时概率密度要乘上变换的雅可比:

\[ \log\pi(a\mid s)=\log p(u)-\sum_i\log\left(1-\tanh^2u_i\right) \]

漏掉这一项,梯度会系统性偏向边界附近的动作。部署时还要按关节限位再裁剪一次,且训练阶段就应模拟同样的裁剪。

6. 并行采样与工程要点

PPO 是同策略方法,样本采完即弃,因此吞吐靠并行环境堆出来:\(N\) 个环境各走 \(T\) 步,一批就是 \(N\times T\) 个转移。这与仿真侧的向量化环境直接对接,换算关系与预算见 isaac-note 第 4 章「物理管线与向量化仿真」。

配置项与 isaac-note 第 5 章「RL 训练流水线」的 RSL-RL 字段一一对应:

概念 RSL-RL 字段 作用
每环境采样步数 num_steps_per_env 一批的总步数 = 环境数 × 该值
复用轮数 num_learning_epochs 同一批数据过几遍
小批量切分 num_mini_batches 每轮的梯度步数
裁剪系数 clip_param 即 \(\epsilon\),常取 0.1–0.2
熵系数 ent_coef 控制探索强度
折扣与 GAE gamma / lam 视野与偏差-方差折中
学习率 learning_rate 可固定,也可按目标 KL 自适应

工程上还有四项固定动作:按批归一化优势(去掉尺度影响)、对观测做运行均值方差标准化、对梯度做范数裁剪、学习率随训练进度衰减。这四项不改算法,但决定了同一套超参能否在不同任务上复用。

判据:先对齐评估口径,再调超参

调 PPO 之前先固定随机种子、评估环境数量与成功判据。评估口径一变,学习曲线之间的比较就失去意义(口径见第 10 章「训练工程、评测与迁移」)。

7. 要点

  • 策略梯度定理把期望回报的梯度写成 \(\nabla\log\pi\cdot G\) 的期望;不需要转移已知,也不需要环境可微。
  • 减基线不改变期望,只降方差;优势 \(A=Q-V\) 与 GAE 的 \(\lambda\) 是偏差-方差的两个旋钮。
  • 演员给动作、评论家给价值,TD 误差或 GAE 当优势;评论家可以有偏,因为它只是指导信号。
  • PPO 用概率比裁剪近似信赖域,一阶实现;同批数据多轮复用是它样本效率的主要来源。
  • 连续动作用高斯策略,\(\tanh\) 变换必须带对数概率修正;标准差塌缩会让探索消失。
  • 吞吐靠并行环境,超参对齐 RSL-RL 字段;优势归一化、观测标准化、梯度裁剪、学习率衰减是四项固定动作。
  • 调参前先固定评估口径,否则曲线之间不可比。

参考文献与延伸阅读

  • Williams, R. J. Simple Statistical Gradient-Following Algorithms for Connectionist Reinforcement Learning. Machine Learning, 1992. DOI
  • Schulman, J., Moritz, P., Levine, S., Jordan, M., & Abbeel, P. High-Dimensional Continuous Control Using Generalized Advantage Estimation. ICLR, 2016. arXiv
  • Schulman, J., Wolski, F., Dhariwal, P., Radford, A., & Klimov, O. Proximal Policy Optimization Algorithms. arXiv:1707.06347, 2017. arXiv
  • Schulman, J., Levine, S., Abbeel, P., Jordan, M., & Moritz, P. Trust Region Policy Optimization. ICML, 2015. arXiv
  • Mnih, V., Badia, A. P., Mirza, M., et al. Asynchronous Methods for Deep Reinforcement Learning. ICML, 2016. arXiv