跳转至

十四:强化学习:传统 PPO、RLHF 定义与 NLP 场景强化学习

来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247484009&idx=1&sn=290d75f032d0459e478d9c90238d8262&chksm=f01eb110c7693806fe827300e90c92b5512e0f1f894322b454d491306be11bf8cb16d82b1218#rd

1. 学习定位

第十三天学习了策略梯度、REINFORCE、Actor-Critic 和 TRPO。第十四天进入 PPO(Proximal Policy Optimization)。PPO 是现代强化学习中最常用的策略优化算法之一,也是很多 RLHF 系统的基础。 传统 PPO 的核心目标:

在提高策略期望回报的同时,限制新策略不要偏离旧策略太远。
它用一个简单的 clipped surrogate objective 近似 TRPO 的信赖域思想,使训练更稳定、实现更简单。 本日知识链路:

policy gradient
-> importance sampling ratio
-> TRPO trust region
-> PPO clipped objective
-> actor loss + critic loss + entropy
-> rollout collection + GAE
-> multi-epoch minibatch update
-> KL monitoring and early stopping
-> RLHF definition and NLP RL mapping

2. PPO 的背景

普通策略梯度容易因为单次更新过大导致策略崩坏。TRPO 通过 KL 约束限制新旧策略距离,但实现复杂。PPO 试图保留 TRPO 的稳定更新思想,同时用更简单的一阶优化实现。 PPO 的名字中 Proximal 的含义是“近端”:新策略应该在旧策略附近更新。 关键对象:

old policy: pi_theta_old
new policy: pi_theta
advantage: A_t
probability ratio: r_t(theta)
PPO 不希望 r_t(theta) 偏离 1 太远。

3. Importance Sampling Ratio

PPO 使用旧策略采样的数据,但在优化时更新新策略。为了衡量新旧策略对同一个动作的概率变化,引入 ratio:

r_t(theta)
= pi_theta(a_t|s_t) / pi_theta_old(a_t|s_t)

img

在实际代码怎么写?因为用概率会下溢(很多状态下,模型对某个动作的概率会非常非常小),用 log probability 实现更稳定:

r_t(theta) = exp(logp_new - logp_old)

img

如果: - r_t > 1:新策略比旧策略更倾向这个动作。

  • r_t < 1:新策略比旧策略更不倾向这个动作。

未裁剪 surrogate objective:

L^{PG}(theta) = E[ r_t(theta) * A_t ]

img

A_t是该动作的优势,代表该动作的好坏,是否要加强或是减弱。而ratio的意义是对新旧数据的来源进行修正。PPO有一个核心的矛盾: - 用来训练的数据,是旧策略收集的

  • 要更新的,是新策略

数据不是新策略产生的 → 直接用会不准。而ratio 就是用来修正这个偏差的,控制训练时的更新幅度。 分类来看就是: - A_t>0(动作收益高)ratio>1:新策略已经比旧策略更喜欢该动作,梯度会继续拉高这个动作概率,更新幅度变大。动作本身很好,现在新策略已经偏向它,继续加大偏好。

  • A_t>0(动作收益高)ratio<1:新策略相比旧策略反而不爱这个优质动作,参数更新幅度被削弱。哪怕A_t很高,但新策略本来就不倾它,本轮提升力度变小。

  • A_t<0(动作很差)ratio>1:新策略反而偏爱烂动作 → r_t*A_t是负数,最大化 loss 会强力压低动作概率;

  • A_t<0(动作很差)ratio<1:新策略本来就不爱烂动作 → 负项绝对值变小,惩罚幅度变小。

这个特性存在一些致命缺陷 → PPO引入Clip的根源:无约束的情况下,梯度会很容易失控。某个优质动作,在优化几步之后,ratio直接冲到5、10甚至更大,r_t*A_t爆炸,一步的参数改动十分巨大,策略剧烈震荡,训练直接崩掉。 于是PPO进行了约束。

