ファインチューニングの理論を学んできましたが、実際に始める前に超重要なステップがあります。それは「データの準備」!
どんなに優秀なモデルや学習アルゴリズムを使っても、データがダメだったらすべて台無しです。「ゴミを入れれば、ゴミが出る(Garbage In, Garbage Out)」って言葉、聞いたことありませんか?
今回は、ファインチューニングデータセットの準備方法を、初心者の方にもわかるように丁寧に解説します!
すべてはデータから始まる
大規模言語モデルの動作を形作る3つの要素があります:
- データセット:モデルが見るもの、その構造
- モデルアーキテクチャ:情報を処理する方法
- 損失関数:「良い動作」をどう伝えるか
この3つ、どれも大事ですが、「1つだけ選べ」と言われたら…実はデータセットが最も重要なんです!
なぜかって?
- アーキテクチャはほぼ固定:Llama、Mistral、Qwenなど既存のモデルを選ぶだけ
- 損失関数も標準的:ほとんどの場合、クロスエントロピー損失を使う
- データセットが結果を駆動:モデルが示してほしい動作をエンコードする
つまり、データセット準備は「ファインチューニングの最初の実践的ステップ」であり、最も重要なステップでもあるんです。
データセットはどこから来るの?
実世界のプロジェクトでは、データセットは通常3つの場所から来ます:
1. 内部データソース
会社の中にあるデータです:
- ドキュメント
- FAQ(よくある質問とその回答)
- トランスクリプト(会議記録など)
- レポート
例えば、カスタマーサポートのチャットボットを作るなら、過去の問い合わせと回答のログが最高のデータになります。
2. 公開データセット
プロトタイピング(試作)やベースライン実験用に使えます:
- FLAN:Google製の命令チューニングデータセット
- OASST(Open Assistant):オープンソースのチャット形式データセット
- Alpaca:Stanford製の命令-回答ペア
これらはHugging Faceで無料で使えます!
3. カスタムデータ収集
上記のどれもユースケースに合わない場合、自分で作ります。後で説明する「合成データ生成」が役立ちますよ。
データセット作成の3つのアプローチ
データセットを作る方法は、大きく3つあります:
1. 人間ラベル付きデータセット(ゴールドスタンダード)
人間の注釈者が例を作成または検証します。
メリット:
– 明確さ、一貫性、整合性が高い
– 信頼性が高い
– ハイステークス(高リスク)ドメインに最適
デメリット:
– 小さくなりがち(コストと時間がかかる)
– スケールしにくい
医療アシスタントや法律アドバイザーなど、正確性が超重要な場合に使います。
2. 合成およびLLM生成データセット(最速成長中)
大規模モデルを使って、シード素材から構造化された例を生成します。
例えば、GPT-4に「金融サービスに関する100個の質問-回答ペアを生成して」って頼むイメージです。
メリット:
– 大規模に作れる
– コストが低い
– 速い
デメリット:
– 自動的に高品質ではない
– 検証と多様化が必要
– 偏ったり狭い動作を生むリスク
「Self-Instruct」や「Alpaca」という有名なデータセットは、この方法で作られました。
3. ハイブリッドデータ作成(現代の主流)
LLMで例を生成 → 人間のレビューでフィルタリング/ランク付け
ほとんどの現代プロジェクトはこれです。「規模」と「品質」のバランスが取れるからです。
例:
1. GPT-4で1000個の例を生成
2. 人間が200個レビューして、低品質なものを削除
3. 残った800個を使ってファインチューニング
トレーニング段階別のデータセットタイプ
LLMのライフサイクルの各段階で、異なるタイプのデータセットを使います:
事前トレーニング(Pre-training):
– 生の連続テキスト
– 例:Wikipedia、書籍、ウェブページ
教師ありファインチューニング(SFT)← 今ここ!:
– 構造化された命令-応答ペア
– 例:「質問: 〇〇、回答: △△」
好みアライメント(Preference Alignment):
– 複数の応答をランク付け
– 例:「回答A vs 回答B、どっちが良い?」
今回は「教師ありファインチューニング」に焦点を当てます。ここが、非構造化テキストから構造化された例に変わる重要な段階なんです。
SFTデータセットのフォーマット:Alpaca形式
最もシンプルで一般的なスキーマは「命令フォーマット(Instruction Format)」です。Alpacaスタイルとも呼ばれます。
基本構造:
{
"instruction": "フランス語に翻訳",
"input": "Hello, how are you?",
"output": "Bonjour, comment allez-vous?"
}
3つのフィールド:
- instruction(命令):何をすべきか
- input(入力):具体的な素材(オプション)
- output(出力):モデルが生成すべきもの
これがシングルターンタスク(1回の質問-回答)の基本形です。
チャット形式:多ターン会話
チャットボットは「1回の質問-回答」じゃなくて、何度もやり取りしますよね。そういう場合はチャット形式を使います。
例(ShareGPT形式):
{
"conversations": [
{"role": "user", "content": "フランスの首都は?"},
{"role": "assistant", "content": "パリです。"},
{"role": "user", "content": "人口は?"},
{"role": "assistant", "content": "約210万人です。"}
]
}
役割(role)と内容(content)を交互に並べる形式です。LINEやSlackのチャットログみたいなイメージですね。
データセットを準備する実践的なステップ
Hugging Faceのデータセットライブラリを使った、実践的な準備方法を見ていきましょう。
ステップ1:データセットを読み込む
Hugging Faceから公開データセットを読み込むのは超簡単:
from datasets import load_dataset
dataset = load_dataset("tatsu-lab/alpaca")
print(dataset)
これで、Alpacaデータセット(52,000個の命令-応答ペア)が使えます!
ステップ2:データを確認
最初の数個を見てみましょう:
print(dataset["train"][0])
# 出力例:
# {
# "instruction": "次の単語の同義語を3つリストアップして",
# "input": "happy",
# "output": "joyful, content, cheerful"
# }
ステップ3:データをクリーニング
データセットには、時々ゴミが混ざっています。クリーニングしましょう:
# 空の出力を削除
dataset = dataset.filter(lambda x: len(x["output"]) > 0)
# 重複を削除
dataset = dataset.unique("output")
ステップ4:データセットを分割
トレーニング用とテスト用に分けます:
dataset = dataset.train_test_split(test_size=0.1)
# train: 90%, test: 10%
ステップ5:Hugging Faceにアップロード(オプション)
自分のデータセットを公開したい場合:
dataset.push_to_hub("your-username/your-dataset-name")
データセット準備のベストプラクティス
最後に、データセット準備で守るべき黄金ルールをまとめます:
1. 多様性を確保
同じパターンばかりだと、モデルは偏ります。いろんな種類の例を入れましょう。
2. 品質 > 量
10,000個の低品質データより、1,000個の高品質データの方が良いです。
3. タスクに合わせる
本番環境で処理するインタラクションに似たデータを使いましょう。金融チャットボットなら、金融用語を含むデータが必要です。
4. 検証を忘れずに
合成データを使う場合、必ず人間の目でチェックしましょう。
5. バランスを取る
特定のトピックに偏らないよう、バランスよく配分しましょう。
まとめ:データが王様
ファインチューニングで最も重要なのは、実はデータなんです。
今回学んだこと:
- データセットの3つのソース(内部、公開、カスタム)
- 3つの作成アプローチ(人間、合成、ハイブリッド)
- Alpaca形式とチャット形式
- Hugging Faceでの実践的な準備方法
- ベストプラクティス
次のレッスンでは、準備したデータを「トークン化とパディング」で数値に変換する方法を学びます。テキストがどうやってモデルが理解できる形に変わるのか、楽しみにしていてくださいね!

コメント