λLLM Wiki

Proximal Policy Optimization

近端策略优化(Proximal Policy Optimization, PPO) 是当前最主流的在线 策略梯度(Policy Gradient) 算法。它用一阶优化近似 TRPO(Trust Region Policy Optimization) 的 KL 约束更新:通过裁剪(clip)概率比,把单步策略更新限制在当前策略的邻域内,从而在”样本高效复用”和”训练稳定性”之间取得良好平衡。PPO 也是 InstructGPT、Llama 2、Claude 等 RLHF 对齐训练的事实标准算法。

核心思想

朴素 REINFORCE 每次 rollout 只用一次,样本效率低。直接复用旧轨迹去更新新策略又会引入 同策略偏差(on-policy bias),见 on-policy-vs-off-policy-rl。TRPO 用一个严格的 KL 约束 DKL(πθoldπθ)δD_\text{KL}(\pi_{\theta_\text{old}} \| \pi_\theta) \le \delta 限制每步策略更新幅度,保证单调改进,但求解二阶优化代价很高。

PPO 把这个约束做了两个工程化简:

  • PPO-Clip:不写 KL 约束,而是直接裁剪 概率比(probability ratio) rt(θ)=πθ(atst)/πθold(atst)r_t(\theta) = \pi_\theta(a_t|s_t) / \pi_{\theta_\text{old}}(a_t|s_t),用一阶梯度就能优化。
  • PPO-Penalty:把 KL 写成自适应系数的惩罚项加进 loss,系数按实际 KL 偏离量动态调整。

实践中 PPO-Clip 更常用,本页默认讨论 PPO-Clip。完整的推导链条(从 policy gradient 到 PPO)见 策略梯度到 PPO 的推导

PPO-Clip 目标函数

给定优势 A^t\hat{A}_t(见 value-model 与 GAE 部分),PPO-Clip 最大化:

LCLIP(θ)=E^t[min(rt(θ)A^t,  clip(rt(θ),1ϵ,1+ϵ)A^t)]L^{CLIP}(\theta) = \hat{\mathbb{E}}_t\Big[\min\big(r_t(\theta)\hat{A}_t,\; \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t\big)\Big]

其中 rt(θ)=πθ(atst)/πθold(atst)r_t(\theta) = \pi_\theta(a_t|s_t) / \pi_{\theta_\text{old}}(a_t|s_t) 是新旧策略在动作 ata_t 上的概率比,ϵ\epsilon 是裁剪范围(典型值 0.2)。

Clip 的悲观下界直觉

clip(rt(θ),1ϵ,1+ϵ)A^t\text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t 把目标函数压平成一个分段线性的”天花板-地板”结构:

  • A^t>0\hat{A}_t > 0(动作比平均好),希望提高 rtr_t。一旦 rt>1+ϵr_t > 1+\epsilon,clip 让该项不再贡献梯度——防止模型在好动作上一次性过度放大。
  • A^t<0\hat{A}_t < 0(动作比平均差),希望降低 rtr_t。一旦 rt<1ϵr_t < 1-\epsilon,clip 同样截断。

最关键的是外层的 min\min:它让 loss 始终取 “unclipped” 与 “clipped” 两者中更保守的那个,形成一个悲观下界。这意味着:

  • 策略朝坏方向(远离 πold\pi_\text{old} 但让 advantage 变差)走时,loss 不会假装一切都好——完整的 penalty 会被保留;
  • 策略朝好方向(远离 πold\pi_\text{old} 且让 advantage 更好)走时,超出 clip 范围后没有额外奖励,从而抑制过冲。

详细的分段讨论与推导见 policy-gradient-to-ppo-derivation

Actor-Critic 完整损失

PPO 通常以 actor-critic 形式训练,与策略头共享网络主干:

LCLIP+VF+S(θ)=E^t[LtCLIP(θ)c1LtVF(θ)+c2S[πθ](st)]L^{CLIP+VF+S}(\theta) = \hat{\mathbb{E}}_t\big[L_t^{CLIP}(\theta) - c_1 L_t^{VF}(\theta) + c_2 S[\pi_\theta](s_t)\big]

  • LtCLIPL_t^{CLIP}:上面的 clipped 策略损失。
  • LtVF=(Vθ(st)Vttarg)2L_t^{VF} = (V_\theta(s_t) - V_t^\text{targ})^2:价值头的平方损失,使 VθV_\theta 逼近回报目标 VttargV_t^\text{targ}。详见 value-model
  • S[πθ](st)S[\pi_\theta](s_t):策略熵 aπθ(ast)logπθ(ast)-\sum_a \pi_\theta(a|s_t)\log \pi_\theta(a|s_t),作为 熵奖励(entropy bonus) 鼓励探索。