4. PPO-Clip 目标函数

PPO-Clip 的核心目标:

L^{CLIP}(theta)
= E_t [ min(
&nbsp; &nbsp; r_t(theta) A_t,
&nbsp; &nbsp; clip(r_t(theta), 1-epsilon, 1+epsilon) A_t
&nbsp; ) ]

img

5. PPO-Clip 的符号理解

此处,clip和min的叠加可能带来一定的理解困难。 clip 的效果应该从优化对象筛选的角度来思考,以下进行分类讨论:

img

img

理解CLIP的核心是,CLIP后的那一项就直接变成一个常数了。意思是说,当发生CLIP的时候,就没有参数更新了。 - (1)A > 0, 要提升动作概率

  • 1、ratio >= 1 + eps,说明当前动作概率很大,不需要再过度提升了(可能会崩),所以选择 clip 后的标量值(对应取 min 操作)参与计算目标函数值,此时 actor model 不会被更新(因为此时的待优化变量「动作概率」被 clip 成一个常数,也就是说把这个变量从目标函数中移除了)。

  • 2、retio < 1 + eps,当前动作概率没那么大,可以正常对动作概率计算梯度,以进行更新(变大)。

(2)A < 0, 要降低动作概率 1、ratio <= 1 - eps ,说明当前动作概率很小,不需要再降低了(可能会崩),所以选择 clip 后的标量值(对应取 min 操作)参与计算目标函数值,此时 actor model 不会被更新(原因同上)。 2、ratio > 1 - eps ,当前动作概率没那么小,可以正常对动作概率计算梯度,以进行更新(变小)。

因此,CLIP的参与下,实际上只有两种参数更新: 当 A_t > 0

min(r_t A_t, clipped_r_t A_t)
如果 r_t > 1+epsilon,裁剪项更小,目标不再鼓励继续增大概率。 当 A_t < 0: 由于乘以负数后大小关系反转,如果 r_t < 1-epsilon,裁剪项更小,目标不再鼓励继续降低概率。 因此 PPO 同时限制“好动作概率增加过多”和“坏动作概率降低过多”。

6. PPO-Penalty 与 PPO-Clip

PPO 有两类常见形式: PPO-Penalty:

maximize E[r_t A_t - beta KL(pi_old, pi_new)]

img

PPO-Penalty 的思想其实非常正统(继承自 TRPO),它把 KL 散度直接作为惩罚项写进目标函数,但它在实践中有一个致命弱点:动态调整 β极其折磨人。 算法需要在训练过程中不断检查 KL 散度:如果 KL 太大了,说明新策略跑得太远,就要增大 β加重惩罚;如果 KL 太小,就减小β。这种引入额外且敏感的超参数(Hyperparameter)的做法,在强化学习这种本来就极度不稳定的领域里,简直是增加调参工程师的血压。 PPO-Clip:

maximize E[min(r_t A_t, clip(r_t,1-eps,1+eps)A_t)]

img

PPO-Clip 更常用,因为实现简单、效果稳定(1、计算廉价,无需计算KL散度 2、免调参,eps一般直接固定在0.2或者0.1)。实际工程中也经常同时监控 KL,如果 KL 过大就 early stop 或调整学习率。

7. Actor-Critic 结构

PPO 通常是 Actor-Critic 算法。 Actor:

pi_theta(a|s)
Critic:

V_phi(s)

img

总损失常写为:

loss = policy_loss + c1 * value_loss - c2 * entropy

img

其中:

policy_loss = -L_CLIP &nbsp;(使用CLIP保证训练稳定)
value_loss = (V_phi(s_t) - return_t)^2 &nbsp;(MSE损失)
entropy = H(pi_theta(.|s_t)) &nbsp; (熵损失鼓励多探索)

8. Rollout 与 On-policy 数据

PPO 是 on-policy 或近似 on-policy 算法。通常流程:

