見出し画像

論文紹介 part4 :"The Ultimate Guide to Fine-Tuning LLMs from Basics to Breakthroughs: An Exhaustive Review of Technologies, Research, Best Practices, Applied Research Challenges and Opportunities"を読む

はじめに

今回も同様に以下の論文を読んでいきます。

論文名:The Ultimate Guide to Fine-Tuning LLMs from Basics to Breakthroughs: An Exhaustive Review of Technologies, Research, Best Practices, Applied Research Challenges and Opportunities

著者:Venkatesh Balavadhani Parthasarathy, Ahtsham Zafar, Aafaq Khan, and Arsalan Shahid

今回はステージ1:データの準備についてみていきます。LLMをファインチューニングするにあたっての基本となりますが、データが不足している場合や、不均衡な場合に用いるテクニックなど、重要な事項が記載されていると思います。下記にまとめていきます。



3.1 データ準備のステップ

3.1.1 データ収集

データ準備の最初のステップは、様々なソースからのデータ収集です。これらのソースは、CSV、ウェブページ、SQLデータベース、S3ストレージなど、任意の形式であり得ます。Pythonはデータを効率的かつ正確に収集するための複数のライブラリを提供しています。

表3.1はここでは省略しますが、pandasやbeautifulsoup、boto3などの基本的なライブラリを紹介しています。LLMの学習に限らず、pandasは使うでしょうし、AWSを使う場合はboto3は必須です。これらに興味がある方は本文をご覧ください。

3.1.2 データ前処理とフォーマット

高品質のデータでファインチューニングを行うためには、データ前処理とフォーマットが不可欠です。このステップには、データのクリーニング、欠損値の処理、タスクの特定要件に合わせたデータのフォーマット化が含まれます。Pythonの複数のライブラリがテキストデータ処理をサポートしています。

表3.2にはデータ前処理のライブラリがまとめらています。基本的にはHuggingFaceを知っておけばいいのではないかと思います。この辺は後ほどチュートリアルを示していければと思っています。

3.1.3 データ不均衡の処理

不均衡なデータセットに対処することは、すべてのクラスでバランスの取れたパフォーマンスを確保するために重要です。以下のようなテクニックと戦略が用いられます:

  1. オーバーサンプリングとアンダーサンプリング: SMOTE(Synthetic Minority Oversampling Technique)のような技術で、合成例を生成してバランスをとります。

    • Pythonライブラリ: imbalanced-learn

    • 説明: imbalanced-learnは、SMOTEを含む不均衡データセットを扱うための様々な方法を提供します。

  2. 損失関数の調整: 少数クラスに対して重みを加え、クラス頻度に反比例してクラスウェイトを設定します。

  3. フォーカルロス: クロスエントロピーロスの変種で、簡単な例を減衰させ、難しい負例に焦点を当てた学習を行います。

    • Pythonライブラリ: focal loss

    • 説明: focal lossパッケージは、BinaryFocalLossやSparseCategoricalFocalLossを含むフォーカルロス関数の堅牢な実装を提供します。

  4. コストセンシティブ学習: 誤分類のコストを学習アルゴリズムに直接組み込み、少数クラスの誤分類に高いコストを割り当てます。

  5. アンサンブルメソッド: バギングやブースティングなどの手法を使用し、複数のモデルを組み合わせてクラスの不均衡を扱います。

    • Pythonライブラリ: sklearn.ensemble

    • 説明: scikit-learnは、バギングやブースティングを含むアンサンブルメソッドの堅牢な実装を提供します。

