跳转到内容

输入关键词开始搜索

    资料摘要:personal chatgpt 27 — trl rlhf PPOTrainer,原理分析与代码走读(OpenRLHF framework)

    视频摘要更新 2026-08-02置信度 high待阅读原始来源 ↗#深度#大模型#课程#personal-chatgpt

    本讲由真实视频转录与作者 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。

    • Actor / policy model πθ\pi_\theta:从 prompt 生成 response,并被更新。
    • Reference model πref\pi_{ref}:通常是冻结的 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。

    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

    策略比:

    rt(θ)=πθ(atst)πold(atst)=exp(logπθlogπold)r_t(\theta)=\frac{\pi_\theta(a_t\mid s_t)}{\pi_{old}(a_t\mid s_t)} =\exp\left(\log\pi_\theta-\log\pi_{old}\right)

    代码使用 log-prob 相减再 exp 以提高数值稳定性。

    课程使用近似的 log-ratio 形式:

    kltlogπθ(atst)logπref(atst)\mathrm{kl}t\approx \log\pi\theta(a_t\mid s_t)-\log\pi_{ref}(a_t\mid s_t)

    rtKL=βkltr_t^{KL}=-\beta,\mathrm{kl}_t

    外部 Reward Model 的序列 score 通常加到 response 最后一个有效 token 上,再与逐 token KL penalty 合成 rewards。Adaptive KL Controller 根据实际 KL 相对 target 的偏差调整 β\beta

    课程沿 compute_advantages 查看 GAE 风格递推。一般形式:

    δt=rt+γV(st+1)V(st)\delta_t=r_t+\gamma V(s_{t+1})-V(s_t)

    At=δt+γλAt+1,Rt=At+V(st)A_t=\delta_t+\gamma\lambda A_{t+1},\qquad R_t=A_t+V(s_t)

    不同 TRL 版本的 mask、whitening 与参数默认值可能不同,复现应以对应版本源码为准。

    策略目标:

    Lclip=Et[min(rtAt,clip(rt,1ϵ,1+ϵ)At)]L^{clip}=\mathbb E_t\left[\min\left(r_tA_t, \operatorname{clip}(r_t,1-\epsilon,1+\epsilon)A_t\right)\right]

    value 也使用裁剪版本,最终优化器最小化 policy loss 与加权 value loss。课程跟入 train_minibatch,展示 rollout 数据经过多个 minibatch/epoch 重用后再更新参数。

    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:actor generate response。
    • 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 学习效果。
    • 使用旧版 trlPPOTrainer.stepAutoModelForCausalLMWithValueHead 和配置字段;当前 TRL 复现需锁版本或迁移 API。
    • GPT-2 hello-world 模型体量很小,不能外推到大模型训练的显存、吞吐或稳定性。
    • reference policy 与“old policy for PPO minibatch ratio”在概念上相关但不完全相同:前者主要提供 KL 基准,后者是 rollout 时策略快照;具体张量需按源码区分。
    • KL 的 logprobs-ref_logprobs 是采样 action 上的近似/估计,不应不加限定地称为完整分布 KL。
    • 前接第 23 讲:Reward Model 训练完成后,在本讲作为冻结的外部评分器。
    • 承接第 16 讲:第 16 讲概览 TRL 三阶段,本讲补齐最复杂的 PPO 第三阶段。
    • 后续关联第 30 讲:第 30 讲从 Bradley–Terry 视角回到奖励模型偏好概率,是本讲 reward 信号的统计基础。
    1. Actor、Reference、Reward Model 与 Value Head 各自产生什么张量?
    2. 为什么 response 的 log-prob 要做 next-token shift?
    3. 外部序列 reward 如何与逐 token KL penalty 合成?
    4. PPO ratio 为什么用 exp(new_logprob-old_logprob) 计算?
    5. 常数 reward=1 的 hello-world 能验证什么、不能验证什么?
    • 滴答清单抓取时学习状态:未完成
    • 视频正文采用自动语音识别;关键术语已用标题、notebook 与源码校正,无法确认的口语细节不扩写。
    • notebook 未执行的 CUDA、权重下载、训练或外部 API 单元,不表述为已复现实验。