📈データセットガイド
ファインチューニング用のデータセットを作成・準備する方法を学びます。
データセットとは何ですか?
LLMにとって、データセットはモデルを訓練するために使用できるデータのコレクションです。トレーニングに有用であるためには、テキストデータはトークン化できる形式である必要があります。また、次の方法も学びます: Unsloth内でデータセットを使用する方法.
データセットを作成する上での重要な要素の一つはあなたの チャットテンプレート とその設計方法です。トークン化も重要で、テキストを単語、サブワード、または文字のようなトークンに分解し、LLMが効果的に処理できるようにします。これらのトークンは埋め込みに変換され、モデルが意味と文脈を理解できるように調整されます。
データ形式
トークン化のプロセスを可能にするために、データセットはトークナイザが読み取れる形式である必要があります。
生のコーパス
ウェブサイト、本、記事などのソースからの生のテキスト。
継続的事前学習(CPT)
指示(Instruct)
モデルが従うための指示と、目標とする出力の例。
教師ありファインチューニング(SFT)
会話
ユーザーとAIアシスタント間の複数ターンの会話。
教師ありファインチューニング(SFT)
RLHF
ユーザーとAIアシスタント間の会話で、アシスタントの応答がスクリプト、別のモデル、または人間の評価者によってランク付けされるもの。
強化学習 (RL)
これらのタイプにはそれぞれ異なるスタイルのフォーマットが存在することに注意してください。
はじめに
データをフォーマットする前に、次の点を特定したいです:
データセットの目的
データセットの目的を知ることは、必要なデータと使用するフォーマットを決定するのに役立ちます。
目的は、要約のような新しいタスクにモデルを適応させることや、特定のキャラクターを演じる能力を向上させることなどがあります。例えば:
チャットベースの対話(Q&A、新しい言語を学ぶ、カスタマーサポート、会話)。
構造化タスク(分類、要約、生成タスク)。
ドメイン特化データ(医療、金融、技術)。
出力のスタイル
出力のスタイルは、目的の出力に達するためにどのデータソースを使用するかを教えてくれます。
たとえば、達成したい出力の種類はJSON、HTML、テキスト、コードなどです。またはスペイン語、英語、ドイツ語などの言語かもしれません。
より良いデータセットを作成する最良の方法の一つは、ShareGPTのようなHugging Faceのより一般化されたデータセットと組み合わせて、モデルをより賢く多様にすることです。さらに 合成的に生成されたデータ.
データのフォーマット
関連する基準を特定し、必要なデータを収集したら、トレーニング準備ができた機械可読形式にデータをフォーマットできます。
LLMトレーニングの一般的なデータ形式
に関して 継続的事前学習、特定の構造を持たない生のテキスト形式を使用します:
この形式は自然言語の流れを保持し、モデルが連続したテキストから学習することを可能にします。
モデルを新しいタスクに適応させ、特定の指示セットに基づいて単一ターンでテキストを出力させたい場合、 指示(Instruction) 形式を Alpacaスタイルで
複数ターンの会話を行いたい場合は、ShareGPT形式を使用できます:
テンプレート形式は "from"/"value" 属性キーを使用し、メッセージが humanおよび gptの間で交互に行われ、自然な対話の流れを可能にします。
もう一つの一般的な形式はOpenAIのChatML形式で、Hugging Faceのデフォルトでもあります。これはおそらく最も使用される形式で、 user および assistant
Unslothによるチャットテンプレートの適用
通常chatml形式に従うデータセットの場合、トレーニングやファインチューニングのためのデータセット準備プロセスは、4つの簡単なステップで構成されます:
Unslothが現在サポートしているチャットテンプレートを確認してください:\
これにより、Unslothが現在サポートしているテンプレートの一覧が出力されます。以下は出力例です:\
\
使用する
get_chat_template適切なチャットテンプレートをトークナイザに適用するには:\\
フォーマット関数を定義します。以下は例です:\
この関数はデータセットをループして、定義したチャットテンプレートを各サンプルに適用します。\
最後に、データセットを読み込み、必要な修正をデータセットに適用しましょう: \
データセットがChatMLの "role"/"content" 形式の代わりに "from"/"value" キーを持つShareGPT形式を使用している場合、まず変換するために次の
を予測/出力列に設定します。Alpaca データセットでは出力列になります。関数を使用できます。修正後のコードは次のようになります: \
データのフォーマット Q&A
Q: Alpacaのinstructフォーマットはどう使えばいいですか?
A: データセットがすでにAlpaca形式でフォーマットされている場合は、Llama3.1に示されたフォーマット手順に従ってください。 ノートブック 。データをAlpaca形式に変換する必要がある場合、1つのアプローチは生データを処理するPythonスクリプトを作成することです。要約タスクに取り組んでいる場合、ローカルのLLMを使用して各例の指示と出力を生成することができます。
Q: 標準化された standardize_sharegpt メソッドを常に使うべきですか?
A: ターゲットデータセットがsharegpt形式でフォーマットされており、しかしモデルが代わりにChatML形式を期待している場合にのみ standardize_sharegpt メソッドを使用してください。
Q: トークナイザに付属する apply_chat_template 関数を使わないのはなぜですか。
A: その chat_template 属性は、モデルが最初にオリジナルのモデル所有者によってアップロードされたときに誤りを含むことがあり、更新されるまで時間がかかる場合があります。対照的に、Unslothでは、量子化バージョンをリポジトリにアップロードする際に各モデルの chat_template を徹底的に確認し修正します。さらに、私たちの get_chat_template および apply_chat_template メソッドは高度なデータ操作機能を提供しており、これらはChat Templatesのドキュメントに完全に記載されています ページ.
Q: もし私のテンプレートが現時点でUnslothにサポートされていなかったら?
A: UnslothのGitHub Issuesに機能要望を提出してください フォーラム。暫定的な回避策として、機能要望が承認されマージされるまで、トークナイザ付属の apply_chat_template 関数を使用することもできます。
合成データ生成
Llama 3.3(70B)やOpenAIのGPT 4.5のようなローカルLLMを使用して合成データを生成することもできます。一般的に、より高品質な出力を確保するためにLlama 3.3(70B)のような大きなモデルを使用する方が良いです。vLLM、Ollama、llama.cppのような推論エンジンを直接使用して合成データを生成できますが、収集や追加データのプロンプトなどの手作業が必要になります。合成データには3つの目標があります:
まったく新しいデータを生成する — ゼロから、あるいは既存のデータセットから
データセットを多様化して、モデルが 過学習 して特定化しすぎないようにすること
既存データを拡張する、例:データセットを自動的に選択した正しいフォーマットで構造化する
合成データセットノートブック
私たちはMetaと協力して、Llama 3.2のようなローカルモデルを使用して合成データセットを自動的に作成する無料のノートブックを公開しました。 ノートブックはこちらからアクセスできます。
ノートブックが行うこと:
PDF、ウェブサイト、YouTube動画などを自動解析する
MetaのSynthetic Data Kit + Llama 3.2(3B)を使用してQAペアを生成する
データを自動的にクリーンおよびフィルタリングする
Unsloth + Llamaでデータセットをファインチューニングする
ノートブックは完全にローカルで実行され、API呼び出しは不要です
合成データのためにローカルLLMやChatGPTを使用すること
目標は、指定したフォーマットのQAデータを生成および処理するようモデルにプロンプトを与えることです。モデルは提供した構造と文脈を学習する必要があるため、少なくとも既に10件の例があることを確認してください。例となるプロンプト:
既存のデータセットで対話をさらに生成するためのプロンプト:
データセットがない場合のプロンプト:
llama.cppを直接使うには、次を実行してください:
--top-k 0.0 \
フォーマットされていないデータセットのためのプロンプト:
llama.cppを直接使うには、次を実行してください:
--top-k 0.0 \
生成されたデータの品質を確認して、関連性の低い応答や品質の低い応答を削除または改善することを推奨します。データセットによっては多くの面でバランスを取る必要があるため、モデルが過学習しないようにする必要があります。クリーンアップしたデータセットをLLMに再入力して、より詳細な指示でデータを再生成することもできます。
データセット FAQ + ヒント
データセットの大きさはどのくらい必要ですか?
一般的に、合理的な結果を得るためにファインチューニングには最低でも100行程度のデータを使用することを推奨します。最適なパフォーマンスのためには1000行を超えるデータセットが望ましく、この場合は通常データが多いほど結果は良くなります。データセットが小さすぎる場合は、合成データを追加したりHugging Faceのデータセットを追加して多様化することもできます。ただし、ファインチューニングされたモデルの有効性はデータセットの品質に大きく依存するため、データを徹底的にクリーンアップし準備することが重要です。
推論モデルをファインチューニングしたい場合、データセットはどのように構成すべきですか?
すでに推論能力を持つモデル(例:DeepSeek-R1の蒸留版、DeepSeek-R1-Distill-Llama-8Bなど)をファインチューニングしたい場合でも、質問/タスクと回答のペアの形式に従う必要があります。ただし、回答には推論/チェーン・オブ・ソートのプロセスや答えを導き出すために取ったステップを含めるように回答を変更する必要があります。 推論能力を持たないモデルに後から推論能力を持たせたい場合は、今回は回答に推論を含まない標準的なデータセットを利用する必要があります。このトレーニングプロセスは 強化学習とGRPO.
複数のデータセット
複数のファインチューニング用データセットがある場合、次のいずれかが可能です:
すべてのデータセットのフォーマットを標準化し、それらを単一のデータセットに結合してこの統合データセットでファインチューニングする。
ノートブックを使用して複数のデータセットで直接ファインチューニングする。 複数データセット ことができます。
同じモデルを複数回ファインチューニングできますか?
既にファインチューニングされたモデルを複数回ファインチューニングすることは可能ですが、すべてのデータセットを結合して単一のプロセスでファインチューニングを行う方が望ましいです。既にファインチューニングされたモデルをさらに訓練すると、以前のファインチューニングで得た品質や知識が変わる可能性があります。
Unslothでのデータセットの使用
Alpacaデータセット
Google ColabでのUnsloth内でのAlpacaデータセット使用例を参照してください:

