Chuyển đến nội dung chính

第 13 課:DPO 和 GRPO — 直接偏好優化

DPO:跳過獎勵模型,直接依照偏好進行訓練。 RLHF 與 DPO 比較。 GRPO(深度搜尋)。 KTO、IPO 變體。與 TRL 全面實施。

🧠 人工智慧與機器學習 — 第 12 課 第 13 課:DPO 和 GRPO — 直接偏好 最佳化

強化學習:從基礎到高級

第 4 部分:RLHF、LLM 調整和製作

亞洲開發網

簡介

DPO(直接偏好優化) 簡化了 RLHF — 直接根據偏好資料進行訓練,無需單獨的獎勵模型和 PPO。


1. DPO 與 RLHF

方面RLHF資料保護官
步驟SFT→RM→PPO(3步驟)SFT → DPO(2 步驟)
獎勵模式明確的、單獨的政策隱含
訓練複合物 (PPO)簡單(類似監督)
穩定性調整起來很棘手穩定
性能最先進的類似

2. DPO 目標

$$\mathcal{L}{DPO}(\pi\theta; \pi_{ref}) = -\mathbb{E}\left[\log \sigma\left(\beta \log \frac{\pi_\theta(y_w|x)}{\pi_{ref}(y_beta|x) - \y_w| \frac{\pi_\theta(y_l|x)}{\pi_{ref}(y_l|x)}\right)\right]$$


3. 使用 TRL 實作 DPO

from trl import DPOTrainer, DPOConfig
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("./sft_model")
ref_model = AutoModelForCausalLM.from_pretrained("./sft_model")
tokenizer = AutoTokenizer.from_pretrained("./sft_model")

config = DPOConfig(
    beta=0.1,
    learning_rate=5e-7,
    per_device_train_batch_size=4,
    num_train_epochs=3,
    output_dir="./dpo_model",
)

trainer = DPOTrainer(
    model=model,
    ref_model=ref_model,
    train_dataset=preference_dataset,
    # Dataset format: {"prompt": str, "chosen": str, "rejected": str}
    tokenizer=tokenizer,
    args=config,
)
trainer.train()

4.GRPO-群組相關策略優化

用於 DeepSeek-R1:

  • 不需要批評/價值網絡
  • 基於群體的優勢估計
  • 高效率的獎勵計算
from trl import GRPOTrainer, GRPOConfig

config = GRPOConfig(
    num_generations=4,  # Generate multiple responses per prompt
    learning_rate=1e-6,
)

trainer = GRPOTrainer(
    model=model,
    reward_funcs=[reward_function],
    train_dataset=prompt_dataset,
    args=config,
)
trainer.train()

5.其他變體

方法所需資料關鍵想法
資料保護官成對偏好政策中的隱性獎勵
GRPO提示+獎勵fn集團優勢
韓國貿易組織二進制(好/壞)無需配對即可工作
首次公開發行成對偏好正規化 DPO
奧爾波成對偏好無需參考模型

總結

方法複雜性資料效能
RLHF高比較 + RM最佳
資料保護官低僅供比較太棒了
GRPO中等提示+獎勵fn太棒了
韓國貿易組織低二進制回饋好