📈データセットガイド
ファインチューニングのためのデータセットの作成と準備方法を学びます。
データセットとは何ですか?
LLMにとって、データセットはモデルのトレーニングに使用できるデータのコレクションです。トレーニングに役立つためには、テキストデータはトークナイズ可能な形式である必要があります。さらに、あなたは以下を学びます: Unsloth内でデータセットを使用する方法.
データセット作成の重要な部分のひとつはあなたの チャットテンプレート とその設計方法です。トークナイゼーションも重要で、テキストをトークン(単語、サブワード、または文字)に分解し、LLMが効果的に処理できるようにします。これらのトークンは埋め込みに変換され、モデルが意味や文脈を理解できるように調整されます。
データ形式
トークナイズのプロセスを可能にするために、データセットはトークナイザが読み取れる形式である必要があります。
生コーパス
ウェブサイト、本、記事などのソースからの生テキスト。
継続的事前学習(CPT)
指示(Instruct)
モデルが従うべき指示と目指すべき出力の例。
教師あり微調整(SFT)
会話
ユーザーとAIアシスタントの複数ターンの会話。
教師あり微調整(SFT)
RLHF
ユーザーとAIアシスタントの会話で、アシスタントの応答がスクリプト、別のモデル、または人間の評価者によってランク付けされるもの。
強化学習(RL)
これらの各タイプには異なるスタイルのフォーマットが存在することに留意してください。
はじめに
データをフォーマットする前に、次の点を特定したいです:
データセットの目的
データセットの目的を知ることで、どのデータが必要か、どの形式を使用すべきかを判断するのに役立ちます。
目的は、要約などの新しいタスクにモデルを適応させることや、特定のキャラクターのロールプレイ能力を向上させることなどが考えられます。例えば:
チャットベースの対話(Q&A、新しい言語を学ぶ、カスタマーサポート、会話)。
構造化タスク(分類、要約、生成タスク)。
ドメイン特化データ(医療、金融、技術)。
出力のスタイル
出力のスタイルは、望ましい出力を得るためにどのデータソースを使用するかを教えてくれます。
たとえば、達成したい出力の種類はJSON、HTML、テキスト、コードなどかもしれません。あるいはスペイン語、英語、ドイツ語などにしたいかもしれません。
より良いデータセットを作成する最良の方法の一つは、ShareGPTのようなHugging Faceのより一般化されたデータセットと組み合わせてモデルをより賢く多様にすることです。また、 合成生成データ.
データのフォーマット
関連する基準を特定し、必要なデータを収集したら、トレーニング用に機械が読み取れる形式にデータをフォーマットできます。
LLMトレーニングの一般的なデータ形式
継続的事前学習( continued pretraining)の場合、特定の構造を持たない生テキスト形式を使用します:
この形式は自然な言語の流れを保持し、モデルが連続したテキストから学習できるようにします。
モデルを新しいタスクに適応させ、特定の指示に基づいて単一ターンでテキストを出力させる場合は、 指示フォーマット(Instruction) を Alpacaスタイルで
複数ターンの会話を行いたい場合は、ShareGPT形式を使用できます:
テンプレート形式は "from" / "value" 属性キーを使用し、メッセージが 人間(human)および GPT(gpt)の間で交互に表示され、自然な対話の流れを可能にします。
もう一つの一般的な形式はOpenAIのChatML形式で、Hugging Faceがデフォルトで使用している形式です。これはおそらく最もよく使われる形式で、 user(ユーザー) および assistant(アシスタント)
Unslothでチャットテンプレートを適用する
通常チャットMLフォーマットに従うデータセットの場合、トレーニングやファインチューニングのためのデータセット準備プロセスは4つの簡単なステップで構成されます:
Unslothが現在サポートしているチャットテンプレートを確認:\
これにより、Unslothが現在サポートしているテンプレートの一覧が出力されます。例として以下の出力:\
\
を使用して
get_chat_templateをトークナイザに適用する:\\
フォーマット関数を定義します。例:\
この関数はデータセットをループし、定義したチャットテンプレートを各サンプルに適用します。\
最後に、データセットを読み込み必要な変更を適用しましょう: \
データセットがChatMLの"role"/"content"形式の代わりに"from"/"value"キーを持つShareGPT形式を使用している場合、まず変換するために
standardize_sharegpt関数を使用できます。修正後のコードは次のようになります:\n\
データのフォーマット Q&A
Q: Alpacaのinstruct形式はどのように使えますか?
A: データセットが既にAlpaca形式にフォーマットされている場合は、Llama3.1の手順に従ってフォーマット手順を行ってください。 ノートブック もしデータをAlpaca形式に変換する必要がある場合、一つの方法は生データを処理するPythonスクリプトを作成することです。要約タスクに取り組んでいる場合は、ローカルLLMを使って各例のための指示と出力を生成することができます。
Q: 常にstandardize_sharegptメソッドを使うべきですか?
A: ターゲットのデータセットがsharegpt形式でフォーマットされており、しかしあなたのモデルがChatML形式を期待する場合にのみ、standardize_sharegptメソッドを使用してください。
Q: トークナイザに付属するapply_chat_template関数を使わない理由は?
A: その chat_template 属性は、元のモデル所有者が最初にモデルをアップロードしたときに誤りを含むことがあり、更新に時間がかかることがあります。対照的に、Unslothでは、量子化されたバージョンをリポジトリにアップロードする際にすべてのモデルでエラーを徹底的にチェックして修正します。また、私たちの chat_template apply_chat_template get_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つの目的があります:
完全に新しいデータを生成する — スクラッチから、または既存のデータセットから
データセットを多様化してモデルが 過学習(overfit) して特定化しすぎないようにすること
既存データを拡張する、例:データセットを選択した正しい形式に自動的に構造化する
合成データセットノートブック
私たちはMetaと協力して、Llama 3.2のようなローカルモデルを使用して合成データセットを自動的に作成する無料のノートブックを公開しました。 ノートブックにはこちらからアクセスできます。
ノートブックが行うこと:
PDF、ウェブサイト、YouTube動画などを自動で解析
MetaのSynthetic Data Kit+Llama 3.2(3B)を使用してQAペアを生成
データを自動でクリーンアップおよびフィルタリング
Unsloth+Llamaでデータセットをファインチューニング
ノートブックは完全にローカルで動作し、API呼び出しは不要
合成データにローカルLLMやChatGPTを使用すること
目的は、モデルに指定した形式でQAデータを生成および処理させることです。モデルは提供した構造と文脈を学習する必要があるため、少なくとも既に10例のデータがあることを確認してください。例となるプロンプト:
既存のデータセットで会話をさらに生成するためのプロンプト:
データセットがない場合のプロンプト:
{% code overflow="wrap" %}
{% endcode %}
フォーマットなしのデータセットのためのプロンプト:
{% code overflow="wrap" %}
{% endcode %}
生成されたデータの品質を確認し、無関係または低品質の応答を削除または改善することを推奨します。データセットによってはバランス調整が必要な場合もあり、モデルが過学習しないようにする必要があります。クリーンアップしたデータセットを再度LLMに入力して、さらにガイダンスを与えた上でデータを再生成することもできます。
データセット FAQ + ヒント
データセットはどれくらいの大きさが必要ですか?
一般的に、妥当な結果を得るための微調整には最低でも100行以上のデータを推奨します。最適な性能のためには1,000行以上のデータセットが望ましく、この場合は通常データが多いほど結果は良くなります。データセットが小さすぎる場合は、合成データを追加したり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に非常に近いモデルが得られました。このプロセスを私たちは 教師付き指示微調整(supervised instruction finetuning).

