资料摘要:personal chatgpt 27 — trl rlhf PPOTrainer,原理分析与代码走读(OpenRLHF framework)
本讲由真实视频转录与作者 notebook/代码交叉整理。原始层:🔒 带时间戳视频转录;课程总览:personal chatgpt — LLMs 实践系列。
本讲以 TRL 的 hello-world notebook 为入口,拆解 RLHF 第三阶段的 PPO 数据流:actor 生成 response;reference policy 提供基准 log-prob;外部 Reward Model 给序列分数;value head 估计每个 token 的价值;KL penalty、reward、advantage/return 被写入 rollout buffer;最后计算 clipped policy loss 与 value loss,更新 actor/value head。
1. RLHF PPO 中的四类模型/角色
Section titled “1. RLHF PPO 中的四类模型/角色”- Actor / policy model :从 prompt 生成 response,并被更新。
- Reference model :通常是冻结的 SFT 模型,用于 KL 约束。
- Reward Model:外部输入,对 prompt+response 给一个 scalar score;
PPOTrainer不自动训练它。 - Critic / value head:从 actor hidden states 输出 token-level value,用于 advantage 和 value loss。
notebook 的 AutoModelForCausalLMWithValueHead 在语言模型上增加线性 v_head,因此一次前向可得到 logits 与 values。
2. Generate 与 rollout
Section titled “2. Generate 与 rollout”response = ppo_trainer.generate(query_tensor, ...)score = external_reward_fn(query_tensor, response)stats = ppo_trainer.step([query_tensor], [response], [score])课程示例把 score 直接伪造为 1,只用于走通 API;真实 RLHF 必须接入上一讲训练的 Reward Model 或其它可靠反馈函数。
3. Actor/reference 前向与 shifted log-prob
Section titled “3. Actor/reference 前向与 shifted log-prob”把 query 与 response 拼接,actor 计算 logits、logprobs、values;reference 再计算 ref logprobs。语言模型是 next-token prediction,需做一位 shift:位置 0..L-2 的 logits 对齐 labels 1..L-1。
策略比:
代码使用 log-prob 相减再 exp 以提高数值稳定性。
4. KL penalty 与 token-level reward
Section titled “4. KL penalty 与 token-level reward”课程使用近似的 log-ratio 形式:
外部 Reward Model 的序列 score 通常加到 response 最后一个有效 token 上,再与逐 token KL penalty 合成 rewards。Adaptive KL Controller 根据实际 KL 相对 target 的偏差调整 。
5. Advantage 与 return
Section titled “5. Advantage 与 return”课程沿 compute_advantages 查看 GAE 风格递推。一般形式:
不同 TRL 版本的 mask、whitening 与参数默认值可能不同,复现应以对应版本源码为准。
6. PPO clipped loss 与 value loss
Section titled “6. PPO clipped loss 与 value loss”策略目标:
value 也使用裁剪版本,最终优化器最小化 policy loss 与加权 value loss。课程跟入 train_minibatch,展示 rollout 数据经过多个 minibatch/epoch 重用后再更新参数。
公式 / 代码要点
Section titled “公式 / 代码要点”logprobs, logits, values, masks = batched_forward_pass(...)ref_logprobs, _, _, _ = batched_forward_pass(ref_model, ...)rewards, non_score_reward = compute_rewards(scores, logprobs, ref_logprobs, masks)values, advantages, returns = compute_advantages(values, rewards, masks)train_stats = train_minibatch(old_logprobs, values, logprobs, logits, vpreds, mask, advantages, returns)完整优化对象不仅是 PPO clip;KL penalty 进入 reward,value head 还有独立 loss。
00:00:定位为 TRL 最后一阶段PPOTrainer。00:59:说明重点是PPOTrainer.step。01:37:回顾 PPO penalty/clip 目标。03:06:用 OpenRLHF 图说明完整 pipeline。03:18:Actor 与 Reference Model。04:13:Critic;04:28进入 Reward Model。06:55:value head 与 Adaptive KL Controller。09:19:actorgenerateresponse。11:35:进入step(query, response, scores)。13:48:解释 next-token shift。15:09:计算 KL penalty。16:00:外部分数与 KL penalty 合成 reward。17:00:计算 advantage/return。18:00:进入 PPO clip 与 value loss。25:00:在 minibatch 训练中定位具体 loss 实现。
- notebook 的 reward 是常数
1,只能验证接口和 shape,不能验证 RLHF 学习效果。 - 使用旧版
trl的PPOTrainer.step、AutoModelForCausalLMWithValueHead和配置字段;当前 TRL 复现需锁版本或迁移 API。 - GPT-2 hello-world 模型体量很小,不能外推到大模型训练的显存、吞吐或稳定性。
- reference policy 与“old policy for PPO minibatch ratio”在概念上相关但不完全相同:前者主要提供 KL 基准,后者是 rollout 时策略快照;具体张量需按源码区分。
- KL 的
logprobs-ref_logprobs是采样 action 上的近似/估计,不应不加限定地称为完整分布 KL。
与前后讲关系
Section titled “与前后讲关系”- 前接第 23 讲:Reward Model 训练完成后,在本讲作为冻结的外部评分器。
- 承接第 16 讲:第 16 讲概览 TRL 三阶段,本讲补齐最复杂的 PPO 第三阶段。
- 后续关联第 30 讲:第 30 讲从 Bradley–Terry 视角回到奖励模型偏好概率,是本讲 reward 信号的统计基础。
- Actor、Reference、Reward Model 与 Value Head 各自产生什么张量?
- 为什么 response 的 log-prob 要做 next-token shift?
- 外部序列 reward 如何与逐 token KL penalty 合成?
- PPO ratio 为什么用
exp(new_logprob-old_logprob)计算? - 常数 reward=1 的 hello-world 能验证什么、不能验证什么?
- 视频:trl rlhf PPOTrainer,原理分析与代码走读(OpenRLHF framework)
- 转录:🔒 personal chatgpt 27 视频转录
- 课件 / 代码:🔒 trl_ppotrainer_helloworld.ipynb
- 视频描述中的补充资料:https://www.bilibili.com/video/BV1hD421K7gG/
- 视频描述中的补充资料:https://www.bilibili.com/video/BV11J4m137fY/
- 视频描述中的补充资料:https://www.bilibili.com/video/BV1GZ421t7oU/
- 滴答清单抓取时学习状态:未完成。
- 视频正文采用自动语音识别;关键术语已用标题、notebook 与源码校正,无法确认的口语细节不扩写。
- notebook 未执行的 CUDA、权重下载、训练或外部 API 单元,不表述为已复现实验。