LLM 后训练实践
第3课:偏好对齐DPO

3.4 实践考量

在线 vs 离线 DPO、beta 参数敏感性分析、偏好数据质量、当前领域趋势

在线 vs 离线 DPO

离线 DPO(标准模式)

标准 DPO 使用一个预先收集好的固定偏好数据集进行训练,这被称为离线(Offline)DPO

偏好数据集 D = {(x, y_w, y_l)} → DPO 训练 → 对齐模型

离线 DPO 的特点:

  • 数据固定:偏好对 (yw,yl)(y_w, y_l) 在训练前就已确定,通常来自其他模型(如 GPT-4)的输出
  • 简单高效:只需一次性准备数据,训练过程与标准监督学习无异
  • 分布偏移风险:随着策略 πθ\pi_\theta 在训练中不断更新,数据中的 (yw,yl)(y_w, y_l) 可能越来越远离当前策略的生成分布

在线 DPO(On-Policy DPO)

在线 DPO 在训练过程中持续使用当前策略生成新的回复,并对其进行偏好标注:

循环:
  1. 当前策略 π_θ 对提示 x 生成多个回复
  2. 使用奖励模型或 AI 标注器对回复排序
  3. 构建新的偏好对 (y_w, y_l)
  4. 在新偏好对上执行 DPO 更新

在线 DPO 的优势:由于偏好对来自当前策略的生成分布,不存在分布偏移问题。研究表明(Xu 等,2024),在线 DPO 在多个基准上显著优于离线 DPO。Tülu 3 的 DPO 阶段也采用了在线策略。

混合策略:迭代 DPO

一个折中方案是迭代 DPO(Iterative DPO)

  1. 用离线数据做一轮 DPO
  2. 用更新后的模型生成新的回复
  3. 标注新的偏好对
  4. 重复步骤1-3

这种方法在纯离线和完全在线之间取得平衡。RLHF Book(Lambert,2025)推荐这种方式作为实际部署时的最佳实践。

三种模式对比

方面离线 DPO迭代 DPO在线 DPO
数据来源固定数据集每轮更新数据实时生成
分布偏移存在部分缓解
计算成本高(需要生成+标注)
实现复杂度
效果基准更好最好
适用场景快速原型、教学生产环境追求最佳效果

当前领域趋势

DPO 用于通用聊天对齐

在2024-2025年的实践中,一个清晰的趋势已经形成:

通用聊天对齐首选DPO/SimPO\text{通用聊天对齐} \xrightarrow{\text{首选}} \text{DPO/SimPO}

原因:

  1. 通用聊天的偏好(有帮助、安全、遵循格式)可以用人类或 AI 标注有效捕获
  2. DPO 训练稳定、资源需求低,适合大多数团队
  3. SimPO 进一步简化了流程,去掉了参考模型

GRPO/RLVR 用于推理能力

推理能力训练首选GRPO/RLVR\text{推理能力训练} \xrightarrow{\text{首选}} \text{GRPO/RLVR}

原因:

  1. 数学、代码等推理任务有可验证的正确答案,天然适合 RL 奖励
  2. 推理能力需要模型探索新的推理路径,DPO 的离线数据无法提供这种探索
  3. DeepSeek-R1 的成功证明了纯 RL 可以涌现推理能力

Qwen3 的实践验证

Qwen3 的四阶段后训练流程完美体现了这一趋势:

阶段1:长思维链冷启动 SFT

用高质量的思维链数据进行 SFT,为后续 RL 训练提供良好的初始化。

阶段2:推理 RL(GRPO)

使用 GRPO 在数学、代码等可验证任务上强化推理能力。

阶段3:思考模式融合

将 RL 训练的推理能力融合回统一模型,实现 /think/no_think 的无缝切换。

阶段4:通用 RL

在更广泛的任务上进行 RL 优化,全面提升模型能力(包含类 DPO 的偏好对齐)。

β\beta 参数敏感性分析

β\beta 的含义回顾

在 DPO 损失中,β\beta 控制策略偏离参考模型的程度

LDPO=E[logσ(βlogπθ(ywx)πref(ywx)βlogπθ(ylx)πref(ylx))]\mathcal{L}_{\text{DPO}} = -\mathbb{E}\left[\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)\right]

β\beta 过大(过于保守)

β\beta 很大(如 β=1.0\beta = 1.0)时:

  • KL 惩罚权重极高,策略几乎不敢偏离参考模型
  • 偏好信号被过度压缩——即使 chosen 明显优于 rejected,模型也只做微小调整
  • 结果:对齐效果不明显,模型行为接近 SFT 模型

β\beta 过小(偏离过远)

β\beta 很小(如 β=0.01\beta = 0.01)时:

  • KL 惩罚权重极低,策略可以大幅偏离参考模型
  • 模型可能过度拟合偏好数据中的模式
  • 可能丧失参考模型的语言能力(灾难性遗忘)
  • 结果:输出质量下降,模型变得不稳定

推荐的 β\beta 设置

方法推荐 β\beta常用范围备注
DPO0.10.05 - 0.5论文默认值
SimPO2.01.0 - 5.0因为隐式奖励定义不同,β\beta 值域不同
IPO0.10.05 - 0.5与 DPO 类似
KTO0.10.05 - 0.5与 DPO 类似