この辺は少々高度なテクニックなのではないかと思っています。データが不均衡な場合にこれらのテクニックを使って、その不均衡を改善しようとしています。
データの不均衡とは、機械学習や統計分析において、特定のクラスやカテゴリがデータセット内で他のクラスやカテゴリよりもはるかに少ないか多いことを指します。例えば、次のような状況が考えられます。

  1. 医療診断: 健康な患者のデータが圧倒的に多く、特定の病気を持つ患者のデータが非常に少ない場合。これにより、モデルは健康な状態を過剰に予測し、病気の診断が正確にできない可能性があります。

  2. 詐欺検出: クレジットカード取引のデータでは、正規の取引が圧倒的多数で、不正な取引がごく一部しかない場合。モデルが不均衡なデータに基づいて学習すると、不正取引を正しく検出できない可能性があります。

  3. 製造業の欠陥検出: 生産される製品のほとんどが正常で、欠陥のある製品がごく少数しかない場合。モデルが正常な製品のデータばかり学習すると、欠陥の検出精度が低くなる可能性があります。

このような不均衡なデータセットでは、モデルが多数派のクラスに偏って学習しやすく、少数派のクラスのパフォーマンスが低下します。これらに対して上記のライブラリが効果を発揮することになります。

3.1.4 データセットの分割

ファインチューニング用のデータセットを分割する際には、通常80:20の比率でトレーニングセットと検証セットに分けます。ここは一般的な項目かと思うので省略しますが、ファインチューニングに限らず、機械学習では一般的にデータ分割を行います。train, test, validなどに分けるのが一般的だと思います。使用用途にもよると思いますが、自分に合ったライブラリを使用すれば良いと思います。

3.2 現行および潜在的な研究手法

3.2.1 データアノテーション

データアノテーションとは、モデルの学習目的に関連する特定の属性をテキストデータにラベリングまたはタグ付けすることです。このプロセスは教師あり学習タスクにとって不可欠であり、ファインチューニングされたモデルの性能に大きな影響を与えます。最近の研究では、以下のようなアプローチが注目されています:

  • 人によるアノテーション: 専門家による手動アノテーションは、その正確性と文脈理解の点でゴールドスタンダードとされていますが、大規模なデータセットでは時間とコストがかかります。Excel、Prodigy、Innodataなどのツールがこのプロセスを支援します。

  • 半自動アノテーション: 機械学習アルゴリズムと人によるレビューを組み合わせ、効率的にラベル付きデータセットを作成します。Snorkelのようなツールは、弱教師あり学習を使用して初期ラベルを生成し、その後人間が精査します。

  • 自動アノテーション: 完全自動化されたアノテーションは、機械学習アルゴリズムを活用してデータを人間の介入なしにラベリングし、スケーラビリティとコスト効果を提供します。Amazon SageMaker Ground Truthなどのサービスが自動ラベリングをサポートしていますが、タスクの複雑さによって精度は異なります。

全く新しいデータセットには人がアノテーションするしかないと思います。これは大変労力のいる作業であり、人海戦術で多くのデータにラベルをつけていきます。ある程度データが集まればそれを用いて学習させ、半自動アノテーション、自動アノテーションが可能になります。アノテーションのプラットフォームとしてCVATが有名です。

3.2.2 データ拡張

データ拡張(DA)技術は、トレーニングデータセットを人工的に拡大してデータ不足に対処し、モデル性能を向上させます。NLPでよく使用される高度な技術には以下が含まれます:

  • 単語埋め込み: Word2VecやGloVeなどの単語埋め込みを使用して、単語を意味的に同等な単語で置き換え、新しいデータインスタンスを生成します。

  • 逆翻訳: テキストを他言語に翻訳し、その後元の言語に戻してパラフレーズされたデータを生成します。この手法は多様なトレーニングサンプルを生み出すのに役立ちます。Google Translate APIが一般的に使用されます。

  • 敵対的攻撃: テキストの意味を保持しつつ、元のテキストをわずかに修正して新しいトレーニングサンプルを生成します。TextAttackのようなライブラリがこれらの拡張をサポートしています。

  • NLP-AUG: キャラクター、単語、文、オーディオ、スペクトログラムの拡張を提供し、データセットの多様性を高めるライブラリです。

画像処理だと、画像を反転させたりするのが多いという印象です。

