Skip to content

第 9 章:从 Policy Gradient 到 PPO

深度强化学习的策略优化方法贯穿了一条清晰的演进脉络:REINFORCE 给出了原始的无偏梯度估计,Baseline 降低了方差,Importance Sampling 打开了数据复用的大门,TRPO 用信任域约束保证了单调改进,而 PPO-Clip 则以极简的裁剪操作实现了工程上的高效落地。本章沿这条主线,同时覆盖 DQN、Actor-Critic、SAC 等必要分支,最终连接到 GRPO——LLM 时代策略优化的直接前身。


前置知识:本章的策略梯度推导建立在第 3 章的变分推断框架之上(见 §3.3),特别是 KL 散度、对数导数技巧和期望的蒙特卡洛估计等工具。

9.1 Policy Gradient 定理推导

从目标函数出发,利用 Log-Derivative Trick 推导 Policy Gradient 定理的完整数学链路。

9.1.1 目标函数

RL 的优化目标(Utility)是最大化策略 πθ 下轨迹回报的期望:

J(θ)=Eτπθ[t=0Tγtrt]=τpθ(τ)R(τ)

其中轨迹概率 pθ(τ)=tπθ(at|st)P(st+1|st,at)。注意 π 本身具有随机性,R(τ)=trt 是随机变量,我们关心的是其期望

Reward vs. Return:Reward 是环境在单步给出的即时评分;Return(回报,又称累积奖励)是从某个时间步往后所有未来奖励的折扣总和。算法真正最大化的是 Return 的期望。

9.1.2 梯度推导——Log-Derivative Trick

直接对 J(θ) 求梯度:

θJ(θ)=θτpθ(τ)R(τ)=τR(τ)θpθ(τ)

问题在于 θpθ(τ) 不是概率分布,无法直接采样。利用恒等式 p=plogp

θJ(θ)=τpθ(τ)[R(τ)θlogpθ(τ)]=Eτπθ[R(τ)θlogpθ(τ)]

展开轨迹的对数概率,环境转移概率 P(st+1|st,at)θ 无关,消掉后得到:

θlogpθ(τ)=tθlogπθ(atst)

将整条轨迹的回报 R(τ) 替换为 Return-to-Go Gt=ktγktrk(因果性——时刻 t 的动作不影响 t 之前的奖励),得到 Policy Gradient 定理

θJ(θ)=Eπθ[tGtθlogπθ(atst)]

9.1.3 直觉:logπ 从哪来

log 的出现不是人为选择,而是 Log-Derivative Trick 的自然产物:

  1. 我们只能从 π 采样,无法从 π 采样(π 不是概率分布);
  2. 通过 π=πlogπ,把"对概率的梯度"变成"概率分布下可采样的期望";
  3. θlogπθ 可微且可计算,乘以回报权重 Gt 即为梯度的蒙特卡洛估计量。
π不可采样log trickπlogπ期望形式,可采样

更高回报的轨迹会以更高的概率被复制,更低回报的轨迹概率被压低——这就是策略梯度的核心语义。

9.1.4 Surrogate Loss 与自动微分

深度学习框架默认做的是梯度下降(最小化 loss),而我们需要梯度上升(最大化 J)。解法是构造一个 Surrogate Loss

LPG(θ)=E[tGtlogπθ(at|st)]

实现中把 {st,at,Gt} 当作常值(stop-gradient),AutoGrad 只对 logπθ 求导,于是:

θLPG(θ)=E[tGtθlogπθ(at|st)]=θJ(θ)

关键认知:PG Loss 是"为拿到正确梯度而设计的代理",不是"可直接代表性能的目标值"。我们只需要 LPGJ 相等,LPG 的数值本身没有可比性。


9.2 REINFORCE 算法与 Baseline 技巧

REINFORCE 的高方差问题及 Baseline 减方差技巧,奠定后续 Actor-Critic 方法的基础。

9.2.1 REINFORCE 算法

REINFORCE 是 Policy Gradient 的最直接实现:每条轨迹采样完毕后,从后向前计算折扣回报 Gt,然后一次性更新策略网络。

