Google Colaboratoryで始めるLLMファインチューニング(4):データセット準備

前回の記事では、Llama3.1をGoogle Colabで動かすというところまでやりました。ここでは、ファインチューニングをするためのデータセットの準備は主に2つあります。「すでに用意してあるデータセットを使用するか」もしくは「データセットを作成して使用するか」この内容を書いていきます。

Google Colabの使い方からやりたい方は、以下に記事のリンクを入れておくので順番に進んでください。

Google Colabの使い方について

Hugging Faceモデルダウンロードについて

Llama 3.1をColabで動かす方法について

ファインチューニング用データセットとは?

ファインチューニング用データセットとは、事前に膨大なデータで学習済みのAIモデルを、特定のタスクや目的に合わせてさらに訓練するための、比較的少量の専門的なデータセットのことです。

一般的なデータセット形式

ファインチューニング用データセットの最も一般的なデータ形式は、JSONL(JSON Lines)形式です。これは、1行ごとに1つの学習データがJSON形式で記述されたテキストファイルです。

JSONL形式の基本

JSONL形式のファイルは、以下のような構造になります。

{"prompt": "入力テキスト1", "completion": "期待される出力1"}
{"prompt": "入力テキスト2", "completion": "期待される出力2"}
{"prompt": "入力テキスト3", "completion": "期待される出力3"}

各行は独立したJSONオブジェクトであり、改行文字で区切られています。これにより、大きなデータセットでも効率的に処理できます。

ユースケース別のデータ形式

ファインチューニングの目的によって、JSONオブジェクトの中身は少し異なります。

1. プロンプトと応答(指示と出力)

最も基本的な形式で、モデルに特定の指示に対する応答を教えたい場合に使用されます。

例: 翻訳、要約、質問応答など

{"prompt": "以下の日本語をフランス語に翻訳してください:こんにちは", "completion": "Bonjour"}
{"prompt": "リンゴの栄養について教えてください。", "completion": "リンゴはビタミンC、食物繊維、カリウムを豊富に含んでいます。"}

ファインチューニング用データセットにおけるcompletionは、AIモデルに生成させたい「期待される出力」を意味します。

2. 会話形式(チャット)

チャットボットのような、会話履歴を学習させたい場合に使用されます。role(役割)とcontent(内容)のペアをリストで記述します。

例: OpenAIのモデルなど

{"messages": [
    {"role": "system", "content": "あなたは、親切で丁寧なカスタマーサポートAIです。"},
    {"role": "user", "content": "注文した商品の配送状況について教えてください。"},
    {"role": "assistant", "content": "ご注文番号をお知らせいただけますでしょうか?お調べいたします。"}
]}
{"messages": [
    {"role": "user", "content": "先週の会議の議事録を作成してほしい。"},
    {"role": "assistant", "content": "はい、承知いたしました。会議の日時と参加者をお知らせください。"}
]}

データセットを探す方法

ファインチューニングするデータセットは、「用意してあるデータセットを使用する」か「データセットを作って使用する」ケースがあります。ここでは、すでに作成されているデータセットを探す方法を解説します。

主要なデータセット探索プラットフォーム

特長:
大規模言語モデル(LLM)をはじめとするAIモデルやデータセットが大量に集まる、AI開発の最大のコミュニティプラットフォーム。

強み:

  • 自然言語処理(NLP)タスクに特化したデータセットが豊富。
  • datasetsというライブラリを使って、Pythonコードから簡単にデータセットを読み込み、処理できる。
  • 日本語に特化したデータセットも多く見つかります。

向いている用途:
LLMのファインチューニング、NLP関連の研究開発。

特長:
機械学習コンペティションで有名なKaggleが提供するデータセットハブです。

強み:

  • 画像、音声、テキストなど、多様な分野のデータセットが公開されている。
  • 多くのデータセットがCSV形式で提供されており、幅広いツールで利用しやすい。
  • データセットに対するコミュニティの議論や分析ノートブック(Kernels)も参考にできる

向いている用途:
データ分析、画像認識、時系列データ分析など、多岐にわたる機械学習タスク。

URL:

特長:
Googleが提供する、データセット専用の検索エンジンです。

強み:

  • ウェブ上に公開されている様々なドメイン(学術機関、政府機関、個人のウェブサイトなど)のデータセットを横断的に検索できる。
  • キーワードだけでなく、特定のサイトに絞って検索する機能も便利。

向いている用途:
広範囲のテーマで公開されているデータセットを探したい場合。

URL:

これらのプラットフォームからデータセットを使うことができます。

データセットを作る方法

データセットを探す方法について書いたので、次は、データセットを作る方法について書いていきます。ファインチューニング用のデータセットを作成する方法は、大きく分けて手動での作成プログラミングによる自動化ツールを使った生成の3つがあります。

1. 手動で作成

最もシンプルで、質の高いデータセットを作成できる方法です。特に、専門知識や独自のブランドトーンが重要な場合に適しています。

具体的な方法:

  1. スプレッドシートで作成:GoogleスプレッドシートやExcelに、promptとcompletionのペアを直接入力します。
  2. データのアノテーション:専門家が既存のテキストデータ(例:顧客サポートのログ、社内マニュアル)にラベル付けや注釈を付けて、教師データを作成します。
  3. JSONL形式に変換:スプレッドシートのデータをCSVファイルとしてエクスポートし、Pythonスクリプトやオンラインツールを使ってJSONL形式に変換します。

メリットとデメリット:

  • メリット:高品質で、目的に完全に合致したデータを作成できる。
  • デメリット:時間とコストがかかる。大量のデータを作成するのは非効率。

2. プログラミングで自動化

ウェブ上の公開情報や社内データをプログラムで抽出し、データセットを自動的に作成します。

