数据截至 (上游 commit 67dfbe211a07)
04 · 在线 RL:GRPO、RLOO 与 PPO
这一章讲什么: 在线 RL 是 TRL 里数据流最长的一条线:模型边生成、边被打分、边更新。主线讲 GRPO(DeepSeek-R1 用的那族算法),顺带对比 RLOO 的「留一法」基线和被挪进 experimental 的经典 PPO。读完你会理解一次 GRPO 训练步里每个张量的来龙去脉。
1. 它要解决的小问题
离线偏好方法(DPO)吃静态标注数据。但要让模型在数学、代码这类有可验证答案的任务上变强,更好的信号是:让模型自己答题,用程序判对错,把「答对的采样变大概率」。这就是在线 RL。
它的工程难点比离线方法多出一截:
- 每步都要生成——生成慢,训练就慢;需要 vLLM 这类高吞吐引擎。
- 训练和生成是两份权重——模型每更新一次,生成引擎里的权重就过时了。
- 优势怎么算——没有价值网络时,要用「同一题的一组回答互相比较」来估计。
- 训推不一致——vLLM 和训练引擎算出的 logp 有系统差,不修正会偏移优化目标。
2. 顶层流程:一次训练步
对应 _generate_and_score_completions(trl/trainer/grpo_trainer.py:2343)+ _compute_loss(trl/trainer/grpo_trainer.py:3109):
① dataloader: RepeatSampler 让每个 prompt 连续出现 num_generations 次
▼
② rollout: 同步权重到 vLLM → 每 prompt 生成 G 个回答
▼
③ 打分: 各 reward_func 给每个回答打分 → rewards_per_func(B*G, F)
▼
④ 优势: 按 prompt 分组,advantage = (r - 组均值) / 组标准差
▼
⑤ 重算 logp: 训练引擎对生成的 completion 算 per-token logp
(β≠0 时参考模型也算一份;多步复用时还存一份 old logp)
▼
⑥ loss: min(ratio·A, clip(ratio)·A) + β·KL,反向传播
▼
⑦ 下一个 generation batch 回到 ②
怎么读这条线: ②⑤⑦ 是「在线」的代价(生成、双引擎、权重搬运);③④ 是 GRPO 区别于 PPO 的核心(函数打分代替奖励模型,组内归一代替价值网络);⑥ 是从 PPO 继承的骨架。