OpenAI APIのファインチューニングの学習データのガイドライン
以下の記事を元に、「OpenAI API」のファインチューニングの学習データのガイドラインをまとめました。
1. 学習データの書式
ファインチューニングするには、単一の入力「プロンプト」とそれに関連する出力 「コンプリーション」 のペアで構成される学習データが必要です。これは、1回のプロンプトで詳細な手順や複数の例を入力するような、ベースモデルの使用方法とは大きく異なります。
「学習データの書式」のガイドラインは、次のとおりです。
2. 学習データの質と数
元のモデルで高品質のプロンプトを使用するよりも優れたパフォーマンスを発揮するようにファインチューニングするには、人間の専門家によって精査された、少なくとも100以上の高品質な学習データが必要です。
学習データ数が2倍になるたび、性能が直線的に向上する傾向があります。通常、学習データ数を増やすことが、性能を向上させる最良かつ最も信頼できる方法になります。
3. ユースケースごとのガイドライン
ユースケースごとに異なるガイドラインもあります。
4. 分類
「分類」のガイドラインは、次のとおりです。
4-1. モデルが虚偽のテキストを生成していないか確認
学習データの例は、次のとおりです。
上記の例では、会社名、製品、広告を含む構造化された入力を使用しました。 区切り記号として "\nSupported:" を使用しました。これにより、プロンプトとコンプリーションが明確に分離されました。十分な数の学習データがあれば、区切り記号は、プロンプトまたはコンプリーション内で使われない限り、大きな違いはありません (通常は 0.4% 未満)。
このユースケースでは、adaでファインチューニングしました。これは、adaの方が高速で安価で、分類タスクの場合大きなモデルに匹敵する精度を期待できるためです。(日本語だと怪しいかも)
リクエストの例は、次のとおりです。
curl https://api.openai.com/v1/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"prompt": "Company: Reliable accountants Ltd\nProduct: Personal Tax help\nAd:Best advice in town!\nSupported:",
"max_tokens": 1,
"model": "YOUR_FINE_TUNED_MODEL_NAME"
}'
yesまたはnoが返されます。
4-2. 感情分析
学習データの例は、次のとおりです。
リクエストで logprobs=2 を設定することにより、対数尤度を取得できます。
リクエストの例は、次のとおりです。
curl https://api.openai.com/v1/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"prompt": "https://t.co/f93xEd2 Excited to share my latest blog post! ->",
"max_tokens": 1,
"model": "YOUR_FINE_TUNED_MODEL_NAME"
}'
レスポンスの例は、次のとおりです。
{
"id": "cmpl-COMPLETION_ID",
"object": "text_completion",
"created": 1589498378,
"model": "YOUR_FINE_TUNED_MODEL_NAME",
"choices": [
{
"logprobs": {
"text_offset": [
19
],
"token_logprobs": [
-0.03597255
],
"tokens": [
" positive"
],
"top_logprobs": [
{
" negative": -4.9785037,
" positive": -0.03597255
}
]
},
"text": " positive",
"index": 0,
"finish_reason": "length"
}
]
}
4-3. メールの分類
学習データの例は、次のとおりです。
多数のカテゴリに分類する場合は、カテゴリを数値に変換することを推奨します。これは、最大500カテゴリまで適切に機能します。トークン化により、数値の前にスペースを追加すると、パフォーマンスがわずかに向上することがあります。
上記の例では、入力として2043トークンに制限された受信メールを使用しました。区切り記号として "\n\n###\n\n" を使用し、電子メール内の ### を削除しました。
5. 条件付きテキスト生成
「条件付きテキスト生成」 (要約、エンティティ抽出、チャットボットなど) のガイドラインは、次のとおりです。
5-1. Wikipediaの記事からの広告の生成
学習データの例は、次のとおりです。
ファインチューンによって、モデルは与えられた学習データのスタイル (および間違い) を模倣しようとするため、提供する学習データが最高品質である必要があります。良い出発点は、約500例です。
Wikipediaの記事には複数の段落と見出しが含まれているため、ここでは複数行区切りを使用しました。 また、単純な終了トークンを使用して、コンプリーションがいつ終了するかをモデルが確実に認識できるようにしました。
5-2. エンティティ抽出
学習データの例は、次のとおりです。
パフォーマンスを向上させるには、抽出されたさまざまなエンティティをアルファベット順に並べ替えるか、元のテキストに表示される順序で並べ替えるのが最適です。これは、モデルが順番に生成する必要がある全てのエンティティを追跡するのに役立ちます。
テキストには複数の行が含まれる可能性が高いため、複数行の区切り記号が最適です。
5-3. カスタマーサポートのチャットボット
チャットボットには通常、「会話の関連コンテキスト」「これまでの会話要約」「最新メッセージ」が含まれます。このユースケースでは、同じ過去の会話がデータセット内に複数の行を生成できますが、毎回わずかに異なるコンテキストで、エージェントの生成ごとにコンプリーションとして生成されます。 このユースケースでは、さまざまなタイプのリクエストや顧客の問題を処理する可能性が高いため、数千の学習データが必要になります。性能が高品質であることを確認するには、会話サンプルを精査してエージェントメッセージの品質を確認することをお勧めします。「要約」は、別のテキスト変換ファインチューニングモデルを使用して生成できます。
学習データの例は、次のとおりです。
チャットボットは通常、「会話に関連するコンテキスト」「これまでの会話の要約」「最新メッセージ」が含まれています。このユースケースでは、様々なタイプのリクエストや顧客の問題を扱う可能性があるため、数千の例が必要になります。性能が高品質であることを保証するために、会話サンプルを吟味することをお勧めします。「要約」は、別のファインチューニングモデルで生成することができます。
5-4. 特性リストからの製品説明の生成
入力を自然言語に変換することが重要です。これにより、優れた性能が得られる可能性があります。
次のような学習データはうまく機能しない可能性が高いです。
次のように、入力を自然言語にするとうまくいく可能性があります。
高い性能を得るには、コンプリーションが提供された説明に基づいていることを確認してください。外部コンテンツが頻繁に参照される場合、そのコンテンツを自動化された方法で追加すると、性能が向上します。説明が画像に基づいている場合は、アルゴリズムを使用して画像のテキストによる説明を抽出すると役立つ場合があります。コンプリーションは1文だけなので、 推論中の停止シーケンスとして "." を使用できます。