1. 用当前策略 pi_old 与环境交互,收集 rollout。
2. 计算 returns 和 advantages。
3. 固定 logp_old。
4. 用这些数据做若干 epoch 的 minibatch 更新。
5. 丢弃旧数据,用新策略重新采样。
虽然 PPO 会对同一批 rollout 做多轮更新,但更新幅度通过 clipping 和 KL 监控限制,因此仍被视为 on-policy 系列。

9. GAE 与 Return

PPO 常用 GAE 估计 advantage:

delta_t = r_t + gamma V(s_{t+1}) - V(s_t)

A_t^GAE
= delta_t + gamma lambda delta_{t+1}
&nbsp; + (gamma lambda)^2 delta_{t+2} + ...
单步TD损失delta_t:

img

GAE优势函数:

img

Return target(用于训练价值网络) 可以写为:

R_t = A_t + V(s_t)

img

GAE 中: - gamma 控制未来奖励折扣。

  • lambda 控制 bias-variance 权衡。

10. PPO 训练流程

典型 PPO-Clip 训练流程:

initialize actor pi_theta and critic V_phi

repeat:
&nbsp; collect rollout using current policy
&nbsp; store states, actions, rewards, dones, logp_old, values
&nbsp; compute advantages using GAE
&nbsp; compute returns = advantages + values
&nbsp; normalize advantages

&nbsp; for epoch in range(K):
&nbsp; &nbsp; for minibatch in rollout:
&nbsp; &nbsp; &nbsp; logp_new = log pi_theta(actions|states)
&nbsp; &nbsp; &nbsp; ratio = exp(logp_new - logp_old)
&nbsp; &nbsp; &nbsp; clipped_ratio = clip(ratio, 1-eps, 1+eps)
&nbsp; &nbsp; &nbsp; policy_loss = -mean(min(ratio*A, clipped_ratio*A))
&nbsp; &nbsp; &nbsp; value_loss = mse(V_phi(states), returns)
&nbsp; &nbsp; &nbsp; entropy_loss = -mean(entropy)
&nbsp; &nbsp; &nbsp; optimize total loss

&nbsp; optionally early stop if KL too large

11. PPO 的关键超参数

常见超参数: - clip_epsilon:ratio 裁剪范围,常见 0.1 到 0.3。

  • learning_rate:策略和价值网络学习率。

  • num_epochs:每批 rollout 重复训练轮数。

  • minibatch_size:每次优化样本数。

  • gamma:奖励折扣。

  • lambda:GAE 参数。

  • entropy_coef:探索强度。

  • value_loss_coef:critic loss 权重。

  • max_grad_norm:梯度裁剪。

  • target_kl:KL 过大时 early stopping。

PPO 对这些超参数较敏感,尤其是学习率、clip range、epoch 数和 advantage 尺度。

12. PPO 的稳定性机制

PPO 稳定性的主要来源: - Ratio clipping 限制策略概率变化。

  • Advantage normalization 控制更新尺度。

  • Value function baseline 降低方差。

  • Entropy bonus 防止探索过早消失。

  • KL monitoring 监控新旧策略距离。

  • Gradient clipping 防止参数更新过大。

这些机制共同避免策略在少量高 advantage 样本上过度更新。

13. PPO 的常见指标

训练时常监控: - Episode reward / return。

  • Policy loss。

  • Value loss。

  • Entropy。

  • Approx KL。

  • Clip fraction。

  • Explained variance。

  • Gradient norm。

其中:

clip fraction = ratio 被裁剪的样本比例
如果 clip fraction 长期很高,说明更新过猛;如果 entropy 迅速下降,说明策略过早确定。

14. PPO 与 TRPO 对比

TRPO:

明确约束 KL
需要复杂二阶优化
理论保证更强
实现难度高
PPO:

用 clipping 或 KL penalty 近似限制更新
使用普通一阶优化器
实现简单
工程表现稳定
PPO 是工程上更常用的折中方案。

