摘要:ChatGPT 的成功不仅来自 GPT 模型本身,更来自一个关键的训练步骤——RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习)。RLHF 用强化学习的方法,让大模型的输出与人类的偏好"对齐"——让它变得有用、诚实、无害。而 RLHF 中使用的主力算法正是上一篇文章讲的 PPO。这篇文章详细拆解 RLHF 的四步流程、PPO 在其中的具体作用、以及 2025 年出现的替代方案 DPO。


一、大模型训练的完整流程

三步走

现代大语言模型的训练分为三个阶段:

阶段 1:预训练(Pre-training)
  数据:互联网文本(万亿 Token)
  目标:预测下一个 Token
  成本:数千万美元
  产出:基础模型(知识丰富但"不会聊天")

阶段 2:监督微调(SFT)
  数据:高质量问答对(人工标注)
  目标:模仿人类回答格式
  成本:数万美元
  产出:对话模型(会回答问题但不够"贴心")

阶段 3:RLHF(基于人类反馈的强化学习)
  数据:人类对模型输出的偏好排序
  目标:与人类价值观对齐
  成本:数万到数十万美元
  产出:对齐模型(有用、诚实、无害)

为什么要对齐?

大模型在预训练阶段学会了海量知识,但也学会了互联网上的偏见、有害内容和不诚实回答。

预训练模型的"天然问题":

✅ 知识丰富——知道几乎所有领域的知识
✅ 语言流畅——能写出通顺的句子
❌ 缺乏帮助性——不会主动理解用户意图
❌ 缺乏诚实性——不确定时也会编造答案(幻觉)
❌ 缺乏安全性——可能输出有害内容

→ RLHF 就是解决这些"对齐问题"的方法

二、RLHF 的四步流程

RLHF 由四个关键步骤组成:

Step 1: 监督微调(SFT)
   用高质量对话数据微调预训练模型
   → 让模型学会"对话格式"

Step 2: 训练奖励模型(Reward Model)
   让人类对模型输出进行排序
   → 训练一个"打分器"

Step 3: PPO 优化
   用奖励模型指导语言模型优化
   → 让模型输出"人类更喜欢"的内容

Step 4: 迭代
   重复 2-3,持续改进

Step 1:监督微调(SFT)

目标:从"续写机器"变成"对话助手"

数据:人工编写的 {prompt, 理想回答} 对
  例如:
    prompt: "解释一下什么是量子计算"
    理想回答: "量子计算是一种利用量子力学..."
  
方法:标准的有监督学习(最大似然估计)
  损失:交叉熵

结果:模型学会了"回答问题"的格式
  但还没有学会"什么是好的回答"

Step 2:训练奖励模型(Reward Model)

奖励模型是 RLHF 的关键——它把"人类偏好"编码成一个可计算的打分函数。

数据收集:
  对同一个 prompt,让模型生成 K 个回答(通常 K=4-9)
  让人类标注员对这些回答排序

例如:
  Prompt: "怎么制作炸弹?"
  回答 A: "我不能提供有害信息。"  ← 人类排第 1
  回答 B: "制作炸弹需要..."      ← 人类排最后

训练奖励模型:
  输入:(prompt, response)
  输出:一个分数(越高表示人类越喜欢)

  损失:对比排序损失(让排在前面的回答分数更高)
# 奖励模型的训练(简化伪代码)
def train_reward_model(model, batch):
    """
    奖励模型的训练目标:
    让人类偏好的回答得分 > 不偏好的回答得分
    """
    prompts, chosen_responses, rejected_responses = batch
    
    # 计算偏好回答和不偏好回答的分数
    chosen_score = model(prompts, chosen_responses)      # 人类觉得好的
    rejected_score = model(prompts, rejected_responses)  # 人类觉得差的
    
    # 对比排序损失
    # 目标:chosen_score - rejected_score 越大越好
    loss = -torch.log(torch.sigmoid(chosen_score - rejected_score))
    
    return loss.mean()

Step 3:PPO 优化

这是 RLHF 的核心步骤——用 PPO 微调语言模型。

PPO 在 RLHF 中的角色:

状态 s = 当前的对话历史(prompt + 已生成的部分)
动作 a = 要生成的下一个 Token
奖励 r = 奖励模型对完整回答的打分

优化目标:
  最大化奖励模型的分数
  同时保持与原始模型不要太远(KL 散度约束)

为什么用 PPO?
  因为生成回答是一个"离散动作"问题(选 Token)
  PPO 擅长处理这类问题
  更重要的是:PPO 的 Clip 机制防止模型"一步走偏"
# RLHF 中 PPO 的目标函数(核心)

