RLHF训练流程
约 1515 字大约 5 分钟
rlhfalignment
2025-09-02
RLHF(Reinforcement Learning from Human Feedback)是将大语言模型与人类偏好对齐的核心技术。本文详细介绍 RLHF 的三个阶段以及 DPO、RLAIF 等替代方案。
RLHF 全景
阶段一:监督微调(SFT)
使用高质量的指令-回复对数据集对预训练模型进行微调,使模型学会遵循指令的格式和基本能力。
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from trl import SFTTrainer
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
# SFT 数据格式
sft_data = [
{"prompt": "解释什么是机器学习", "completion": "机器学习是人工智能的一个分支..."},
{"prompt": "写一首关于春天的诗", "completion": "春风拂面暖洋洋..."},
]
training_args = TrainingArguments(
output_dir="./sft_output",
num_train_epochs=3,
per_device_train_batch_size=4,
learning_rate=2e-5,
warmup_ratio=0.1,
bf16=True,
gradient_accumulation_steps=4,
)
trainer = SFTTrainer(
model=model,
args=training_args,
train_dataset=sft_dataset,
tokenizer=tokenizer,
max_seq_length=2048,
)
trainer.train()SFT 数据质量至关重要。LIMA 论文表明,仅 1000 条精心标注的高质量数据就能训练出强大的指令跟随模型。
阶段二:训练奖励模型(Reward Model)
奖励模型学习人类对回复质量的偏好排序。给定同一个 prompt 的两个回复,人类标注者选择更好的一个。
数据收集
对每个 prompt,采样多个回复,人类标注者进行两两比较或排序:
Prompt: "如何提高代码质量?"
Response A (chosen): "提高代码质量可以从以下几方面入手:1. 代码审查..."
Response B (rejected): "写好代码就行了。"训练目标
奖励模型使用 Bradley-Terry 模型,优化偏好对的排序损失:
LRM=−logσ(rθ(x,yw)−rθ(x,yl))
其中 yw 是偏好的回复,yl 是被拒绝的回复。
from trl import RewardTrainer, RewardConfig
from transformers import AutoModelForSequenceClassification
# 奖励模型基于分类模型
reward_model = AutoModelForSequenceClassification.from_pretrained(
"meta-llama/Llama-2-7b-hf",
num_labels=1, # 输出标量奖励分数
)
reward_config = RewardConfig(
output_dir="./reward_model",
num_train_epochs=1,
per_device_train_batch_size=4,
learning_rate=1e-5,
bf16=True,
max_length=2048,
)
# 偏好数据集包含 chosen 和 rejected 字段
trainer = RewardTrainer(
model=reward_model,
args=reward_config,
tokenizer=tokenizer,
train_dataset=preference_dataset,
)
trainer.train()阶段三:PPO 优化
使用 PPO(Proximal Policy Optimization)算法,以奖励模型的输出作为奖励信号,优化语言模型的生成策略。
PPO 的优化目标:
LPPO=Ex∼D,y∼πθ[rϕ(x,y)−β⋅DKL(πθ(y∣x)∥πref(y∣x))]
KL 散度惩罚项防止策略模型偏离 SFT 模型太远(避免 reward hacking)。
from trl import PPOTrainer, PPOConfig, AutoModelForCausalLMWithValueHead
# 策略模型(带 value head)
policy_model = AutoModelForCausalLMWithValueHead.from_pretrained("./sft_output")
ref_model = AutoModelForCausalLMWithValueHead.from_pretrained("./sft_output")
ppo_config = PPOConfig(
learning_rate=1e-5,
batch_size=64,
mini_batch_size=16,
gradient_accumulation_steps=4,
ppo_epochs=4,
kl_penalty="kl",
init_kl_coef=0.2, # KL 惩罚系数 β
target_kl=6.0,
)
ppo_trainer = PPOTrainer(
config=ppo_config,
model=policy_model,
ref_model=ref_model,
tokenizer=tokenizer,
dataset=prompt_dataset,
)
# 训练循环
for batch in ppo_trainer.dataloader:
# 1. 生成回复
query_tensors = batch["input_ids"]
response_tensors = ppo_trainer.generate(query_tensors, max_new_tokens=256)
# 2. 计算奖励
rewards = reward_model(query_tensors, response_tensors)
# 3. PPO 更新
stats = ppo_trainer.step(query_tensors, response_tensors, rewards)
print(f"Reward: {stats['ppo/mean_scores']:.4f}, KL: {stats['objective/kl']:.4f}")DPO(Direct Preference Optimization)
DPO(Rafailov et al., 2023)跳过了奖励模型和 PPO 训练,直接从偏好数据优化策略模型。它证明了 RLHF 的优化目标可以转化为一个简单的分类损失。
LDPO=−logσ(βlogπref(yw∣x)πθ(yw∣x)−βlogπref(yl∣x)πθ(yl∣x))
DPO 的优势:
- 不需要训练单独的奖励模型
- 不需要复杂的 PPO 训练循环
- 训练更稳定,超参数更少
- 效果与 RLHF 相当甚至更好
from trl import DPOTrainer, DPOConfig
dpo_config = DPOConfig(
output_dir="./dpo_output",
beta=0.1, # 温度参数
learning_rate=5e-7,
num_train_epochs=3,
per_device_train_batch_size=4,
bf16=True,
loss_type="sigmoid", # sigmoid 或 hinge
max_length=2048,
max_prompt_length=512,
)
dpo_trainer = DPOTrainer(
model=policy_model,
ref_model=ref_model,
args=dpo_config,
tokenizer=tokenizer,
train_dataset=preference_dataset, # 包含 prompt, chosen, rejected
)
dpo_trainer.train()Constitutional AI 与 RLAIF
Constitutional AI(Anthropic)让 AI 自己根据一组原则(宪法)来评估和改进回复,减少对人类标注的依赖。
RLAIF(Reinforcement Learning from AI Feedback)用强大的 AI 模型替代人类标注者生成偏好数据:
- 给定 prompt 和两个回复
- 用 GPT-4 等模型判断哪个更好
- 用 AI 偏好数据训练奖励模型或 DPO
# RLAIF 偏好标注示例
def generate_ai_preference(prompt, response_a, response_b, judge_model):
judge_prompt = f"""请评估以下两个回复的质量,选择更好的一个。
问题: {prompt}
回复A: {response_a}
回复B: {response_b}
请从有用性、准确性、安全性三个维度评估,输出 "A" 或 "B"。"""
result = judge_model.generate(judge_prompt)
return "chosen_a" if "A" in result else "chosen_b"训练数据收集
高质量偏好数据是 RLHF 成功的关键:
| 数据源 | 特点 |
|---|---|
| 专业标注团队 | 质量最高,成本最高 |
| 众包平台 | 规模大,质量参差不齐 |
| AI 反馈 (RLAIF) | 成本低,存在系统性偏差 |
| 用户反馈(点赞/踩) | 真实分布,噪声大 |
标注指南应明确定义偏好标准:有用性、诚实性、无害性、遵循指令的程度等。
评估
| 评估方法 | 说明 |
|---|---|
| 人类评估 | 黄金标准,成本高 |
| MT-Bench | GPT-4 自动评分,多轮对话 |
| AlpacaEval | 自动评估指令跟随能力 |
| Arena (Chatbot Arena) | 真实用户盲评,Elo 排名 |
| 安全性测试 | 红队测试,毒性检测 |
总结
RLHF 三阶段流程(SFT -> 奖励模型 -> PPO)是 ChatGPT 等产品的核心训练方法。DPO 简化了这一流程,成为越来越多模型的首选方案。RLAIF 和 Constitutional AI 进一步降低了对人类标注的依赖。无论采用哪种方法,高质量的偏好数据和可靠的评估体系都是成功的关键。
贡献者
更新日志
9f6c2-feat: organize wiki content and refresh site setup于