教材讲解 第十章

第十章 使用 DPO 微调大语言模型

Direct Preference Optimization:直接偏好优化。不训奖励模型,一对「更喜欢 / 不喜欢」就能当损失。书上的口诀是:你的大语言模型实际上是一个奖励模型。

  1. 一条样本三件套:prompt、chosen、rejected。
  2. 正负例太像,或出现偏好循环,数据会废。
  3. 损失:拉高 chosen 相对 rejected 的对数几率,并用 β 拉住参考模型。
  4. 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) 的核心是:

β ( log πθ(yw|x)/πθ(yl|x) − log πref(yw|x)/πref(yl|x) ) 再送进 sigmoid,取 log。希望括号里的数尽量大:相对参考模型而言,chosen 比 rejected 更占优。

一段话的概率是逐步 token 概率连乘。式 (10.2)。实现上对 log 概率求和。

β 大:更不敢离开参考模型。β 小:更敢为了偏好大改。

书 §10.1.2 · 式 (10.1)(10.2) · p.134

拖两个对数几率差

教学:用「θ 的 log 比 − ref 的 log 比」当括号里的数,再看 sigmoid。β 越大,同样差距被放大得越狠,也更受 ref 牵制。

0.4
0.0
0.5

σ( β (Δθ − Δ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 上?

合上这一章

  1. 偏好三件套。prompt / chosen / rejected。小心循环和太像的正负例。
  2. DPO。拉高 chosen 相对 rejected 的对数几率,β 拉住 πref
  3. SFT 掩码。损失只落在答案 token。

章末自测

讲完了。下面几题核对本讲刚说过的概念。点选立刻看对错;做错也不会锁下一章。

第十一章 使用 PPO 微调大语言模型 · 原书 p.159–179

打开第十一章 回到目录