3.2.3 LLMを使用した合成データ生成

大規模言語モデル(LLM)は、以下のような革新的な技術を用いて合成データを生成できます:

  • プロンプトエンジニアリング: GPT-3のようなLLMを誘導し、関連性が高く質の高い合成データを生成するための特定のプロンプトを作成します。

  • マルチステップ生成: LLMが初期データを生成し、その後のステップで洗練させる反復的な生成プロセスを採用します。この方法は要約やバイアス検出などの様々なタスクにおいて高品質な合成データを生成できます。

合成データをファインチューニングに使用する前に、その正確性と関連性を検証することが重要です。

3.3 LLMファインチューニングのためのデータ準備における課題

データ準備における主な課題は以下のとおりです:

  1. ドメインの関連性: データが特定のドメインに関連していることを確認し、モデルの性能を確保します。ドメインが合わないデータは一般化性能が低下し、誤った出力を引き起こします。

  2. データの多様性: 多様でバランスの取れたデータを含め、モデルのバイアスを防ぎ、一般化性能を向上させます。多様性が欠けると、モデルは過小評価されるシナリオで性能が悪化します。

  3. データサイズ: 大規模データセットを管理・処理すること。効果的なファインチューニングには少なくとも1000サンプルが推奨されますが、大規模データセットはストレージ、計算資源、処理時間に課題をもたらします。

  4. データクリーニングと前処理: ノイズやエラー、不整合を除去し、クリーンな入力をモデルに提供することが重要です。不十分な前処理はモデル性能を著しく低下させます。

  5. データアノテーション: 精密で一貫したラベリングは、ラベル付きデータを必要とするタスクにおいて重要です。一貫性のないアノテーションは信頼性の低いモデル予測につながります。

  6. 稀なケースの処理: データセット内で稀だが重要な事例を適切に表現し、モデルが頻度の少ないが重要なシナリオにも一般化できるようにします。

  7. 倫理的考慮: 有害またはバイアスを含むコンテンツを精査し、意図しない結果を防ぎます。倫理的なデータ取り扱いにはバイアスの除去やプライバシーの確保が含まれます。

3.4 LLMファインチューニング用の利用可能なデータセット

LLMのファインチューニングに適したデータセットの一覧は、LLMXplorerのようなリソースで参照できます。これはドメインおよびタスク固有のデータセットを提供します。

以下にLLMXploreのリンクを示します。ドメイン、タスク特有のデータを検索できるようです。

https://docs.google.com/forms/d/e/1FAIpQLSfYVIyJNn5Afpb5YfFSBrYaXSBNwFn_8EBTSQO8qswhlusoxQ/viewform

3.5 ベストプラクティス

これまでのまとめのような章なので省略します。


データを収集すること一つをとっても多くのテクニックがあることがわかります。このステージが最も時間がかかる工程なのではないかと思います。要件に従いファインチューニングしたい方向にデータを集め、そのデータが不足していればデータを拡張させたり、不均衡なら不均衡を解決するライブラリを用いるのも手段です。また、均衡するようにデータを集めるのも一つの手段です。

集めたデータは教師付きファインチューニングであればそのデータに正解データをラベル付けする必要があります。この工程がアノテーションであり、それを効率化するプラットフォームや半自動、自動アノテーションなどのテクニックがあります。ただ、LLMの登場によりプロンプトエンジニアリングをうまくやれば、アノテーションを効率的に実施できる可能性があります。この辺はプロンプトのうまさが効いてくるのではないでしょうか。

学習させるときにはデータを分割して、Out of Sampleに対しての性能を評価していくことになりますが、これも単に分ければ良いというものではなく、その割合やシャッフルしたり、しなかったり、金融などでは未来の情報を含まないように一方向の分割をしたりなどの手法を取る必要があります。

この辺は実際に手を動かして取得するしかないのかなぁ、と思います。次はステージ2のモデルの初期化を見ていこうと思います。

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