事前学習済みの大規模言語モデル (LLM) は、特定の要件を完全に満たせない場合があります。これらのモデルをファインチューニングすることで、特定のタスクにおけるパフォーマンスを向上させることができます。ファインチューニングは、モデルが特定のアプリケーションシナリオにより正確に適応するのに役立ちます。このトピックでは、教師ありファインチューニング (SFT) や直接プリファレンス最適化 (DPO) などのファインチューニング戦略、およびフルパラメータ、LoRA、QLoRA などの手法を紹介します。また、最適なモデルパフォーマンスを達成するためのハイパーパラメーターについても説明します。
ファインチューニング手法の紹介
SFT/DPO
モデルギャラリーでは、モデルに対して教師ありファインチューニング (SFT) と直接プリファレンス最適化 (DPO) を実行できます。大規模言語モデル (LLM) のトレーニングプロセスには、通常、次の 3 つのステップが含まれます。
1. 事前学習 (PT)
事前学習 (PT) は、LLM トレーニングプロセスの最初のステップです。モデルは、大規模なコーパスから基本的な文法ルール、論理的推論スキル、および一般的な知識を学習します。
目的:モデルに言語理解能力、論理的推論スキル、および一般的な知識を提供すること。
モデル例:モデルギャラリーでは、Qwen や Llama シリーズなど、多くの事前学習済みモデルが提供されています。
2. 教師ありファインチューニング (SFT)
教師ありファインチューニング (SFT) は、事前学習済みモデルをさらに調整して、特定のドメインでのパフォーマンスを最適化し、対話形式や Q&A シナリオに適応させます。
目的:出力フォーマットと内容の観点からモデルのパフォーマンスを向上させること。
問題例:モデルが漢方薬などの特定ドメインで、ユーザーの質問に専門的に回答できるようにすること。
解決策:漢方薬などの特定ドメインに関連する Q&A 形式のデータを準備し、それを使用してモデルをファインチューニングします。
3. プリファレンス最適化 (PO)
SFT の後、モデルは文法的に正しいものの、事実として不正確であったり、人間の価値観と一致しなかったりする応答を生成する可能性があります。プリファレンス最適化 (PO) は、モデルの対話能力をさらに向上させ、人間の価値観に沿うようにするために使用されます。主な手法には、強化学習に基づく近接方策最適化 (PPO) と直接プリファレンス最適化 (DPO) があります。DPO は言語モデルを直接最適化します。DPO は暗黙的な強化学習パラダイムを使用します。明示的な報酬モデルを必要とせず、報酬を直接最大化することもありません。そのため、DPO は PPO よりもトレーニング中に安定しています。
3.1 直接プリファレンス最適化 (DPO)
DPO モデルは、主に 2 つのコンポーネントで構成されます。トレーニングが必要な LLM と、トレーニングモデルが期待される結果から逸脱するのを防ぐ参照モデルです。参照モデルもファインチューニングされた LLM ですが、そのパラメーターは凍結され、更新されません。
トレーニングデータ形式:(prompt, chosen (優先される応答
), rejected (拒否された応答 )) のトライアド 損失関数は以下の数式で表されます。損失関数が示すように、DPO アルゴリズムの原則は、参照モデルと比較して、モデルが優先される応答を生成する確率を高め、拒否された応答を生成する確率を低くすることです。
σ はシグモイド関数で、結果を (0, 1) の範囲にマッピングします。
β はハイパーパラメーターで、通常は 0.1 から 0.5 の間です。損失関数の秘密度を調整します。
PEFT:LoRA/QLoRA
パラメータ効率の良いファインチューニング (PEFT) は、大規模な事前学習済みモデルのファインチューニングに広く使用されています。その中心的な考え方は、ほとんどのモデルパラメーターを変更せずに、少数のパラメーターのみをファインチューニングすることで、競争力のある、あるいは最先端のパフォーマンスを達成することです。更新するパラメーターの数が少ないため、必要なデータと計算リソースも削減されます。これにより、ファインチューニングの効率が向上します。モデルギャラリーは、フルパラメータファインチューニングと、LoRA および QLoRA の 2 つの PEFT 手法をサポートしています。
LoRA(低ランク適応)
LoRA 手法は、パラメーターマトリックス (たとえば、m × n ディメンションのマトリックス) の隣にバイパスパスを追加することでモデルをファインチューニングします。このパスは、m × r と r × n ディメンションの 2 つの低ランクマトリックスの積で構成されます。ここで、r は m と n よりもはるかに小さいです。フォワードプロパゲーション中、入力データは元のパラメーターマトリックスと LoRA バイパスの両方を通過し、それらの出力が合計されます。トレーニング中、元のパラメーターは凍結され、LoRA コンポーネントのみがトレーニングされます。LoRA コンポーネントは 2 つの低ランクマトリックスで構成されているため、そのパラメーター数は元のマトリックスよりもはるかに少なくなります。これにより、トレーニングの計算オーバーヘッドが大幅に削減されます。
QLoRA(量子化 LoRA)
QLoRA は、モデルの量子化と LoRA 手法を組み合わせたものです。LoRA バイパスを導入することに加えて、QLoRA はロード時に大規模モデルを 4 ビットまたは 8 ビット精度に量子化します。計算中、これらの量子化されたパラメーターは、処理のために 16 ビット精度に逆量子化されます。この手法は、使用されていないときのモデルパラメーターのストレージ要件を最適化し、LoRA と比較してトレーニング中の GPU メモリ消費量をさらに削減します。
学習手法の選択とデータの準備
SFT と DPO のどちらかを選択する場合は、特定のアプリケーションシナリオと前述の技術説明に基づいて決定してください。
フルパラメータトレーニング、LoRA、または QLoRA の選択
複雑なタスク:フルパラメータトレーニングを使用します。この手法は、すべてのモデルパラメーターを活用してパフォーマンスを向上させることができます。
単純なタスク:LoRA または QLoRA を使用します。これらはトレーニングが速く、必要な計算リソースも少なくて済みます。
データ量が少ない場合:データ量が数百から数千エントリと少ない場合は、モデルの過学習を防ぐために LoRA または QLoRA を選択します。
計算リソースが限られている場合:計算リソースが限られている場合は、QLoRA を選択して GPU メモリ消費量をさらに削減します。QLoRA は量子化と逆量子化のプロセスを追加するため、トレーニング時間が LoRA よりも長くなる場合があることにご注意ください。
トレーニングデータの準備
単純なタスク:大量のデータは必要ありません。
SFT のデータ要件:SFT の場合、通常、数千の高品質なデータエントリで良好な結果が得られます。この場合、単にデータ量を増やすよりも、データ品質を最適化することがより重要です。
ハイパーパラメーター
learning_rate
学習率は、各反復におけるパラメーターの更新の大きさを決定します。学習率を大きくするとトレーニングが速くなる可能性がありますが、パラメーターの更新が過剰になり、損失関数の最小値への収束が妨げられる可能性もあります。学習率を小さくすると、より安定した収束プロセスが得られますが、トレーニング時間が増加したり、モデルが局所最適解に陥ったりする可能性があります。AdamW オプティマイザーを使用すると、モデルが収束しない事態を効果的に防ぐことができます。
num_train_epochs
エポックは、機械学習とディープラーニングにおける重要な概念です。1 エポックは、トレーニングデータセット全体を 1 回完全に走査することを表します。たとえば、エポック数を 10 に設定した場合、モデルはデータセット全体を 10 回走査してトレーニングパラメーターを更新します。
エポック数が少なすぎると学習不足につながり、多すぎると過学習を引き起こす可能性があります。エポック数は 2 から 10 の間の値に設定できます。サンプルサイズが小さい場合は、学習不足を避けるためにエポック数を増やしてください。サンプルサイズが大きい場合は、通常 2 エポックで十分です。さらに、学習率が小さいほど、通常はより多くのエポックが必要になります。検証セットでの精度を監視し、改善が見られなくなった時点でトレーニングを停止できます。
per_device_train_batch_size
実際には、モデルパラメーターを更新する前にすべてのトレーニングデータを走査するのではなく、より小さなデータセットを複数回反復して使用することで、トレーニング効率を向上させることができます。バッチサイズは、各反復で使用されるトレーニングデータサンプルの数を表します。たとえば、バッチサイズを 32 に設定した場合、モデルは各トレーニングステップで 32 のトレーニングサンプルを使用します。`per_device_train_batch_size` パラメーターは、各 GPU での 1 回のトレーニングステップで使用されるデータ量を指定します。
バッチサイズパラメーターは、主にトレーニング効果ではなく、トレーニング速度を調整するために使用されます。バッチサイズが小さいと、勾配推定の分散が大きくなり、収束するためにより多くの反復が必要になります。バッチサイズを大きくすると、トレーニング時間を短縮できます。
理想的なバッチサイズは、通常、ハードウェアがサポートできる最大値です。ナビゲーションウィンドウで、[モデルギャラリー] > [ジョブ管理] > [トレーニングジョブ] を選択します。対象のジョブの名前をクリックします。[タスク監視] ページで、GPU メモリとメモリの使用状況を確認し、GPU メモリのオーバーフローを引き起こさない最大のバッチサイズを選択します。

