📈データセットガイド

ファインチューニング用のデータセットの作成方法と準備方法を学びます。

データセットとは何ですか?

LLMにとって、データセットはモデルの訓練に使用できるデータの集合です。訓練に有用であるためには、テキストデータがトークン化可能な形式である必要があります。また、ここでは Unsloth内でデータセットを使用する方法.

データセット作成の重要な要素の一つはあなたの チャットテンプレート とそれをどのように設計するかです。トークン化も重要で、テキストを単語、サブワード、文字などのトークンに分割し、LLMが効果的に処理できるようにします。これらのトークンは埋め込みに変換され、モデルが意味と文脈を理解できるように調整されます。

データ形式

トークン化のプロセスを可能にするために、データセットはトークナイザーが読み取れる形式である必要があります。

フォーマット
説明
訓練タイプ

生のコーパス

ウェブサイト、本、記事などのソースからの生のテキスト。

継続事前学習(CPT)

インストラクト

モデルが従う指示と目標とする出力の例。

教師あり微調整(SFT)

会話

ユーザーとAIアシスタントの複数ターンの会話。

教師あり微調整(SFT)

RLHF

ユーザーとAIアシスタントの会話で、アシスタントの応答がスクリプト、別のモデル、または人間の評価者によってランク付けされるもの。

強化学習(RL)

circle-info

これらのタイプそれぞれに対して異なるスタイルのフォーマットが存在することは覚えておく価値があります。

はじめに

データをフォーマットする前に、以下を特定したいです:

1

データセットの目的

データセットの目的を知ることで、どのデータが必要でどのフォーマットを使うべきかを判断するのに役立ちます。

目的は、要約などの新しいタスクにモデルを適応させることや、特定のキャラクターを演じる能力を向上させることなどがあります。例えば:

  • チャットベースの対話(Q&A、新しい言語の学習、カスタマーサポート、会話)。

  • 構造化されたタスク(分類arrow-up-right、要約、生成タスク)。

  • ドメイン特化データ(医療、金融、技術など)。

2

出力のスタイル

出力のスタイルは、目的の出力を達成するためにどのデータソースを使用するかを示してくれます。

例えば、達成したい出力の種類はJSON、HTML、テキスト、コードなどかもしれません。またはスペイン語、英語、ドイツ語などの言語で出力したい場合もあります。

3

データソース

必要なデータの目的とスタイルが分かったら、データの品質と を分析する必要があります。Hugging FaceやWikipediaはデータセットの素晴らしいソースで、特に言語学習用モデルを訓練したい場合にWikipediaは有用です。

データのソースはCSVファイル、PDF、あるいはウェブサイトである可能性があります。また 合成的に生成する こともできますが、各例が高品質で関連性があることを確保するために追加の注意が必要です。

circle-check

🦥 Unslothデータレシピ

Unslothデータレシピ PDFやCSVファイルのようなドキュメントをアップロードし、それらを利用可能なデータセットに変換できます。グラフノードワークフローを通じて、視覚的にデータセットを作成および編集できます。

レシピページがメインの入口です。レシピはブラウザにローカル保存されるため、後で保存した作業に戻ることができます。ここから空のレシピを作成するか、ガイド付き学習用レシピを開くことができます。

データレシピも同じ基本的な流れに従います。レシピページを開き、レシピを作成または選択し、エディタでワークフローを構築し、検証してプレビューを実行し、出力が正しく見えたらフルデータセットを実行します。シードデータと生成ブロックを追加し、ワークフローを検証し、サンプル出力をプレビューしてから、フルデータセットビルドを実行します。

概要として、一般的なワークフローは次のようになります:

  1. レシピページを開きます。

  2. 新しいレシピを作成するか既存のレシピを開きます。

  3. ブロックを追加してデータセットのワークフローを定義します。

  4. クリック 検証 して設定の問題を早期に発見します。

  5. プレビューを実行してサンプル行を素早く確認します。

  6. レシピが準備できたらフルデータセットのビルドを実行します。

  7. 進行状況と出力はグラフ上でまたは 実行 ビューで詳細をライブに確認します。

  8. 生成されたデータセットを Studio そしてモデルを微調整します。詳細を読む:

