十四:强化学习:传统 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 的含义是“近端”:新策略应该在旧策略附近更新。 关键对象:
PPO 不希望r_t(theta) 偏离 1 太远。
3. Importance Sampling Ratio¶
PPO 使用旧策略采样的数据,但在优化时更新新策略。为了衡量新旧策略对同一个动作的概率变化,引入 ratio:
在实际代码怎么写?因为用概率会下溢(很多状态下,模型对某个动作的概率会非常非常小),用 log probability 实现更稳定:
如果:
- r_t > 1:新策略比旧策略更倾向这个动作。
r_t < 1:新策略比旧策略更不倾向这个动作。
未裁剪 surrogate objective:
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(
r_t(theta) A_t,
clip(r_t(theta), 1-epsilon, 1+epsilon) A_t
) ]
5. PPO-Clip 的符号理解¶
此处,clip和min的叠加可能带来一定的理解困难。 clip 的效果应该从优化对象筛选的角度来思考,以下进行分类讨论:
理解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:
r_t > 1+epsilon,裁剪项更小,目标不再鼓励继续增大概率。
当 A_t < 0:
由于乘以负数后大小关系反转,如果 r_t < 1-epsilon,裁剪项更小,目标不再鼓励继续降低概率。
因此 PPO 同时限制“好动作概率增加过多”和“坏动作概率降低过多”。
6. PPO-Penalty 与 PPO-Clip¶
PPO 有两类常见形式: PPO-Penalty:
PPO-Penalty 的思想其实非常正统(继承自 TRPO),它把 KL 散度直接作为惩罚项写进目标函数,但它在实践中有一个致命弱点:动态调整 β极其折磨人。 算法需要在训练过程中不断检查 KL 散度:如果 KL 太大了,说明新策略跑得太远,就要增大 β加重惩罚;如果 KL 太小,就减小β。这种引入额外且敏感的超参数(Hyperparameter)的做法,在强化学习这种本来就极度不稳定的领域里,简直是增加调参工程师的血压。 PPO-Clip:
PPO-Clip 更常用,因为实现简单、效果稳定(1、计算廉价,无需计算KL散度 2、免调参,eps一般直接固定在0.2或者0.1)。实际工程中也经常同时监控 KL,如果 KL 过大就 early stop 或调整学习率。
7. Actor-Critic 结构¶
PPO 通常是 Actor-Critic 算法。 Actor:
Critic:总损失常写为:
其中:
policy_loss = -L_CLIP (使用CLIP保证训练稳定)
value_loss = (V_phi(s_t) - return_t)^2 (MSE损失)
entropy = H(pi_theta(.|s_t)) (熵损失鼓励多探索)
8. Rollout 与 On-policy 数据¶
PPO 是 on-policy 或近似 on-policy 算法。通常流程:
1. 用当前策略 pi_old 与环境交互,收集 rollout。
2. 计算 returns 和 advantages。
3. 固定 logp_old。
4. 用这些数据做若干 epoch 的 minibatch 更新。
5. 丢弃旧数据,用新策略重新采样。
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}
+ (gamma lambda)^2 delta_{t+2} + ...
GAE优势函数:
Return target(用于训练价值网络) 可以写为:
GAE 中:
- gamma 控制未来奖励折扣。
lambda控制 bias-variance 权衡。
10. PPO 训练流程¶
典型 PPO-Clip 训练流程:
initialize actor pi_theta and critic V_phi
repeat:
collect rollout using current policy
store states, actions, rewards, dones, logp_old, values
compute advantages using GAE
compute returns = advantages + values
normalize advantages
for epoch in range(K):
for minibatch in rollout:
logp_new = log pi_theta(actions|states)
ratio = exp(logp_new - logp_old)
clipped_ratio = clip(ratio, 1-eps, 1+eps)
policy_loss = -mean(min(ratio*A, clipped_ratio*A))
value_loss = mse(V_phi(states), returns)
entropy_loss = -mean(entropy)
optimize total loss
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 长期很高,说明更新过猛;如果 entropy 迅速下降,说明策略过早确定。14. PPO 与 TRPO 对比¶
TRPO:
PPO: PPO 是工程上更常用的折中方案。15. RLHF 的基本定义¶
RLHF(Reinforcement Learning from Human Feedback)指使用人类反馈信号训练或优化模型行为。典型大模型 RLHF 流程:
1. SFT: 用人工示范数据监督微调。
2. Reward Model: 用人类偏好比较数据训练奖励模型。
3. RL Optimization: 用 PPO 等算法优化语言模型,使奖励更高,同时限制偏离参考模型。
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:
stable policy gradient algorithm
Ratio:
r_t = pi_new(a|s) / pi_old(a|s)
Clip objective:
min(r_t A_t, clip(r_t,1-eps,1+eps) A_t)
Loss:
policy loss + value loss - entropy bonus
Data:
collect rollout with old policy
compute GAE advantages
update for several epochs
then recollect data
Stability:
clipping, KL monitoring, advantage normalization,
entropy, gradient clipping
RLHF:
SFT -> reward model -> 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="