`per_device_train_batch_size` を同じ値に保ち、GPU の数を増やすと、実質的に合計バッチサイズが増加します。
seq_length
LLM の場合、トレーニングデータがトークナイザーによって処理された後、トークンのシーケンスになります。シーケンス長は、モデルが受け入れる単一のトレーニングサンプルのトークンシーケンスの長さを表します。トレーニングサンプルのトークンシーケンスがこの長さを超える場合、データは切り捨てられます。短い場合は、データはパディングされます。
トレーニング中に、トレーニングデータのトークンシーケンス長の分布に基づいて、適切なシーケンス長を選択できます。特定のテキストシーケンスに対して、異なるトークナイザーによって生成されるトークンシーケンスの長さは通常似ています。したがって、OpenAI トークンオンライン電卓を使用して、テキストのトークンシーケンス長を推定できます。
SFT アルゴリズムの場合、システムプロンプト + 命令 + 出力のシーケンス長を推定できます。DPO アルゴリズムの場合、システムプロンプト + プロンプト + chosen とシステムプロンプト + プロンプト + rejected のシーケンス長を推定し、大きい方の値を使用します。
lora_dim/lora_rank
Transformer で LoRA を適用する場合、主にマルチヘッドアテンションコンポーネントに適用されます。実験によると、以下のことが示されています。
マルチヘッドアテンション内の複数の重みマトリックスを適応させる方が、単一タイプの重みマトリックスのみを適応させるよりも効果的です。
ランクを上げても、必ずしもより意味のある部分空間をカバーするとは限りません。低ランクの適応マトリックスで十分な場合があります。
モデルギャラリーで提供されている `llm_deepspeed_peft` アルゴリズムでは、LoRA はマルチヘッドアテンション内の 4 種類すべての重みマトリックスを適応させ、デフォルトのランク値は 32 です。
lora_alpha
これは LoRA のスケーリング係数です。`lora_alpha` の値が高いほど LoRA マトリックスの影響が強まり、トレーニングデータ量が少ないシナリオに適しています。`lora_alpha` の値が低いほど LoRA マトリックスの影響が弱まり、トレーニングデータ量が多いシナリオに適しています。`lora_alpha` の値は、一般的に `lora_dim` の値の 0.5 倍から 2 倍です。
dpo_beta
このパラメーターは DPO トレーニングで使用され、参照モデルからの逸脱度をコントロールします。デフォルト値は 0.1 です。beta 値が高いほど、参照モデルからの逸脱が少なくなります。このパラメーターは SFT トレーニング中は無視されます。
load_in_4bit/load_in_8bit
これらのパラメーターは QLoRA で使用されます。ベースモデルをそれぞれ 4 ビットおよび 8 ビット精度でロードすることを指定します。
gradient_accumulation_steps
大きなバッチサイズはより多くの GPU メモリを必要とし、CUDA メモリ不足 (OOM) エラーを引き起こす可能性があります。そのため、しばしば小さなバッチサイズが設定されます。しかし、小さなバッチサイズは勾配推定の分散を増加させ、収束速度に影響を与えます。OOM エラーを回避しつつ収束速度を向上させるために、勾配蓄積を使用できます。モデルの最適化ステップを実行する前に複数のバッチの勾配を蓄積することで、より大きな実効バッチサイズを実現できます。実効バッチサイズは、設定されたバッチサイズの値に `gradient_accumulation_steps` を掛けた値です。
apply_chat_template
`apply_chat_template` が true に設定されている場合、モデルのデフォルトの チャットテンプレートが自動的にトレーニングデータに追加されます。カスタムのチャットテンプレートを使用したい場合は、`apply_chat_template` を false に設定し、必要な特殊トークンをトレーニングデータに挿入できます。`apply_chat_template` が true の場合でも、システムプロンプトを手動でカスタマイズすることは可能です。
system_prompt
システムプロンプトでは、モデルがユーザーのクエリにより良く回答できるように、指示、ガイダンス、および背景情報を提供できます。たとえば、次のようなシステムプロンプトを使用できます。「あなたは熱心でプロフェッショナルなカスタマーサービスエージェントです。あなたのコミュニケーションはフレンドリで、回答は簡潔です。あなたは例を使ってユーザーの問題を解決するのが好きです。」