見出し画像

OpenAI APIのファインチューニングの学習データのガイドライン

以下の記事を元に、「OpenAI API」のファインチューニングの学習データのガイドラインをまとめました。

1. 学習データの書式

ファインチューニングするには、単一の入力「プロンプト」とそれに関連する出力 「コンプリーション」 のペアで構成される学習データが必要です。これは、1回のプロンプトで詳細な手順や複数の例を入力するような、ベースモデルの使用方法とは大きく異なります。

「学習データの書式」のガイドラインは、次のとおりです。

・プロンプトが終了してコンプリーションが開始することをモデルに知らせるため、区切り記号 ("\n\n###\n\n"など) でプロンプトを終了する必要があります。区切り記号は、プロンプトの他の場所で使用されない文字列を指定します。

・コンプリーションが終了することをモデルに知らせるため、停止記号 ("\n"、"###"など)でコンプリーションを終了する必要があります。停止記号は、コンプリーションの他の場所で使用されない文字列を指定します。

・推論時には、学習データと同じ書式 (同じ区切り記号と停止記号) でLLMを呼び出す必要があります。

・トークン化により、ほとんどの単語が先行する空白でトークン化されるため、各コンプリーションは空白で始まる必要があります。(日本語は該当しないかも)

2. 学習データの質と数

元のモデルで高品質のプロンプトを使用するよりも優れたパフォーマンスを発揮するようにファインチューニングするには、人間の専門家によって精査された、少なくとも100以上の高品質な学習データが必要です。

学習データ数が2倍になるたび、性能が直線的に向上する傾向があります。通常、学習データ数を増やすことが、性能を向上させる最良かつ最も信頼できる方法になります。

3. ユースケースごとのガイドライン

ユースケースごとに異なるガイドラインもあります。

・分類
 ・モデルが虚偽のテキストを作成していないか確認
 ・感情分析
 ・メールの分類

・条件付きテキスト生成
 ・Wikipediaの記事からの広告の生成
 ・エンティティの抽出
 ・カスタマー サポートのチャットボット
 ・特性リストからの製品説明の生成

4. 分類

「分類」のガイドラインは、次のとおりです。

・クラスは単一のトークンのものを選択。推論時に max_tokens=1 を指定。

クラスごとに100以上の学習データを準備。

・クラスの対数尤度を求めるには、logprobs=5 (5クラス分) を指定。

4-1. モデルが虚偽のテキストを生成していないか確認

学習データの例は、次のとおりです。

{"prompt":"Company: BHFF insurance\nProduct: allround insurance\nAd:One stop shop for all your insurance needs!\nSupported:", "completion":" yes"}
{"prompt":"Company: Loft conversion specialists\nProduct: -\nAd:Straight teeth in weeks!\nSupported:", "completion":" no"}

上記の例では、会社名、製品、広告を含む構造化された入力を使用しました。 区切り記号として "\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. 感情分析

学習データの例は、次のとおりです。

{"prompt":"Overjoyed with the new iPhone! ->", "completion":" positive"}
{"prompt":"@lakers disappoint for a third straight night https://t.co/38EFe43 ->", "completion":" negative"}

リクエストで 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. メールの分類

学習データの例は、次のとおりです。

{"prompt":"Subject: Update my address\nFrom:Joe Doe\nTo:support@ourcompany.com\nDate:2021-06-03\nContent:Hi,\nI would like to update my billing address to match my delivery address.\n\nPlease let me know once done.\n\nThanks,\nJoe\n\n###\n\n", "completion":" 4"}

多数のカテゴリに分類する場合は、カテゴリを数値に変換することを推奨します。これは、最大500カテゴリまで適切に機能します。トークン化により、数値の前にスペースを追加すると、パフォーマンスがわずかに向上することがあります。

上記の例では、入力として2043トークンに制限された受信メールを使用しました。区切り記号として "\n\n###\n\n" を使用し、電子メール内の ### を削除しました。

5. 条件付きテキスト生成

「条件付きテキスト生成」 (要約、エンティティ抽出、チャットボットなど) のガイドラインは、次のとおりです。

500以上の学習データを準備。

より低い学習率1~2 エポックのみを使用する方がうまくいく傾向がある。

5-1. Wikipediaの記事からの広告の生成

学習データの例は、次のとおりです。

