土法炼钢兴趣小组的算法知识备份

【强化学习与大模型后训练】09|RLHF 全链路:用 PPO 对齐语言模型

文章导航

分类入口
rl-posttraining
标签入口
#rlhf#ppo#reward-model#kl-penalty#gae#instructgpt#alignment

目录

训练一个聊天模型时,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。

相反,理解这条经典链路,是理解后面所有简化、替代和批评的基线。

参考资料

← 上一篇:08|奖励模型 | 下一篇:10|DPO

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-05-29 · rl-posttraining

强化学习与大模型后训练

从 MDP、策略梯度、PPO 等强化学习最小必要集出发,系统讲清现代大模型后训练:SFT、奖励模型、RLHF,到 DPO/IPO/KTO/ORPO/SimPO 免 RL 对齐、GRPO,再到 RLVR 可验证奖励、推理模型(o1/R1 范式)、过程奖励、奖励黑客、RL 训练基础设施与评测。全 20 篇深度博客。


By .