奖励建模与 RLHF

Build~45 minutesPython先修要求: Phase 5 · 05 (Sentiment), Phase 9 · 08 (PPO)
人类写不出「好助手回复」的奖励函数,但他们可以比较两个回复、挑出更好的那个。用这些比较拟合一个奖励模型,然后让语言模型对着它做 RL。Christiano 2017。InstructGPT 2022。这就是把 GPT-3 变成 ChatGPT 的配方。到了 2026 年,它大多被 DPO 取代——但心智模型仍然成立。

问题

你在下一 token 预测目标上训练了一个语言模型。它能写出语法正确的英语。它也会撒谎、胡扯,该拒绝时却不拒绝。你没法靠更多预训练修好它——网络文本是问题本身,不是解药。

你想要一个标量奖励,能表达「回复 A 比回复 B 更适合指令 X」。手动写这个奖励函数是不可能的。「有帮助性」不是一个关于 token 的闭式表达式。但人类可以比较两个输出并标出偏好。这种数据在大规模下收集起来很便宜。

RLHF(Christiano 等人 2017;Ouyang 等人 2022)把偏好转换成奖励模型,再用 PPO 对着这个奖励优化 LM。分三步:SFT → RM → PPO。这就是让 ChatGPT、Claude、Gemini,以及 2023–2025 年所有其他对齐 LLM 上线的配方。

2026 年,PPO 那一步大多被 DPO(Phase 10 · 08)取代,因为后者更便宜,对对齐调优的效果也几乎一样好。但奖励模型这一块仍然支撑着每一个 Best-of-N 采样器、每一条从可验证奖励做 RL 的 pipeline,以及每一个使用过程奖励模型的推理模型。理解了 RLHF,你就理解了整个对齐栈。

概念

三阶段 RLHF:SFT、在成对偏好上训练 RM、带 KL 惩罚的 PPO

阶段 1:监督微调(SFT)。 从预训练基础模型开始。在目标行为的人类示范上微调(指令跟随回复、有帮助的回答等)。结果:一个 \pi_{\text{SFT}} 模型,它偏向良好行为,但动作空间仍然无界。

阶段 2:奖励模型训练。

  • 收集针对提示 x 的成对回复 (y_+, y_-),由人类标注为「y_+ 优于 y_-」。
  • 训练奖励模型 R_\phi(x, y),给 y_+ 打出更高的分。
  • 损失:Bradley-Terry 成对逻辑损失:

L(\phi) = -\mathbb{E}[ \log \sigma(R_\phi(x, y_+) - R_\phi(x, y_-)) ]

\sigma 是 sigmoid。奖励之差意味着偏好的对数几率。BT 自 1952 年以来就是标准(Bradley-Terry),也是现代 RLHF 的主导选择。

  • R_\phi 通常从 SFT 模型初始化,在上面加一个标量头。同一个 Transformer 主干;一个线性层输出奖励。

阶段 3:带 KL 惩罚的 PPO 对抗 RM。

  • 从 \pi_{\text{SFT}} 初始化可训练策略 \pi_\theta。保留一个冻结的参考 \pi_{\text{ref}} = \pi_{\text{SFT}}。
  • 回复 y 末尾的奖励:

r_{\text{total}}(x, y) = R_\phi(x, y) - \beta \cdot \mathrm{KL}(\pi_\theta(\cdot \mid x) \Vert \pi_{\text{ref}}(\cdot \mid x))

KL 惩罚防止 \pi_\theta 任意偏离 \pi_{\text{SFT}}——它是正则项,不是硬信赖域。\beta 通常取 0.01-0.05。

  • 用这个奖励跑 PPO(第 08 课)。优势在 token 级轨迹上计算,但 RM 只给完整回复打分。

为什么需要 KL? 没有它,PPO 会愉快地找到奖励作弊策略——RM 只在分布内的补全上训练过。一个分布外的回复可能比任何人类写的都得分更高。KL 把 \pi_\theta 保持在 RM 训练过的那片流形附近。它是 RLHF 里最重要的那个旋钮。

2026 年现状:

  • DPO(Rafailov 2023):闭式代数把阶段 2+3 坍缩成偏好数据上的单个监督损失。没有 RM,没有 PPO。在对齐基准上质量相同,算力只占一小部分。见 Phase 10 · 08。
  • GRPO(DeepSeek 2024–2025):用组相对基线代替评论家的 PPO,奖励来自验证器(代码能跑 / 数学答案匹配),而不是人类训练的 RM。推理模型的主流做法。见 Phase 9 · 12。
  • 过程奖励模型(PRM): 给部分解(每个推理步骤)打分,用于 RLHF 和推理方向的 GRPO 变体。
  • Constitutional AI / RLAIF: 用对齐的 LLM 生成偏好代替人类。扩展了偏好预算。
reward-model静态版本未包含此交互图

构建它

