はじめに
DPO (直接優先最適化) は RLHF を簡素化し、個別の報酬モデルや PPO を必要とせずに、優先データから直接トレーニングします。
1. DPO 対 RLHF
| 側面 | RLHF | DPO |
|---|---|---|
| ステップ | 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_w|x)} - \beta \log \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. その他のバリエーション
| 方法 | 必要なデータ | 主要なアイデア |
|---|---|---|
| DPO | ペアごとの設定 | ポリシーにおける暗黙の報酬 |
| GRPO | プロンプト + 報酬 fn | グループならではのメリット |
| KTO | バイナリ (良い/悪い) | ペアなしで動作します |
| IPO | ペアごとの設定 | 正規化された DPO |
| オルポ | ペアごとの設定 | 参照モデルは必要ありません |
概要
| 方法 | 複雑さ | データ | パフォーマンス |
|---|---|---|---|
| RLHF | 高 | 比較 + RM | ベスト |
| DPO | 低い | 比較のみ | すばらしい |
| GRPO | 中 | プロンプト + 報酬 fn | すばらしい |
| KTO | 低い | バイナリフィードバック | 良い |