複数のカラムでの微調整
しかし、ChatGPTスタイルのアシスタントでは、1つの指示/1つのプロンプトしか許可されず、複数のカラム/入力はできません。例えばChatGPTでは1つのプロンプトを送信しなければならず、複数のプロンプトは送れません。

これは本質的に、微調整が機能するように複数のカラムを1つの大きなプロンプトに「統合」しなければならないことを意味します!
例えば非常に有名なタイタニックデータセットには多くのカラムがあります。年齢、乗客クラス、運賃などに基づいてその乗客が生存したか死亡したかを予測するのが仕事でした。これを単純にChatGPTに渡すことはできず、むしろこの情報を1つの大きなプロンプトに「統合」する必要があります。

例えば、乗客に関するすべての情報を含む「統合」された単一のプロンプトでChatGPTに尋ねれば、その乗客が死亡したか生存したかを推測または予測するように頼むことができます。

他の微調整ライブラリでは、微調整のためにデータセットを手動で準備し、すべてのカラムを1つのプロンプトに統合する必要があります。Unslothでは、これを一度に行う to_sharegpt という関数を提供しています!

これはより多くのカスタマイズを許可するため少し複雑ですが、いくつかのポイントがあります:
すべてのカラム名を中括弧で囲む必要があります
{}。これらは実際のCSV/Excelファイル内のカラム名です。オプションのテキストコンポーネントは
[[]]で囲む必要があります。例えばカラム"input"が空であれば、マージ関数はそのテキストを表示せずスキップします。これは欠損値のあるデータセットに有用です。出力またはターゲット/予測カラムを
output_column_nameで選択してください。Alpacaデータセットの場合、これはoutput.
となります。例えばタイタニックデータセットでは、各カラム/テキストの一部をオプションにして下のような大きな統合プロンプト形式を作成できます。

