Skip to content

RLHF 与 DPO (对齐技术)


探索 RLHF 三阶段流程,对比 DPO 的简化方案。

🎯 RLHF 流程可视化

📚
SFT
监督微调
⚖️
RM
奖励模型训练
🎮
PPO
强化学习优化
Stage 1: SFT
📥 输入
  • 预训练模型
  • 高质量对话数据
⚙️ 过程
  • 学习对话格式
  • 学习指令跟随
  • 输出: π_SFT
📤 输出
  • SFT 模型
RLHF vs DPO
特性RLHFDPO
需要 RM✅ 是❌ 否
需要 RL✅ PPO❌ 直接优化
训练稳定性🟡 较难🟢 简单
代表模型ChatGPTLlama 2

💡 点击阶段查看详情,或点击播放自动演示


一句话定义:RLHF (Reinforcement Learning from Human Feedback) 和 DPO (Direct Preference Optimization) 是让大语言模型对齐人类价值观的关键技术,使模型输出更有帮助、更安全、更诚实。

  • RLHF: 通过人类反馈训练奖励模型,再用强化学习优化 LLM。
  • DPO: 跳过奖励模型,直接从偏好数据优化 LLM(更简单高效)。
  • 对齐 (Alignment): 让 AI 的行为符合人类意图和价值观。

想象你在训练一只聪明的狗:

阶段类比AI 对应
预训练狗天生会很多动作GPT 学会了语言能力
SFT教狗基本指令(坐、握手)指令微调,学会对话格式
RLHF给狗零食奖励好行为用奖励模型强化好回答
DPO直接告诉狗”这样好,那样不好”从偏好对直接学习

问题示例
有害内容教用户制作危险物品
幻觉一本正经地胡说八道
不服从不回答问题,说一堆废话
偏见输出歧视性内容
用户: 如何制作炸弹?
❌ 未对齐: 首先你需要准备以下材料...
✅ 已对齐: 抱歉,我无法提供任何关于制造危险物品的信息。
如果你对化学感兴趣,我可以推荐一些安全的实验...

┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Stage 1 │ │ Stage 2 │ │ Stage 3 │
│ SFT │ → │ Reward │ → │ PPO │
│ 监督微调 │ │ 奖励模型 │ │ 强化学习 │
└─────────────┘ └─────────────┘ └─────────────┘

用高质量对话数据微调预训练模型:

# 示例数据格式
{
"prompt": "解释什么是黑洞",
"response": "黑洞是一种..." # 人工编写的高质量回答
}

训练一个模型给回答打分:

奖励模型
rθ(x,y)r_\theta(x, y)
  • xx: 用户输入 (prompt)
  • yy: 模型输出 (response)
  • rθr_\theta: 输出一个标量分数,越高越好

训练数据:人类对比两个回答,选择更好的那个。

Prompt: "如何学习编程?"
Response A: "多写代码,从简单项目开始..." ← 人类选择 ✓
Response B: "编程很难,你可能学不会..."

损失函数

Bradley-Terry 偏好损失
L=logσ(rθ(x,yw)rθ(x,yl))\mathcal{L} = -\log\sigma(r_\theta(x, y_w) - r_\theta(x, y_l))
  • ywy_w: 人类偏好的回答 (winner)
  • yly_l: 人类不偏好的回答 (loser)
  • σ\sigma: Sigmoid 函数
  • 目标: 让 r(yw)>r(yl)r(y_w) > r(y_l)

用奖励模型指导 LLM 优化:

RLHF 目标函数
maxπEx,y[rθ(x,y)]βKL(ππref)\max_\pi \mathbb{E}_{x,y}[r_\theta(x,y)] - \beta \cdot \text{KL}(\pi \| \pi_{\text{ref}})
  • π\pi: 当前策略(LLM)
  • rθr_\theta: 奖励模型打分
  • KL\text{KL}: KL 散度,防止模型偏离太远
  • β\beta: 平衡系数

DPO 的核心洞察:奖励模型可以被隐式表示,不需要单独训练!

DPO 损失函数
LDPO=logσ(βlogπθ(ywx)πref(ywx)βlogπθ(ylx)πref(ylx))\mathcal{L}_{\text{DPO}} = -\log\sigma\left(\beta \log\frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log\frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)}\right)
  • 直接在偏好数据上优化 LLM
  • 不需要训练奖励模型
  • 不需要 PPO 采样
  • 训练更稳定,超参更少
特性RLHFDPO
复杂度高(3阶段)低(1阶段)
训练稳定性较差(RL 不稳定)
计算资源多(需要多个模型)
效果优秀接近 RLHF
代表应用ChatGPT, ClaudeLlama 2, Zephyr

import torch
import torch.nn.functional as F
def dpo_loss(
policy_chosen_logps: torch.Tensor, # π(y_w|x)
policy_rejected_logps: torch.Tensor, # π(y_l|x)
ref_chosen_logps: torch.Tensor, # π_ref(y_w|x)
ref_rejected_logps: torch.Tensor, # π_ref(y_l|x)
beta: float = 0.1
) -> torch.Tensor:
"""
DPO 损失函数
Args:
policy_*_logps: 当前策略的 log 概率
ref_*_logps: 参考模型的 log 概率
beta: 温度系数
"""
# 计算 log ratio
chosen_logratios = policy_chosen_logps - ref_chosen_logps
rejected_logratios = policy_rejected_logps - ref_rejected_logps
# DPO 损失
losses = -F.logsigmoid(beta * (chosen_logratios - rejected_logratios))
return losses.mean()
# 使用 TRL 库更简单
from trl import DPOTrainer
trainer = DPOTrainer(
model=model,
ref_model=ref_model,
beta=0.1,
train_dataset=dataset,
tokenizer=tokenizer,
)
trainer.train()



InstructGPT 论文

OpenAI 的 RLHF 开创性工作

阅读

DPO 论文

Direct Preference Optimization

阅读

TRL 库

Hugging Face 的 RLHF/DPO 实现

GitHub