30秒快速回答: RLHF 是用「人类偏好」来训练 AI 的方法——人类先对 AI 的回答打分(A 比 B 好),再用这些分数训练一个「奖励模型」来预测人类会打多少分,最后用强化学习(PPO)让 AI 学会「怎样的回答能得高分」。这就像训练一只狗:做对了给零食,做错了不给,久而久之学会什么是「好行为」。
RLHF 的三个阶段
阶段一:有监督微调 (SFT)
[高质量问答对] → 训练 → 基础对话模型
↓
阶段二:奖励模型训练 (RM)
[人类对多个回答排序] → 训练 → 奖励模型
(预测人类会给多少分)
↓
阶段三:强化学习 (PPO)
[让 AI 生成回答 → 奖励模型打分 → PPO 优化]
(让 AI 学会「怎样才能得高分」)
阶段一:SFT(已在预训练阶段完成)
# 概念示意
model = pretrained_llm()
data = [
{"input": "解释一下 RLHF", "output": "RLHF 是..."},
# ... 数千条高质量问答
]
model = fine_tune(model, data)
阶段二:训练奖励模型
核心思想:人类不需要给「绝对分数」,只需要告诉模型「A 比 B 好」:
# 人类标注数据格式
preferences = [
{
"prompt": "如何学习 AI?",
"chosen": "建议从 Python 和数学基础开始...",
"rejected": "AI 很简单,三天就能学会..."
},
# ... 数万条偏好对
]
# 奖励模型训练(Bradley-Terry 排序损失)
def reward_model_loss(r_chosen, r_rejected):
"""
最小化:-log(sigmoid(r_chosen - r_rejected))
目标:让「好回答」的奖励 >「差回答」的奖励
"""
return -torch.log(torch.sigmoid(r_chosen - r_rejected))
阶段三:PPO 优化
# PPO (Proximal Policy Optimization) 简化示意
for episode in range(n_episodes):
# 1. AI 生成一个回答
response = policy_model.generate(prompt)
# 2. 奖励模型打分
reward = reward_model(prompt, response)
# 3. KL 散度惩罚(防止偏离太远)
kl_penalty = KL_divergence(policy_model, reference_model)
# 4. 综合奖励
total_reward = reward - beta * kl_penalty
# 5. 用 PPO 更新策略
policy_model = ppo_update(policy_model, total_reward)
DPO:RLHF 的简化替代
为什么需要 DPO?
RLHF 的痛点:
1. 需要单独训练一个奖励模型
2. PPO 训练不稳定(4 个模型同时跑)
3. 超参数敏感(beta, clip 等)
DPO(Direct Preference Optimization)解法:
1. 不需要奖励模型!直接从偏好数据训练
2. 只需 1 个模型的 forward pass
3. 数学上等价于 PPO,但实现简单一个数量级
RLHF vs DPO 对比
| 维度 | RLHF (PPO) | DPO |
|---|---|---|
| 需要奖励模型? | 是 | 否 |
| 训练复杂度 | 高(4 模型) | 低(1 模型) |
| 训练稳定性 | 波动大 | 稳定 |
| 效果上限 | 理论上更高 | 接近但略低 |
| 适用场景 | 大公司/研究 | 个人/小团队 |
DPO 实战代码
from transformers import AutoModelForCausalLM, AutoTokenizer
from trl import DPOTrainer, DPOConfig
from datasets import Dataset
# 1. 加载基础模型
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3-8B")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3-8B")
# 2. 准备偏好数据
data = {
"prompt": [
"如何学习编程?",
"AI 会取代人类吗?"
],
"chosen": [
"建议从 Python 入门,逐步学习数据结构和算法...",
"AI 会取代部分重复性工作,但创造性和人际工作仍需要人..."
],
"rejected": [
"编程很简单,看视频就会",
"AI 马上会取代全人类"
]
}
dataset = Dataset.from_dict(data)
# 3. 配置 DPO 训练
training_args = DPOConfig(
output_dir="./dpo-model",
per_device_train_batch_size=4,
learning_rate=5e-6,
num_train_epochs=3,
beta=0.1, # KL 惩罚系数
logging_steps=10,
)
# 4. 训练
trainer = DPOTrainer(
model=model,
args=training_args,
train_dataset=dataset,
tokenizer=tokenizer,
)
trainer.train()
# 5. 保存对齐后的模型
trainer.save_model("./dpo-model-final")
print("DPO 训练完成!模型已对齐人类偏好。")
RLHF 在 2026 年的演进
| 方向 | 进展 | 说明 |
|---|---|---|
| DPO 变体 | ORPO、KTO、IPO | 越来越简单的对齐方法 |
| 合成偏好数据 | 最强模型生成偏好 | 减少对人类标注的依赖 |
| 多目标对齐 | 安全性 + 创意性 + 准确性 | 不止「有用」,还要「安全」 |
| 持续对齐 | 在线 RLHF | 模型部署后持续接收反馈更新 |
常见问题
Q: RLHF 和 RLAIF 有什么区别?
RLHF 用「人类」反馈(人工标注),RLAIF 用「AI」反馈(如 GPT-4 打分)。RLAIF 成本更低、速度更快,但可能存在 AI 偏见。实际项目中常用「人类 + AI 混合反馈」。
Q: 不做 RLHF 的模型会怎样?
会「跑偏」——生成有害内容、胡编乱造、不符合人类预期。最典型的例子:早期 GPT-3 不做 RLHF 时,经常生成种族歧视、暴力等不安全内容。
Q: DPO 比 RLHF 简单那么多,为什么还有人用 RLHF?
DPO 依赖的偏好数据假设更强(要求偏好数据完全准确),实际数据可能不满足。大规模场景下,RLHF 的奖励模型可以持续更新,更灵活。
下一步建议: 用 HuggingFace TRL 库的 DPOTrainer,拿 100 条你标注的「好回答 vs 差回答」对,训练一个你自己的对齐模型。