ファインチューニング入門:LoRA と QLoRA
プロンプトエンジニアリングも RAG も要件を満たせないとき、ファインチューニングでモデルに特定のスタイルやタスクを確実に習得させられます。このチュートリアルでは最も主流な効率的ファインチューニング手法 LoRA と QLoRA を紹介します。
著者:AI Resource Hub
実際にファインチューニングが必要なとき
知識を補うだけなら RAG を優先します。固定の出力スタイルや形式が必要な場合、または小さいモデルに特定タスクを学習させたい場合にファインチューニングが適します。
ファインチューニングには一定量の高品質なラベル付きデータが必要です。投資する前に目標と評価方法を見極めましょう。
フルファインチューニングのコスト
フルパラメータのファインチューニングはモデルの全重みを更新するため、メモリと計算コストが膨大です。大規模モデルでは個人や小規模チームにはほぼ不可能です。
LoRA の核心思想
LoRA(Low-Rank Adaptation)は元の重みを固定し、その横に小さな低ランク行列のペアを挿入して「差分」を学習します。学習可能なパラメータ数はフルファインチューニングの1%以下になることが多いです。
学習後は非常に小さなアダプターが得られ、必要に応じて読み込めるため、タスクごとに複数セットを管理しやすくなります。
QLoRA と量子化
QLoRA は LoRA を基に、まずベースモデルを4ビットに量子化してから学習します。メモリ使用量をさらに大幅に削減し、単一のコンシューマー GPU でかなり大きなモデルのファインチューニングを可能にします。
データ準備と実践のコツ
データの質は量より重要です。明確で一貫性のある、目標シナリオを網羅する指示-回答ペアを作成しましょう。
小さい学習率と少数のエポックから始め、検証セットの性能を注意深く観察して過学習を避けます。Hugging Face PEFT などのライブラリで素早く始められます。
アダプターのマージとデプロイ
学習後、LoRA 重みをベースモデルにマージして単一のスタンドアロンファイルにするか、分離したまま必要に応じてロードできます。マージはデプロイが簡単ですが、再エクスポートなしでアダプターを切り替える柔軟性が失われます。同じベースモデルから複数タスクを提供する場合は分離を維持し、単一目的ならマージが便利です。
アダプターを付ける一歩
この呼び出しは、学習ループの前に LoRA アダプターを付ける段階を解きます。断片の rank と alpha は出発点の下書きであり、計測結果ではありません。失敗:target_modules の名前がこのモデルに無いと、print_trainable_parameters は 0 を返し、損失は訓練したかった層を動かしません。
from peft import LoraConfig, get_peft_model
config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
task_type="CAUSAL_LM",
)
model = get_peft_model(base_model, config)
model.print_trainable_parameters()