DPO 实操:数据、调参与排错
前置知识点
一句话定义
DPO 实操三件事:把偏好数据造对(单变量差异)、把 β 与学习率配好(它们决定偏离幅度)、把 rewards/accuracies 曲线读懂(它是 DPO 的心电图)。
为什么重要
DPO「跑起来」很容易(TRL 几十行),但「跑对」需要知道它特有三类坑:偏好数据混入多变量差异导致学错方向、超参沿 SFT 直觉设置导致训练崩溃、误读监控指标错过塌缩信号。本节给出可直接抄的配置与判读标准。
前置知识
kp-022 的 DPO 损失与 β 语义;kp-016 的有效批量与 lr 联动。
核心概念
- 偏好对数据:
{prompt, chosen, rejected},关键在「单变量差异」——两个回答只在你希望调整的维度上不同。 - rewards/accuracies:训练中模型给 chosen 更高隐式奖励的比例,健康值应从 0.5 升到 0.7-0.9。
- margins:chosen 与 rejected 隐式奖励差的均值,衡量对齐力度。
- 长度偏置:DPO 易学到「长回答更好」或「短回答更好」的伪规律,是最常见的假收获。
原理与机制
数据构造的机制要求:DPO 损失只看两个回答的似然比,模型会把「两答案的一切差异」都当作偏好信号。若 chosen 恰好也更详细/更礼貌/事实更准,模型学到的是这些混杂属性。规范做法:同一 SFT 模型对同一 prompt 采样多条回答,人工只按目标维度标注优劣,其余方面刻意保持一致;或用规则改写(如对同一答案生成简洁版/冗长版)制造纯维度差异。
超参的机制配置:lr 必须比 SFT 小两个数量级(5e-7~5e-6),因为 DPO 损失在 σ 饱和后梯度放大,SFT 量级的 lr 会瞬间把似然推崩;β=0.05-0.3(0.1 常用);epoch=1(偏好数据过拟合极快);B_eff 32-64。
判读规则:accuracies 从 0.5 缓升到 0.75±为健康;冲到 0.95+ 且 margins 暴涨,通常是过拟合或长度偏置,同时 chosen 似然在跌(DPO 文献称之为 chosen likelihood collapse——模型学会贬低 rejected 却也顺带贬低 chosen)。终检永远靠人工盲评,不信训练指标单方面报喜。
图示
rewards/accuracies
1.0│ ╭── 冲顶=过拟合/长度偏置警报
│ ╭─────╯
0.5│─────────╭──── 健康区: 缓升到0.7-0.85后趋平
└──────────────────────▶ steps
同时看: chosen似然不塌 + margins 缓升直观类比
偏好数据像双胞胎对照实验:除了研究的那一个变量,其他都要一样,否则把结果归因给谁都说不清;accuracies 像考试正确率——从 50%(瞎猜)缓慢爬到 80% 是学会,直接跳 100% 是背了答案(过拟合)。
实例或案例
3000 对客服偏好数据的两次训练:v1 数据里 chosen 普遍比 rejected 长 2 倍,DPO 后「简洁率」升到 90%,但盲评发现模型开始拒绝必要的详细说明——学到了长度偏置;v2 重造数据(同长度不同详略取向),DPO 后简洁诉求满足率 78%,详略判断盲评通过率 84%,无副作用。数据单变量化的价值高于任何调参。
操作步骤
- 从 SFT 模型对每条 prompt 采样 3-5 个回答(温度 0.8)。
- 标注规范:只按目标维度(如简洁性/安全性)判优劣,其他维度一致才成对。
- 构造
{prompt, chosen, rejected}jsonl,清洗过 kp-011 流程。 - TRL 配置:
DPOConfig(beta=0.1, learning_rate=5e-7, num_train_epochs=1,
per_device_train_batch_size=2, gradient_accumulation_steps=16,
bf16=True, max_length=2048)
DPOTrainer(model=sft_model, ref_model=None, # PEFT 下自动以基座为 ref
args=args, train_dataset=ds,
processing_class=tokenizer)- 监控 accuracies(目标 0.7-0.85 区间趋平)、margins、chosen 似然。
- 产出后双评测 + 50 条盲评,通过才进入下一迭代。
排错清单
- accuracies 停在 0.5:数据里 chosen/rejected 差异不可判别,或 lr 过小,先人工抽 20 对确认可判别。
- accuracies 直冲 0.95+:过拟合或长度偏置,查数据长度分布,减 epoch,加大 β。
- 训练早期 chosen 似然骤跌:lr 过大(回到 5e-7)或 β 过小。
- 显存翻倍 OOM:ref 模型开销,用 PEFT(ref 自动挂基座)或减 max_length。
- 效果「提升」但盲评无感:大概率长度/格式偏置,回到数据单变量化。
常见误区
- 拿 GPT 打分当偏好标注:判别模型的系统性偏差会原样学进模型,标注要有人工抽检。
- DPO 训多个 epoch:偏好信号 1 个 epoch 就饱和,多训必崩。
- 只看 accuracies 报捷:它是「判别偏好」的能力,不是「回答质量」的能力,两者可能背离。
与其他知识点的关系
DPO 数学见 kp-022;监控体系复用见 kp-019;评测与盲评流程见 kp-025;异常现象的系统定位见 kp-030。
延伸阅读
本节不适用:实操配置以 TRL 文档与 DPO 论文附录的超参为准做对照实验。
自测题
- 为什么偏好数据要求「单变量差异」?
答:DPO 会把两个回答的一切差异当作偏好信号学习;混杂多变量会让模型学到错误归因(如长度偏置)。
- DPO 的学习率为什么比 SFT 小两个数量级?
答:DPO 损失经 σ 后在小差异区间梯度放大,SFT 量级的 lr 会使似然瞬间偏移、训练崩塌。
- accuracies 达到 0.98 是好消息吗?
答:未必——冲顶常伴随过拟合、长度偏置或 chosen 似然塌缩,需同时看 margins 与生成质量盲评。