導入
ChatGPT のような 大規模言語モデル(LLM) も、公開モデルをファインチューニングして「自社の口調」「専門知識」に特化させられます。ただしパラメータが数十億〜数千億個。全部を更新するのは非現実的です。そこで生まれた省エネ手法が LoRA です。
説明
LLM の全パラメータを更新(フルファインチューニング)するには、巨大な GPU メモリと膨大なコストがかかります。そこで PEFT(Parameter-Efficient Fine-Tuning:パラメータ効率の良い微調整) という考え方が主流になりました。その代表が LoRA(Low-Rank Adaptation) です。
LoRA のアイデア:元の巨大な重みは凍結したまま、その隣に「小さな差分行列」だけを付け足して、そこだけを学習する。更新するパラメータを元の 1% 未満に抑えられます。
flowchart LR in["入力"] --> w["元の重み W<br/>(巨大・凍結)"] in --> lora["小さな追加行列<br/>A×B(これだけ学習)"] w --> add["+"] lora --> add add --> out["出力"]
イメージは「分厚い専門書(=事前学習済みの巨大な重み)はそのままに、余白に自分用の付箋(=LoRAの小さな行列)を貼っていく」感じです。本体を書き換えないので安全で、付箋だけなら軽い。
peft ライブラリを使うと、既存モデルに数行で LoRA を適用できます。
from peft import LoraConfig, get_peft_model
config = LoraConfig(r=8, lora_alpha=16, target_modules=["q_proj", "v_proj"])
model = get_peft_model(base_model, config) # 元は凍結・LoRA部だけ学習対象に
model.print_trainable_parameters()
# 例: trainable params: 0.2% || 全体の 0.2% しか学習しない
その後の訓練ループは第4章と同じ(zero_grad → forward → loss → backward → step)。学習後は、この小さな LoRA 部分(数MB)だけを保存すればよく、配布も差し替えも軽量です。
フルファインチューニング vs LoRA
| 観点 | フルファインチューニング | LoRA(PEFT) |
|---|---|---|
| 更新するパラメータ | 全部(数十億) | ごく一部(1%未満) |
| 必要なGPUメモリ | 非常に大きい | 小さい |
| 保存サイズ | モデル全体(数十GB) | 数MB〜数百MB |
| 使いどころ | 潤沢な計算資源がある時 | 個人〜中小規模の大半 |
個人や多くの現場では、まず LoRA を選ぶのが現実的です。
まとめ
- LLM は巨大すぎて全パラメータ更新は非現実的 → PEFT(省パラメータ微調整)が主流。
- LoRA:元の重みは凍結し、隣に付ける小さな差分行列だけを学習する。
peftで数行。学習・保存が軽く、個人〜中小規模のLLM微調整の定番。