hat-chefData Recipeschevron-right

データのフォーマット

関連する基準を特定し、必要なデータを収集したら、訓練準備が整った機械可読形式にデータをフォーマットできます。

LLM訓練の一般的なデータ形式

について 、特定の構造を持たない生テキスト形式を使用します:

この形式は自然な言語の流れを保持し、モデルが連続したテキストから学習できるようにします。

モデルを新しいタスクに適応させ、特定の指示セットに基づいて単一ターンでテキストを出力させたい場合、 指示(Instruction) 形式を使用できます Alpacaスタイルでarrow-up-right

複数ターンの会話にしたい場合は、ShareGPT形式を使用できます:

テンプレート形式は "from" / "value" 属性キーを使用し、メッセージは humangptの間で交互に並び、自然な対話の流れを可能にします。

もう一つの一般的な形式はOpenAIのChatML形式で、Hugging Faceがデフォルトで使用しているものです。これはおそらく最も使用される形式で、 userassistant

Unslothでのチャットテンプレートの適用

通常ChatML形式に従うデータセットの場合、訓練や微調整のためにデータセットを準備するプロセスは4つの簡単なステップで構成されます:

  • Unslothが現在サポートしているチャットテンプレートを確認します:\

    これによりUnslothが現在サポートしているテンプレートのリストが出力されます。例の出力は次のとおりです:\

    \

  • 使用 get_chat_template 正しいチャットテンプレートをトークナイザーに適用するには:\

    \

  • フォーマット関数を定義します。例:\

    この関数はデータセットをループし、定義したチャットテンプレートを各サンプルに適用します。\

  • 最後に、データセットを読み込み、必要な変更を適用しましょう: \

    もしデータセットがChatMLの "role" / "content" 形式の代わりに "from" / "value" キーを使用するShareGPT形式なら、まず standardize_sharegpt 関数を使って変換できます。修正されたコードは次のようになります: \

データのフォーマット Q&A

Q: Alpaca instruct形式はどう使えばいいですか?

A: データセットが既にAlpaca形式でフォーマットされている場合は、Llama3.1に示されたフォーマット手順に従ってください。 ノートブック arrow-up-rightデータをAlpaca形式に変換する必要がある場合、1つの方法は生データを処理するPythonスクリプトを作成することです。要約タスクに取り組んでいる場合は、ローカルのLLMを使用して各例の指示と出力を生成できます。

Q: 常にstandardize_sharegptメソッドを使うべきですか?

A: ターゲットのデータセットがsharegpt形式でフォーマットされており、あなたのモデルが代わりにChatML形式を期待している場合にのみstandardize_sharegptメソッドを使用してください。

Q: なぜトークナイザーに付属するapply_chat_template関数を使わないのですか?

A: ために chat_template 属性は、元のモデル所有者によってモデルが最初にアップロードされたときにエラーを含むことがあり、更新に時間がかかる場合があります。対照的に、Unslothでは、量子化されたバージョンをリポジトリにアップロードするときに各モデルについて徹底的にチェックし、 chat_template を修正します。 get_chat_templateapply_chat_template メソッドは高度なデータ操作機能を提供しており、これはChat Templatesのドキュメントで詳しく説明されています ページarrow-up-right.

Q: もし私のテンプレートが現在Unslothにサポートされていない場合はどうすればよいですか?

A: unslothのGitHub Issuesに機能要望を提出してください フォーラムarrow-up-right。一時的な回避策として、機能要望が承認されマージされるまでトークナイザー自身のapply_chat_template関数を使用することもできます。

合成データ生成

ローカルのLLM(Llama 3.3(70B)など)やOpenAIのGPT-4.5を使用して合成データを生成することもできます。一般に、最高品質の出力を確保するためにLlama 3.3(70B)のようなより大きなモデルを使用する方が良いです。vLLM、Ollama、llama.cppのような推論エンジンを直接使用して合成データを生成できますが、収集や追加データのプロンプトには手作業が必要になるでしょう。合成データの目標は3つあります:

  • 完全に新しいデータを生成する — ゼロから、または既存のデータセットから

  • データセットを多様化してモデルが 過学習しないようにする そして特定化しすぎないようにする

  • 既存のデータを拡張する、例:データセットを自動的に選択した正しいフォーマットに構造化する