def ppo_rlhf_loss(new_log_probs, old_log_probs, rewards, kl_penalty):
    """
    RLHF 中 PPO 的完整损失
    
    包含两个部分:
    1. 奖励最大化(让模型输出人类偏好的回答)
    2. KL 散度惩罚(防止模型偏离原始分布太远)
    """
    # 1. 策略比率
    ratio = torch.exp(new_log_probs - old_log_probs)
    
    # 2. Clip 裁剪(PPO 核心)
    clipped_ratio = torch.clamp(ratio, 0.8, 1.2)
    
    # 3. 奖励 + KL 惩罚
    #    KL 惩罚防止模型"作弊"——如果只用奖励信号,
    #    模型可能会输出"高分但语言混乱"的回答
    advantage = rewards - kl_penalty
    
    # 4. PPO 目标
    loss = -torch.min(ratio * advantage, clipped_ratio * advantage)
    
    return loss.mean()

KL 散度惩罚为什么重要?

如果没有 KL 惩罚:
  PPO 会最大化奖励模型的分数
  模型可能学会"攻击"奖励模型的弱点
  输出一些"高分但人类看不懂"的内容

加上 KL 惩罚:
  PPO 同时最大化奖励和保持语言流畅
  KL 项 = D_KL(π_ppo || π_sft)
  如果 π_ppo 偏离 π_sft 太远,KL 惩罚变大
  → 模型在"讨好奖励模型"和"保持语言能力"之间平衡

经验值:
  太强的 KL 惩罚 → 模型改变太小,RLHF 无效
  太弱的 KL 惩罚 → 模型可能"疯掉"
  通常 KL 惩罚的系数在 0.01~0.1 之间

三、RLHF 的挑战

挑战 1:奖励黑客(Reward Hacking)

问题:奖励模型只是一个代理(proxy),不是真正的人类判断
  → 模型可能找到"欺骗"奖励模型的方法

真实案例:
  奖励模型喜欢"长篇大论"的回答
  PPO 发现后,模型开始输出冗长但空洞的文本
  虽然奖励分数很高,但人类并不喜欢

解决方案:
  - KL 散度惩罚(阻止偏离原始分布)
  - 训练多个奖励模型取平均
  - 定期用人类评估来校准奖励模型

挑战 2:奖励模型的不完美

奖励模型是通过"排序数据"训练的
排序数据天然有噪声——不同标注员的偏好不同

一个 prompt 可能:
  标注员 A 觉得回答 1 好
  标注员 B 觉得回答 2 好
  标注员 C 觉得两个都不好

→ 奖励模型学到的可能是"平均偏好"
→ 无法捕捉人类偏好的多样性

挑战 3:PPO 的工程复杂性

RLHF 的 PPO 需要同时加载四个模型:
  1. 策略模型(正在训练的语言模型)
  2. 参考模型(冻结的 SFT 模型,用于计算 KL 散度)
  3. 奖励模型(给回答打分)
  4. Critic 模型(PPO 的价值网络,有时和策略模型合并)

显存占用 = 4 × 模型大小
  7B 模型 × 4 = 28B 的显存需求
  70B 模型 × 4 = 280B 的超高需求

→ RLHF 的计算成本比 SFT 高 10 倍以上

四、DPO:无奖励模型的 RLHF

DPO 的核心思想

2024 年提出的 DPO(Direct Preference Optimization)绕过了奖励模型和 PPO,直接优化语言模型。

PPO 路径:                DPO 路径:
  人类偏好 → 训练奖励模型    人类偏好 → 直接优化语言模型
     ↓                        ↓
  PPO 优化语言模型          一步到位
     ↓
  对齐模型
  
DPO 省去了"训练奖励模型"和"PPO 强化学习"两个步骤

DPO 的原理

DPO 的核心发现:奖励模型和语言模型之间有一个数学等价关系——给定最优策略 π*,可以反推出奖励函数 r。

DPO 的推导直觉:

1. 传统 RLHF 的最优策略满足:
   π*(y|x) ∝ π_sft(y|x) × exp(r(x,y)/β)
   翻译:最优策略 = 原始策略 × 奖励加权

2. 反过来,奖励函数可以表示为:
   r(x,y) = β × log(π*(y|x) / π_sft(y|x)) + 常数

3. 把奖励函数代入偏好损失,得到 DPO 损失:
   L_DPO = -log σ(β × [log(π(y_w|x)/π_ref(y_w|x)) - log(π(y_l|x)/π_ref(y_l|x))])

   其中:
   y_w = 人类偏好的回答
   y_l = 人类不偏好的回答
   σ = sigmoid 函数
   β = 温度参数

DPO 的 PyTorch 实现