例えば、多くの欠損データがある次のようなデータセットを想定してください:
S
23
18
7.25
すると、私たちは結果を次のようにしてほしくありません:
乗客はSから出航しました。彼らの年齢は23歳です。彼らの運賃は 空(EMPTY).
乗客は 空(EMPTY)から出航しました。彼らの年齢は18歳です。彼らの運賃は$7.25です。
代わりに、カラムをオプションとして [[]]で囲むことにより、この情報を完全に除外できます。
[[The passenger embarked from S.]] [[Their age is 23.]] [[Their fare is 空(EMPTY).]]
[[The passenger embarked from 空(EMPTY).]] [[Their age is 18.]] [[Their fare is $7.25.]]
は次のようになります:
乗客はSから出航しました。彼らの年齢は23歳です。
彼らの年齢は18歳です。彼らの運賃は$7.25です。
マルチターン会話
気づかなかった場合の問題点として、Alpacaデータセットはシングルターンであるのに対し、ChatGPTを使っていたときは対話的で複数ターンで会話できました。例えば、左側が我々の望む形ですが、右側のAlpacaデータセットは単一の会話しか提供しません。ファインチューニングされた言語モデルにChatGPTのようなマルチターン会話のやり方を何らかの形で学習させたいのです。

そこで私たちは conversation_extension パラメータを導入しました。これは本質的にシングルターンデータセットのいくつかのランダムな行を選択し、それらを1つの会話にマージします!例えば、これを3に設定すると、ランダムに3行を選択して1つにマージします。長すぎる設定は学習を遅くする可能性がありますが、チャットボットや最終的なファインチューニング結果を大幅に改善することがあります!

次に output_column_name を予測/出力カラムに設定します。Alpacaデータセットの場合は出力カラムになります。
その後、私たちは standardize_sharegpt 関数を使ってデータセットをファインチューニングに適した正しい形式にします!必ずこれを呼び出してください!

ビジョン微調整
ビジョンまたはマルチモーダルモデルを微調整するデータセットには画像入力も含まれます。例えば、 Llama 3.2 Visionノートブック は放射線画像のケースを用いて、AIがX線、CTスキャン、超音波をより効率的に医療専門家の支援に使える方法を示しています。
サンプリングされたROCO放射線データセットを使用します。データセットにはこちらからアクセスできます。 こちらこのデータセットにはX線、CTスキャン、超音波が含まれ、医療状態や疾患を示しています。各画像には専門家が書いたキャプションが付いています。目標はVLMを微調整して医療専門家にとって有用な分析ツールにすることです。
データセットを見て、最初の例が何を示しているかを確認しましょう:

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