{"prompt":"Samsung Galaxy Feel\nThe Samsung Galaxy Feel is an Android smartphone developed by Samsung Electronics exclusively for the Japanese market. The phone was released in June 2017 and was sold by NTT Docomo. It runs on Android 7.0 (Nougat), has a 4.7 inch display, and a 3000 mAh battery.\nSoftware\nSamsung Galaxy Feel runs on Android 7.0 (Nougat), but can be later updated to Android 8.0 (Oreo).\nHardware\nSamsung Galaxy Feel has a 4.7 inch Super AMOLED HD display, 16 MP back facing and 5 MP front facing cameras. It has a 3000 mAh battery, a 1.6 GHz Octa-Core ARM Cortex-A53 CPU, and an ARM Mali-T830 MP1 700 MHz GPU. It comes with 32GB of internal storage, expandable to 256GB via microSD. Aside from its software and hardware specifications, Samsung also introduced a unique a hole in the phone's shell to accommodate the Japanese perceived penchant for personalizing their mobile phones. The Galaxy Feel's battery was also touted as a major selling point since the market favors handsets with longer battery life. The device is also waterproof and supports 1seg digital broadcasts using an antenna that is sold separately.\n\n###\n\n", "completion":"Looking for a smartphone that can do it all? Look no further than Samsung Galaxy Feel! With a slim and sleek design, our latest smartphone features high-quality picture and video capabilities, as well as an award winning battery life. END"}

ファインチューンによって、モデルは与えられた学習データのスタイル (および間違い) を模倣しようとするため、提供する学習データが最高品質である必要があります。良い出発点は、約500例です。

Wikipediaの記事には複数の段落と見出しが含まれているため、ここでは複数行区切りを使用しました。 また、単純な終了トークンを使用して、コンプリーションがいつ終了するかをモデルが確実に認識できるようにしました。

5-2. エンティティ抽出

学習データの例は、次のとおりです。

{"prompt":"Portugal will be removed from the UK's green travel list from Tuesday, amid rising coronavirus cases and concern over a \"Nepal mutation of the so-called Indian variant\". It will join the amber list, meaning holidaymakers should not visit and returnees must isolate for 10 days...\n\n###\n\n", "completion":" Portugal\nUK\nNepal mutation\nIndian variant END"}

パフォーマンスを向上させるには、抽出されたさまざまなエンティティをアルファベット順に並べ替えるか、元のテキストに表示される順序で並べ替えるのが最適です。これは、モデルが順番に生成する必要がある全てのエンティティを追跡するのに役立ちます。

テキストには複数の行が含まれる可能性が高いため、複数行の区切り記号が最適です。

5-3. カスタマーサポートのチャットボット

チャットボットには通常、「会話の関連コンテキスト」「これまでの会話要約」「最新メッセージ」が含まれます。このユースケースでは、同じ過去の会話がデータセット内に複数の行を生成できますが、毎回わずかに異なるコンテキストで、エージェントの生成ごとにコンプリーションとして生成されます。 このユースケースでは、さまざまなタイプのリクエストや顧客の問題を処理する可能性が高いため、数千の学習データが必要になります。性能が高品質であることを確認するには、会話サンプルを精査してエージェントメッセージの品質を確認することをお勧めします。「要約」は、別のテキスト変換ファインチューニングモデルを使用して生成できます。

学習データの例は、次のとおりです。

{"prompt":"Summary: <summary of the interaction so far>\n\nSpecific information:<for example order details in natural language>\n\n###\n\nCustomer: <message1>\nAgent: <response1>\nCustomer: <message2>\nAgent:", "completion":" <response2>\n"}
{"prompt":"Summary: <summary of the interaction so far>\n\nSpecific information:<for example order details in natural language>\n\n###\n\nCustomer: <message1>\nAgent: <response1>\nCustomer: <message2>\nAgent: <response2>\nCustomer: <message3>\nAgent:", "completion":" <response3>\n"}

チャットボットは通常、「会話に関連するコンテキスト」「これまでの会話の要約」「最新メッセージ」が含まれています。このユースケースでは、様々なタイプのリクエストや顧客の問題を扱う可能性があるため、数千の例が必要になります。性能が高品質であることを保証するために、会話サンプルを吟味することをお勧めします。「要約」は、別のファインチューニングモデルで生成することができます。

5-4. 特性リストからの製品説明の生成

入力を自然言語に変換することが重要です。これにより、優れた性能が得られる可能性があります。

次のような学習データはうまく機能しない可能性が高いです。

{"prompt":"Item=handbag, Color=army_green, price=$99, size=S->", "completion":" This stylish small green handbag will add a unique touch to your look, without costing you a fortune."}

次のように、入力を自然言語にするとうまくいく可能性があります。

{"prompt":"Item is a handbag. Colour is army green. Price is midrange. Size is small.->", "completion":" This stylish small green handbag will add a unique touch to your look, without costing you a fortune."}

高い性能を得るには、コンプリーションが提供された説明に基づいていることを確認してください。外部コンテンツが頻繁に参照される場合、そのコンテンツを自動化された方法で追加すると、性能が向上します。説明が画像に基づいている場合は、アルゴリズムを使用して画像のテキストによる説明を抽出すると役立つ場合があります。コンプリーションは1文だけなので、 推論中の停止シーケンスとして "." を使用できます。

関連




この記事が気に入ったらサポートをしてみませんか?