モデル学習ガイド5:DPO学習ガイド
DPO(直接偏好最適化)の主な役割は、モデルに「話す」ことを教えるのではなく、「選択する」ことを教えることです。
レンダリング中...
既然あなたはすでに PT(知識注入)と SFT(形式の標準化)を完了したのであれば、**DPO(直接的な選好最適化)** はあなたの最後のメスとなります。 その中核的な役割はモデルに「話す」ことを教えるのではなく、モデルに **「選択する」** ことを教えることです。 コンパニオンAIのシナリオにおいて、DPOは特に「正解だが無意味な」応答を排除し、モデルに2つの回答の中からより「人間味のある」方を選択することを強制します。
## DPO のデータ準備
これが最も重要なステップです。DPOトレーニングには標準的な回答は必要ありません。必要なのは **「二者択一」の比較セット** です。
**データ形式:** 各データには3つの部分が含まれます。
1. **Prompt(プロンプト):** ユーザーの入力。
2. **Chosen(選択された良い応答):** 温かく、共感的で、口語的な回答。
3. **Rejected(拒否された悪い応答):** 機械的で、冷淡で、カスタマーサービスのような口調で、説教臭い回答。
**JSONL の例:**
```JSON
{
"prompt": "疲れたなぁ、毎日無意味な残業ばかりで。",
"chosen": "抱きしめてあげるね、見渡す限りの疲労は本当に人を消耗させるよね。もしよかったら、今夜は何も考えずに、早く休んでね?",
"rejected": "残業は現代の職場の一般的な現象です。時間管理を適切に行うか、上司に仕事量を相談することをお勧めします。ポジティブな姿勢を保つことはストレスを軽減するのに役立ちます。"
}
```
## 2つのスキームの操作手順
### 1. LLaMA-Factory
LLaMA-Factory は DPO のサポートが非常に成熟しており、数行の構成で実行できます。
**操作フロー:**
1. **データの登録:** `dataset_info.json` であなたの選好データセットを構成します。
2. **`dpo.yaml` の作成:**
```YAML
stage: dpo # DPO ステージを指定
model_name_or_path: ./sft_output # SFT 後のモデルのパスを使用する必要があります
create_new_adapter: true # SFT の上に LoRA のレイヤーを重ねる
dataset: my_dpo_data
template: qwen
finetuning_type: lora # DPO 特有のハイパーパラメータ
pref_beta: 0.1 # 典型的な Beta の値
dpo_ft_loss: sigmoid # 損失関数タイプ
learning_rate: 1e-6 # DPO の学習率は SFT よりもさらに1桁低い
num_train_epochs: 2.0
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
```
3. **起動コマンド:**
```Bash
llamafactory-cli train dpo.yaml
```
### 2. コードを自分で書く
HuggingFace の `TRL` ライブラリは `DPOTrainer` を提供しており、深いカスタマイズに適しています。
**コードのコアフラグメント:**
```Python
from trl import DPOTrainer
from transformers import AutoModelForCausalLM, AutoTokenizer
# 1. SFT 後のモデルをポリシーモデルとしてロード
# 2. 同じモデルのコピーをリファレンスモデルとしてロードし、KL ダイバージェンスを計算してモデルが逸脱するのを防ぎます
model = AutoModelForCausalLM.from_pretrained("./sft_model")
ref_model = AutoModelForCausalLM.from_pretrained("./sft_model")
dpo_trainer = DPOTrainer(
model,
ref_model=ref_model, # DPO 特有のリファレンスモデル
beta=0.1, # 調整
train_dataset=train_dataset,
tokenizer=tokenizer,
args=DPOConfig(
output_dir="./dpo_model",
per_device_train_batch_size=1,
learning_rate=1e-6,
remove_unused_columns=False # DPO は prompt/chosen/rejected フィールドを保持する必要があります
),
)
dpo_trainer.train()
```
## 必須の注意点
1. **必ず最初に SFT を行い、次に DPO を行う:** 原始モデルを直接 DPO に使用すると、モデルは会話形式を学習していないため、大量のガベージが出力されます。
2. **Beta パラメータの神秘性:** $\beta$ が大きいほど、モデルは Chosen の回答に対してより「従順」になります。ただし、大きすぎると、モデルは多様性を失い、繰り返し応答する可能性があります。0.1 は良い出発点です。
3. **メモリのプレッシャー:** DPO トレーニングでは通常、2つのモデル(現在最適化されているモデルとリファレンスモデル)を同時にロードする必要があるため、メモリ使用量は SFT の **2倍** になります。メモリが不足している場合は、`load_in_4bit=True` を有効にするか、LoRA を使用してください。
4. **モデルの劣化を防ぐ:** DPO は、モデルの論理的推論能力(算術など)を低下させる可能性があります。コンパニオン AI がユーザーの会計を支援する必要がある場合は、DPO データセットにいくつかの一般的な論理的整合性のあるデータを混ぜてください。
## まとめ
- **PT:** 「知っているかどうか」の問題を解決します(ビジネス背景、専門知識)。
- **SFT:** 「ルールを理解しているかどうか」の問題を解決します(会話形式、人格設定)。
- **DPO:** 「聞き心地が良いかどうか」の問題を解決します(感情認識、AI 味の除去)。
**これで、モデルトレーニングの3つの主要なステップはすべて説明されました。**END
コメント
ログインしてコメントを閲覧・投稿してください
ログインへ