RLHF 与大模型对齐:从 PPO 到 DPO
·
摘要: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-RLHF | DPO |
|---|---|---|
| 步骤数 | 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,直接优化偏好——简单、稳定、高效 |
核心三句话:
- RLHF 是 ChatGPT 成功的核心密码——没有 RLHF,GPT 只是一个"知识丰富但不好用"的基础模型
- PPO 在 RLHF 中的作用是"稳妥地优化"——Clip 机制和 KL 惩罚确保了模型不会"一步走偏"
- DPO 让 RLHF 变得简单——不需要奖励模型和 PPO 的复杂工程,一句话的数据就能优化模型
强化学习系列 4 篇总结:
01: Q-Learning ──── 基础 RL,表格方法
02: DQN + PPO ──── 深度 RL 的两大里程碑
03: Policy Gradient ── 策略梯度演进,Actor-Critic
04: RLHF ─────────── RL 在大模型中最关键的应用
更多推荐

所有评论(0)