具体的な方法:

  1. ウェブスクレイピング:PythonのBeautifulSoupやScrapyなどのライブラリを使って、ウェブサイトからテキストデータを抽出します。著作権や利用規約に注意が必要です。
  2. APIの利用:X(旧Twitter)やRedditなどの公開APIを利用して、特定のトピックに関するテキストデータを収集します。
  3. 既存データの活用:社内データベースやログファイルから、過去のやり取りや文書を抽出します。

メリットとデメリット:

  • メリット:大量のデータを効率的に収集できる。
  • デメリット:データの品質が均一でない場合がある。抽出したデータのクレンジング(重複削除、ノイズ除去など)が必要になる。

3. AIツールを使って生成する(合成データ)

より大規模なデータセットを効率的に作成したい場合に有効な方法です。

具体的な方法:

  1. 小規模データから拡張:質の高い少数のデータを「シード(種)」として用意し、より強力な大規模言語モデル(LLM)を使って類似のデータセットを大量に生成します。
  2. プロンプトで生成:LLMに「〇〇のような会話を100件生成してください」といった指示を与え、データセットを自動生成させます。
  3. 蒸留(Distillation):性能の高いモデルの応答を教師データとして利用し、より小さいモデルをファインチューニングする手法です。

メリットとデメリット:

  • メリット:大量のデータを素早く生成できるため、データ不足を解消できる。
  • デメリット:生成されたデータにバイアスが含まれたり、オリジナリティに欠ける可能性がある。

MoDSと呼ばれるデータセットを作るための手法について

MoDSは、すでにある大規模なデータセットの中から、最も効果的な少数のデータだけを選び抜いて、新しい、小規模で高性能なファインチューニング用データセットを構築する手法です。

手元に大きくて雑多な指示データ候補があり、その中から最小限の件数で最大の効果を出したい場面で特に有効です。典型的には、計算資源や学習時間が限られる状況、ノイズ混じりのオープン指示コーパスを使う状況、新しい基盤モデルに入れ替えた直後で「そのモデルの弱点に合わせて」データを選び直したい状況に向いています。

一方で、候補データがそもそも少ない場合、極めて専門的で既存の報酬モデルが品質をうまく採点できない場合、全候補に対する推論・採点の計算コストを確保できない場合は効果が出にくいことがあります。そのようなときは、領域適合した採点器(コードならテスト通過率、数理なら検証器など)に置き換える、候補集合をまずルールベースで粗く間引く、といった調整を加えるとMoDSの考え方を活かしやすくなります。

論文についてはこちらから

データセットを「探す」か「作る」の判断基準

ファインチューニング用のデータセットについて、「探して使う」と「作って用意する」のどちらを選択するかは、目的、コスト、時間の制約、データの独自性など、いくつかの要因によって決まります。

探して使うケース

公開されているデータセットを探して利用することは、コストと時間を節約したい場合や、広く一般的な知識やタスクの学習で十分な場合に有効です。

探して使うべき時:

  • 開発の初期段階やPoC(概念実証):プロジェクトの初期段階で、モデルが特定のタスクに適応できるか素早く検証したい場合。
  • 汎用的なタスク:一般的な言語翻訳、感情分析、テキスト分類など、多くの事例が公開されているタスク。
  • 低コストでの実施:アノテーション(正解データの作成)には多くの人件費がかかるため、コストを抑えたい場合。
  • データ収集の手間を省きたい:特定の分野のデータ収集が困難な場合や、時間がない場合。

探して使う際の注意点:

  • 利用規約(ライセンス):商用利用が可能か、再配布できるかなど、ライセンスを必ず確認する必要があります。
  • データの品質と偏り:公開データセットの品質は保証されておらず、アノテーションの精度が低い、データに偏りがあるなどのリスクがあります。
  • 独自性の欠如:特定の専門分野や独自の応答スタイルを学習させたい場合、公開データでは不十分です。

作って用意するケース

独自にデータセットを作成することは、モデルに特定の専門知識や独自の応答スタイルを学習させたい場合や、高い精度を追求する場合に適しています。

作って用意すべき時:

  • 専門性の高いタスク:医療、法律、社内規定など、特定の業界や自社固有の知識をモデルに習得させたい場合。
  • 独自の応答形式やスタイル:企業のブランドトーンに合わせたチャットボットを作成するなど、独自の応答形式を学習させたい場合。
  • 高い精度や信頼性が求められるタスク:誤答が許されないような、モデルの出力に高い一貫性や正確性が求められるタスク。
  • 競合他社との差別化:独自のデータセットで学習させたモデルは、他社には真似できない独自の強みとなります。

作って用意する際の注意点:

  • 高いコストと時間:データの収集、整理、アノテーションには多くのコストと時間がかかります。
  • 品質管理:データの品質がモデルの性能を左右するため、正確なアノテーションと品質管理が不可欠です。
  • データの偏り:作成したデータに偏りがあると、モデルがバイアスを学習してしまう可能性があります。

まとめ

この記事では、ファインチューニング用のデータセットを準備するための方法について書いていきました。次の記事では、データセットを使用して、実際にファインチューニングをしてみようと思います。

クラウドに出せないデータで、自社専用AIをつくる。
Nextorageでは、機密情報や社内ナレッジなど、クラウドサービスに出せないデータを活用して、自社専用AIを構築するためのオンプレミスAIソリューション 「aiDAPTIV+(アイダプティブ・プラス)」 を展開しています。

生成AIを業務で活用したい一方で、
「社外サービスに機密情報を入力できない」
「GPUコストが高く、導入・運用のハードルが高い」
「日本語業務で十分な精度を出したい」
といった課題を感じている企業・組織の方は、ぜひ以下からお問い合わせください。