DPO(Direct Preference Optimization)(ディーピーオーダイレクトプリファレンスオプティミゼーション)
RLHFの強化学習フェーズを不要にした人間フィードバックによるLLMアライメント手法。好ましい/好ましくない応答ペアのデータセットから直接ポリシーモデルを最適化する。2023年にStanford/UCバークレーが提案。
DPO(Direct Preference Optimization)とは
DPO(Direct Preference Optimization)は、大規模言語モデル(LLM)を人間の嗜好に合わせるアライメント手法です。従来のRLHF(Reinforcement Learning from Human Feedback)では報酬モデルの学習とPPOによる強化学習の2段階が必要でしたが、DPOはこれを単一の教師あり学習損失に統合しました。2023年にStanford大学・UCバークレーの研究者によって提案されました。
RLHFとの比較
| 手法 | 報酬モデル | 強化学習 | 実装複雑さ | 安定性 |
|---|---|---|---|---|
| RLHF | 必要 | PPO | 高 | 不安定になりやすい |
| DPO | 不要 | なし | 低 | 安定 |
| KTO | 不要 | なし | 低 | 安定 |
数理的背景
DPOはBradley-Terryモデルを基礎とします。2つの応答 y_w(好ましい)と y_l(好ましくない)が与えられたとき、人間が y_w を好む確率を:
P(y_w > y_l) = σ(r(x, y_w) - r(x, y_l))
とモデル化します(σはシグモイド関数、r は報酬関数)。DPOはこの最適ポリシーの閉形式解を利用し、報酬モデルを陽に学習せずに参照モデルとの対数比で暗黙的に表現します。
DPO損失関数
DPOの損失関数は:
# DPO損失の概念的コード
loss = -log_sigmoid(
beta * (log_ratio(model, chosen) - log_ratio(model, rejected))
)
# beta: KLペナルティの強さを制御するハイパーパラメータ
# log_ratio: log(π_θ(y|x) / π_ref(y|x))
ここで β(ベータ)は参照モデルからの乖離を制御するハイパーパラメータです(典型的には 0.1〜0.5)。
必要なデータ形式
DPOは「好ましい応答・好ましくない応答」のペアデータが必要です。
{
"prompt": "Pythonでリストをソートする方法は?",
"chosen": "Pythonの`sorted()`関数や`list.sort()`メソッドを使います...",
"rejected": "ソートは難しいので外部ライブラリを使ってください"
}
主要な公開データセット:
- Anthropic HH-RLHF: 170K+のHelpful/Harmlessペア
- OpenAssistant: 多言語の指示応答ペア
- UltraFeedback: GPT-4で評価した64Kペア
- Orca-DPO-Pairs: 複雑な推論ペア
実装例(TRL/Transformers)
from trl import DPOTrainer, DPOConfig
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1")
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-v0.1")
training_args = DPOConfig(
beta=0.1,
output_dir="./dpo-model",
num_train_epochs=3,
per_device_train_batch_size=4,
)
trainer = DPOTrainer(
model=model,
args=training_args,
train_dataset=dataset,
tokenizer=tokenizer,
)
trainer.train()
DPOの限界と改善手法
- 分布外問題: 選好ペアのないプロンプトへの汎化が弱い → KTO/SimPOで対処
- 長さバイアス: 長い応答を好みやすい傾向 → SimPO/IPOで対処
- 参照モデル依存: 参照モデルの品質に性能が依存
2025年の採用状況
DPOはLlama-3・Mistral・Gemma・Qwen等の主要オープンモデルのインストラクションチューニングで広く採用されています。HuggingFace TRLライブラリに実装が含まれており、比較的少ない計算資源で実施できます。
よくある質問
Q1: DPOとRLHFどちらが良い? A: 実装の容易さと安定性ではDPO優位。ただし一部の研究ではRLHF+PPOがベンチマーク上で優ることもある。実用的には多くのケースでDPOで十分。
Q2: betaパラメータはどう選ぶ? A: 典型的には0.1〜0.5。小さいほど参照モデルに近い出力になり、大きいほど選好データを強く反映する。0.1から始め検証セットで調整を推奨。
Q3: データ量はどれくらい必要? A: 数千〜数万ペアが一般的。Anthropic HH-RLHFの一部(5K〜20K)でも効果的な改善が報告されている。
まとめ
DPOはRLHFの複雑さを大幅に削減しながら同等以上のアライメント性能を達成した革新的手法です。2025年現在、KTO・ORPO・SimPOなどの派生手法も登場し、選好最適化の研究は活発に続いています。