
Preference Fine-Tuning の概要
以下の記事が面白かったので、簡単にまとめました。
1. Preference Fine-Tuning
「DPO」(Direct Preference Optimization) により、プロンプトとレスポンスのペアに基づいてモデルをファインチューニングできます。このアプローチにより、モデルは人間の嗜好を学習し、好まれる可能性の高い出力を最適化できます。現在、テキストのみサポートされています。
2. 対応モデル
「Preference Fine-Tuning」の対応モデルは、次のとおりです。
・gpt-4o-2024-08-06 : 対応
・gpt-4o-mini-2024-07-18 : まもなく対応
・その他の最新モデル : 来年はじめには対応
3. DPO 用のデータセットの準備
データセット内の各例には、次のものが含まれている必要があります。
・プロンプト (ユーザーメッセージなど)
・推奨される出力 (理想的なアシスタントのレスポンス)
・推奨されない出力 (最適ではないアシスタントのレスポンス)
データはJSONL 形式でフォーマットされ、各行は次の構造の例を表します。
{
"input": {
"messages": [
{
"role": "user",
"content": "こんにちは。今日のサンフランシスコはどれくらい寒いか教えていただけますか?"
}
],
"tools": [],
"parallel_tool_calls": true
},
"preferred_output": [
{
"role": "assistant",
"content": "今日のサンフランシスコは、予想ほど寒くはありません。朝の雲は晴れ、最高気温は 68°F (20°C) 前後、最低気温は 57°F (14°C) 前後になるでしょう。"
}
],
"non_preferred_output": [
{
"role": "assistant",
"content": "今日はサンフランシスコは特に寒くないです。"
}
]
}
現在、各例について1ターンの会話のみを学習しており、preferredメッセージとnon-preferredメッセージの最後は、アシスタントメッセージである必要があります。
4. SFT + DPO
現在、「OpenAI」はFine-Tuningするためのデフォルトの方法として、「SFT」(Supervised Fine-Tuning) を提供しています。別のDPOジョブを実行する前に、preferredレスポンス (またはサブセット) に対して「SFT」を実行すると、モデルの調整と性能が大幅に向上します。最初に目的のレスポンスに対してモデルをFine-Tuningすることで、正しいパターンをより適切に識別でき、「DPO」が動作を改善するための強力な基盤が提供されます。
推奨されるワークフローは次のとおりです。
(1) preferredレスポンスのサブセットを使用して、「SFT」でベースモデルをFine-Tuning。データの品質とタスクの代表性を確保することに重点を置く。
(2) 「SFT」でFine-Tuningされたモデルを開始点として使用し、「DPO」を適用して、preferred比較に基づいてモデルを調整。
5. DPO Fine-Tuning ジョブの設定
Fine-Tuningジョブ作成エンドポイントにメソッドフィールドを導入しました。ここでは、typeと関連するhyperparametersを指定できます。
・DPO の場合
(1) type に dpo を指定
(2) 必要に応じて、hyperparameters でオプションを指定
「beta」は、「DPO」でのみ使用できる新しいオプションです。これは 0 から 2 までの浮動小数点数で、新しいモデルが以前の動作にどれだけ厳密に従うか、または指定された設定に合わせるかを制御します。数値が高いほど保守的になり (以前の動作を優先)、数値が低いほど積極的になります (新しく指定された設定をより頻繁に優先)。
この値を自動 (デフォルト) に設定して、プラットフォームによって構成された値を使用することもできます。
以下の例は、「OpenAI SDK」でDPO Fine-Tuningジョブを設定する方法を示しています。Fine-Tuningジョブの作成全般の詳細については、next section of the guideを参照してください。
from openai import OpenAI
client = OpenAI()
job = client.fine_tuning.jobs.create(
training_file="file-all-about-the-weather",
model="gpt-4o-2024-08-06",
method={"type": "dpo", "hyperparameters": {"beta": 0.1}},
)