事前学習済みの大規模言語モデル (LLM) は、特定のニーズに対して必ずしも最適とは限りません。ファインチューニングによって、特定のタスクにおけるパフォーマンスが向上します。このガイドでは、ファインチューニング戦略 (SFT/DPO) やテクニック (全パラメータ、LoRA、QLoRA) を紹介し、主要なハイパーパラメータの概要を説明します。
ファインチューニング手法
SFT/DPO
モデルギャラリーでは、教師ありファインチューニング (SFT) と Direct Preference Optimization (DPO) を用いてモデルをファインチューニングできます。大規模言語モデル (LLM) のトレーニングプロセスには、通常、以下の 3 つのステージが含まれます。
1. 事前学習 (PT)
事前学習は LLM のトレーニングプロセスの最初のステージであり、モデルは大規模なテキストコーパスから基本的な文法、論理的推論、および一般常識を学習します。
-
目的:モデルに言語理解、論理的推論、および一般常識を身につけさせること。
-
モデル例:モデルギャラリーでは、Qwen や Llama シリーズなど、多くの事前学習済みモデルが提供されています。
2. 教師ありファインチューニング (SFT)
教師ありファインチューニングは、事前学習済みモデルをさらに適応させ、特定のドメイン、対話、および質疑応答シナリオで優れた性能を発揮させるためのものです。
-
目的:モデルの出力形式と内容を改善すること。
-
問題例:モデルが漢方薬などの特定ドメインの質問に対して、専門家レベルの回答を提供できるようにすること。
-
解決策:漢方薬などの特定ドメインの質疑応答ペアを使用してモデルをファインチューニングすること。
3. 選好最適化 (PO)
教師ありファインチューニングの後、モデルは文法的に正しいものの、事実として不正確であったり、人間の価値観と合致しない応答を生成することがあります。選好最適化 (PO) は、モデルの対話能力をさらに洗練させ、人間の価値観に沿わせるために使用されます。主な手法には、強化学習ベースの近接方策最適化 (PPO) と、言語モデルを直接最適化する Direct Preference Optimization (DPO) があります。DPO は、明示的な報酬モデルを必要とせず、暗黙的な強化学習パラダイムを使用するため、そのトレーニングプロセスは PPO よりも安定しています。
3.1 Direct Preference Optimization (DPO)
-
DPO モデルは、トレーニング対象の大規模言語モデル (LLM) と参照モデルの 2 つの主要コンポーネントで構成されます。参照モデルもファインチューニングされた LLM であり、そのパラメータは凍結され、トレーニング対象のモデルが意図した動作から逸脱するのを防ぎます。
-
トレーニングデータ形式:(prompt、chosen (選好される応答
)、rejected (選好されない応答 )) からなるトリプレット -
損失関数は以下のとおりです。DPO アルゴリズムは、参照モデルと比較して、モデルが選好される応答を生成する確率を高め、選好されない応答を生成する確率を低くすることを目指します。
-
σ は Sigmoid 関数であり、結果を (0, 1) の範囲にマッピングします。
-
β はハイパーパラメータであり、通常は 0.1 から 0.5 の間に設定され、損失関数の感度を調整します。
-
PEFT: LoRA/QLoRA
パラメータ効率的なファインチューニング (PEFT) 技術は、モデルのパラメータの大部分を凍結し、ごく一部のサブセットのみをファインチューニングすることで、十分なパフォーマンスを達成します。更新されるパラメータが少ないため、データと計算リソースの要件も削減されます。モデルギャラリーは、全パラメータファインチューニングのほか、LoRA と QLoRA という 2 つの PEFT 手法をサポートしています。
LoRA (低ランク適応)
LoRA 技術は、モデルのパラメータ行列 (たとえば、サイズ m×n の行列) の隣に並列パスを追加します。このパスは、2 つの低ランク行列 (サイズ m×r と r×n、ここで r は m と n よりはるかに小さい) の積で構成されます。フォワードパス中、入力は元のパラメータ行列と LoRA パスの両方を通過し、それらの出力が合計されます。トレーニング中、元のパラメータは凍結され、LoRA パスのみがトレーニングされます。LoRA パスは 2 つの低ランク行列で構成されているため、元の行列よりもはるかにパラメータが少なく、トレーニングの計算オーバーヘッドが大幅に削減されます。
QLoRA (量子化 LoRA)
QLoRA は、モデルの量子化と LoRA 技術を組み合わせたものです。LoRA パスを導入することに加えて、QLoRA は大規模モデルをロードする際に 4-bit または 8-bit 精度に量子化します。計算中、これらの量子化されたパラメータは、処理のために 16-bit に逆量子化されます。この方法は、モデルパラメータが使用されていないときのストレージを最適化するだけでなく、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 パラメータは、1 回のトレーニングイテレーションで各 GPU が処理するサンプル数を指定します。
-
バッチサイズパラメータは、主にトレーニングの効果ではなく、トレーニング速度を調整します。バッチサイズが小さいと、勾配推定の分散が大きくなり、収束するためにより多くのイテレーションが必要になります。バッチサイズを大きくすると、総トレーニング時間を短縮できます。
-
理想的なバッチサイズは、通常、お使いのハードウェアがサポートできる最大値です。[モデルギャラリー] > Job Management > Training Jobsに移動し、特定のジョブ名をクリックして、Task monitoringページで[GPU メモリ使用率]と[メモリ使用率]のメトリクスを表示することで、GPU メモリオーバーフローを発生させない最大のバッチサイズを選択できます。

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