Skip to content

CS234 從人類偏好學:Bradley-Terry、RLHF 與 DPO 推導

2026年9月30日1 分鐘
TL;DRCS234 L8 把上一篇的 inverse RL 換了輸入:不再是專家示範,而是人類說「A 比 B 好」。Bradley-Terry 模型把這種成對比較變成一個可以用交叉熵擬合的 reward;RLHF 拿這個 reward model 加上 KL 懲罰去跑 PPO;DPO 則證明 KL 限制下的最佳策略有封閉解,把 reward 改寫成策略的對數比值,代回 Bradley-Terry 後 partition function 相消,於是可以直接在偏好資料上訓練策略、跳過 reward model。2026 投影片沒有 offline RL 的內容,DPO 也改由課堂自己講,不再是 2024 的客座。

🌏 English version

版本說明:本文依據 CS234 Winter 2026 的 Lecture 8 投影片 p.18–68 與 Lecture 9 p.2–3(頁碼是 PDF 頁碼)。L8 p.37–58 的投影片標明取自 Tatsu Hashimoto 在 CS224N 的 Lecture 11。2026 錄影只給修課生;公開的 Spring 2024 播放清單 第 8、9 支只當補充。存取等級 A3(定義見 全球 AI/CS 課程地圖)。所有事實都在 2026-09-30 打開上述 PDF 與影片頁核對。

系列位置:上一篇 從示範學:BC、DAgger、IRL、MaxEnt IRL|下一篇 A3:Hopper reward engineering、偏好學習、DPO、best arm identification|系列總覽

上一篇結尾,L7 的總結留了一句話:很多時候我們只拿得到偏好配對,而不是示範。L8 就從這裡開始。它的課堂安排是「Imitation Learning and RLHF and maybe DPO」,下一堂就是期中考。

2026 與 2024 的差別

先交代兩件事,免得對著 2024 影片找不到內容:

  1. 2026 投影片沒有 offline RL。2026 課表 Week 4–6 的標籤裡有「Offline RL」,但 L6–L9 的投影片沒有對應的一講。2024 播放清單的第 8 支雖然標題叫「Offline RL 1」,YouTube 章節顯示內容是 MaxEnt IRL 與 RLHF,所以下表拿它當補充;真正講 offline RL 的是第 10 支「Offline RL 3」,在 2026 找不到對應投影片,本文不替 2026 補寫 offline RL。
  2. DPO 從客座改成課堂自己講。2024 的第 9 支是 DPO 作者 Rafael Rafailov、Archit Sharma、Eric Mitchell 的客座;2026 則把 DPO 併進 L8,用的是 CS224N 的投影片。
2026 L8 投影片內容Spring 2024 影片補充(依 YouTube 章節)
p.18–25人類怎麼幫忙訓練 RL 代理人影片 08 52:26 起「RLHF techniques」
p.26–35成對比較、Bradley-Terry、軌跡 reward、後空翻影片 08 1:00:36 起「Bradley-Terry model」
p.36–44RLHF pipeline、reward model、InstructGPT影片 08 1:11:10「RLHF in LLMs」;影片 09 5:02 起「RLHF overview」
p.45–64DPO 推導與結果影片 09 26:21 起「DPO theory introduction」 到 52:19,之後是 Q&A

人類能怎麼幫忙

L8 p.20–25 先把問題放大:如果我們想要能匹配人類表現、或匹配人類價值的 RL 代理人,人類輸入就很重要。投影片舉了幾個例子:

  • Thomaz & Breazeal(2008)研究人怎麼教機器人,用來設計更好的機器人學習者
  • 以「人類要花的力氣」排一條光譜:一端是 DAgger 式的持續教學,另一端是只給示範;中間是兩兩比較的標籤,投影片問它是不是「sweet spot」
  • 推薦系統排序的比較(Yisong Yue 的 dueling bandits 講義)
  • Sadigh 等人(RSS 2017)主動挑選要問人的比較題,學人機互動的 reward

為什麼是成對比較?L8 p.27 給了兩個理由:對人來說,它通常比手寫 reward function 容易,也比給一個純量分數(「你有多喜歡這則廣告?」)容易。

Bradley-Terry:把「A 比 B 好」變成機率

投影片先提醒上一篇的結論:沒有其他假設時,潛在的 reward 模型不唯一。所以這裡選一個特定的結構模型。

先看最簡單的設定:k 臂 bandit,有 K 個動作 b₁…b_K,沒有狀態。假設人做成對比較時有雜訊,偏好 bᵢ 勝過 bⱼ 的機率是:

P(bᵢ ≻ bⱼ) = exp(r(bᵢ)) / (exp(r(bᵢ)) + exp(r(bⱼ)))

這就是 Bradley-Terry 模型(1952)。它是遞移的:p_ik 由 p_ij 與 p_jk 決定。

「最好」有三種定義

L8 p.29 列出 dueling bandits 文獻裡的三種贏家:

名稱定義
Condorcet winner對其他每個選項的勝率都大於 0.5
Copeland winner贏的場次減輸的場次最多
Borda winner對所有選項的期望得分最高(贏 1、平 0.5、輸 0)

投影片補充:歷史上 k 臂或 dueling bandit 的演算法多半以找 Copeland winner 為目標。這張表提醒你:當偏好不一定遞移時,「最好的回答」本身就需要定義。

擬合參數

資料是 N 筆 (bᵢ, bⱼ, μ):人標 bᵢ ≻ bⱼ 時 μ = 1,標一樣好時 0.5,反過來時 0。用交叉熵最大化概似:

loss = −Σ [μ log P(bᵢ ≻ bⱼ) + (1 − μ) log P(bⱼ ≻ bᵢ)]

這跟邏輯迴歸幾乎一模一樣,只是輸入是兩個選項的 reward 差。

從動作到軌跡

同樣的模型可以套到軌跡上:把 R¹ 定義成軌跡 τ¹ 的(潛在、觀察不到的)reward 總和,人偏好 τ¹ ≻ τ² 的機率就是 exp(R¹) / (exp(R¹) + exp(R²))。學好 reward model 之後,投影片的下一步只有一句:拿這個模型去跑 PPO。

這就是 Christiano 等人 2017 的做法。L8 p.35 引用的結果是:模擬機器人學會後空翻,「needed 900 bits of feedback from a human evaluator」。

從後空翻到 ChatGPT:RLHF pipeline

L8 p.37–44 換成 CS224N 的投影片,把同一套流程搬到語言模型:

  1. 第一步是 instruction tuning
  2. 第二、三步是最大化 reward,問題是怎麼做

為什麼問成對比較:人給的分數有雜訊,而且不同人的尺度對不齊。改問「哪個比較好」通常更可靠。reward model 的 loss 就是 Bradley-Terry:讓「贏的」樣本分數比「輸的」高,取 −log σ(差)。

先確認 reward model 能用:投影片引用 Stiennon 等人 2020,用 reward model 預測保留下來的人類判斷來評估它,夠大、資料夠多的 reward model 準確度接近單一人類標註者。

把所有東西接起來:有一個預訓練(可能也做過 instruction tuning)的模型 p^PT、一個 reward model,以及一個能朝任意 reward 最佳化的方法。複製一份模型 p^RL_θ,用 RL 最佳化:

r(s) = RM(s) − β log(p^RL_θ(s) / p^PT(s))

後面那一項是懲罰:p^RL 比 p^PT 更偏好某個輸出時要付代價,期望值就是兩者的 KL divergence。它防止模型偏離預訓練模型太遠。

投影片接著放三個結果:

  • Stiennon 等人 2020:RLHF 勝過單純預訓練加微調
  • InstructGPT(Ouyang 等人 2022):把 RLHF 擴展到約 3 萬個任務
  • 受控比較(Dubois 等人 2023):很多研究用 GPT-4 的回饋模擬人類回饋;InstructGPT 用的 PPO 確實有效,但 best-of-n、只在「好的」輸出上訓練這類簡單 baseline 也表現不錯

L8 p.48 另外引用 Zheng 等人 2023 的〈Secrets of RLHF in Large Language Models Part I: PPO〉,說明 PPO 在 LLM 上實際訓練的麻煩。

DPO:reward model 其實可以不用

DPO(Rafailov 等人 2023) 的出發點是 RLHF 的同一個目標:在 KL 限制下最大化 reward。L8 p.49–58 用四步把它推到一個 loss。

第一步:寫出目標。 對任意 reward function r,最大化 E[r(x, y)] − β KL(π ‖ π_ref)。

第二步:最佳策略有封閉解。 這是先前文獻就有的結果:

π*(y|x) = (1/Z(x)) · π_ref(y|x) · exp(r(x, y)/β)

Z(x) 是所有可能回應的加總,無法直接計算。投影片特別註記:所以這條式子不能直接拿來用。

第三步:反過來寫。 對兩邊取 log、移項,把 reward 寫成最佳策略的函數:

r(x, y) = β log(π*(y|x) / π_ref(y|x)) + β log Z(x)