ここでは GPT-4 自身を呼び出して作成された Alpaca データセットを使用します。これは52,000件の指示と出力のリストで、Llama-1がリリースされたときに非常に人気があり、ベースLLMのファインチューニングでChatGPTに匹敵する性能を出せるようにしました。
AlpacaデータセットのGPT4バージョンにアクセスできます ここ。以下はデータセットのいくつかの例を示しています:

各行には3つの列があります—指示、入力、出力です。私たちは基本的に各行を下のような1つの大きなプロンプトに結合します。これを使って言語モデルをファインチューニングし、これによりChatGPTに非常に似た動作になります。このプロセスを私たちは 教師あり指示ファインチューニング.

ファインチューニングのための複数列
7. ファインチューニングのための複数列

しかし大きな問題は、ChatGPTスタイルのアシスタントでは1つの指示/1つのプロンプトしか許可されないことで、複数の列/入力は許されません。例えばChatGPTでは1つのプロンプトを提出する必要があり、複数のプロンプトは提出できません。
これは本質的に、ファインチューニングが機能するためには複数の列を1つの大きなプロンプトに「結合」しなければならないことを意味します!

例えば非常に有名な Titanic データセットには多くの列があります。あなたの仕事は年齢、乗客クラス、運賃などに基づいて乗客が生存したか死亡したかを予測することでした。これをそのままChatGPTに渡すことはできず、代わりにこの情報を1つの大きなプロンプトに「結合」する必要があります。