15. RLHF 的基本定义

RLHF(Reinforcement Learning from Human Feedback)指使用人类反馈信号训练或优化模型行为。典型大模型 RLHF 流程:

1. SFT: 用人工示范数据监督微调。
2. Reward Model: 用人类偏好比较数据训练奖励模型。
3. RL Optimization: 用 PPO 等算法优化语言模型,使奖励更高,同时限制偏离参考模型。
第十四天只建立 RLHF 定义和 PPO 基础;第十五天会重点展开 RLHF-PPO 和 GRPO。

16. NLP 场景下的强化学习

在 NLP 中可以把生成任务建模为 MDP:

state: prompt + 已生成 token
action: 下一个 token
transition: 把 token 追加到上下文
reward: 序列结束后的偏好、任务成功、规则评分或安全评分
难点: - 动作空间是巨大词表。

  • episode 是变长序列。

  • 奖励通常在序列结束后才出现。

  • 语言质量不能只由标量奖励完全描述。

  • 过度优化奖励模型会导致 reward hacking。

17. PPO 在 NLP 中的特殊问题

传统 PPO 面向环境交互;NLP/RLHF 中的 PPO 有一些特殊性: - 动作是 token,log probability 来自语言模型。

  • 状态是长上下文,计算成本高。

  • reward 通常是 sequence-level reward。

  • 需要 reference model 和 KL penalty 防止模型偏离 SFT 行为。

  • value head 通常接在语言模型上估计每个 token 位置的 value。

  • 需要处理 padding、attention mask、response mask。

这些内容会在第十五天进一步展开。

18. 常见误区

误区一:PPO 的 clip 是硬约束。 clip 是目标函数裁剪,不是严格禁止策略变化,因此仍需 KL 监控。 误区二:PPO 可以无限复用旧数据。 PPO 是近似 on-policy,旧 rollout 重复训练轮数有限,策略变远后旧数据不再可靠。 误区三:ratio 可以直接用概率相除实现。 工程上通常用 exp(logp_new - logp_old),数值更稳定。 误区四:value loss 越小策略越好。 critic 只是辅助策略更新,最终仍要看 return、KL、entropy 和任务指标。 误区五:RLHF 等于 PPO。 PPO 是 RLHF 的一种优化算法,RLHF 是用人类反馈训练模型的整体范式。

19. 核心总结

第十四天需要掌握的最小闭环:

PPO:
&nbsp; stable policy gradient algorithm

Ratio:
&nbsp; r_t = pi_new(a|s) / pi_old(a|s)

Clip objective:
&nbsp; min(r_t A_t, clip(r_t,1-eps,1+eps) A_t)

Loss:
&nbsp; policy loss + value loss - entropy bonus

Data:
&nbsp; collect rollout with old policy
&nbsp; compute GAE advantages
&nbsp; update for several epochs
&nbsp; then recollect data

Stability:
&nbsp; clipping, KL monitoring, advantage normalization,
&nbsp; entropy, gradient clipping

RLHF:
&nbsp; SFT -&gt; reward model -&gt; RL optimization with human feedback

20. 参考资料

  • Bilibili:动画讲解如何用 PPO 训练大模型:https://www.bilibili.com/video/BV1hqykY9E7E/

  • CSDN:PPO 详解,有代码逐行分析:https://blog.csdn.net/qq_51399582/article/details/144650295

  • PPO 原论文:https://arxiv.org/abs/1707.06347

  • Deep Reinforcement Learning from Human Preferences:https://arxiv.org/abs/1706.03741

  • Training language models to follow instructions with human feedback:https://arxiv.org/abs/2203.02155

  • OpenAI Spinning Up: PPO:https://spinningup.openai.com/en/latest/algorithms/ppo.html

  • Hugging Face TRL 文档:https://huggingface.co/docs/trl/

            预览时标签不可点
    

    <div class="