「良い説明がすべてです」

「完璧な解説はすべてを変える」

few-shot学習を使用してテキスト分類の性能を向上させる方法

Photo by Patrick Tomasso on Unsplash.

私は長い間、大規模言語モデル(LLM)を個人プロジェクトや日常業務の一部として使用してきました。多くの人々と同様に、これらのモデルの強力な能力に興奮しています。ただし、これらのモデルは非常に強力ですが、さまざまなタスクを改善する余地が常にあります。

そして、いいえ、私はLLMの微調整について書くつもりはありません。これはコストがかかり、多くの場合、良いGPU搭載デバイスが必要です。実際には、few-shot学習を使用してモデルを改善する非常にシンプルな方法を紹介します。

few-shot学習は、モデルがわずかな例(クラスごとに通常1〜5の例)だけを使用して新しいタスクを解決するために訓練される機械学習の技術です。few-shot学習にはいくつかの重要なポイントがあります:

  • 少量のデータから一般化を学ぶ:few-shot学習の方法は、数千または数百万の例が必要な従来の深層学習の方法とは異なり、わずかな例からもうまく一般化できるモデルを学習することを目指しています。
  • 転移学習:few-shot学習の方法は、以前のタスクを解決する際に得られた知識を活用し、その知識を新しいタスクをより速く、より少ないデータから学習するのに役立てます。この転移学習の能力が重要です。
  • 類似性の学習:一部のfew-shot学習手法は、例と例の間の類似性を学習します。これにより、新しい例を既存のラベル付き例と比較して予測することができます。

しかし、分類の問題でfew-shot学習をどのように使用してモデルの性能を向上させることができるのでしょうか?例を通じて見ていきましょう。

データと準備

私はHuggingFaceからデータを取得して分析を開始しました。データセットはfinancial-reports-secと呼ばれます(このデータセットはApache License 2.0を持ち、商業利用が許可されています)し、データセットの作者によると、1993年から2020年までのアメリカの公開企業がSECのEDGARシステムに提出した年次報告書(10-Kファイリング)が含まれています。各年次報告書は20のセクションに分割されています。

このデータの2つの関連属性は、現在のタスクに役立ちます:

  • Sentence:10-Kファイリングの抜粋
  • Section:文が属する10-Kファイリングのセクションを示すラベル

私は次の3つのセクションに焦点を当てました:

  • 事業(Item 1):企業の事業を説明します。これには子会社、市場、最近のイベント、競争、規制、労働などが含まれます。データでは0で示されます。
  • リスク要因(Item 1A):企業に影響を与える可能性のあるリスクについて説明します。これには外部要因、潜在的な障害、他の開示が含まれ、投資家に警告します。データでは1で示されます。
  • 物件(Item 2):重要な物理的資産の詳細を示します。知的財産や無形資産は含まれません。データでは3で示されます。

各ラベルごとに、置換なしで10の例をサンプリングしました。データは次のように構成されています:

出来合いの 予測

データが準備できたら、データフレームから文を取得してラベルを予測する分類器関数を作成するだけです。

Role = '''あなたはSECの10-Kフォームの専門家です。テキストが与えられ、そのテキストを「Item 1」、「Item 1A」、「Item 2」のいずれかに分類する必要があります。テキストは必ずいずれかのカテゴリに属しているので、1つのカテゴリのみを返してください。'''def sec_classifier(text):         response = openai.ChatCompletion.create(        model='gpt-4',        messages=[            {                "role": "system",                "content": Role},            {                "role": "user",                "content": text}],        temperature=0,        max_tokens=256,        top_p=1,        frequency_penalty=0,        presence_penalty=0)    return response['choices'][0]['message']['content']

I’m using GPT-4 here since it’s OpenAI’s most capable model so far. I’ve also set the temperature to 0 just to make sure the model does not go off track. The really fun part is how I define the Role — that’s where I get to guide the model on what I want it to do. The Role tells it to stay focused and deliver the kind of output I’m looking for. Defining a clear role for the model helps it generate relevant, high-quality responses. The prompt in this function is:

あなたはSEC 10-Kフォームの専門家です。テキストが提示され、そのテキストを「Item 1」、「Item 1A」、「Item 2」のいずれかに分類する必要があります。テキストは上記のカテゴリーのいずれかに属しているため、1つのカテゴリーのみを返してください。

全データ行に分類関数を適用した後、モデルのパフォーマンスを評価するために分類レポートを生成しました。マクロ平均のF1スコアが0.62となり、このマルチクラス問題に対して合理的な予測能力があることを示しています。3つのクラス間の例の数がバランスが取れていたため、マクロおよび重み付け平均は同じ値に収束しました。このベースラインのスコアは、追加の調整や最適化などの追加操作の前の事前学習モデルの初期精度を反映しています。

               precision    recall  f1-score   support      Item 1       0.47      0.80      0.59        10     Item 1A       0.80      0.80      0.80        10      Item 2       1.00      0.30      0.46        10    accuracy                           0.63        30   macro avg       0.76      0.63      0.62        30weighted avg       0.76      0.63      0.62        30

