對應原題(Common ‧ Fine-Tuning, Post-Training and Alignment)

  • What is DPO and why did it displace PPO-based RLHF at many labs? When is online RL still better?
    — Asked at: Hugging Face, Scale AI

論文:Rafailov et al., Direct Preference Optimization: Your Language Model is Secretly a Reward Model (NeurIPS 2023)。

🎯 什麼情境該想到我

當你「想做偏好對齊,但看到 PPO 要同時跑四個模型就退縮了」的時候。
★ DPO 的價值在於:它把一個強化學習問題,變回一個標準的監督式分類問題。

⚙️ 怎麼用

★ 核心推導(三步,值得會講)

Step 1:RLHF 的最佳解有閉式形式

RLHF 全流程 的目標是

這個帶 KL 約束的最佳化問題有已知的解析解:

Step 2:反解出獎勵

★ 這一步就是整篇論文的洞察:
獎勵函數可以用「policy 與 reference 的對數機率比」來表達。
換句話說——語言模型本身就隱含著一個獎勵模型(論文標題的由來)。

Step 3:代進 Bradley-Terry, 消失

因為是差值,那個難算的配分函數 直接抵銷掉。 得到:

這是一個可以直接用 backward() 的損失函數。沒有 RM,沒有取樣,沒有 RL。

def dpo_loss(policy_logps_w, policy_logps_l, ref_logps_w, ref_logps_l, beta=0.1):
    # logps = 該回應所有 token 的 log-prob 總和
    pi_logratio  = policy_logps_w - policy_logps_l
    ref_logratio = ref_logps_w    - ref_logps_l
    return -F.logsigmoid(beta * (pi_logratio - ref_logratio)).mean()

★ 為什麼取代了 PPO-RLHF

PPO-RLHFDPO
需要幾個模型4(policy / ref / RM / value)2(policy / ref,ref 凍結且可預先算完)
要訓練幾個2(policy + value)+ 事先訓 RM1
訓練迴圈rollout → 評分 → 優勢估計 → 更新標準監督式:batch → loss → backward
超參數很多(、GAE 、value loss 係數、rollout 長度…)主要就 和 lr
穩定性⚠️ 惡名昭彰地難調✅ 穩定、可復現
資源高一個數量級一般團隊做得起

一句話:PPO 需要一個 RL 工程團隊,DPO 只需要一個會用 SFTTrainer 的人。
對「不是前沿實驗室」的所有人來說,這個差距就是能不能做的差距。

ref_logps 可以離線預先算完(reference 模型是凍結的),所以訓練時記憶體只要一份 policy —— 再配 LoRA 更省(見 LoRA 與 QLoRA、GPU 記憶體估算)。

★ 何時 online RL 仍然更好(題目的後半,也是重點)

根源:DPO 是 off-policy 的。

DPO:       在「資料集裡現成的那些回應」上學
            ★ 模型當前實際會生成的輸出,它從未見過,也從未被修正

Online RL: 在「policy 當下真的會產生的輸出」上學
            ★ 修正的正是它真的會犯的錯

四個具體場景下 online RL 勝出:

場景為什麼 DPO 不行
★ 獎勵不可微 / 來自外部驗證「程式碼能不能通過測試」「數學答案對不對」無法寫成偏好配對來反傳。RL 只需要一個純量分數,來源不限 → 見 GRPO 與 RLVR
需要探索DPO 只能在既有資料的分布內移動,無法發現新策略
推理任務要衝上限長鏈推理的正確路徑不在偏好資料裡,要靠 policy 自己搜出來
分布偏移嚴重訓練久了 policy 已遠離資料分布,DPO 的梯度變得不相關

★ DPO 的已知失效模式(能講出來是加分):

DPO 的損失只保證 的差值變大,
它完全不管絕對機率。 實務上常觀察到兩者的機率同時下降——
模型把機率質量推到了 和 以外的地方,而那裡沒有任何監督訊號。
結果是:偏好指標好看,實際輸出變得奇怪。

→ 對策:監控 chosen 的絕對 log-prob,不要只看 reward margin;必要時混入 SFT loss 當正則。

折衷路線(實務主流)

方法做法
★ Iterative / Online DPO用當前 policy 生成候選 → 用 RM 或裁判模型標出好壞 → 做一輪 DPO → 重複。拿回 on-policy 的好處,保留 DPO 的簡單
拒絕採樣微調(RFT)policy 生成 N 個候選,只留最好的做 SFT。極簡但有效

→ 這正是 工具-偏好對齊方法選擇 提到的「用拒絕採樣產生 on-policy 偏好資料」。

主要變體

變體解決什麼
IPODPO 在偏好接近確定性時會過擬合;IPO 換一個目標函數處理
KTO不需要成對資料,只要「這個好/這個壞」的單邊標記——實務上資料好蒐集得多
ORPO把 SFT 與對齊合併成單階段,且不需要 reference 模型
SimPO用長度正規化的平均 log-prob 當隱式獎勵,不需要 reference 模型

⚠️ 注意 / 什麼時候不適用

  • 的角色等同 KL 係數。太小 → 偏離 SFT 太多、輸出變怪;太大 → 學不動。常見 0.1,但要掃。
  • ★ 仍然會 reward hacking,只是換了形式。DPO 一樣會放大 length bias 與諂媚——偏好資料裡有的偏誤,它照單全收(見 RLHF 全流程)。
  • 必須先做 SFT。 就是 SFT 模型;在一個不會聽指令的模型上做 DPO 沒有意義。
  • 偏好資料的來源要和目標模型對得上。用別的模型產生的偏好資料(off-policy)效果會打折。
  • 要監控絕對 log-prob,不只是 margin(見上)。
  • 評估不能只看偏好勝率。要同時跑能力評估——DPO 調過頭會傷害通用能力(見 災難性遺忘)。
  • DPO 不會讓模型變聰明。它調整偏好分布,不增加能力。要提升推理能力請看 GRPO 與 RLVR。

🧪 我實際套用的紀錄

  • 2026-09-20:從面試題庫展開,尚未實際套用。

🔗 相關