投影片的解讀:當策略比參考模型更喜歡這個回應,比值是正的;更不喜歡時是負的。

第四步:代回 Bradley-Terry。 Bradley-Terry 只在乎兩個回應的 reward 差,所以兩邊的 β log Z(x) 相消。剩下的就是只含策略的 loss:

L_DPO = −E[log σ(β log(π_θ(y_w|x)/π_ref(y_w|x)) − β log(π_θ(y_l|x)/π_ref(y_l|x)))]

投影片的總結寫成一個等式:「reward function 上的 loss」加上「reward 與策略之間的轉換」,等於「策略上的 loss」。

第二步的封閉解怎麼來(L8 p.54–55 的手寫推導方向)

L8 p.54 的手寫頁從封閉解出發:已知 π*(y|x) = (1/Z(x)) π_ref(y|x) exp(r(x,y)/β),對 r 求解。兩邊除以 π_ref、取 log,得到 log(π*/π_ref) = r/β − log Z,也就是 β log(π*/π_ref) + β log Z = r。投影片接著寫「now plug into Bradley Terry pref func, so we can derive pref directly in terms of π_ref and π*」。

封閉解本身可以這樣想:把 KL 項展開後,目標等價於最小化 π 與「π_ref · exp(r/β) 正規化後的分布」之間的 KL,而 KL 在兩個分布相等時最小。這一段是本文的補充說明,投影片直接引用為先前結果。

結果

L8 p.59–64 放了幾組結果:

  • reward 與 KL 的取捨:用 GPT2-XL 生成正面的 IMDB 影評,拿一個預訓練的情感分類器當「gold」reward model,依它產生偏好資料,再分別用 PPO 與 DPO 最佳化,比較在相同 KL 下拿到多少 reward
  • 用 DPO 訓練的模型:p.61 是一張模型排行榜截圖,手寫圈出其中好幾個用 DPO 訓練的模型
  • 大規模 DPO:p.62–64 分別擷取 Mistral 與 Llama 3 論文裡講 instruction fine-tuning 的段落

p.65 有一頁標題是 CPL,但 post 版 PDF 在這頁只有標題、沒有內容。CPL 指的應該是 Contrastive Preference Learning(Hejna 等人 2023),一種同樣不用 RL、直接從偏好學策略的方法;投影片沒有展開,本文也只給指引。

最後兩頁是延伸方向:從人類偏好學習與做決策,是社會選擇、計算經濟學與 AI 交會的領域,Stanford 有 Koyejo 的新課 CS329H「Machine Learning from Human Preferences」;以及 Knox & Stone(2008)的 TAMER 框架,讓人類在代理人訓練過程中即時給回饋。

L9 開頭的小測

L9(bandits 那一講)一開場就回頭考這一講,題目是「全選正確的」:

  1. RLHF 和 DPO 都會從偏好資料學出一個顯式的 reward model
  2. 兩者都受限於:最多只能跟偏好資料裡最好的樣本一樣好
  3. DPO 不使用參考策略
  4. 以上皆非
  5. 不確定

post 版 PDF 沒有標出答案。讀完本篇,你可以自己檢查:第 1、3 點分別對照 DPO 推導的第三步與第四步;第 2 點值得多想一下,RLHF 的 PPO 階段會產生新的樣本去讓 reward model 打分,這跟只在固定配對上訓練的 DPO 有什麼不同?

自學怎麼做

  1. 先把 Bradley-Terry 的交叉熵 loss 跟邏輯迴歸並排寫一次,確認兩者只差在輸入是 reward 差。
  2. 讀 L8 p.49–58 時,自己從封閉解推到 DPO loss,特別看 Z(x) 在哪一步消失。推不出來就配 2024 影片 09 的「DPO loss function」章節(30:46 起)。
  3. 回頭對照上一篇的 MaxEnt IRL:P(τ) ∝ exp(wᵀμ_τ) 與 π* ∝ π_ref · exp(r/β) 長得很像,想想各自的「參考分布」是什麼。
  4. 動手在下一篇的作業三:Q2 用 Hopper 上的偏好資料學 reward model 再跑 PPO(run_rlhf.py),Q3 在同一份資料上做 SFT 與 DPO(run_dpo.py)。

今晚可以做的一件事:用 numpy 寫一個 5 臂的 Bradley-Terry 模擬器,先隨便設定真實 reward,產生幾百筆成對比較,再用梯度下降把 reward 擬合回來。你會發現擬合出來的 reward 只在加減一個常數的意義下是對的,這正是 DPO 裡 log Z 能消掉的原因。

延伸閱讀

參考資料