Unslothを合成データに使用する

Unsloth Studioの任意の非構造化または構造化データを簡単にアップロードでき、 データレシピ それは自動的に使用可能な/合成データセットに変換します。詳細は ガイドをご覧ください.

ローカルLLMまたはChatGPTを合成データに使用する

目的は、指定したフォーマットのQAデータを生成および処理するようモデルにプロンプトを与えることです。モデルは提供した構造と文脈を学習する必要があるため、少なくとも既に10例のデータを用意しておくことを確認してください。例となるプロンプト:

  • 既存のデータセットで会話をさらに生成するためのプロンプト:

  • データセットをまだ持っていない場合のプロンプト:

    {% code overflow="wrap" %}

    {% endcode %}

  • フォーマットされていないデータセットのためのプロンプト:

    {% code overflow="wrap" %}

    {% endcode %}

生成されたデータの品質を確認して、関連性のない応答や低品質の応答を削除または改善することを推奨します。データセットによってはモデルが過学習しないように様々な面でバランスを取る必要があるかもしれません。改善したデータセットを再びLLMに入力して、さらにガイダンスを加えてデータを再生成することができます。

データセットFAQとヒント

データセットはどのくらい大きくすべきですか?

一般的には、ある程度の結果を得るために微調整には最低でも100行以上のデータを推奨します。最適な性能のためには1,000行以上のデータセットが望ましく、多くの場合データが多いほど良い結果になります。データセットが小さすぎる場合は合成データを追加したり、Hugging Faceのデータセットを追加して多様化することも可能です。ただし、微調整されたモデルの有効性はデータセットの品質に大きく依存するため、データを徹底的にクリーンアップして準備することが重要です。

推論(reasoning)モデルを微調整したい場合、データセットをどのように構造化すべきですか?

既に推論能力を持つモデル(例:DeepSeek-R1の蒸留版など、DeepSeek-R1-Distill-Llama-8Bなど)を微調整したい場合でも、質問/タスクと回答のペアに従う必要があります。ただし、回答には推論/チェーン・オブ・ソート形式のプロセスと、解答を導き出すために取ったステップを含めるように変更する必要があります。 推論を持たないモデルを将来的に推論能力を備えさせたい場合は、今回は回答に推論を含めない標準的なデータセットを利用する必要があります。この訓練プロセスは「 強化学習とGRPO.

複数のデータセット

微調整用に複数のデータセットがある場合、次のいずれかが可能です:

  • すべてのデータセットの形式を標準化し、それらを単一のデータセットに結合してこの統合データセットで微調整を行う。

  • を使用して、 複数データセットarrow-up-right ノートブックを使って複数のデータセットで直接微調整する。

同じモデルを複数回微調整できますか?

既に微調整されたモデルを複数回微調整することは可能ですが、すべてのデータセットを組み合わせて単一のプロセスで微調整を行う方が望ましいです。すでに微調整されたモデルを再訓練すると、以前の微調整プロセスで得られた品質や知識が変化する可能性があります。

Unslothでのデータセットの使用

Alpacaデータセット

Google Colab上でUnsloth内でAlpacaデータセットを使用する例を参照してください:

ここではGPT-4自体を呼び出して作成されたAlpacaデータセットを使用します。これは52,000件の指示と出力のリストで、Llama-1がリリースされたときに非常に人気があり、ベースのLLMを微調整することでChatGPTと競合できるようになりました。

AlpacaデータセットのGPT4バージョンにアクセスできます こちらarrow-up-right。以下にデータセットのいくつかの例を示します:

各行には指示、入力、出力の3つの列があることがわかります。基本的に各行を下記のように1つの大きなプロンプトに結合します。それを使用して言語モデルを微調整し、これによりChatGPTに非常に近いものになりました。このプロセスを私たちは 教師あり指示微調整.

複数列での微調整

しかし大きな問題は、ChatGPTスタイルのアシスタントでは1つの指示/1つのプロンプトのみを許容し、複数の列/入力を許さないことです。例えばChatGPTでは1つのプロンプトを送信しなければならず、複数のプロンプトは送れません。

