DPO 无需奖励模型就能教会“这个更好”
一句话总结
这是教已经通过 SFT 学会回答的模型 哪种回答更好 的阶段。DPO(Direct Preference Optimization)只用针对同一个问题的好回答(chosen)和坏回答(rejected)成对的数据,不需要奖励模型,也不需要强化学习,只用一个分类损失就能做到。MiniMind 的 train_dpo.py 用十行代码实现了这个损失。这个模块会用事实相同、只有口吻不同的配对(입니다 对 이다)来做 DPO,同时测量口吻是否改变,以及 内容是否得以保持。
为什么需要它
RLHF 先用人的偏好训练奖励模型,再用强化学习(PPO)把模型推向奖励最大化,同时又不让它偏离原模型太远。这需要同时运行四份模型(策略、参考、奖励、价值),而且训练不稳定。DPO 的论文用闭式解出了这个目标的最优解,使同一个问题可以用 策略和参考两份模型 加上一个简单的分类损失来解决。MiniMind 的 README 写道,DPO 是在静态偏好数据上反复训练的 off-policy 方式,所以很稳定,但它不会自己探索,所以比起“答对题目的能力”,更适合用在偏好、安全这类对齐上。这个模块里的实验,展示的正是这条界线。
工作原理
一句话的对数概率,是 每个回答令牌的 log p 之和。MiniMind 用与 SFT 相同的掩码只保留回答令牌。
log_probs = torch.gather(F.log_softmax(logits, dim=2), 2, labels.unsqueeze(2)).squeeze(-1)
seq = (log_probs * mask).sum(dim=1) # 문장마다 답 토큰의 합
chosen, rejected = seq[:B // 2], seq[B // 2:] # 배치 앞 절반이 chosen, 뒤 절반이 rejected
logits = (π_chosen − π_rejected) − (ref_chosen − ref_rejected)
loss = −F.logsigmoid(β * logits).mean()
- 参考模型。再加载一份 SFT 模型并冻结(
eval()、requires_grad_(False))。策略 相对于 参考模型越是更喜欢 chosen,损失就越小。策略与参考相同时,括号里是 0,所以损失是 −log σ(0) = ln 2 ≈ 0.693。 - β。决定可以偏离参考多远。论文把 β·log(π/π_ref) 解释为隐式奖励。MiniMind 的默认值是 0.15。
- 学习率。MiniMind 的默认值是 4e-8,代码注释写着“建议 5e-8 以下,以避免遗忘”。它比 SFT(1e-5)还小几百倍。偏好训练只能把模型稍微推一点点。
一个陷阱。DPO 损失只看 chosen 和 rejected 的 差值。所以学习率一大,在把 rejected 大幅拉低的同时,把 chosen 也一起拉低是常有的事——差距拉开,损失减小,但模型实际给出的回答却哪一边都不是。用这门课程的模型把 lr 提到 1e-4,chosen 的平均对数概率会从 −3.5 崩到 −16.5,以敬体回答的比例反而下降了。所以不能只看损失,要同时看 生成结果 和 其他能力是否保住了。
在现场相遇的样子
公司内部的聊天机器人反馈攒多了,比如夹杂着不礼貌的口吻,或者回答了被禁止的话题,就要构造偏好配对来做 DPO。这时常遇到的是“口吻改好了,准确率却下降了”(常称为 alignment tax)。所以在 DPO 前后,同时 测量偏好指标(偏好准确率、期望口吻的比例)和原有能力指标(事实正确率),是标准流程。还要记住,偏好数据教不了事实——模型不知道的事实,给它看再多 chosen 也不会凭空出现。构造偏好配对本身也是成本。人要读两个回答并选出一个,这要花时间,而且每个人的标准不同,数据里会混入噪声。所以要先用一句话定好“偏好什么”(例如:使用敬语、禁止没有依据的断言),从只在这一个标准上不同的配对开始,结果就更容易解读——这个实验的配对只有口吻一处不同,原因就在这里。
本课程与 MiniMind 原版的不同之处
MiniMind 的偏好数据是从 DPO-En-Zh-20k 中选出的真实人类偏好配对,一对里的两个回答内容不同。这门课程的配对内容相同,只在口吻这一处做了不同。这样才能用一个变量来测量“偏好训练搬动了什么、保住了什么”。学习率也不同——MiniMind 对遍历长数据的 64M 模型用 4e-8,这门课程对只跑 100 步的 1M 模型用 1e-5。数字不同,原则相同:比 SFT 学习率小得多,并且在指标变好的同时也测量原有能力。
下一项实验要做什么
用 SFT 基准模型测出一个偏好配对的对数概率,按论文公式实现 DPO 损失,确认策略与参考相同时得到 ln 2。测量 DPO 之前的偏好准确率和敬体比例,以及 100 步 DPO 之后同样的指标如何变化,忽略口吻的正确率是否得以保持。