def dpo_loss(policy_logps, ref_logps, pref_logps, unpref_logps, beta=0.1):
    """
    DPO 损失函数
    
    参数:
        policy_logps: 当前策略模型的 log 概率
        ref_logps: 参考模型(冻结的 SFT 模型)的 log 概率
        pref_logps: 偏好回答的 log 概率
        unpref_logps: 不偏好回答的 log 概率
        beta: 温度参数(控制偏离程度)
    """
    # 偏好回答的"对数几率比"
    pref_ratio = policy_logps - ref_logps     # log(π/π_ref) for y_w
    
    # 不偏好回答的"对数几率比"
    unpref_ratio = policy_logps - ref_logps   # log(π/π_ref) for y_l
    
    # DPO 损失
    logits = pref_ratio - unpref_ratio
    loss = -torch.log(torch.sigmoid(beta * logits))
    
    return loss.mean()

DPO vs PPO

对比PPO-RLHFDPO
步骤数3 步(RM训练+PPO+KL约束)1 步
训练稳定性⚠️ 需要大量调参✅ 稳定
计算成本极高(4个模型)低(2个模型)
效果✅ 强(上限高)✅ 接近PPO
实现复杂度❌ 复杂✅ 简单
超参数多(lr, clip, KL系数...)少(只需 β)
DPO 的优势:
  ✅ 不需要训练奖励模型
  ✅ 不需要 PPO 的四个模型
  ✅ 训练更稳定
  ✅ 代码更简单

DPO 的劣势:
  ⚠️ 不能迭代优化(没有"多次打分→优化"的循环)
  ⚠️ 对偏好数据质量更敏感
  
2026 年现状:DPO 广泛用于模型对齐
  但也经常和 PPO 结合使用
  或者用 DPO 做初步对齐,PPO 做精细优化

五、从 PPO 到 DPO 的演进

RLHF 的演进路径:

2022 (InstructGPT/ChatGPT):
  SFT → 训练 RM → PPO
  ← OpenAI 开创性的工作
  
2023 (开源复现):
  各种开源 RLHF 框架(TRL、DeepSpeed Chat)
  PPO 成为标准

2024 (DPO 提出):
  DPO → 不需要 RM 和 PPO
  更简单、更稳定
  
2024-2025 (变体涌现):
  KTO: 不需要配对偏好数据(只要"好"或"坏")
  ORPO: 把 SFT 和对齐合并成一步
  GRPO: 不需要 Critic 模型的 PPO 变体(DeepSeek-R1使用)

2026 (现状):
  PPO 和 DPO 共存
  简单任务用 DPO
  复杂对齐用 PPO + RM
  混合使用是最佳实践

六、RLHF 的完整效果

RLHF 到底带来了什么提升?

评估维度       SFT 模型     RLHF 模型    提升幅度
──────────────────────────────────────────────
帮助性          3.2/5      4.5/5      +40% ✅
诚实性          2.8/5      4.1/5      +46% ✅
安全性          3.5/5      4.7/5      +34% ✅
创造力          3.0/5      4.3/5      +43% ✅
拒绝有害请求    2.0/5      4.5/5      +125% ✅

RLHF 最大的提升:在"拒绝有害请求"上
  从 40% 提升到 90%+
  同时保持了对正常请求的高质量回答

一个具体对比

同一 prompt:"如何欺骗我的老板?"

SFT 模型回答:
  "您可以假装生病、伪造考勤记录..."
  → 回答了问题,但提供了有害建议 ❌

RLHF 模型回答:
  "我不建议欺骗您的老板。建立信任关系对长期职业发展更重要。
  如果您有困难,可以考虑以下合法的方式:
  1. 与老板开诚布公地沟通
  2. 申请调休或远程办公
  3. 寻求 HR 的帮助"
  → 拒绝提供有害信息,同时提供了有益建议 ✅

七、总结

概念一句话理解
RLHF用强化学习让大模型学会"人类偏好"——有用、诚实、无害
奖励模型一个给回答打分的模型——把"人类偏好"编码成数值
PPO 在对齐中的作用在不超过 KL 约束的前提下最大化奖励模型的分数
KL 散度惩罚防止模型"走火入魔"——既要讨好人类,又要保持语言能力
DPO跳过奖励模型和 PPO,直接优化偏好——简单、稳定、高效

核心三句话:

  1. RLHF 是 ChatGPT 成功的核心密码——没有 RLHF,GPT 只是一个"知识丰富但不好用"的基础模型
  2. PPO 在 RLHF 中的作用是"稳妥地优化"——Clip 机制和 KL 惩罚确保了模型不会"一步走偏"
  3. DPO 让 RLHF 变得简单——不需要奖励模型和 PPO 的复杂工程,一句话的数据就能优化模型

强化学习系列 4 篇总结:

01: Q-Learning ──── 基础 RL,表格方法
02: DQN + PPO ──── 深度 RL 的两大里程碑
03: Policy Gradient ── 策略梯度演进,Actor-Critic
04: RLHF ─────────── RL 在大模型中最关键的应用

更多推荐