训练一个聊天模型时,SFT 能让模型学会“像答案一样回答”,但它不知道两个都像答案的回复哪个更符合人类偏好。
奖励模型把偏好比较压成一个标量,PPO 再把这个标量变成策略更新。
常见误区是把 RLHF 想成“先训一个 reward model,然后直接最大化它”。
真正的 InstructGPT 式 RLHF 不是裸奔最大化奖励,而是带参考策略 KL 约束的在线策略优化。
这篇文章把 SFT policy init、冻结奖励模型、参考模型、critic、GAE、PPO 更新和 KL 控制串成一条可实现的链路。
读完你应该能分清四个模型各自做什么、为什么显存贵、KL 系数为什么要动态调,以及为什么这条路后来被 DPO、GRPO 等方法部分替代。
一、RLHF 的目标不是“奖励越高越好”
RLHF(Reinforcement Learning from Human Feedback)的核心问题是:给定 prompt \(x\),让策略 \(\pi_\theta(y\mid x)\) 生成更受人类偏好的回答 \(y\)。
如果只看奖励模型 \(r_\phi(x,y)\),最直接的目标是:
\[ \max_\theta \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(\cdot\mid x)}[r_\phi(x,y)] \]
这个目标在语言模型上非常危险。
奖励模型只是在偏好数据上学到的代理目标,不是真实人类偏好的完美函数。
策略如果可以无限探索,就会找到奖励模型的漏洞:格式套话、冗长解释、过度自信、迎合标注偏好,甚至生成训练集里没有覆盖的奇怪模式。
所以 InstructGPT 的 RLHF 目标会加一个“不要离 SFT 模型太远”的约束。
参考策略 \(\pi_{ref}\) 通常就是 SFT 结束后的模型副本,训练期间冻结。
带 KL 正则的目标可以写成:
\[ \max_\theta \mathbb{E}_{x,y \sim \pi_\theta}\left[r_\phi(x,y) - \beta\,\mathrm{KL}(\pi_\theta(\cdot\mid x)\,\|\,\pi_{ref}(\cdot\mid x))\right] \]
在实际 token 级实现里,策略生成 \(y=(a_1,\ldots,a_T)\),每一步都有当前策略和参考策略的 log-prob。
常用 shaping 写法是:
\[ r_t^{\mathrm{kl}} = -\beta\left(\log \pi_\theta(a_t\mid x,a_{<t}) - \log \pi_{ref}(a_t\mid x,a_{<t})\right) \]
完整回答的最终奖励来自奖励模型,token 级 KL 惩罚沿轨迹累积。
于是优化用到的总奖励可以理解为:
\[ r_{total}=r_\phi(x,y)-\beta\,\mathrm{KL}(\pi_\theta(\cdot|x)\,\|\,\pi_{ref}(\cdot|x)) \]
这里的 \(\mathrm{KL}\) 在实现中不是枚举整个词表的解析 KL,而是用采样 token 上的 log-prob 差作为轨迹上的 KL 估计和惩罚。
这个写法有三个工程含义。
第一,reference model 不是可选装饰;它定义了“偏离 SFT 行为”的代价。
第二,\(\beta\) 不是普通超参数;它控制对齐收益和语言能力回退之间的张力。
第三,奖励模型分数不能孤立看;同样的高 reward,如果伴随很高 KL,可能是策略在钻 reward model 的空子。
二、四个模型各司其职
经典 PPO-RLHF 训练时,内存里通常有四个逻辑模型。
| 模型 | 是否训练 | 主要输入 | 主要输出 | 作用 |
|---|---|---|---|---|
| Policy / Actor \(\pi_\theta\) | 是 | prompt 与已生成 token | token 分布、log-prob | 采样回答并接受 PPO 更新 |
| Reference \(\pi_{ref}\) | 否 | 同一条 prompt-response | reference log-prob | 计算 KL 惩罚 |
| Reward model \(r_\phi\) | 否 | prompt-response | 标量奖励 | 近似人类偏好 |
| Value / Critic \(V_\psi\) | 是 | prompt-response prefix | 状态价值 | 估计优势、降低方差 |
这四个模型有时会共享底座,有时会拆成独立权重。
概念上必须分清:policy 决定未来采样分布,reference 给行为锚点,reward 给偏好标量,value 给 credit assignment 的基线。
如果 value head 接在 policy backbone 上,它仍然是另一个训练目标。
如果 reward model 与 policy 同尺度,训练时即使冻结也要前向推理,占显存和吞吐。
如果 reference 与 policy 同尺度,KL 计算也要一次前向。
这就是 PPO-RLHF 显得笨重的第一原因:同一批 response,至少需要 policy、reference、reward、value 多路计算。
四模型循环可以画成这样:
flowchart TD
A[Prompt batch] --> B[Policy 采样 response]
B --> C[Reference 计算 token log-prob]
B --> D[Reward model 打分]
B --> E[Value/Critic 估计 V]
C --> F[Token 级 KL 惩罚]
D --> G[终止奖励]
E --> H[GAE 优势估计]
F --> H
G --> H
H --> I[PPO clipped update]
I --> B
这张图故意没有把数据集画得很复杂,因为核心闭环只有一条:采样、打分、估计优势、更新策略。
难点在于每个箭头都很贵。
采样是自回归推理,不能像 SFT 那样完全并行地 teacher forcing。
奖励模型需要读完整回答,通常在 EOS 或截断处输出一个标量。
reference 需要对回答 token 做 teacher forcing 前向,得到每个生成 token 的 log-prob。
critic 需要给每个时间步一个 value,用来和回报对齐。
policy 更新还要保存旧策略 log-prob,构造 PPO ratio。
所以 PPO-RLHF 的训练吞吐不是“一个 loss 加一个 backward”能概括的。
三、从 SFT 到 PPO:一条样本的生命周期
先看一条 prompt 在训练中的生命周期。
第一步,从 prompt 数据集采样 \(x\)。
这个 prompt 可以来自人工指令、线上日志、红队问题、任务混合池,也可以来自后续主动学习筛选。
第二步,用当前 policy \(\pi_\theta\) 自回归采样回答 \(y\)。
采样策略通常会设置 temperature、top-p、最大长度、EOS 规则和拒绝空输出的过滤。
这一步和 SFT 最大不同:SFT 读的是固定答案,RLHF 必须让当前策略自己产生训练样本。
第三步,对 \((x,y)\) 做多路前向。
policy 保存生成时的 old log-prob,或者在训练前重新 teacher forcing 一遍得到 \(\log \pi_{old}\)。
reference 计算 \(\log \pi_{ref}(a_t\mid x,a_{<t})\)。
reward model 输出 \(r_\phi(x,y)\)。
value model 输出每个 response token 位置的 \(V_\psi(s_t)\)。
第四步,构造 token 级 reward。
KL shaping 在每个 response token 上都有一项:
\[ r_t = -\beta(\log$\pi_\theta(a_t\mid s_t)-\log$\pi_{ref}(a_t\mid s_t)) \]
在最后一个有效 token 上,再加奖励模型分数:
\[ r_T \leftarrow r_T + r_\phi(x,y) \]
有些实现会把 reward model 分数放到 EOS token,有些放到最后一个非 padding response token。
关键是 mask 语义要一致:prompt token 不拿 RL 奖励,padding token 不参与优势估计。
第五步,用 GAE 计算优势。
上一节 04|Actor-Critic 与优势函数、GAE 已经讲过,GAE 的核心递推是:
\[ \delta_t = r_t + \gamma V(s_{t+1}) - V(s_t) \]
\[ \hat A_t = \delta_t + \gamma\lambda \hat A_{t+1} \]
语言模型 RLHF 里,\(\gamma\) 常接近 1,因为一段回答内部没有传统环境折扣的物理含义。
\(\lambda\) 控制 bias-variance trade-off。
第六步,用 PPO clipped objective 更新 policy。
旧策略来自 rollout 时的 policy,当前策略是正在更新的 policy。
ratio 写作:
\[ r_t(\theta)=\frac{\pi_\theta(a_t\mid s_t)}{\pi_{old}(a_t\mid s_t)}=\exp(\log\pi_\theta-\log\pi_{old}) \]
PPO 的裁剪目标是:
\[ L^{CLIP}(\theta)=\mathbb{E}_t\left[\min(r_t(\theta)\hat A_t,\mathrm{clip}(r_t(\theta),1-\epsilon,1+\epsilon)\hat A_t)\right] \]
同时训练 value loss,并可能加 entropy bonus。
第七步,重复 rollout。
这一步很重要:PPO-RLHF 是在线方法,训练样本来自不断变化的当前 policy。
如果 rollout 太旧,ratio 会偏离 1,PPO 裁剪会吞掉大量梯度。
如果 rollout 太新但 batch 太小,估计方差又会很大。
四、KL 惩罚为什么放在 token 级
从数学上说,KL 约束是两个序列分布之间的距离。
序列概率可分解为 token 条件概率连乘:
\[ \log\pi(y\mid x)=\sum_{t=1}^{T}\log\pi(a_t\mid x,a_{<t}) \]
因此采样轨迹上的 log-ratio 也自然分解为:
\[ \log\frac{\pi_\theta(y\mid x)}{\pi_{ref}(y\mid x)}=\sum_{t=1}^{T}\left(\log\pi_\theta(a_t\mid s_t)-\log\pi_{ref}(a_t\mid s_t)\right) \]
把 KL 惩罚拆到每个 token,有三个实际好处。
第一,优势估计有了逐步 reward,critic 不必只在最后一个 token 才看到信号。
第二,长回答的偏离会被逐 token 累积,而不是和短回答共用一个句级惩罚。
第三,可以监控每个 token、每个 batch、每个长度段的 KL,方便做稳定性诊断。
但 token 级 KL 也带来几个坑。
第一,采样 token 上的 log-ratio 不是完整词表 KL 的精确值。
它是对当前策略采样分布下的一种轨迹估计。
第二,如果 response mask 写错,把 prompt token 也算进去,KL 会被 prompt 模板长度污染。
第三,如果 EOS 后的 padding 也参与计算,长短样本的 KL 口径会失真。
第四,如果 reward model 鼓励很长的回答,KL 也会随长度累积,\(\beta\) 实际上会参与长度控制。
这就是后面 18|训练稳定性 要专门讨论长度偏置、KL 和熵的原因。
五、奖励白化与尺度控制
奖励模型输出的标量没有天然单位。
一个 reward model 可能输出均值接近 0、标准差接近 1 的分数。
另一个 reward model 可能输出范围更宽,或者在某个 prompt 分布上整体偏高。
PPO 对奖励尺度非常敏感。
奖励变大,优势变大,策略更新步子也变大。
如果 \(\beta\) 不变,KL 约束的相对强度就会被削弱。
因此 RLHF 实现常见 reward whitening:在一个 batch 或一段数据上把 reward 标准化。
示意写法如下:
# 示意:只对白化后的奖励做训练,不代表完整工程实现
scores = reward_model(prompt_response).float()
mean = scores.mean()
std = scores.std().clamp_min(1e-6)
whitened_scores = (scores - mean) / std白化不是为了改变偏好排序,而是让 PPO 的数值尺度可控。
如果只关心 Bradley-Terry 训练,reward 的平移不影响偏好概率。
但在 PPO 里,reward 的绝对尺度会进入优势、value target 和 KL trade-off。
这也是为什么同一份 reward model 换一个 prompt 分布后,往往需要重新调 KL 系数和 reward normalization。
奖励尺度还有一个隐蔽问题:不同任务的 reward 分布可能不同。
如果训练 batch 混合了摘要、问答、代码、拒答,统一白化可能会让某类任务的偏好信号被压扁。
工程上会按数据源、任务类型或 rollout window 做更细的统计。
六、自适应 KL:把目标 KL 当控制系统
\(\beta\) 决定策略离 reference 多远。
\(\beta\) 太小,policy 会追着 reward model 跑,可能出现 reward hacking。
\(\beta\) 太大,policy 几乎被锁在 SFT 附近,RL 更新没有效果。
InstructGPT 系路线通常会设一个 target KL,然后动态调整 \(\beta\)。
直觉很简单:如果实际 KL 高于目标,就加大惩罚;如果实际 KL 低于目标,就减小惩罚。
示意代码如下:
# 示意:不同实现会使用更平滑的控制器和 horizon
kl = measured_kl_per_token.mean()
error = kl / target_kl - 1.0
beta = beta * (1.0 + clip(error, -0.2, 0.2) * n_steps / horizon)
beta = max(beta, min_beta)这其实是一个控制问题。
reward model、采样温度、policy 学习率、batch size 都会影响 KL。
\(\beta\) 只是其中一个执行器。
如果学习率过高,单靠增大 \(\beta\) 可能压不住策略漂移。
如果 reward model 本身偏向长答案,\(\beta\) 又会和长度惩罚纠缠。
如果 prompt 分布突然切换,target KL 也未必仍然合理。
所以稳定的 RLHF 监控至少要同时看:reward、KL、entropy、response length、clip fraction、value loss、优势分布。
只看平均 reward 上升,很容易误判训练变好。
七、alignment tax:为什么对齐可能带来能力回退
alignment tax 常被翻译成“对齐税”。
它不是一个严格数学量,而是指模型为了更符合人类偏好或安全策略,可能在某些原始能力上付出的代价。
在 PPO-RLHF 里,对齐税可能来自四个方向。
第一,SFT 数据本身改变了预训练模型的分布。
如果 SFT 数据覆盖窄,模型会学到更固定的回答模板。
第二,reward model 只反映标注偏好,不等于任务真实正确性。
如果标注更偏好礼貌、完整、结构化,模型可能牺牲简洁性或探索性。
第三,KL 约束让策略不能离 SFT 太远。
这能防崩,但也限制了在某些任务上通过 RL 找到更优行为。
第四,PPO 训练本身可能引入熵下降。
一旦策略过早变尖,模型会减少多样性,错误模式更难通过采样发现。
Ouyang et al. 2022 的 InstructGPT 论文报告了一个重要现象:较小的 InstructGPT 模型在人工偏好上可以超过更大的 GPT-3 原始模型。
但这类结果不能被误读成“RLHF 一定提升所有能力”。
它提升的是偏好评测下的行为质量。
对事实性、代码、数学、长上下文等能力,需要单独评测。
后续 19|后训练评测 会把偏好评测、能力回归和安全评测分开。
八、工程成本集中在采样与编排
PPO-RLHF 的训练系统通常会拆成采样侧和训练侧。
采样侧要高吞吐生成 response,接近推理服务。
训练侧要做反向传播、PPO 多 epoch 更新和参数同步,接近分布式训练。
两边的最优配置不同。
采样偏好 KV cache、高并发、连续 batching。
训练偏好大 batch、梯度累积、ZeRO/FSDP、checkpointing。
如果把两者硬塞在一个普通训练循环里,GPU 利用率经常很差。
这就是 17|RL 训练基础设施 要讲采样-训练分离的原因。
从显存角度看,四模型循环也很昂贵。
policy 训练需要参数、梯度、优化器状态和激活。
value 如果共享 backbone,会增加 value head 和 value loss 的激活需求。
reference 和 reward 虽然冻结,但仍需要权重常驻或被高效调度到推理设备。
如果 reward model 与 policy 同规模,整体资源很快翻倍。
从计算角度看,rollout 的自回归生成往往是瓶颈。
SFT 的一个 batch 可以并行看完整答案。
RLHF 必须一个 token 一个 token 地生成新答案。
这使得 PPO-RLHF 的 wall-clock 成本远高于“同等 token 数的 SFT”。
九、和 InstructGPT、Anthropic recipe 的关系
Ziegler et al. 2019 和 Stiennon et al. 2020 已经把“从人类偏好训练奖励模型,再用 PPO 优化语言模型”这条线跑通。
Ouyang et al. 2022 的 InstructGPT 把它系统化到指令跟随场景:先 SFT,再训练 reward model,再用 PPO 优化,同时用 KL 惩罚约束到 SFT policy。
Bai et al. 2022 的 Anthropic Constitutional AI / Helpful and Harmless 路线也沿用了偏好模型与 RLHF,只是在偏好数据构造和原则监督上有自己的设计。
这些工作共同形成了后来“经典 RLHF”的默认配方。
这个配方的优点是表达力强。
只要 reward model 能给分,policy 就可以通过在线采样发现比离线数据更高 reward 的回答。
它的缺点是复杂。
你要训练 reward model,要跑在线采样,要维护 critic,要调 KL,要防 reward hacking,还要持续评测能力回归。
DPO 的吸引力正来自这里:如果能从同一个 KL-regularized 目标推导出离线分类损失,就可以绕开很多在线 RL 工程成本。
下一篇我们就推导这个等价关系。
十、实现清单:哪些指标必须上仪表盘
下面这份清单比公式更接近工程现实。
| 指标 | 看什么 | 异常信号 |
|---|---|---|
| reward mean / std | 奖励模型分数尺度 | 均值升高但人工评测下降,可能 reward hacking |
| KL per token | policy 偏离 reference 的程度 | 突然升高说明更新过猛或采样分布变了 |
| response length | 长度行为 | reward 上升伴随长度膨胀,要检查长度偏置 |
| entropy | 策略分布尖锐程度 | 快速下降可能模式坍缩 |
| clip fraction | PPO 裁剪比例 | 过高说明 rollout 太旧或学习率太大 |
| value loss | critic 拟合质量 | 持续爆炸会污染优势估计 |
| advantage mean / std | 更新信号尺度 | 未归一化或异常尖峰会导致不稳定 |
这些指标要按任务、prompt source、长度段切分。
一个全局平均数很容易掩盖坏事。
例如拒答类 prompt 的 reward 可能上升,代码类 prompt 的正确率同时下降。
再比如短回答 KL 稳定,长回答 KL 已经失控。
PPO-RLHF 最怕“训练曲线看起来很好,离线评测和人工评审突然变差”。
稳定性工作不是训练后补救,而是训练中实时发现偏移。
十一、边界:PPO-RLHF 解决不了什么
PPO-RLHF 解决的是“给定一个代理奖励,如何让策略在 KL 约束下提高该奖励”。
它不保证奖励模型正确。
它不保证标注偏好覆盖所有安全边界。
它不保证模型事实性提升。
它不保证长推理能力自然出现。
它也不保证训练后的模型适合所有下游任务。
如果奖励来自不可验证的人类偏好,RLHF 的上限仍受偏好数据和 reward model 泛化能力限制。
如果任务有明确可验证答案,后来的 RLVR 往往会比纯偏好奖励更贴近任务正确性信号。
如果工程资源有限,DPO 或其变体可能是更合理的第一选择。
如果目标是大规模推理采样,GRPO 这类去 critic 方法会更有吸引力。
这不是否定 PPO-RLHF。
相反,理解这条经典链路,是理解后面所有简化、替代和批评的基线。
参考资料
- Long Ouyang, Jeffrey Wu, Xu Jiang, Diogo Almeida, Carroll L. Wainwright, Pamela Mishkin, Chong Zhang, et al. 2022. Training language models to follow instructions with human feedback. NeurIPS 2022.
- Nisan Stiennon, Long Ouyang, Jeffrey Wu, Daniel Ziegler, Ryan Lowe, Chelsea Voss, Alec Radford, Dario Amodei, Paul Christiano. 2020. Learning to summarize with human feedback. NeurIPS 2020.
- Yuntao Bai, Andy Jones, Kamal Ndousse, Amanda Askell, Anna Chen, Nova DasSarma, Dawn Drain, et al. 2022. Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback. arXiv:2204.05862.
- Daniel M. Ziegler, Nisan Stiennon, Jeffrey Wu, Tom B. Brown, Alec Radford, Dario Amodei, Paul Christiano, Geoffrey Irving. 2019. Fine-Tuning Language Models from Human Preferences. arXiv:1909.08593.
- John Schulman, Filip Wolski, Prafulla Dhariwal, Alec Radford, Oleg Klimov. 2017. Proximal Policy Optimization Algorithms. arXiv:1707.06347.
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【强化学习与大模型后训练】05|PPO 深度解剖:裁剪目标、KL 约束与实现陷阱
从信任域思想推到 PPO 裁剪目标,解释 KL 约束、完整损失和代码级实现细节,帮助读者判断一次策略更新是否安全。
【强化学习与大模型后训练】04|Actor-Critic 与优势函数、GAE
解释 Actor-Critic 架构、优势估计和 GAE 的偏差—方差取舍,并映射到 LLM 后训练中的 value head 与 per-token advantage。
强化学习与大模型后训练
从 MDP、策略梯度、PPO 等强化学习最小必要集出发,系统讲清现代大模型后训练:SFT、奖励模型、RLHF,到 DPO/IPO/KTO/ORPO/SimPO 免 RL 对齐、GRPO,再到 RLVR 可验证奖励、推理模型(o1/R1 范式)、过程奖励、奖励黑客、RL 训练基础设施与评测。全 20 篇深度博客。
【强化学习与大模型后训练】01|系列总览:从 RL 到 LLM 后训练的地图
把强化学习到大模型后训练的主线压成一张可阅读地图,区分风格对齐与能力激发,并说明 20 篇文章的依赖关系。