原文出处:Direct Preference Optimization (DPO) 原作者:Hugging Face · 许可证:Apache-2.0 License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与 Hugging Face 所有。
直接偏好优化(DPO)
直接偏好优化(Direct Preference Optimization,DPO)为偏好对齐(preference alignment)提供了一条比"基于人类反馈的强化学习"(Reinforcement Learning from Human Feedback,RLHF)更简单、更稳定的路。它不需要单独训练奖励模型(reward model),也不用跑复杂的强化学习算法,而是直接拿人类偏好数据来优化语言模型。
理解 DPO
原文此处有一张图,画的是两条训练路线的对比:上面一条是传统 RLHF,要经过监督微调、奖励模型、强化学习多个环节;下面一条是 DPO,从 SFT 模型出发,直接用偏好数据训练。
传统的 RLHF 方案需要多个组件、多个训练阶段,图里画出了其中两件事:
- 训练一个奖励模型,根据"被偏好的回答"和"被拒绝的回答"来预测人类偏好。
- 用 PPO(近端策略优化,Proximal Policy Optimization)这类强化学习算法,让策略(也就是语言模型)对着奖励模型做优化。
DPO 把这个过程大幅简化了:跳过奖励模型,改用二元交叉熵损失(binary cross-entropy loss)直接优化语言模型。具体分两步:
- 先训练一个 SFT 模型(监督微调,Supervised Fine-Tuning),让它学会遵循指令。
- 再做 DPO 训练,直接用偏好数据优化语言模型。
提示: DPO 的效果经过了实战检验。Meta 的 Llama 系列等生产模型,以及许多前沿语言模型,都用 DPO 训练过。
DPO 是怎么工作的
DPO 把偏好对齐改写成了一个分类问题。给定一个提示词(prompt)和两个回答(一个被偏好、一个被拒绝),DPO 训练模型提高被偏好回答的似然(likelihood),同时压低被拒绝回答的似然。
训练过程
DPO 的起点是监督微调(SFT):先用标准的指令遵循数据集把模型适配到目标领域,让模型学会基本地完成任务,同时保留原有的通用能力。这一步为后面的偏好学习打下基础。
接下来是偏好学习。训练数据是成对的输出,一对里有一个被偏好的回答和一个不被偏好的回答。偏好数据对帮助模型理解:哪些回答更符合人类的价值观和期望。
DPO 的核心创新在于"直接优化"。它不训练单独的奖励模型,而是用二元交叉熵损失,根据偏好数据直接更新模型权重。这条更短的路让训练更稳定、更高效,效果与传统 RLHF 相当,甚至更好。
DPO 损失函数
DPO 的核心创新就落在损失函数上。它用偏好数据直接优化策略(语言模型):
$$L_{DPO} = -\mathbb{E}{(\pi,r)\sim D} \left[\log \sigma\left(\beta \log \frac{\pi\theta(y_w|x)}{\pi_{ref}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{ref}(y_l|x)}\right)\right]$$
其中:
π_θ是正在训练的模型π_ref是参考模型(reference model),通常就是那个 SFT 模型y_w是被偏好的回答(赢家)y_l是被拒绝的回答(输家)β是温度参数(temperature parameter),控制优化的力度σ是 sigmoid 函数
DPO 数据集格式
DPO 训练需要偏好数据集,每条样本包含:
| 字段 | 说明 | 示例 |
|---|---|---|
prompt |
输入的提示词或问题 | "Explain quantum computing in simple terms"(用大白话解释量子计算) |
chosen |
被偏好的回答 | "Quantum computing uses quantum mechanics principles..." |
rejected |
不被偏好的回答 | "Quantum computing is very complex and hard to understand..." |
数据集里也可以加入更多特征来改善训练质量。比如系统提示词(system prompt),给模型的行为定规矩;也可以是多轮对话,在复杂对话里标注偏好;还可以带上元数据(metadata),提供偏好强度、标注者一致率这类额外信息。
原文此处内嵌了一个数据集浏览器,展示 trl-lib/ultrafeedback_binarized 数据集中的一条真实训练样本,结构就是上面表里的 prompt、chosen、rejected 三个字段。
提示: 高质量的偏好数据集是 DPO 训练成功的前提。偏好标注要清晰、一致,并且跟你的目标场景对齐。可以参考 Hugging Face 的偏好数据集合集 找例子。
用 TRL 实现
TRL(Transformers Reinforcement Learning)库让 DPO 的实现变得很直接:
```python from trl import DPOConfig, DPOTrainer from transformers import AutoModelForCausalLM, AutoTokenizer from datasets import load_dataset
加载模型和分词器
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM3-3B") tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM3-3B")
配置 DPO 训练
training_args = DPOConfig( beta=0.1, # 温度参数 learning_rate=5e-7, # 较低的学习率,保证稳定 max_prompt_length=512, # 提示词最大长度 max_length=1024, # 总长度上限 per_device_train_batch_size=4, gradient_accumulation_steps=4, num_train_epochs=1, )
初始化训练器
trainer = DPOTrainer( model=model, args=training_args, train_dataset=preference_dataset, processing_class=tokenizer, )
训练模型
trainer.train() ```
期望的数据集类型
DPO 需要偏好数据集。DPOTrainer 同时支持对话式和标准两种数据集格式。传入对话式数据集时,训练器会自动把聊天模板(chat template)应用到数据上。
DPOTrainer 对显式提示词和隐式提示词的数据集都支持,但我们建议用显式提示词。如果传入的是隐式提示词数据集,训练器会自动从 "chosen" 和 "rejected" 列里提取提示词。更多细节见 TRL 文档的 preference style 一节。
| 参数 | 说明 | 建议 |
|---|---|---|
| Beta (β) | 控制偏好优化的力度 | 范围:0.1 到 0.5 取值偏低:更保守,模型离参考模型更近 取值偏高:偏好对齐更激进,有 overfitting(过拟合)风险 |
| 学习率 | DPO 训练的学习率 | 建议:比常规微调低得多(5e-7 到 5e-6) 原因:防止灾难性遗忘(catastrophic forgetting),保持稳定 调整:训练不稳时再调低 |
| 数据集规模与质量 | 对偏好数据集的要求 | 底线:领域任务大约需要 1,000 对高质量偏好数据 建议:要扎实的对齐效果,10,000 对以上 质量优先:宁要少而精的偏好对,不要多而差的 |
最佳实践
数据质量
数据质量决定 DPO 训练的成败。偏好数据集应当覆盖期望行为的各个侧面,样本足够多样。标注规范要写清楚,保证"偏好"和"拒绝"的标注口径一致。改善模型表现的一个抓手就是改善偏好数据质量,比如从大数据集里筛选出高质量样本,或者只保留与你场景相关的样本。
训练期间要盯紧损失的收敛情况,并在留出的验证数据上核验效果。β 参数可能需要调整,在"学会偏好"和"保住模型通用能力"之间找平衡。定期用多样的提示词做评估,能帮你确认模型学到的是想要的偏好,而不是在过拟合。
把模型的输出和参考模型的输出放在一起比较,确认偏好对齐确实有进步。在各种提示词上做测试,包括边缘情况,才能保证偏好学习在不同场景下都靠得住。
训练稳定性
训练时仔细监控损失的收敛:DPO 损失应该平滑下降,不该来回震荡或 erratic(忽好忽坏)。定期把你的模型和参考模型的输出做对比,确认对齐质量有实质改善。用梯度裁剪(gradient clipping)防止训练失稳,学习率偏高或数据集难啃时尤其要用。设置早停(early stopping)机制,表现停止上升或开始变差时就停,避免过拟合、浪费算力。
评估
用多样的提示词评估模型,包括边缘情况,确保不同场景下的偏好学习都扎实。拿模型输出和参考模型输出对比,验证对齐质量确实在变好。
避开常见的坑
做 DPO 时要警惕模型对偏好过拟合:一旦过拟合,模型会变得啰嗦重复,通用能力也会退化。出现这种迹象,就把 β 调低、缩短训练时间,或者增加数据多样性。反过来,如果训练完几乎看不到对齐效果的改善,可能是偏好信号太弱:试试调高 β、改善数据质量,或者延长训练。
另一个常见的问题是分布偏移(distribution shift):模型在训练领域里表现不错,放到新场景就掉链子。想避免这一点,偏好数据集要全面覆盖目标用例,收录能代表真实应用的多样样本。目标是让偏好学习扎实可靠,模型在不同情境下都保持实用。
下一步
- 用你自己的偏好数据训练 SmolLM3
- 评估对齐质量和模型表现
- 部署你对齐好的模型
掌握 DPO 之后,可以继续阅读进阶 DPO 方法一节。