CartPole 完整实现

python
import torch
import torch.nn as nn
import torch.optim as optim
from torch.distributions import Categorical
import gymnasium as gym

GAMMA = 0.99

class Policy(nn.Module):
    def __init__(self, state_dim, action_dim):
        super().__init__()
        self.network = nn.Sequential(
            nn.Linear(state_dim, 128),
            nn.ReLU(),
            nn.Linear(128, action_dim),
            nn.Softmax(dim=-1)
        )
    def forward(self, state):
        return self.network(state)

class ReinforceAgent:
    def __init__(self, state_dim, action_dim):
        self.policy = Policy(state_dim, action_dim)
        self.optimizer = optim.Adam(self.policy.parameters(), lr=0.01)
        self.saved_log_probs = []
        self.rewards = []

    def select_action(self, state):
        state = torch.from_numpy(state).float().unsqueeze(0)
        probs = self.policy(state)
        m = Categorical(probs)
        action = m.sample()
        self.saved_log_probs.append(m.log_prob(action))  # 记录 log pi
        return action.item()

    def finish_episode(self):
        R = 0
        returns = []
        # 从后向前计算折扣回报
        for r in reversed(self.rewards):
            R = r + GAMMA * R
            returns.insert(0, R)

        returns = torch.tensor(returns)
        returns = (returns - returns.mean()) / (returns.std() + 1e-6)  # 标准化

        policy_loss = []
        for log_prob, G in zip(self.saved_log_probs, returns):
            policy_loss.append(-log_prob * G)  # Surrogate Loss

        self.optimizer.zero_grad()
        torch.cat(policy_loss).sum().backward()
        self.optimizer.step()

        del self.rewards[:]
        del self.saved_log_probs[:]

# --- 训练入口 ---
env = gym.make("CartPole-v1")
agent = ReinforceAgent(state_dim=env.observation_space.shape[0],
                       action_dim=env.action_space.n)

for episode in range(1000):
    state, _ = env.reset()
    for t in range(500):
        action = agent.select_action(state)
        state, reward, terminated, truncated, _ = env.step(action)
        agent.rewards.append(reward)
        if terminated or truncated:
            break
    agent.finish_episode()
    if episode % 50 == 0:
        print(f"Episode {episode}, duration: {t+1}")

代码解读:

  • select_action:从当前策略采样动作,同时记录 logπθ(at|st)
  • finish_episode:一条轨迹结束后,从后向前累积折扣回报 Gt,标准化后构造 loss = logπG,一次反向传播更新策略;
  • On-policy 特性:一条轨迹只训练一次,然后丢弃,数据不可复用。

9.2.2 Baseline 与 Advantage

理论依据:Score Function 的期望恒为零,即 E[θlogpθ(x)]=0

简单证明:

E[θlogpθ(x)]=pθ(x)θlogpθ(x)dx=θpθ(x)dx=θpθ(x)dx=θ1=0

因此减去任意不依赖动作的 Baseline b(st) 不改变梯度的期望:

E[(Gtb)θlogπ]=E[Gtθlogπ]

定义优势函数(Advantage)

AtGtb(st),或更一般地A(s,a)=Q(s,a)V(s)
  • At>0:这次动作比预期好,增大其概率;
  • At<0:这次动作比预期差,降低其概率。

直觉例子(一直输的游戏):AI 目前水平的平均得分(Baseline)约为 20 分。某局得了 18 分,优势 =(18)(20)=+2>0。尽管还是输了,但比平时表现好,这些动作值得被鼓励。

带 Baseline 的 PG Loss:

Lpg-adv(θ)=E[A^tlogπθ(at|st)]

9.2.3 折扣回报与信用分配

折扣回报

折扣因子 γ 本身就编码了一种信用分配机制:

Gt=rt+γrt+1+γ2rt+2+
  • 动作对越久之后的回报,所负责任越小(γk 衰减);
  • 离奖励信号越近的动作,责任越大。

