第十章 使用 DPO 微调大语言模型
Direct Preference Optimization:直接偏好优化。不训奖励模型,一对「更喜欢 / 不喜欢」就能当损失。书上的口诀是:你的大语言模型实际上是一个奖励模型。
- 一一条样本三件套:prompt、chosen、rejected。
- 二正负例太像,或出现偏好循环,数据会废。
- 三损失:拉高 chosen 相对 rejected 的对数几率,并用 β 拉住参考模型。
- 四SFT 阶段:交叉熵只落在答案 token 上。
书 §10.1–10.2 · p.133–157
10.1.1 偏好数据集
是什么。JSON 长这样:prompt「这部电影怎么样?」,chosen「这部电影很好看。」,rejected「这部电影不好看。」p.133。
来源可以是:调温度让模型多写几句再让人标;产品里「这两个回答选一个」;手工写;合成后再人工审核;开源偏好集。
坑。正负例几乎一样(「很好看」vs「挺好看」),人自己都分不清。或者出现循环:同一个人标 A≻B,另一个人标 B≻A,模型看见 A≻B≻A,什么都学不到。p.133–134。
书 §10.1.1 · p.133–134
点 chosen 或 rejected
同一提示词,人类更喜欢哪一句。
prompt:这部电影怎么样?
DPO 要的不是「这句话绝对分」,而是「相对另一句,哪句更该抬高概率」。
接下节。这个相对关系怎么写进一个可反传的式子。
10.1.2 DPO 目标函数
πθ 是正在训练的模型,πref 是冻结的参考(通常是 SFT 完的那份)。yw 是 chosen,yl 是 rejected。式 (10.1) 的核心是:
一段话的概率是逐步 token 概率连乘。式 (10.2)。实现上对 log 概率求和。
β 大:更不敢离开参考模型。β 小:更敢为了偏好大改。
书 §10.1.2 · 式 (10.1)(10.2) · p.134
拖两个对数几率差
教学:用「θ 的 log 比 − ref 的 log 比」当括号里的数,再看 sigmoid。β 越大,同样差距被放大得越狠,也更受 ref 牵制。
σ( β (Δθ − Δref) )
这个数靠近 1,说明模型已经把 chosen 相对 rejected 分得很开。损失是 −log(它),所以还想再推高。
接下节。DPO 之前通常先 SFT。SFT 的损失不要算在提示词上。
10.2 SFT:损失只落在答案上
是什么。图 10.1–10.3:一条样本是「指令 + 回答」。预测下一个 token 时,指令那几格的交叉熵丢掉(mask),只对回答部分反传。图 10.2 画得很直白:提示词不算,答案算。
为什么?提示词是用户给的,模型不必学会「重新打一遍题目」。它要学会的是:题目已经在了,后面怎么写。
书 §10.2.1 · 图 10.1–10.4 · p.135–147
灰色不算损失,朱砂算
点「切换」。看哪些 token 进交叉熵。
批次里把这件事推广:从 model_inputs 里找到回答的起始下标,再切片算损失。图 10.3、图 10.4。
下一章。如果走 InstructGPT 那条:SFT 之后先训 RM,再用 PPO。奖励怎么分到每一个 token 上?
合上这一章
- 偏好三件套。prompt / chosen / rejected。小心循环和太像的正负例。
- DPO。拉高 chosen 相对 rejected 的对数几率,β 拉住 πref。
- SFT 掩码。损失只落在答案 token。
章末自测
讲完了。下面几题核对本讲刚说过的概念。点选立刻看对错;做错也不会锁下一章。