本课使用极小的合成「提示」和「回复」,都用字符串表示。RM 是基于词袋表示的线性打分器。没有真正的 LLM——重要的是 pipeline 的形状,不是规模。见 code/main.py。

第 1 步:合成偏好数据

pythonPROMPTS = ["help me", "answer me", "explain this"]
GOOD_WORDS = {"clear", "specific", "kind", "thorough"}
BAD_WORDS = {"vague", "rude", "wrong", "short"}

def make_pair(rng):
    x = rng.choice(PROMPTS)
    y_good = rng.choice(list(GOOD_WORDS)) + " " + rng.choice(list(GOOD_WORDS))
    y_bad = rng.choice(list(BAD_WORDS)) + " " + rng.choice(list(BAD_WORDS))
    return (x, y_good, y_bad)

真实 RLHF 里这一步换成人类标注员。形状——(prompt, preferred_response, rejected_response)——完全相同。

第 2 步:Bradley-Terry 奖励模型

线性打分:R(x, y) = w · bag(y)。训练以最小化 BT 成对对数损失:

pythondef rm_train_step(w, x, y_pos, y_neg, lr):
    r_pos = dot(w, bag(y_pos))
    r_neg = dot(w, bag(y_neg))
    p = sigmoid(r_pos - r_neg)
    for tok, cnt in bag(y_pos).items():
        w[tok] += lr * (1 - p) * cnt
    for tok, cnt in bag(y_neg).items():
        w[tok] -= lr * (1 - p) * cnt

几百次更新之后,w 会给好词 token 正的权重,给坏词负的权重。

第 3 步:在 RM 之上加类 PPO 策略

我们的玩具策略从词表里产生单个 token。我们在 RM 下给这个 token 打分,计算 \log \pi_\theta(\text{token} \mid \text{prompt}),加上对参考的 KL 惩罚,再应用裁剪的 PPO 替代目标。

pythondef rlhf_step(theta, ref, w, prompt, rng, eps=0.2, beta=0.1, lr=0.05):
    logits_theta = policy_logits(theta, prompt)
    probs = softmax(logits_theta)
    token = sample(probs, rng)
    logits_ref = policy_logits(ref, prompt)
    probs_ref = softmax(logits_ref)
    reward = dot(w, bag([token])) - beta * kl(probs, probs_ref)
    # ppo-style update on theta, treating reward as the return
    ...

第 4 步:监控 KL

每次更新都跟踪平均 \mathrm{KL}(\pi_\theta \Vert \pi_{\text{ref}})。如果它悄悄爬过 ~5-10,说明策略已经远离 \pi_{\text{SFT}}——要么 \beta 在上升,要么奖励作弊开始了。这是真实 RLHF 里的头号诊断指标。

第 5 步:用 TRL 的生产配方

一旦理解了玩具 pipeline,下面是真实库用户写出的同一个循环。Hugging Face 的 TRL 是参考实现——阶段 2 用 RewardTrainer,阶段 3 用 PPOTrainer(内置对参考的 KL)。

python# Stage 2: reward model from pairwise preferences
from trl import RewardTrainer, RewardConfig
from transformers import AutoModelForSequenceClassification, AutoTokenizer

tok = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B-Instruct")
rm = AutoModelForSequenceClassification.from_pretrained(
    "meta-llama/Llama-3.1-8B-Instruct", num_labels=1
)

# dataset rows: {"prompt", "chosen", "rejected"} — Bradley-Terry format
trainer = RewardTrainer(
    model=rm,
    tokenizer=tok,
    train_dataset=preference_data,
    args=RewardConfig(output_dir="./rm", num_train_epochs=1, learning_rate=1e-5),
)
trainer.train()
python# Stage 3: PPO against the RM with KL penalty to the SFT reference
from trl import PPOTrainer, PPOConfig, AutoModelForCausalLMWithValueHead

policy = AutoModelForCausalLMWithValueHead.from_pretrained("./sft-checkpoint")
ref    = AutoModelForCausalLMWithValueHead.from_pretrained("./sft-checkpoint")  # frozen

ppo = PPOTrainer(
    config=PPOConfig(learning_rate=1.41e-5, batch_size=64, init_kl_coef=0.05,
                     target_kl=6.0, adap_kl_ctrl=True),
    model=policy, ref_model=ref, tokenizer=tok,
)

for batch in dataloader:
    responses = ppo.generate(batch["query_ids"], max_new_tokens=128)
    rewards   = rm(torch.cat([batch["query_ids"], responses], dim=-1)).logits[:, 0]
    stats     = ppo.step(batch["query_ids"], responses, rewards)
    # stats includes: mean_kl, clip_frac, value_loss — the three PPO diagnostics

库替你做了三件事。adap_kl_ctrl=True 实现自适应 β 调度:观测到的 KL 超过 target_kl 就翻倍 β;低于一半就减半。参考模型按约定是冻结的——你绝不能不小心和 policy 共享参数。价值头与策略在同一个主干上(AutoModelForCausalLMWithValueHead 会附加一个标量 MLP 头),这就是为什么 TRL 分别报告 policy/kl 和 value/loss。