例如 γ=0.9 时,三步之后的奖励只保留原始值的 0.930.73 倍。这让梯度信号自然地聚焦在"与当前奖励关系最密切的动作"上。

9.2.4 PG Loss vs. SL Loss

Karpathy 的经典对比揭示了 RL 与监督学习的本质差异:

SL Loss=ilogp(yixi)(真实标签已知)PG Loss=iAilogp(yixi)(标签从策略采样)

两步操作:

  1. 采样:没有"正确答案",用当前策略 yip(|xi) 生成数据;
  2. 加权优化:用 Advantage Ai 告诉模型哪些动作该加强(A>0)、哪些该抑制(A<0)。

SL 最大化所有正确标签的似然;PG 选择性地放大好动作、压缩坏动作的似然。


9.3 Q-Learning 与 DQN

Value-based 路线的代表:Q-Learning 的表格版与深度网络版(DQN)的关键设计。

9.3.1 从 Q-Table 到 Deep Q-Network

  • 有限离散状态空间:用 Q-Table 存储 Q(s,a),直接查表更新;
  • 连续/海量状态空间:Q-Table 不可行,用深度神经网络 Qθ(s,a) 参数化——Deep Q-Network (DQN)。

Q-Learning 的更新规则:

Q(s,a)Q(s,a)+α[r+γmaxaAQ(s,a)Q(s,a)]

9.3.2 DQN 的目标函数

将 Q-Learning 的更新规则转化为深度学习的回归损失:

L(θ)=E(s,a,r,s)D[(yQθ(s,a))2]y=r+γmaxaQθ(s,a)(TD Target)

其中 θTarget Network 的参数,定期从 θ 复制,不实时更新。

9.3.3 DQN 的关键技术

Experience Replay(经验回放):将转移 (s,a,r,s) 存入 Replay Buffer,训练时随机采样 mini-batch。

  • 打破数据间的时序相关性,使样本更接近 i.i.d. 假设;
  • 同一条经验可被多次使用,提高数据利用率——这是 Off-policy 的直接体现。

Target Network(目标网络):固定 TD Target 的"地基",防止 Q 值"自己追自己"导致训练发散。

DQN 中的策略:DQN 的最终目标是导出一个隐式的确定性贪心策略 π(s)=argmaxaQ(s,a)。训练过程中使用 ε-greedy 行为策略保证探索。

9.3.4 DQN vs. PPO:根本差异