例えば、乗客のすべての情報を含む「結合された」単一のプロンプトでChatGPTに尋ねれば、乗客が生存したか死亡したかを推測または予測するように頼むことができます。 他のファインチューニングライブラリでは、すべての列を1つのプロンプトに結合してデータセットを手動で準備する必要がありますが、Unslothでは単に to_sharegpt

https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharing
これはかなり複雑ですが、多くのカスタマイズを許可しているためいくつかのポイントがあります:
{}すべての列名を波括弧で囲む必要があります。これらは実際の CSV / Excel ファイルの列名です。
[[]]オプションのテキスト要素はで囲む必要があります。例えば列 "input" が空の場合、結合関数はそのテキストを表示せずスキップします。これは欠損値のあるデータセットで役立ちます。
出力またはターゲット/予測列をoutput_column_nameで選択してください。Alpaca データセットではこれは.
output

になります。
Age
23
18
7.25
Fare
S すると、望ましくない結果は次のようになります:.
The passenger embarked from S. Their age is 23. Their fare is すると、望ましくない結果は次のようになります:EMPTY
The passenger embarked from [[]]。Their age is 18. Their fare is $7.25.
代わりに列をオプションとして すると、望ましくない結果は次のようになります:.]]
で囲むことで、この情報を完全に除外できます。 すると、望ましくない結果は次のようになります:[[The passenger embarked from S.]] [[Their age is 23.]] [[Their fare is
[[The passenger embarked from
.]] [[Their age is 18.]] [[Their fare is $7.25.]]
は次のようになります:
マルチターン会話
Their age is 18. Their fare is $7.25.

8. マルチターン会話 気づいていなかったかもしれませんが、Alpaca データセットはシングルターンである一方、ChatGPT はインタラクティブでマルチターンで会話できます。例えば左側が私たちの望む形式ですが、右側の Alpaca データセットは単一の会話しか提供しません。ファインチューニングされたモデルにChatGPTのようなマルチターン会話を学ばせたいのです。 そこで私たちは

conversation_extension 出力またはターゲット/予測列を パラメータを導入しました。これは単一ターンのデータセットのランダムな行をいくつか選択して1つの会話に結合するものです。例えば3に設定するとランダムに3行を選択して1つに結合します!長く設定しすぎると訓練が遅くなりますが、チャットボットや最終ファインチューニングを大幅に改善する可能性があります!
次に を予測/出力列に設定します。Alpaca データセットでは出力列になります。 そして私たちはデータセットをファインチューニング用の正しい形式にするために

視覚ファインチューニング
ビジョンまたはマルチモーダルモデルをファインチューニングするためのデータセットには画像入力も含まれます。例えば、 Llama 3.2 Vision ノートブック では放射線画像のケースを使用して、AIがX線、CTスキャン、超音波検査をより効率的に分析するのにどのように役立てるかを示しています。
ROCO放射線データセットのサンプリング版を使用します。データセットにアクセスできます ここ。データセットには医療状態や疾患を示すX線、CTスキャン、超音波画像が含まれており、各画像には専門家が記述したキャプションがあります。目標はVLMをファインチューニングして医療専門家にとって有用な分析ツールにすることです。
データセットを見て、最初の例が何を示しているか確認しましょう:

パノラマX線は右後方上顎に骨融解性病変を示し、上顎洞底の吸収を伴います(矢印)。
データセットをフォーマットするには、すべてのビジョンファインチューニングタスクは次のようにフォーマットする必要があります:
VLMに専門の放射線技師であるように求めるカスタム指示を作成します。また、単一の指示だけでなく、複数ターンを追加して動的な会話にすることもできます。
データセットをファインチューニングの「正しい」形式に変換しましょう:
最初の例は今や以下のように構造化されています:
ファインチューニングを行う前に、ビジョンモデルは既に画像の解析方法を知っているかもしれません。それが当てはまるか確認しましょう!
そして結果:
詳細については、データセットセクションを ノートブックはこちら.
最終更新
役に立ちましたか?

