大規模言語モデルのファインチューニングにおいて、元のモデルパラメータを凍結したまま低ランク行列を注入して追加学習する手法。Microsoftが2021年に提案し、VRAM使用量と学習時間を大幅に削減しながら高い精度を維持する。
LoRA(Low-Rank Adaptation)とは、事前学習済みモデルの重み行列を直接更新するのではなく、低ランクの分解行列(A行列とB行列)を追加して学習する手法である。Edward Hu氏らがMicrosoft Research在籍時に2021年の論文「LoRA: Low-Rank Adaptation of Large Language Models」で提案した。
従来のFull Fine-tuningではモデルの全パラメータ(例: Llama 3.1 8Bで約80億個)を更新するため、大量のVRAMと計算資源が必要だった。LoRAは重み行列W(d×d)に対し、低ランク行列の積 B×A(d×r + r×d、r << d)を加算することで、更新パラメータ数を数百分の1に削減する。
数学的には: W' = W + ΔW = W + B×A(Bはd×r、Aはr×d、rはランク)
ランクrは通常8〜128に設定される。r=16の場合、Llama 3.1 8Bモデルの更新パラメータは約4,000万個(全体の0.5%)に過ぎない。
| パラメータ | 推奨値 | 説明 |
|---|---|---|
| rank (r) | 8-64 | 低ランク行列の次元。大きいほど表現力増、VRAM増 |
| alpha (α) | r×1〜r×2 | スケーリング係数。α=2rが安定的 |
| target_modules | q_proj, v_proj, k_proj, o_proj | 適用対象の線形層 |
| dropout | 0.05-0.1 | LoRA層のドロップアウト率 |
| learning_rate | 1e-4〜5e-4 | Full FTより10倍程度高く設定可能 |
| epochs | 1-3 | 過学習防止のため少なめに |
LoRAの成功を受け、多数の改良手法が提案されている:
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/Meta-Llama-3.1-8B",
max_seq_length=2048,
load_in_4bit=True, # QLoRA
)
model = FastLanguageModel.get_peft_model(
model, r=16, lora_alpha=32,
target_modules=["q_proj","k_proj","v_proj","o_proj"],
lora_dropout=0.05,
)
上記の設定でRTX 4090(24GB)1枚で約1.5時間の学習が可能(データセット5,000件の場合)。
Q1: LoRAのランク(r)はどう選べばよい? A: 一般的なタスクではr=16〜32で十分。複雑なドメイン適応にはr=64〜128を試す。r=8未満は精度低下が目立つ。VRAMに余裕があればr=32から始め、精度とリソースのバランスを見るのが実践的。
Q2: LoRAアダプタのファイルサイズはどのくらい? A: 7Bモデルのr=16 LoRAアダプタは約30〜50MB。ベースモデル(約14GB fp16)と比較して1/300以下。複数のタスク別アダプタを保持しても容量負担は極めて小さい。
Q3: LoRAをマージするメリットは? A: マージ後は通常のモデルと同じ推論速度になり、アダプタ読み込みのオーバーヘッドがゼロ。ただしマージすると他のアダプタとの切り替えができなくなる。本番デプロイ時にマージ、開発時は分離が一般的。