7.2. インストラクションに従うためのファインチューニング
Reading time: 9 minutes
tip
このセクションの目的は、テキストを生成するだけでなく、チャットボットとしてタスクに応答するなどの指示に従うように、すでに事前トレーニングされたモデルをファインチューニングする方法を示すことです。
データセット
LLMを指示に従うようにファインチューニングするためには、指示と応答を含むデータセットが必要です。LLMを指示に従うようにトレーニングするための異なるフォーマットがあります。例えば:
- Apply Alpacaプロンプトスタイルの例:
Below is an instruction that describes a task. Write a response that appropriately completes the request.
### Instruction:
Calculate the area of a circle with a radius of 5 units.
### Response:
The area of a circle is calculated using the formula \( A = \pi r^2 \). Plugging in the radius of 5 units:
\( A = \pi (5)^2 = \pi \times 25 = 25\pi \) square units.
- Phi-3 プロンプトスタイルの例:
<|User|>
Can you explain what gravity is in simple terms?
<|Assistant|>
Absolutely! Gravity is a force that pulls objects toward each other.
LLMをこれらの種類のデータセットでトレーニングすることは、生のテキストだけでなく、LLMが受け取る質問に対して具体的な応答を提供する必要があることを理解するのに役立ちます。
したがって、リクエストと回答を含むデータセットで最初に行うべきことの1つは、そのデータを希望するプロンプト形式でモデル化することです。例えば:
# Code from https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/ch07.ipynb
def format_input(entry):
instruction_text = (
f"Below is an instruction that describes a task. "
f"Write a response that appropriately completes the request."
f"\n\n### Instruction:\n{entry['instruction']}"
)
input_text = f"\n\n### Input:\n{entry['input']}" if entry["input"] else ""
return instruction_text + input_text
model_input = format_input(data[50])
desired_response = f"\n\n### Response:\n{data[50]['output']}"
print(model_input + desired_response)
そのため、常にデータセットをトレーニング、検証、テスト用のセットに分ける必要があります。
バッチ処理とデータローダー
次に、トレーニング用のすべての入力と期待される出力をバッチ処理する必要があります。これには以下が必要です:
- テキストをトークン化する
- すべてのサンプルを同じ長さにパディングする(通常、長さはLLMの事前トレーニングに使用されるコンテキストの長さと同じくらいになります)
- カスタムコレート関数で入力を1つシフトして期待されるトークンを作成する
- トレーニング損失から除外するために、一部のパディングトークンを-100に置き換える:最初の
endoftext
トークンの後、他のすべてのendoftext
トークンを-100に置き換えます(cross_entropy(...,ignore_index=-100)
を使用することで、-100のターゲットを無視します) - [オプション] LLMが回答を生成する方法のみを学習するように、質問に属するすべてのトークンも-100でマスクします。Alpacaスタイルを適用する場合、これは
### Response:
までのすべてをマスクすることを意味します。
これが作成されたら、各データセット(トレーニング、検証、テスト)のデータローダーを作成する時間です。
事前トレーニングされたLLMのロードとファインチューニングおよび損失チェック
ファインチューニングするために、事前トレーニングされたLLMをロードする必要があります。これは他のページで既に議論されています。その後、以前に使用したトレーニング関数を使用してLLMをファインチューニングできます。
トレーニング中、エポックごとにトレーニング損失と検証損失がどのように変化するかを確認して、損失が減少しているか、過学習が発生しているかを確認することも可能です。
過学習は、トレーニング損失が減少しているが、検証損失が減少していないか、むしろ増加している場合に発生します。これを避けるために、最も簡単な方法は、この挙動が始まるエポックでトレーニングを停止することです。
応答の質
これは分類ファインチューニングではないため、損失の変動をより信頼できるわけではありませんが、テストセットの応答の質を確認することも重要です。したがって、生成された応答をすべてのテストセットから収集し、手動でその質を確認することをお勧めします。間違った回答があるかどうかを確認します(LLMが応答文の形式と構文を正しく作成することは可能ですが、完全に間違った応答を返すことがあります。損失の変動はこの挙動を反映しません)。
生成された応答と期待される応答を他のLLMに渡して応答を評価させることでも、このレビューを行うことが可能です。
応答の質を確認するために実行する他のテスト:
- 大規模マルチタスク言語理解(MMLU): MMLUは、文科、科学など57の科目にわたるモデルの知識と問題解決能力を評価します。さまざまな難易度の選択肢問題を使用して理解を評価します。
- LMSYSチャットボットアリーナ:このプラットフォームでは、ユーザーが異なるチャットボットの応答を並べて比較できます。ユーザーがプロンプトを入力すると、複数のチャットボットが応答を生成し、直接比較できます。
- AlpacaEval: AlpacaEvalは、GPT-4のような高度なLLMがさまざまなプロンプトに対する他のモデルの応答を評価する自動評価フレームワークです。
- 一般言語理解評価(GLUE): GLUEは、感情分析、テキストの含意、質問応答など、9つの自然言語理解タスクのコレクションです。
- SuperGLUE: GLUEを基にして、SuperGLUEは現在のモデルにとって難しいとされるより挑戦的なタスクを含んでいます。
- 模倣ゲームベンチマークを超えて(BIG-bench): BIG-benchは、推論、翻訳、質問応答などの分野でモデルの能力をテストする200以上のタスクを持つ大規模なベンチマークです。
- 言語モデルの包括的評価(HELM): HELMは、精度、堅牢性、公平性など、さまざまな指標にわたる包括的な評価を提供します。
- OpenAI Evals: OpenAIによるオープンソースの評価フレームワークで、カスタムおよび標準化されたタスクでAIモデルをテストできます。
- HumanEval: コード生成能力を評価するために使用されるプログラミング問題のコレクションです。
- スタンフォード質問応答データセット(SQuAD): SQuADは、モデルが正確に回答するためにテキストを理解しなければならないWikipedia記事に関する質問で構成されています。
- TriviaQA: トリビアの質問と回答の大規模データセットで、証拠文書も含まれています。
その他多数
指示に従ったファインチューニングコード
このファインチューニングを実行するためのコードの例は、https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.pyで見つけることができます。