模型训练指南五:DPO训练指南
DPO(直接偏好优化)核心作用不是教模型“说话”,而是教模型“选择”。
渲染中...
既然你已经完成了 PT(注入知识)和 SFT(规范格式),那么 **DPO(直接偏好优化)** 就是你最后的一把手术刀。
它的核心作用不是教模型“说话”,而是教模型 **“选择”**。在陪伴式AI场景中,DPO 专门用来砍掉那些“正确但废话”的回复,强迫模型在两个答案中选择那个更有“人味”的。
## DPO 的数据准备
这是最关键的一步,DPO 训练不需要标准的答案,它需要的是**“二选一”的对比组**。
**数据格式:** 每条数据包含三个部分:
1. **Prompt(提示词):** 用户的输入。
2. **Chosen(被选中的好回复):** 温暖、共情、口语化的回答。
3. **Rejected(被拒绝的坏回复):** 机械、冷淡、客服腔、爱讲大道理的回答。
**JSONL 示例:**
```JSON
{
"prompt": "我好累啊,感觉每天都在无意义地加班。",
"chosen": "抱抱你,这种一眼望不到头的疲惫最消磨人了。如果可以的话,今晚先什么都别想,早点休息好吗?",
"rejected": "加班是现代职场的普遍现象。建议您合理规划时间,或者与上级沟通工作量。保持积极的心态有助于缓解压力。"
}
```
## 两种方案的操作步骤
### 方案1. LLaMA-Factory
LLaMA-Factory 对 DPO 的支持非常成熟,几行配置就能跑起来。
**操作流:**
1. **注册数据:** 在 `dataset_info.json` 中配置你的偏好数据集。
2. **编写 `dpo.yaml`:**
```YAML
stage: dpo # 指定为 DPO 阶段
model_name_or_path: ./sft_output # 必须用你 SFT 后的模型路径
create_new_adapter: true # 在 SFT 之上再套一层 LoRA
dataset: my_dpo_data
template: qwen
finetuning_type: lora
# DPO 特有超参
pref_beta: 0.1 # 典型的 Beta 取值
dpo_ft_loss: sigmoid # 损失函数类型
learning_rate: 1e-6 # DPO 的学习率要比 SFT 还要低一个数量级
num_train_epochs: 2.0
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
```
3. **启动命令:**
```Bash
llamafactory-cli train dpo.yaml
```
### 方案2. 自己写代码
HuggingFace 的 `TRL` 库提供了 `DPOTrainer`,适合深度定制。
**代码核心片段:**
```Python
from trl import DPOTrainer
from transformers import AutoModelForCausalLM, AutoTokenizer
# 1. 加载 SFT 后的模型作为策略模型 (Policy Model)
# 2. 同时也需要一个参考模型 (Reference Model),通常是同一个模型的拷贝,用来计算 KL 散度防止模型跑偏
model = AutoModelForCausalLM.from_pretrained("./sft_model")
ref_model = AutoModelForCausalLM.from_pretrained("./sft_model")
dpo_trainer = DPOTrainer(
model,
ref_model=ref_model, # DPO 特有的参考模型
beta=0.1, # 调节因
train_dataset=train_dataset,
tokenizer=tokenizer,
args=DPOConfig(
output_dir="./dpo_model",
per_device_train_batch_size=1,
learning_rate=1e-6,
remove_unused_columns=False # DPO 需要保留 prompt/chosen/rejected 字段
),
)
dpo_trainer.train()
```
## 必须注意的坑
1. **必须要先 SFT 再 DPO:** 如果你直接拿原始模型做 DPO,模型会因为没有学会对话格式而产生大量乱码。
2. **Beta 参数的玄学:** $\beta$ 越大,模型越“听话”,即越倾向于 Chosen 答案;但如果太大,模型会失去多样性,甚至复读。0.1 是个黄金起步点。
3. **显存压力:** DPO 训练时通常需要同时加载两个模型(当前优化的模型和参考模型),显存开销几乎是 SFT 的 **2 倍**。如果显存不够,务必开启 `load_in_4bit=True` 或者使用 LoRA。
4. **防止模型退化:** DPO 可能会让模型在逻辑推理能力(如算术)上退化。如果你的陪伴 AI 还需要帮用户算账,记得在 DPO 数据集里混入一些通用的逻辑对齐数据。
## 总结
- **PT:** 解决“知不知道”的问题(业务背景、专业知识)。
- **SFT:** 解决“懂不懂规矩”的问题(对话格式、人设定位)。
- **DPO:** 解决“好不好听”的问题(情感感知、去 AI 味)。
**至此,模型训练的三大板斧已经全部介绍完了。**END
评论
登录后查看和发表评论
前往登录