Description is all you need (few-shot prediction)

前述のように、few-shot学習はわずかな良い例でモデルを一般化することに関するものです。そのため、私はItem 1、Item 1A、Item 2についての説明を含めてクラスを修正しました(Wikipediaを参考):

Role_fewshot = '''あなたはSEC 10-Kフォームの専門家です。テキストが提示され、そのテキストを「Item 1」、「Item 1A」、「Item 2」のいずれかに分類する必要があります。テキストは上記のカテゴリーのいずれかに属しているため、1つのカテゴリーのみを返してください。分類時には、以下の定義を考慮してください:Item 1(つまり「ビジネス」)は、企業の事業内容を説明します。企業が何を行っているか、どの子会社を所有しているか、どの市場で事業を展開しているかなどが含まれます。また、最近のイベント、競争、規制、労働問題なども含まれる場合があります。(一部の業界は規制が厳しく、複雑な労働要件があり、これらが事業に重大な影響を与えることがあります。)このセクションの他のトピックには、特別な運営コスト、季節要因、保険事項なども含まれる場合があります。Item 1A(つまり「リスクファクター」)は、会社が何がおかしくなる可能性があるか、想定される外的影響、将来の義務不履行の可能性など、投資家や潜在的な投資家に適切な警告をするために開示される他のリスクを記載するセクションです。Item 2(つまり「物件」)は、会社の重要な物理的資産を示すセクションです。これには知的財産や無形財産は含まれません。注意:アイテムのみを記載してください。'''def sec_classifier_fewshot(text):         response = openai.ChatCompletion.create(        model='gpt-4',        messages=[            {                "role": "system",                "content": Role_fewshot},            {                "role": "user",                "content": text}],        temperature=0,        max_tokens=256,        top_p=1,        frequency_penalty=0,        presence_penalty=0)    return response['choices'][0]['message']['content']

プロンプトは以下のようになります:

あなたはSEC 10-Kフォームの専門家です。テキストが提示され、そのテキストを「Item 1」、「Item 1A」、「Item 2」のいずれかに分類する必要があります。テキストは上記のカテゴリーのいずれかに属しているため、1つのカテゴリーのみを返してください。分類時には、次の定義を考慮してください:

Item 1(つまり「ビジネス」)は、企業の事業内容を説明します。企業が何を行っているか、どの子会社を所有しているか、どの市場で事業を展開しているかなどが含まれます。また、最近のイベント、競争、規制、労働問題なども含まれる場合があります。(一部の業界は規制が厳しく、複雑な労働要件があり、これらが事業に重大な影響を与えることがあります。)このセクションの他のトピックには、特別な運営コスト、季節要因、保険事項なども含まれる場合があります。

Item 1A(つまり「リスクファクター」)は、会社が何がおかしくなる可能性があるか、想定される外的影響、将来の義務不履行の可能性など、投資家や潜在的な投資家に適切な警告をするために開示される他のリスクを記載するセクションです。

Item 2(つまり「物件」)は、会社の重要な物理的資産を示すセクションです。これには知的財産や無形財産は含まれません。

テキストを実行すると、以下のパフォーマンスが得られます:

                適合率  再現率 F1スコア サポート      項目1        0.70      0.70      0.70        10     項目1A       0.78      0.70      0.74        10      項目2       0.91      1.00      0.95        10    正確度                          0.80        30   平均値       0.80      0.80      0.80        30加重平均値       0.80      0.80      0.80        30

マクロ平均のF1スコアは0.80となり、予測の改善が29%もあります。これは、各クラスの良い説明を提供するだけで実現されました。

最後に、フルデータセットをご覧いただけます:

実際に、提供した例はモデルに具体的なインスタンスを学習させることができます。例を用いることで、モデルはパターンや特徴を推論することができ、複数の例を見ることで、モデルは学習される全体的なコンセプトを特徴付ける共通点や違いに気付くことができます。これにより、モデルはより堅牢な表現を形成するのに役立ちます。さらに、例を提供することは、大規模なラベル付きデータセットの代わりに、モデルを望ましい振る舞いに導く、弱い監督の形式として機能します。

フューショット関数では、具体的な例はモデルが留意すべき情報やパターンの種類を指し示すのに役立ちます。要約すると、具体的な例はフューショット学習に重要です。それらはモデルが新しい概念の初期表現を構築するためのアンカーポイントを提供し、その後、提供されたわずかな例を通じて洗練されることができます。具体的なインスタンスからの帰納学習は、モデルが抽象的な概念の微妙な表現を開発するのに役立ちます。

もし、この記事がお役に立てたら、私のLinkedInやウェブページiliateimouri.comでぜひコンタクトを取ってください。

注:特記されていない限り、すべての画像は著者によるものです。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more