これは本質的に、微調整が実際に機能するためには複数の列を1つの大きなプロンプトに「結合」しなければならないことを意味します!

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

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

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

これには多くのカスタマイズを許可するため少し複雑ですが、いくつかポイントがあります:

  • すべての列名を波かっこで囲む必要があります {}。これらは実際のCSV/Excelファイルの列名です。

  • オプションのテキストコンポーネントは [[]]で囲む必要があります。例えば「input」列が空の場合、結合関数はそのテキストを表示せずスキップします。これは欠損値のあるデータセットに便利です。

  • 出力またはターゲット/予測の列を output_column_nameで選択します。Alpacaデータセットでは、これは output.

になります。

例えば、タイタニックデータセットでは、各列/テキストの一部をオプションにして以下のような大きな結合プロンプト形式を作成できます。

例えば、データセットが多くの欠損データを含む次のような形だと仮定します:
出港港(Embarked)
年齢(Age)

運賃(Fare)

23

18

7.25

S

  1. その場合、結果が次のようになることは望みません: 乗客はSから出港しました。彼らの年齢は23です。彼らの運賃は.

  2. 空(EMPTY) 乗客はSから出港しました。彼らの年齢は23です。彼らの運賃は乗客は

から出港しました。彼らの年齢は18です。彼らの運賃は$7.25です。 [[]]代わりに列を

  1. でオプションとして囲むことで、この情報を完全に除外できます。 乗客はSから出港しました。彼らの年齢は23です。彼らの運賃は.]]

  2. [[乗客はSから出港しました。]] [[彼らの年齢は23です。]] [[彼らの運賃は 乗客はSから出港しました。彼らの年齢は23です。彼らの運賃は[[乗客は

から出港しました。]] [[彼らの年齢は18です。]] [[彼らの運賃は$7.25です。]]

  1. となり、

  2. 結果は次のようになります:

乗客はSから出港しました。彼らの年齢は23です。

彼らの年齢は18です。彼らの運賃は$7.25です。

マルチターン会話 お気づきかもしれませんが、Alpacaデータセットは単一ターンである一方で、ChatGPTは対話的で複数ターンで話しかけることができます。例えば左側が我々の望む形ですが、右側のAlpacaデータセットは単一の会話しか提供しません。微調整された言語モデルには、ChatGPTのようにマルチターン会話の方法を学習させたいのです。 そこで我々は

conversation_extension output_column_name パラメータを導入しました。これは本質的に単一ターンデータセットのランダムな行を選択して、それらを1つの会話に結合します。例えば3に設定すると、ランダムに3行を選択して1つに結合します!長く設定しすぎると訓練が遅くなる可能性がありますが、チャットボットや最終的な微調整を大幅に改善する可能性があります。

次に予測/出力の列を standardize_sharegpt に設定します。Alpacaデータセットでは、それはoutput列になります。

その後、我々はデータセットを微調整に正しい形式にするために単に

関数を使用します!必ずこれを呼んでください! ビジョン微調整arrow-up-right 視覚またはマルチモーダルモデルの微調整用データセットには画像入力も含まれます。例えば、

Llama 3.2 Visionノートブック こちらarrow-up-rightでは、放射線画像がどのようにX線、CTスキャン、超音波を分析する際に医療専門家を支援できるかを示す放射線症例を使用します。

サンプル版のROCO放射線データセットを使用します。データセットにアクセスできます

features: ['image', 'image_id', 'caption', 'cui'],
num_rows: 1978

画像

キャプション

{ "role": "assistant",

return { "messages" : conversation }

データセットを微調整のための「正しい」形式に変換しましょう:

{'role': 'assistant',

_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128,

* 左上歯間の骨は比較的放射線不透過性を示しています。 * 画像上部には2本の大きな矢印があり、この領域の詳細な検査が必要であることを示唆しています。矢印の一方は左側、もう一方は右側に位置しています。しかし、いくつかの点でのみは、(原文の続きに依存するため省略されます)arrow-up-right.

最終更新

役に立ちましたか?