常见陷阱

  • 过度优化 / 奖励作弊。 RM 并不完美;\pi_\theta 会找到得分高但很糟糕的对抗性补全。症状:奖励无限攀升,而人类评估分数持平或下降。修复:早停、调高 \beta、扩大 RM 训练数据。
  • 长度作弊。 在有帮助的回复上训练的 RM,常常隐含地奖励长度。策略学会给回复灌水。补救:长度归一化奖励,或用长度感知 RM 的 RLAIF。
  • RM 太小。 RM 至少要跟策略一样大。太小的 RM 无法忠实地给策略的输出打分。
  • KL 调参。 β 太低 → 漂移和奖励作弊。β 太高 → 策略几乎不变。标准技巧是用自适应 β,把每步 KL 目标固定住。
  • 偏好数据噪声。 约 30% 的人类标签有噪声或模棱两可。用一致性过滤后的数据训练 RM,或在 BT 上加温度来校准。
  • 异策略问题。 PPO 数据在第一个 epoch 之后略微异策略。像第 08 课那样监控裁剪比例。

使用它

2026 年的 RLHF 是分层的:

层目标方法
指令跟随、有帮助性、无害性对齐优先用 DPO(Phase 10 · 08)而非 RLHF-PPO。
推理正确性(数学、代码)能力带验证器奖励的 GRPO(Phase 9 · 12)。
长时程多步任务Agent在步骤上用过程奖励模型的 PPO / GRPO。
安全 / 拒绝行为安全用独立安全 RM 的 RLHF-PPO,或 Constitutional AI。
推理时 Best-of-N快速对齐在解码时使用 RM;无需训练策略。
奖励蒸馏推理算力在冻结 LM 之上训练一个小「奖励头」。

RLHF 是 2022–2024 年那个方法。到了 2026 年,生产对齐 pipeline 以 DPO 优先,只有 RM 密集或安全关键的步骤才用 PPO。

交付它

保存为 outputs/skill-rlhf-architect.md:

markdown---
name: rlhf-architect
description: Design an RLHF / DPO / GRPO alignment pipeline for a language model, including RM, KL, and data strategy.
version: 1.0.0
phase: 9
lesson: 9
tags: [rl, rlhf, alignment, llm]
---

Given a base LM, a target behavior (alignment / reasoning / refusal / agent), and a preference or verifier budget, output:

1. Stage. SFT? RM? DPO? GRPO? With justification.
2. Preference or verifier source. Humans, AI feedback, rule-based, unit-test-pass, or reward distillation.
3. KL strategy. Fixed β, adaptive β, or DPO (implicit KL).
4. Diagnostics. Mean KL, reward stability, over-optimization guard (holdout human eval).
5. Safety gate. Red-team set, refusal rate, safety RM separate from helpfulness RM.

Refuse to ship RLHF-PPO without a KL monitor. Refuse to use an RM smaller than the target policy. Refuse length-only rewards. Flag any pipeline that does not hold back a blind human-eval set as lacking over-optimization protection.

练习

  1. 简单。 在 code/main.py 里用 500 组合成偏好对训练 Bradley-Terry 奖励模型。在留出的 100 对上测量成对准确率。应该超过 90%。
  2. 中等。 用 \beta \in \lbrace 0.0, 0.1, 1.0 \rbrace 跑玩具 PPO-RLHF 循环。对每个值,画出 RM 分数与对参考 KL 随更新次数的变化。哪些运行发生了奖励作弊?
  3. 困难。 在同一份偏好数据上实现 DPO(闭式偏好似然损失),与 RLHF-PPO pipeline 对比所用算力和最终达到的 RM 分数。

关键术语

术语人们怎么说它实际指什么
RLHF"对齐 RL"三阶段 SFT + RM + PPO pipeline(Christiano 2017,Ouyang 2022)。
Reward Model (RM)"打分网络"通过 Bradley-Terry 拟合到成对偏好的学习标量函数。
Bradley-Terry"成对逻辑损失"P(y_+ \succ y_-) = \sigma(R(y_+) - R(y_-));标准的 RM 目标。
KL penalty"待在参考附近"奖励里的 \beta \cdot \mathrm{KL}(\pi_\theta \Vert \pi_{\text{ref}});反奖励作弊的正则项。
Reward hacking"古德哈特定律"策略利用 RM 的缺陷;症状:奖励上升,人类评估持平。
RLAIF"AI 标注的偏好"标签来自另一个 LM 而不是人类的 RLHF。
PRM"Process Reward Model"给部分推理步骤打分;用于推理 pipeline。
Constitutional AI"Anthropic 的方法"由显式规则引导的 AI 生成偏好。

延伸阅读

示意图共 1 张

rlhf diagram
rlhf

“Stay hungry, stay foolish.”

— Steve Jobs

esc
↑↓切换↵打开esc关闭