RLHFからDPOへ:アライメント訓練の進化
RLHF(人間のフィードバックからの強化学習)はモデルアライメントの主流の手法であり続けていますが、明らかな痛点があります:独立した報酬モデルを訓練し、PPO強化学習を通じてポリシーを最適化する必要がある——プロセスは複雑で、訓練は不安定で、ハイパーパラメータに敏感です。DPOは2023年にエレガントな代替案を提案しました:人間の選好データから直接ポリシーモデルを最適化し、報酬モデルの訓練と強化学習の段階を省く。数学的に、DPOは選好確率から最適ポリシーへの閉形式解を導出し、RLHFの3ステップのパイプラインを1ステップに簡素化しました。
DPOの数学的原理
DPOの目的関数はBradley-Terry選好モデルに基づいています。プロンプトx、選好応答yw(chosen)、拒否応答yl(rejected)が与えられたとき、DPOの損失関数は:L_DPO(πθ;πref)=−E[log σ(β·(log πθ(yw|x)/πref(yw|x) − log πθ(yl|x)/πref(yl|x)))]。ここで、πθは最適化対象のポリシー、πrefは参照ポリシー(通常はSFT後のモデル)、βは参照ポリシーからの逸脱の程度を制御するパラメータです。直感的には、DPOは選好応答の対数確率比を拒否応答に対して増加させ、βで参照ポリシーから過度に逸脱しないように制約します。
DPOデータの準備
DPOには3つ組データセット(prompt, chosen, rejected)が必要です。データソース:人間によるアノテーション(最も高品質で、ランキングまたは二者択一方式)、AIフィードバック(強力なモデルでスコアリングし、より良い応答を選択)、オンライン収集(本番環境からユーザーのいいね/悪いねのシグナルを収集)。重要なのは、chosenとrejectedが同じプロンプトに対するものであり、その差が単なる形式や長さの違いではなく、真の選好を反映していることです——長さのデバイアスが必要です。
DPO訓練の実践
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from trl import DPOTrainer, DPOConfig
from datasets import Dataset
model_name = "deepseek-ai/deepseek-coder-1.3b-instruct"
model = AutoModelForCausalLM.from_pretrained(model_name)
ref_model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token
# DPOデータの準備
dpo_data = Dataset.from_list([
{
"prompt": "Pythonで関数を書いてください:",
"chosen": "def add(a,b):\n \"\"\"2つの数の和を返す\"\"\"\n return a + b",
"rejected": "def add(a,b):\n return a + b # docstringがありません"
}
])
# DPO設定
dpo_config = DPOConfig(
output_dir="./dpo_output",
per_device_train_batch_size=2,
gradient_accumulation_steps=8,
learning_rate=5e-6,
beta=0.1, # 参照ポリシーからの逸脱を制御
max_length=1024,
max_prompt_length=512,
logging_steps=10,
fp16=True,
)
# 訓練
trainer = DPOTrainer(
model=model,
ref_model=ref_model,
args=dpo_config,
train_dataset=dpo_data,
tokenizer=tokenizer,
)
trainer.train()
trainer.save_model("./dpo_final")DPO訓練のヒントと一般的な問題
- βパラメータの調整:βが小さすぎると、ポリシーが参照モデルから逸脱しすぎて退化を引き起こす可能性があります;大きすぎると、更新が保守的すぎてアライメント効果が不明確になります。0.1から始めて、0.05刻みで探索することをお勧めします。
- 参照モデルの凍結:参照モデルは訓練全体を通じて不変でなければなりません。そうしないと、DPOが自明な退化解を見つける可能性があります。
- 長さのデバイアス:選好データでは、chosenがrejectedよりも長い傾向があります。モデルが真のアライメントではなく「より長い応答を生成する」ことを学習しないように、長さの正規化または正則化が必要です。
- 学習率:DPOは通常、SFTよりも低い学習率(5e-6から1e-5)が必要です。高すぎるとポリシーの崩壊を引き起こす可能性があります。
DPO vs RLHF vs IPO vs KTO
DPOだけが選択肢ではありません。その後の研究でDPOの改良が行われています:IPO(Identity Preference Optimization)は、特定の状況でのDPOの過学習問題を解決します;KTO(Kahneman-Tversky Optimization)は、ペアの選好データを必要とせず、単一データの「良い/悪い」ラベルのみを必要とします。選択の提案:ペアの選好データがある場合はDPO;良い/悪いラベルのみの場合はKTO;DPOの訓練が不安定な場合はIPO。ほとんどのシナリオでは、DPOから始めるのが最良の選択です。
DPO訓練の一般的な失敗モード
DPOの理論は簡潔でエレガントですが、実際の訓練で私たちが遭遇した落とし穴は共有する価値があります:モード崩壊——選好データ内のchosenとrejectedの差が十分に顕著でない場合(例えば、両者の違いが単に「応答が長い」だけの場合)、DPOは真の選好ではなく「常に長い応答を生成する」という偽の相関を学習する可能性があります。解決策:長さ正規化された報酬信号を使用するか、データ構築段階でchosenとrejectedの長さを意図的にバランスさせます。破滅的忘却——DPOが特定の選好のアライメントに集中すると、汎用能力の退化を引き起こす可能性があります。私たちの実験では、コードスタイルの選好データのみでDPOを行った後、モデルの常識QAの精度が7.2%低下しました。解決策:DPOデータに5-10%の汎用SFTデータを「アンカー」として混ぜ、基本能力を維持します。報酬ハッキング——βが低すぎる場合、モデルは損失関数を「欺く」方法を見つける可能性があります——例えば、chosen内の高頻度語を繰り返して確率を上げるなど、真の選好を理解するのではなく。解決策:損失値だけでなく多次元の自動評価を使用して訓練プロセスを監視し、異常なパターンを検出したらすぐにβを調整します。
DPOとオンライン選好学習の組み合わせ
オフラインDPOの限界は、選好データが静的であることです——モデル改善後の新しい選好分布を反映できません。より高度なアプローチはオンラインDPOです:各訓練ラウンド後に、現在のポリシーでモデルが応答を生成し、人間または強力なモデルが選好をラベル付けし、新しいデータで訓練を続けます。数回の反復後、モデルは自身の出力を継続的に自己改善できます。私たちの実験では、3ラウンドのオンラインDPO反復後、モデルの文章品質の向上は
DPO評価:アライメントが「アライメントされている」かどうかを知る方法
DPOトレーニング後の評価は、損失曲線の下降だけを見ることはできません——損失が減少してもモデルが良くなったとは限りません。私たちは多次元のDPO評価スキームを使用します:選好精度(ホールドアウトされた選好テストセットで、モデルが選択肢(chosen)に拒否肢(rejected)よりも高い確率を与えるかどうか——これは最も直接的な指標で、目標は>75%)、勝率比較(同じプロンプトセットに対する新モデルと旧モデルの出力を、GPT-4のブラインド評価で勝率を判断——目標は>55%)、基本能力の維持(標準NLPベンチマークで評価し、アライメントトレーニングが基本能力を損なわないことを確認——目標は±3%以内の変動)、安全性の検証(敵対的プロンプトを使用して拒否能力をテスト——有害なリクエストの拒否率が低下しないこと)。すべての指標が合格して初めてDPOトレーニングが成功したと見なされます。
DPOとSFTの順序と相乗効果
標準的なDPOプロセスはSFT→DPOの2段階ですが、実際にはより良い戦略を発見しました:反復交互トレーニング——SFT(2エポック)→DPO(1エポック)→SFT(1エポックで新しいデータを補完)→DPO(1エポック)。各DPO段階では現在最も顕著な問題のみをアライメントします(例えば、最初のDPOで安全性を、2回目のDPOで形式の規範性をアライメント)、一度のDPOですべての問題を解決しようとすることによる最適化目標の競合を避けます。実験によると、反復交互トレーニングは最終的な人間による評価で標準的なSFT→DPOより8.5パーセントポイント高いスコアを達成し、特に複雑な多制約タスク(例えば「安全で効率的でコメントが明確なPythonコードを書く」)で顕著な優位性を示します。追加コストは約20%(トレーニングを2回多く実行)ですが、高品質が要求されるシナリオではこの20%の投資収益率は非常に高いです。
このスキルチェーンを自分で編成してみませんか?
スキルチェーンで開く →