论文典型取值 c1=1c_1 = 1c2=0.01c_2 = 0.01

Advantage 与 GAE

PPO 几乎总是搭配 GAE(Generalized Advantage Estimation) 计算 A^t\hat{A}_t

A^t=l=0Tt1(γλ)lδt+l,δt=rt+γV(st+1)V(st)\hat{A}_t = \sum_{l=0}^{T-t-1}(\gamma\lambda)^l \delta_{t+l},\quad \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)

参数 λ[0,1]\lambda \in [0,1] 权衡 bias 和 variance:λ=0\lambda = 0 是一步 TD(低方差高 bias),λ=1\lambda = 1 是 Monte Carlo residual(无 bias 高方差)。典型 λ=0.95\lambda = 0.95。GAE 的递推 A^t=δt+γλA^t+1\hat{A}_t = \delta_t + \gamma\lambda \hat{A}_{t+1} 允许在反向扫描时 O(T)O(T) 计算整条轨迹。完整推导见 policy-gradient-to-ppo-derivation

RLHF 场景下的 PPO

把 PPO 用到语言模型对齐时,要做几个典型适配:

  • γ=1\gamma = 1:优化目标是整条 response 的质量,不对中间 token 做时间折扣。
  • 稀疏 reward:只在序列末尾由 奖励模型(Reward Model)(见 reward-model) 给一个标量 reward;中间 token 的 reward 全为 0。
  • KL shaping:与原始 SFT 模型的 KL 距离通常减在 reward 里而不是加在 loss 里(即 rt=rtβKLtr_t' = r_t - \beta\, \text{KL}_t),这样 advantage 计算不变,便于复用标准 PPO 代码。见 kl-divergence
  • 每 token 一个 action:状态 sts_t 是 prompt + 已生成的前缀,动作 ata_t 是下一个 token。价值函数学习”给定到目前为止生成的前缀,最终 reward 的期望”——但这是一个极难的估计问题,因为大多数前缀还没有 reward 信号。这正是后来 GRPO 扔掉 critic 的动机之一。

完整的训练循环——包括 4 个模型的角色、shaped reward 的混合结构、一次 rollout + update 的端到端流程、GAE 信号沿序列指数衰减的数值感受——见 PPO+RLHF 训练循环 walkthrough

与其它方法的关系

方法特点与 PPO 的关系
REINFORCE朴素 policy gradientPPO 的原始形式,无 clip 无 baseline
A2C / A3Cadvantage actor-criticPPO 的前辈,无 clip,同批数据只更新一次
TRPO二阶 KL 约束PPO 的理论来源,PPO 用 clip 做一阶近似
GRPO去掉 critic,组内标准化 baselinegrpo,在 LLM 场景下简化 PPO
DPO直接偏好优化跳过 RL 过程的 offline 方法

实践超参数

超参数典型值说明
ϵ\epsilon0.1 – 0.3clip 范围;RLHF 场景常取 0.2
γ\gamma0.99(控制)/ 1.0(RLHF)reward 折扣
λ\lambda (GAE)0.95 – 0.97advantage 平滑
KL 系数 β\beta0.01 – 0.1(自适应)reward shaping 强度
Rollout 长度数百至数千 token越长越稳定但越贵
Epochs per rollout2 – 10同一批数据重复更新次数;过多会 off-policy
Minibatch size32 – 256梯度更新 batch

常见实现细节

  • Value function clipping:对 value 也做一次 clip,LVF=max((VθVtarg)2,(clip(Vθ,Voldϵv,Vold+ϵv)Vtarg)2)L^{VF} = \max\big((V_\theta - V^\text{targ})^2, (\text{clip}(V_\theta, V_\text{old} - \epsilon_v, V_\text{old} + \epsilon_v) - V^\text{targ})^2\big)
  • Advantage normalization:在 minibatch 级别对 A^t\hat{A}_t 做均值 0、方差 1 的标准化,显著降低梯度方差。
  • 全局梯度裁剪20.5\|\nabla\|_2 \le 0.5 防止单步梯度爆炸。
  • Adam ϵ\epsilon 调小:取 10510^{-5} 而不是默认的 10810^{-8},对复现性影响明显。
  • Orthogonal initialization:policy 输出层 scale 0.01,value 输出层 scale 1.0。

参考资料

Comments