ORPO(Odds Ratio Preference Optimization)(オーアールピーオーオッズレシオプリファレンスオプティミゼーション)
参照モデル不要でSFTとアライメントを1ステップで実行するLLM手法。オッズ比ベースの損失関数でSFT損失と選好最適化を統合。韓国POSTECH・KAISTが2024年に提案。GPUメモリと学習ステップを削減。
ORPO(Odds Ratio Preference Optimization)とは
ORPO(Odds Ratio Preference Optimization)は、韓国のPOSTECH・KAISTの研究者が2024年に提案したLLMアライメント手法です。SFT(Supervised Fine-Tuning)とアライメントを単一の学習ステップに統合し、参照モデルを不要にした効率的な手法です。
従来手法との比較
従来のLLMの学習パイプライン:
1. SFT(教師あり微調整) → 指示追従能力を獲得
2. DPO/RLHF(選好最適化) → 人間の嗜好に合わせる(参照モデルが必要)
ORPOでは:
1. ORPO(1ステップ) → SFTとアライメントを同時に実行(参照モデル不要)
損失関数
ORPOの損失関数は2つの項の和です。
L_ORPO = L_SFT + λ * L_OR
SFT損失項 (L_SFT)
通常の教師あり微調整と同じクロスエントロピー損失。
オッズ比損失項 (L_OR)
def odds_ratio_loss(chosen_logps, rejected_logps):
chosen_odds = exp(chosen_logps) / (1 - exp(chosen_logps) + 1e-6)
rejected_odds = exp(rejected_logps) / (1 - exp(rejected_logps) + 1e-6)
log_odds_ratio = log(chosen_odds) - log(rejected_odds)
loss = -log_sigmoid(log_odds_ratio)
return loss
オッズ比 P/(1-P) を使うことで、参照モデルなしに相対的な好ましさを直接最適化できます。
参照モデル不要の理由
DPOでは参照モデルを使い「参照モデルからの相対的な対数比」を計算しますが、ORPOではオッズ比の対数差が参照モデルなしで同様の役割を果たします。これにより:
- GPUメモリが削減(参照モデルをロードしなくて良い)
- 学習ステップが1つに削減
- コードがシンプル
実装(TRLライブラリ)
from trl import ORPOTrainer, ORPOConfig
training_args = ORPOConfig(
lambda_=0.1,
output_dir="./orpo-model",
num_train_epochs=3,
per_device_train_batch_size=4,
learning_rate=8e-6,
)
trainer = ORPOTrainer(
model=model,
args=training_args,
train_dataset=dataset,
tokenizer=tokenizer,
)
trainer.train()
ORPOの実績
論文での検証結果:
- Mistral-7B + ORPO: AlpacaEval2でDPOと同等以上
- Phi-2 (2.7B) + ORPO: GPT-3.5-turboと競合するチャット性能
- Llama-2-7B + ORPO: MT-Benchでベースモデルから大幅改善
HuggingFace採用
2024年にHuggingFaceがTRLに公式統合。ORPOTrainerとして使用可能。orpo-dpo-mix-40kデータセットも公開されています。
よくある質問
Q1: SFTとORPOをどちらに使うべき? A: 既にSFT済みモデルにDPOを追加するのが現状のベストプラクティス。ゼロからのファインチューニングならORPOで1ステップ完結が効率的。
Q2: lambdaパラメータの推奨値は? A: 論文では0.1が推奨。大きすぎるとアライメントが強くなりすぎSFT品質が下がる可能性。
Q3: LoRAと組み合わせられる? A: はい。PEFT(LoRA/QLoRA)との組み合わせが可能。TRLのORPOTrainerはPEFT対応。
まとめ
ORPOはSFTとアライメントを1ステップに統合した効率的な手法で、参照モデルが不要という実用的なメリットがあります。メモリ効率・学習コストともに優れており、リソース制約のある環境でのLLMファインチューニングに適しています。