维度DQN(Value-based)PPO(Policy-based)
学习对象Qθ(s,a)(联合函数)πθ(as)(条件函数)
策略类型隐式确定性(argmaxQ显式随机策略
On/Off-policyOff-policyOn-policy(带重要性采样修正)
适用动作空间离散有限连续或离散均可
数据复用经验回放,高复用率数据生命周期短

Off-policy 的直觉:DQN 学习的是 Q 值——动作的"客观价值"。无论当时是出于新手好奇还是专家判断做出的动作,结果(奖励)是客观存在的,因此用过去的经验来更新价值判断完全合理。PPO 学习的是"当前策略下应该怎么做",策略一变,旧数据的梯度方向就不再准确。


9.4 Actor-Critic 架构

策略网络与价值网络联合学习,兼取 Policy Gradient 的灵活性与 TD 的低方差优势。

9.4.1 双网络架构

Actor-Critic 结合了 Policy Gradient 和价值函数两条路线:

  • Actor(策略网络 πθ:负责决策,输出动作概率分布;
  • Critic(价值网络 Vϕ:负责评分,估计当前状态的价值。

9.4.2 TD 形式的优势函数

REINFORCE 使用蒙特卡洛回报 Gt(完整轨迹),方差大。Actor-Critic 用 TD Error 来估计优势:

A(s,a)=Q(s,a)V(s)r+γV(s)V(s)(TD Error)

分解来看:

A(s,a)r+γV(st+1)TD Target(Bootstrap)V(st)Baseline

9.4.3 Bias-Variance 权衡

Critic 的核心价值在于用偏差换方差:

来源效果解释
Bootstrap:V(st+1) 截断未来方差下降,引入偏差不再依赖未来数百步的随机结果,用 Critic 的预测值直接替代
Baseline:V(st)不影响期望,降低方差减去一个只与状态有关的基线,数学上梯度期望不变

方差来源:REINFORCE 的 Gt 需要把整条轨迹从当前步到终止全部跑完,其中每一步的随机性(环境转移 + 策略采样)都会累积;TD Error 只看一步,随机性大幅减小。代价是 V(s) 本身是近似值,引入了偏差。

9.4.4 Actor 与 Critic 的更新

Critic 更新(最小化 TD 误差):

Lcritic(ϕ)=(r+γVϕ(s)Vϕ(s))2

Actor 更新(用 Advantage 加权 log 概率):

Lactor(θ)=A(s,a)logπθ(a|s)

两个网络交替更新:Critic 先打分,Actor 再根据打分调整策略。


9.5 SAC(Soft Actor-Critic)基础

最大熵框架下的 Actor-Critic:SAC 如何通过熵正则化实现稳定的连续控制。

9.5.1 最大熵强化学习目标

SAC 在标准 RL 目标中加入熵奖励,鼓励策略在完成任务的同时保持随机性:

J(π)=Eτπ[t(rt+αH(π(|st)))]

其中 α 是温度系数,H(π(|s))=aπ(a|s)logπ(a|s) 是策略熵。

直觉:在回报相近的多条路径中,SAC 倾向于选择"保持更多选择余地"的策略,避免过早收敛到局部最优。

9.5.2 与 KL 正则化的等价关系

当参考策略 πref 为均匀分布时,KL 散度等价于负熵(加常数):

J(θ)=E[R]βDKL(πθπref)

这个形式正是 RLHF 中 KL 惩罚项的理论来源。SAC 的思想——"最大化回报同时不要偏离参考分布太远"——在 LLM 对齐中被直接继承。

9.5.3 SAC 的核心特点

  • Off-policy:使用经验回放,数据效率高;
  • 自动温度调节α 可以自动学习,无需手动调参;
  • 连续动作空间:天然适合连续控制任务。

9.6 从 PG 到 PPO-Clip 的演进

从 Importance Sampling 到 Trust Region 再到 PPO-Clip,策略优化的稳定性演进之路。

PPO 总览

9.6.1 REINFORCE 的局限

REINFORCE 每次更新必须使用当前策略采样的数据——一条数据只训练一次,用完即弃

采样πθk一条轨迹训练一次πθk+1丢弃数据,重新采样

当与环境交互的成本很高时(如机器人、LLM),这种数据效率是不可接受的。

改进目标:先用旧策略 πold 采样一批轨迹,在上面做多步更新

9.6.2 重要性采样与 CPI 代理目标

定义概率比(Likelihood Ratio):

rt(θ)πθ(at|st)πold(at|st)

CPI(Conservative Policy Iteration)代理目标:

LCPI(θ)=Eπold[rt(θ)A^t]=πoldπθ(at|st)πold(at|st)A^t

θ=θoldrt=1,对 θ 求梯度:

θLCPI|θ=θold=E[A^tθlogπθ(at|st)]

这正是 vanilla PG(Advantage 版本)的梯度。换言之,CPI 用 rt 代替了 PG 的 logπ,两者在旧策略附近的一阶梯度方向一致

PG 用 logπ;CPI 用 r=πθ/πold。前者是绝对量,后者是相对量(比值),但在 θold 处它们给出相同的更新方向。

9.6.3 TRPO:信任域约束

CPI 的问题在于:当 θ 远离 θold 时,重要性采样的比值 rt 可以任意大,代理目标不再是真实目标的良好近似。

TRPO 在 CPI 目标上加 KL 信任域约束:

maxπEπold[π(a|s)πold(a|s)A^πold(s,a)]s.t.Esπold[DKL(πold(s)π(s))]ϵ

约束方向:KL 散度 DKL(πoldπ) 度量的是"在旧策略的支撑上、新策略偏离了多少"。选择 πold 作为 KL 的第一个参数(而非 π),是因为我们希望在旧策略已覆盖的区域内约束新策略的行为——这正是 TRPO 原始论文(Schulman et al., 2015)中使用的方向。

直觉:以 πold 为圆心画一个 KL 球(信任域,Trust Region),在球内找使代理目标最大的新策略。

问题:TRPO 需要计算二阶 Fisher 信息矩阵的逆,计算代价高,难以与现代深度学习框架(自动微分 + 一阶优化器)高效集成。

9.6.4 PPO-Clip:简洁的工程实现

PPO 用简单的裁剪操作近似替代 TRPO 的信任域约束:

LCLIP(θ)=E[min(rt(θ)A^t,clip(rt(θ),1ϵ,1+ϵ)A^t)]

裁剪逻辑(以 ϵ=0.2 为例):

情形条件处理原因
A^t>0(好动作)rt>1.2截至 1.2涨太猛,防止过度乐观
A^t>0(好动作)rt<0.8不截,梯度拉回好动作概率太低,继续拉升
A^t<0(坏动作)rt>1.2不截,梯度压低坏动作概率太高,继续惩罚
A^t<0(坏动作)rt<0.8截至 0.8降太猛,防止过激

核心原则:只在"有利方向"超出阈值时截平(防止过激乐观),在不利方向保持完整梯度(让惩罚保真)。

9.6.5 探索与利用:PPO 的上界约束

PPO 的 clip 机制对高概率 token(exploitation)和低概率 token(exploration)的影响并不对称。以 ϵ=0.2A^i,t>0 为例:

  • πold(oi|q)=0.9 时,上限 0.9×1.2=1.08,高概率 token 可以轻松获得显著的概率增量;
  • πold(oi|q)=0.01 时,上限 0.01×1.2=0.012,低概率 token 被严格限制,难以获得实质性增长。

这意味着 PPO 的上界约束天然倾向于利用已有的高概率动作,而抑制了对低概率动作的探索。这一观察在 DAPO 等后续工作中被明确指出并修正。


9.7 PPO from Scratch 实现

从零实现 PPO:包含 Actor-Critic 网络、GAE 优势估计与 Clip 目标函数的完整代码。

9.7.1 PPO 完整目标函数(RL4LLM 版本)

Lk(θ)=E[min(rθA^,clip(rθ,1ϵ,1+ϵ)A^)]策略(PG)项+βE[DKL(πθπref)]KL 正则项

其中 rθ=exp(logπθlogπθk)

  • PG 项:正优势回答的 logπθ 被拉大(概率上升),负优势回答的概率下降;
  • KL 项:防止策略偏离参考模型太远。

9.7.2 PG Loss 的数值含义

单样本的 PG Loss 项为:

t(θ)=(Gtbt)logπθ(at|st)
  • logπ(at|st):当前策略对已选动作的对数概率——增大它等于沿梯度让该动作更可能;
  • (Gtbt):这次选择的信用分——高于基线就奖励,低于基线就惩罚;
  • 乘积效果:好动作的 logπ 变大,坏动作的 logπ 变小。

9.7.3 优势标准化对 Loss 的影响

优势标准化(Whiten)后 A~t=AtE[A]Std(A),有 E[A~]=0。对 PG Loss 做分解:

E[A~logπ]=Cov(A~,logπ)相关性项+E[A~]E[logπ]=0=Cov(A~,logπ)
  • Cov > 0(好动作概率高):Loss < 0,优化方向正确,继续推进;
  • Cov < 0(策略更偏好坏动作):Loss > 0,梯度强力纠正;
  • Cov 0:策略无明显偏好,或已接近收敛。

9.7.4 Loss 围绕 0 震荡的案例分析

python
import numpy as np

def ppo_terms(A, r, eps=0.2):
    A = np.asarray(A, dtype=float)
    r = np.asarray(r, dtype=float)
    r_clip = np.clip(r, 1 - eps, 1 + eps)
    term_pg = r * A
    term_clip = np.minimum(term_pg, r_clip * A)
    return term_clip

# Case A:好样本概率上升、坏样本概率下降(正常训练状态)
A_A = [2.0, 1.0, -1.5, -1.5]    # 均值 = 0
R_A = [1.18, 1.10, 0.90, 0.92]  # 全在 clip 范围内
L_A = -np.mean(ppo_terms(A_A, R_A))  # ≈ -0.18(Loss < 0)

# Case B:好样本概率下降、有坏样本概率大幅上升被 clip
A_B = [2.0, 1.0, -1.5, -1.5]
R_B = [0.85, 0.88, 0.82, 1.50]  # 最后一个触发上界 clip
L_B = -np.mean(ppo_terms(A_B, R_B))  # ≈ +0.22(Loss > 0)
  • Case A:正优势样本的 r>1,负优势样本的 r<1,正贡献略占优,Lclip0.18
  • Case B:好样本概率下降(r<1,削弱正贡献),有坏样本 r 大涨且被不利地记账,负贡献占优,Lclip+0.22
  • 纯 On-policy 时πθ=πold,所有 rt=1,加上优势被标准化(均值为 0),Loss = 0。但 Loss = 0 不代表梯度 = 0——在 θ=θold 处,梯度 θJ=E[A^tθlogπθ] 仍然存在。

9.7.5 为什么 RL Loss 曲线不能像 SL 那样解读

监督学习的 loss 函数固定(数据集不变,只有参数在动),所以"同一函数值"的下降有意义。RL 中,每一步的 loss 函数本身不同——数据是从不断变化的策略中采样的。第 k 步优化的是 Lk(θ)(期望对 Dk 求),第 k+1 步优化的是 Lk+1(θ)(期望对 Dk+1 求),它们根本不是同一个函数。

横向比较不同步的 Loss 值,就像把苹果、橘子、土豆、番茄的"甜度"放在一条线上——数值没有可比性

监控建议:训练 RL 时应关注 Reward/Return 曲线,而非 PG Loss 曲线。Loss 的增长往往反映的是 KL 散度在增大(模型在学习),而非训练出了问题。


9.8 稀疏奖励与奖励分配问题

奖励稀疏时的信号分配问题:GAE 与 Reward Shaping 的解决思路。

9.8.1 信用分配难题

在大多数现实任务中,奖励是稀疏的:智能体在一段很长的序列末尾才得到奖励(如游戏结束时才知道胜负、LLM 生成完整回答后才得到评分),中间步骤的"功劳"难以分配。

本质困难:奖励信号只在序列末尾出现一次,但整个序列有数十甚至数百步——哪些步骤"应该负责"这个奖励?

9.8.2 折扣回报的信用分配视角

折扣因子 γ 提供了一种隐式的信用分配:

Gt=rt+γrt+1+γ2rt+2+
  • 越靠近奖励信号的动作,分配到的权重越大;
  • 越远离奖励信号的动作,权重按 γk 指数衰减。

但在奖励极度稀疏的场景中(例如只在最后一步给 ±1),γ 的衰减可能不足以有效区分关键步骤和无关步骤。

9.8.3 常见解法

1. Reward Shaping(奖励塑形)

在环境奖励之上叠加辅助信号,引导智能体更快找到目标。例如:

  • Cursor Tab RL 中:接受建议 +0.75,拒绝 0.25,不显示 0
  • 机器人导航中:每靠近目标一步给正奖励。

2. Potential-based Shaping(基于势能的塑形)

为保证最优策略不变,辅助奖励必须满足势能函数形式:

F(s,a,s)=γΦ(s)Φ(s)

其中 Φ(s) 是状态的势能函数。这保证了所有轨迹的辅助奖励之和只取决于起止状态,不改变策略的相对排序。

3. Intrinsic Motivation(内在动机)

引入探索奖励(好奇心驱动、新颖性检测)鼓励智能体访问未见过的状态,缓解稀疏奖励下的"漫无目的"问题。

4. Hierarchical RL(分层强化学习)

将大问题分解为子目标,子目标有更密集的奖励信号。高层策略选择子目标,低层策略执行具体动作。


9.9 Group Policy Optimization(GRPO 前身)

去除 Critic 的组内相对优势估计,从 PPO 走向 GRPO 的理论铺垫。

9.9.1 设计动机

标准 PPO 依赖 Critic 网络来估计优势函数。但在 LLM 场景中:

  • Critic 网络的参数量与 LLM 本身相当,训练代价翻倍;
  • 对于有明确打分机制的任务(数学题、代码题),可以直接用实际奖励做对比,无需 Critic 近似。

GRPO(Group Relative Policy Optimization)的核心想法:用组内采样的实际奖励做相对比较,替代 Critic 网络

9.9.2 组内相对优势

对同一个 Prompt q,采样 G 个输出 {o1,,oG},获得奖励 {r1,,rG},优势定义为组内标准化:

A^i=riμgroupσgroup+ϵ

高于组内均值的输出获得正优势,低于均值的获得负优势。

9.9.3 目标函数

JGRPO(θ)=1Gi=1G1|oi|t=1|oi|min(πθ(oi,t|q,oi,<t)πθold(oi,t|q,oi,<t)A^i,t,clip(πθπθold,1ε,1+ε)A^i,t)βDKL(πθπref)

结构上与 PPO-Clip 一致(min-clip 项 + KL 正则),区别在于优势 A^ 的来源:PPO 用 Critic 的 TD 自举,GRPO 用组内奖励的标准化。

9.9.4 GRPO Loss 为 0 的推导

在纯 on-policy(πθ=πθold)且优势标准化后,可以展示 PG 项恰好为 0:

PG 项=1Gi=1G1|oi|t=1|oi|A^i,t=1Gi=1GA^i(因为同一输出内优势相同)=1Gi=1Griμσ=iriGμGσ=0

因此 JGRPO|θ=θold=βDKL(πθπref)。但梯度仍然非零,学习信号依然存在。

9.9.5 Dr. GRPO:处理退化组

标准 GRPO 的组内标准化在两种极端情况下会出问题:

难题(几乎全错):

python
R_hard = torch.tensor([0.0, 0.2, 0.2, 0.0, 0.0, 0.1, 0.0, 0.0])
# mean=0.0625, std=0.0857

方差极小,标准化后那些"勉强答对"(r=0.2)的回答获得了被人为放大的优势 A^1.56,可能误导模型去"学习"不稳定的输出。

简单题(几乎全对):

python
R_easy = torch.tensor([0.2, 0.9, 1.0, 0.4, 1.0, 0.1, 0.9, 0.0])
# mean=0.5625, std=0.4029

方差适中,标准化后的优势分布合理,梯度信号有效。

Dr. GRPO 的修正策略:检测"组内方差过低"或"全部正确/错误"的退化情况,跳过该组的更新,避免被噪声梯度误导。

9.9.6 GRPO vs. PPO 对比

维度PPOGRPO
优势估计Critic 网络(TD 自举)组内奖励标准化
额外参数需要 Critic(参数量 策略网络)无需 Critic
适用场景通用 RL 任务有明确打分的生成任务(RLVR)
每个 Prompt 采样1 个输出G 个输出(G 通常 416
信号质量低偏差(Critic 拟合好时)依赖组内多样性

本章小结

主题核心内容
Policy Gradient 定理Log-derivative trick;logπ 的来源;无偏梯度估计
REINFORCE完整轨迹 MC 估计;On-policy;高方差;Surrogate Loss
Baseline / AdvantageA=QV;Score 期望为 0;降低方差不引入偏差
Q-Learning / DQNOff-policy;Experience Replay;Target Network
Actor-CriticTD 优势估计;Bias-Variance 权衡;Critic 截断未来
SAC最大熵 RL;熵奖励 KL 正则化;RLHF KL 项的起源
IS TRPO PPOrt=πθ/πold;KL 信任域;Clip 近似
PPO Loss 分析非单调;Loss=0 时梯度非零;应看 Reward 曲线
稀疏奖励信用分配;Reward Shaping;势能形式
GRPO组内相对优势;无需 Critic;Dr. GRPO 退化组修正

延伸阅读