首页 / 资料库 / Hugging Face · 小模型课

资料库11 分钟读完Apache-2.0DPO偏好对齐Hugging Face小模型课

直接偏好优化(DPO)

译自《Direct Preference Optimization (DPO)》 · 查看英文原文

原文出处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 方法一节。

这篇在讲什么,跟咱们的课怎么对?

资料库是大厂公开教材的中文译本,偏原理和工程做法。想看面向中小企业的白话版本,去入门课场景课