β\beta 调优建议:从推荐默认值开始,观察训练过程中的 reward margin(chosen 和 rejected 的隐式奖励差)。如果 margin 增长过慢,适当减小 β\beta;如果 margin 增长过快或模型输出质量下降,增大 β\beta。在实验中,先用 β=0.1\beta = 0.1 做基线实验,再尝试 0.05 和 0.5 进行消融。

β\beta 的直觉理解

可以类比为学习中的保守程度

  • β\beta 大 ≈ "安全第一":学新东西的时候非常保守,只做微调
  • β\beta 小 ≈ "大胆尝试":积极学习新偏好,但可能忘记旧知识
  • 最优 β\beta ≈ "适度创新":在保留基础能力的同时,有效学习新偏好

偏好数据质量

偏好数据的常见问题

问题类型描述影响
标注噪声标注者之间的分歧或错误标注训练信号混乱
偏好偏差AI 标注器的系统性偏好(如偏向长回复)模型学到虚假模式
分布不均某些话题的数据远多于其他话题模型在少数据话题上表现差
难度不平衡大部分样本的 chosen/rejected 差异过大或过小学习效率低

数据质量检查清单

检查偏好一致性

随机抽取50-100个样本,人工检查 chosen 是否确实优于 rejected。如果一致性低于80%,数据质量可能有问题。

# 简单的数据质量检查
import random

samples = random.sample(dataset, 50)
for s in samples:
    print(f"Prompt: {s['prompt'][:100]}...")
    print(f"Chosen: {s['chosen'][:200]}...")
    print(f"Rejected: {s['rejected'][:200]}...")
    print("---")
    # 人工判断: chosen 确实更好吗?

检查长度分布

统计 chosen 和 rejected 的长度分布。如果 chosen 系统性地比 rejected 更长(或更短),模型可能学到长度偏好而非质量偏好

import numpy as np

chosen_lengths = [len(s['chosen'].split()) for s in dataset]
rejected_lengths = [len(s['rejected'].split()) for s in dataset]

print(f"Chosen 平均长度: {np.mean(chosen_lengths):.0f}")
print(f"Rejected 平均长度: {np.mean(rejected_lengths):.0f}")
# 如果差异过大 (>2x),考虑过滤或重新标注

检查话题覆盖

确保偏好数据覆盖你关心的所有任务类型(通用问答、代码、数学、安全等)。单一类型的数据会导致模型在其他类型上的能力退化。

过滤低质量样本

去除以下类型的样本:

  • Chosen 和 rejected 几乎相同(差异过小)
  • Chosen 明显包含错误信息
  • 长度异常(过短或过长)的样本

UltraFeedback 数据集分析

本课实验使用的 HuggingFaceH4/ultrafeedback_binarized 数据集特点:

特性详情
规模~64K 条提示
标注方式GPT-4 多维度评分
评分维度Helpfulness, Honesty, Instruction-following, Truthfulness
Chosen 选择综合评分最高的回复
Rejected 选择综合评分最低的回复
来源模型Llama-2, WizardLM, ShareGPT 等多个模型

关于 AI 标注偏好数据:使用 GPT-4 等强模型标注偏好数据是一种常见做法,但需要注意 AI 标注器可能有系统性偏差——例如偏向更长、更结构化的回复。在实际生产中,混合使用人类标注和 AI 标注通常是最佳实践。

其他实践建议

学习率选择

DPO 的学习率通常比 SFT 低一个数量级:

方法推荐学习率原因
SFT (LoRA)2e-5 ~ 2e-4从零学习指令跟随能力
DPO (LoRA)5e-7 ~ 5e-6在已有能力基础上微调偏好
SimPO (LoRA)5e-7 ~ 5e-6同 DPO

过高的学习率会导致模型快速"忘记" SFT 学到的能力。

训练轮数

偏好优化通常只需要 1 个 epoch。原因是:

  1. 偏好数据集的每条数据信息量较大(包含 chosen 和 rejected)
  2. 多次遍历容易过拟合到训练集的特定偏好模式
  3. 过多的训练会导致模型在 rejected 方向上过度抑制,降低多样性

监控指标

训练过程中应关注以下指标:

指标正常趋势异常信号
训练损失逐渐下降不下降或剧烈波动
Reward margin (chosen - rejected)逐渐增大增大过快或不增
Chosen 回复概率轻微上升大幅下降
Rejected 回复概率轻微下降大幅上升
KL 散度缓慢增加快速增长(>10)

常见问题及解决方案

问题可能原因解决方案
模型输出质量下降β\beta 过小或学习率过高增大 β\beta、降低学习率
对齐效果不明显β\beta 过大或数据质量差减小 β\beta、检查数据质量
过度拒绝安全偏好数据比例过高平衡数据中的安全/有用样本比例
多样性下降训练轮数过多减少 epoch 数、增大 β\beta
训练不收敛学习率过高或数据格式错误降低学习率、检查数据格式

本节小结

在实践中应用 DPO 时,需要关注以下关键决策:

  1. 选择在线还是离线:离线更简单,在线效果更好
  2. 当前趋势:DPO 用于聊天对齐,GRPO 用于推理
  3. β\beta 调优:从默认值 0.1 开始,根据训练监控调整
  4. 数据质量:质量 > 数量,务必进行数据质量检查
  5. 学习率和训练轮数:比 SFT 更小的学习率,通常1个 epoch