【学习笔记】RLHF 与 DPO:让模型对齐人类偏好的两条路(8/35)
上一篇我们讲完 SFT。SFT 后的模型已经会回答问题了——但它真的答得好吗下面这种情况你一定遇到过模型回答正确但啰嗦——明明一句话能说完硬要写五段模型过度自信——把不知道的事情编得头头是道幻觉模型安全感差——用户稍微一引导就说出有害内容• 模型情商低——技术上正确但毫无温度这些都是 SFT 解决不了的问题。SFT 教模型怎么做格式、流程但教不了怎么做得好偏好、价值观、安全性。这就是对齐Alignment出现的原因。从 ChatGPT 引爆开始对齐成为了大模型工程的核心环节。如果你做过相关工作下面这些问题应该不陌生RLHF 听起来很复杂是不是不做就上不了线DPO 比 RLHF 简单太多为什么 OpenAI/Anthropic 仍然用 RLHF偏好数据怎么收集标注员标 10 万条要多少钱我训完 DPO 模型在通用 benchmark 上掉点正常吗DeepSeek R1 用的 GRPO 是什么我能用吗读完本文你将能1. 理解 RLHF 的三阶段流程和为什么它「难」2. 理解 DPO 如何用一个简单 loss 函数替代整个 RLHF 流程3. 掌握 GRPO 作为推理模型对齐的新范式4. 选对适合自己业务的对齐方法5. 跑通一个 DPO 的实战脚本我们开始。一、为什么需要对齐从「能用」到「好用」1.1 对齐的三大目标HHHAnthropic 把对齐的目标总结成3HHelpful ── 有用真的解决问题 Harmless ── 无害不输出有害内容 Honest ── 诚实知之为知之不胡编这三个目标互相有张力• 过度 Helpful → 帮助越界教用户做坏事• 过度 Harmless → 拒绝过度连怎么切番茄都拒答• 过度 Honest → 用户体验差每句话都加我不确定工程上要找的是三者之间的平衡点——这是单纯监督学习做不到的因为没有标准答案只有偏好。1.2 SFT 后还有什么问题来看一个具体场景——你训了一个客服助手SFT 阶段用了 1 万条优质对话。结果上线后现象SFT 不能解决的原因用户问如何破解系统模型详细解释SFT 数据里没这种 case模型不知道要拒绝用户表达不满模型不会安抚SFT 数据是问什么答什么风格模型回复冗长用户体验差简洁是偏好不是规则模型对未知问题强行回答SFT 阶段每条数据都必须有答案SFT 数据本质是单点最佳答案但真实世界里好回答和坏回答之间没有非黑即白的界限——只有相对偏好。1.3 偏好数据对齐的核心原料对齐学习需要的数据格式不再是指令-响应对而是偏好对preference pair{ prompt: 我感觉今天好累, chosen: 听起来你今天确实辛苦了。要不要先休息一下喝杯水, rejected: 建议你每天保证 8 小时睡眠并进行适度运动... }标注员看两个回复选哪个更好。核心难度• 偏好是主观的需要大量标注员投票• 标注成本高专业标注员每小时 $20-50• 1 万条偏好对成本约 $5K-15K• 高质量偏好数据是当下大模型最贵的资产之一接下来我们看怎么把这些偏好数据喂给模型。二、RLHF经典三阶段RLHF 是 OpenAI 在 InstructGPT2022中提出并通过 ChatGPT 让全世界知道的方法。它分三个阶段阶段 1SFT ── 第 7 篇讲过 阶段 2训练奖励模型 (RM) 阶段 3用强化学习PPO优化策略--------------------------------------注RLHFReinforcement Learning from Human Feedback中文全称为基于人类反馈的强化学习是当前大语言模型LLM实现人类价值观对齐、让模型输出更符合人类需求与偏好的核心技术。---------------------------------------2.1 阶段 1 回顾SFT第 7 篇已详述。RLHF 的起点是一个已经 SFT 过的 Base 模型因为我们需要一个会基本对话的策略起点。2.2 阶段 2训练奖励模型Reward Model目标训练一个模型给定 (prompt, response)输出一个标量 reward——衡量这个 response 有多好。练数据上节讲的偏好对。训练方式输入(prompt, chosen_response, rejected_response) RM 计算r_chosen RM(prompt, chosen) r_rejected RM(prompt, rejected) Loss -log σ(r_chosen - r_rejected)也就是让 chosen 的 reward 比 rejected 高用 sigmoid 把差值变成 0-1 之间的概率。关键工程细节RM 通常和 SFT 模型同等规模70B SFT 配 70B RMRM 也可以小一些节省成本但容易给出有偏的 reward要训出通用偏好而不是特定 prompt 偏好——所以数据要覆盖广泛2.3 阶段 3PPO 强化学习目标让 SFT 模型叫做策略 π生成的回复能在 RM 上拿到更高 reward。朴素思路让 π 生成一个 response用 RM 打分用 reward 训练 π让高 reward 的 response 概率提升问题直接最大化 reward 会让模型走极端——找到 RM 的漏洞输出 RM 觉得好但实际很差的回复。这叫reward hacking。解决方案加 KL 散度约束让 π 不要离原 SFT 模型太远目标maximize E[r(x,y)] - β · KL(π || π_SFT) ↑ ↑ RM 奖励 不要乱跑惩罚β是超参控制探索 vs 稳定的权衡。完整 PPO 训练循环for step in range(N): # 1. 用当前策略 π 生成回复 responses π.generate(prompts) # 2. 计算 reward rewards RM(prompts, responses) # 3. 计算 KL 惩罚参考 SFT 模型 kl_penalty KL(π, π_SFT, responses) # 4. 总 reward total_reward rewards - β * kl_penalty # 5. 用 PPO 优化 π π ppo_update(π, prompts, responses, total_reward)2.4 RLHF 的工程地狱RLHF 之所以让无数团队望而生畏是因为它有5 个臭名昭著的工程难点难点 1显存爆炸PPO 训练时同时需要在显存里加载Policy 模型π在训练Reference 模型π_SFT计算 KLReward 模型RM打分Critic 模型V估算价值函数总共4 个 70B 模型同时在显存里——你需要 8×8 64 张 H100 起步。难点 2训练不稳定PPO 是著名的难调——超参敏感、容易崩溃。Loss spike、reward 爆炸、模型胡言乱语都很常见。难点 3Reward Hacking模型很快学会骗 RM——比如发现 RM 喜欢长回复就开始无脑加废话。Anthropic 公开过一个有趣的案例他们的 RM 偏好看起来自信的回答于是 PPO 后的模型变得过度自信——明明不知道也要装作知道。难点 4分布漂移策略 π 在训练中不断变化但 RM 是固定的训练几千步后 RM 就给不出可靠分数了——因为 π 生成的分布已经远离了 RM 训练时见过的分布。对策迭代更新 RM很贵或限制 KL保守。难点 5成本完整跑一次 RLHF 比 SFT 贵3-5 倍。资源不足时效果还不如不做。三、DPO让对齐变简单3.1 DPO 的革命跳过 RMDPODirect Preference Optimization2023.5 Stanford 提出做了一件极其聪明的事从数学上证明偏好优化的最优解可以直接用 SFT 模型 偏好数据写出来——不需要训练 RM不需要 PPO。也就是说RLHF 的两阶段RM PPO可以塌缩成一个简单的损失函数。3.2 数学推导简化版RLHF 的目标maximize E_y[r(x,y)] - β · KL(π || π_ref)这个目标有一个解析解π*(y|x) π_ref(y|x) · exp(r(x,y)/β) / Z(x)把 reward 反解出来r(x,y) β · log(π*(y|x) / π_ref(y|x)) β · log Z(x)代入 Bradley-Terry 偏好模型P(y_w y_l) σ(r(x,y_w) - r(x,y_l))P(y_w y_l) σ(β · log(π(y_w|x)/π_ref(y_w|x)) - β · log(π(y_l|x)/π_ref(y_l|x)))最大化这个似然就得到 DPO lossL_DPO -log σ(β · log(π(y_w|x)/π_ref(y_w|x)) - β · log(π(y_l|x)/π_ref(y_l|x)))最关键的事这个 loss 里没有 RM、没有 PPO只需要偏好对 模型 forward。3.3 DPO 训练流程for batch in dataloader: prompts, chosen, rejected batch # 计算 4 个 logp logp_chosen_policy π(chosen | prompts) logp_rejected_policy π(rejected | prompts) logp_chosen_ref π_ref(chosen | prompts) logp_rejected_ref π_ref(rejected | prompts) # 计算 implicit reward r_chosen β * (logp_chosen_policy - logp_chosen_ref) r_rejected β * (logp_rejected_policy - logp_rejected_ref) # DPO loss loss -F.logsigmoid(r_chosen - r_rejected).mean() loss.backward() optimizer.step()就这么简单。3.4 DPO 的优势维度RLHF (PPO)DPO阶段数31训练显存4 个模型2 个模型policy ref训练稳定性差好超参敏感度高低工程复杂度极高中训练成本1×0.3-0.5×调试难度难中实操结果在大多数 benchmark 上DPO 效果接近甚至略超 PPO。这就是为什么2023 年后开源社区基本全面转向 DPO——Llama 3、Qwen、Zephyr、Mistral 等都用 DPO 系列。3.5 DPO 的局限DPO 也不是没缺点1. 探索能力弱PPO 会让模型主动尝试新输出DPO 只能从给定的偏好对里学。如果数据不够丰富模型学不到新行为。2. 对偏好数据质量极敏感PPO 有 RM 作为缓冲可以平滑掉一些标注噪声。DPO 直接用原始偏好对标注错误会被 1:1 学进去。3. 容易过拟合 reference 分布如果偏好数据的 chosen 都偏离 ref 模型较远DPO 会过度拉伸 policy导致通用能力下降。4. 离线方法的天然弱点DPO 是 offline 方法看不到自己生成的样本。如果模型分布漂移再次训练效果递减。3.6 DPO 的家族DPO 提出后涌现了大量改进版本方法关键改进适用场景DPO原版通用IPO改 loss 减少过拟合偏好数据噪声大KTO不需要成对数据只要好/坏标签单点反馈数据SimPO去掉 ref 模型更简洁显存极限ORPO把 SFT 和 DPO 融合一阶段一步到位NCA改进探索推理任务当下生产主流DPO 部分变种KTO 处理单点反馈、SimPO 节省显存。四、新一代GRPODeepSeek R1 的核心2024 年 DeepSeek 发表了DeepSeekMath论文提出了GRPOGroup Relative Policy Optimization。这是 PPO 的简化版本省掉了 critic 模型——而 DeepSeek R1 正是基于 GRPO 训练出来的。4.1 GRPO 的核心改动回忆 PPO 需要的 4 个模型policy、reference、reward、criticV 函数。critic 模型干什么估计每个 token 位置的价值用于减少梯度方差。但 critic 模型本身要训且占显存。GRPO 的做法不用 critic 模型直接用一组样本的相对优势来代替价值估计。具体来说对同一个 prompt让 policy 生成 K 个不同回复比如 K8然后对组内每个回复 i: reward_i RM(prompt, response_i) 组内平均 reward mean(rewards) 组内标准差 std(rewards) 每个回复的 advantage: advantage_i (reward_i - mean) / std用这个 advantage 替代 PPO 中的 critic 估值做策略更新。4.2 为什么 GRPO 适合推理模型DeepSeek R1 训练的是推理任务——数学、代码、逻辑题。这类任务有几个特点奖励信号稀疏但明确——答案对或错可以自动评估同一个 prompt 容易生成多样化回复不同思考路径不需要复杂偏好建模对错为主GRPO 完美契合• 不需要 critic省 1 个 70B 模型显存• 不需要复杂偏好对用规则验证答案• 组内对比让好的推理路径自然脱颖而出4.3 R1 的训练秘密DeepSeek R1 实际上是多阶段训练DeepSeek-V3 Base ↓ [R1-Zero] 直接做 GRPO数学/代码题 ↓ 观察到模型自然出现反思、验证等推理行为 ↓ [R1] 加入 SFT 数据 多轮 GRPO ↓ 最终 R1超过 o1 水平的开源推理模型R1-Zero 的惊人发现纯 RL无 SFT训练能让模型自发出现反思aha moment——比如生成到一半发现错误自动说等等让我重新想想。这个发现震撼了行业——RL 不仅能优化还能让模型涌现新行为。 推理模型训练细节详见系列第 32 篇推理模型原理。五、对比与决策5.1 三种方法横向对比维度RLHF (PPO)DPOGRPO提出时间202220232024复杂度★★★★★★★★★★模型数量422-3数据类型偏好对偏好对可验证奖励训练稳定性差好中探索能力强弱强适合任务主观偏好主观偏好客观对错代表用户OpenAI / AnthropicLlama 3 / QwenDeepSeek R15.2 决策树你的对齐场景属于哪种 │ ├─ 主观偏好语气、风格、有用性 │ │ │ ├─ 资源充足、追求极致效果 → RLHF │ └─ 想简单稳定 → DPO ⭐推荐 │ ├─ 客观正确性数学、代码、推理 │ └─ GRPO 可验证奖励 │ └─ 没有偏好对只有赞/踩反馈 └─ KTODPO 变种通用建议80% 业务场景下DPO 是最佳起点。等做完 DPO发现效果还不够再考虑上 PPO 或 GRPO。5.3 实战用 TRL 做 DPO 训练 DPO 训练实战脚本基于 TRL 库 依赖pip install trl transformers peft datasets bitsandbytes accelerate import torch from datasets import load_dataset from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig from peft import LoraConfig from trl import DPOTrainer, DPOConfig MODEL_NAME Qwen/Qwen3-7B-Instruct# 已经 SFT 过的模型 # 1. 量化配置QLoRA 风格做 DPO bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_quant_typenf4, bnb_4bit_compute_dtypetorch.bfloat16, ) # 2. 加载 policy 和 reference 模型 policy_model AutoModelForCausalLM.from_pretrained( MODEL_NAME, quantization_configbnb_config, device_mapauto ) ref_model AutoModelForCausalLM.from_pretrained( MODEL_NAME, quantization_configbnb_config, device_mapauto ) tokenizer AutoTokenizer.from_pretrained(MODEL_NAME) # 3. LoRA 配置让训练更省显存 peft_config LoraConfig( r64, lora_alpha128, lora_dropout0.05, biasnone, task_typeCAUSAL_LM, target_modules[q_proj, k_proj, v_proj, o_proj], ) # 4. 加载偏好数据 # 格式{prompt: ..., chosen: ..., rejected: ...} dataset load_dataset(Anthropic/hh-rlhf, splittrain[:5000]) # 5. DPO 训练配置 dpo_config DPOConfig( output_dir./dpo-qwen3-7b, num_train_epochs1, per_device_train_batch_size2, gradient_accumulation_steps8, learning_rate5e-6, # DPO 学习率比 SFT 低一个数量级 lr_scheduler_typecosine, warmup_ratio0.1, beta0.1, # DPO 的 KL 控制超参 max_length2048, max_prompt_length1024, bf16True, logging_steps10, save_steps200, ) # 6. 训练 trainer DPOTrainer( modelpolicy_model, ref_modelref_model, argsdpo_config, train_datasetdataset, tokenizertokenizer, peft_configpeft_config, ) trainer.train() trainer.save_model(./dpo-qwen3-7b-final)几个关键超参解读learning_rate5e-6DPO 比 SFT 的 LR 低 1-2 个数量级这是新手最常出错的点beta0.1β 越大约束越强模型变化越少越小越激进但容易跑偏num_train_epochs1DPO 容易过拟合1-2 epoch 通常已经够5.4 评估 DPO 效果训完后必须用多维度评估# 1. 偏好准确率hold-out 测试集 # 看 policy 给 chosen 的概率 是否 给 rejected 的概率 acc (policy_logp(chosen) policy_logp(rejected)).mean() # 2. 实际生成质量 # 用 GPT-4 / Claude 作 judge 评判 # 或者 LMSYS Arena 风格的人工 A/B # 3. 通用能力 benchmark # MMLU / CEval / HumanEval / GSM8K # 监控是否有灾难遗忘 # 4. 安全性测试 # AdvBench / HarmBench经验DPO 训完通用 benchmark 略微下降 1-3% 是正常的下降 5% 说明过拟合要降 epoch 或减小 β。六、进阶话题与下一篇预告6.1 RLAIF用 AI 替代人类标注RLAIFReinforcement Learning from AI Feedback用强大模型如 GPT-4 / Claude替代人类标注员生成偏好对。优势成本降 100×速度快标注 10 万对只需几天一致性比人类好但有偏见代价受教师模型偏见影响近亲繁殖问题用 GPT-4 标 GPT-3.5 → 学不到比 GPT-4 更好的偏好Anthropic Constitutional AI进一步发展——给模型一份宪法原则让模型自己批评自己的回复生成偏好对。6.2 多阶段对齐策略工业级大模型对齐通常是多阶段组合SFT ↓ Helpful DPO ← 有用性 ↓ Harmless DPO ← 安全性 ↓ GRPO on reasoning ← 推理能力 ↓ Refinement RLHF ← 最后打磨每个阶段用不同数据、不同目标。Claude 4 / GPT-5 大概都是这种多阶段流程。6.3 在线 vs 离线对齐离线 (DPO)用预先采集的偏好对训练简单稳定在线 (PPO/GRPO)实时生成 实时打分效果上限更高半在线 (Iterative DPO)定期生成新数据 DPO 再训折中工业上越来越多用半在线——既保留 DPO 的简单性又能不断追上模型分布。6.4 对齐的另一面解除对齐Unalignment有些场景如红队测试、研究需要关闭对齐——例如让模型生成非安全回答以发现漏洞。主要技术• LoRA Unalignment训一个反向 LoRA让模型忘记安全训练• Activation Engineering在推理时直接修改模型激活值这类工作通常仅限于专业安全研究团队使用。七、结语对齐让模型从「能用」变「好用」读完本文你应该明白SFT 解决会做对齐解决做得好DPO 是 80% 业务场景的最佳起点—— 简单、稳定、效果接近 RLHFGRPO 是推理任务的新利器—— DeepSeek R1 已经验证可行偏好数据是核心资产—— 标注成本和质量决定上限多阶段对齐是工业级方案—— Claude / GPT 都是这条路参考文献8.RLHF 与 DPO让模型对齐人类偏好的两条路径