大規模言語モデルの全パラメータを更新せず、ごく少数の追加パラメータだけで調整する「LoRA」は、ファインチューニングのコストを劇的に下げました。仕組みと実践のポイントを解説します。
LoRA:大規模モデルを手軽にカスタマイズする革新的手法

AIを知りたい
先生、LLMをファインチューニングしたいんですが、GPUメモリが足りなくて困っています。LoRAを使えば解決できると聞いたのですが、本当ですか?

AIエンジニア
本当だよ。LoRA(Low-Rank Adaptation)は、モデルの全パラメータを更新するのではなく、低ランクの小さな行列だけを追加学習する手法なんだ。例えば70億パラメータのモデルでも、LoRAなら追加パラメータはわずか数百万で済むから、必要なGPUメモリが10分の1以下になるよ。

AIを知りたい
10分の1以下ですか!でも、そんなに少ないパラメータで性能は落ちないんですか?

AIエンジニア
驚くべきことに、LoRAはフルファインチューニングとほぼ同等の性能を達成できることが多いんだ。これはMicrosoftの研究者が2021年に発表した論文で実証されたよ。大規模言語モデルの重み行列は「低ランク」の構造を持っているため、少数のパラメータ変更だけでタスクへの適応が可能なんだ。
LoRAとは。
LoRA(Low-Rank Adaptation of Large Language Models)は、Microsoftの研究チームが2021年に発表した、大規模言語モデルの効率的なファインチューニング手法です。事前学習済みモデルの重み行列を直接更新する代わりに、低ランク分解した2つの小さな行列(AとB)を各レイヤーに追加し、この追加分だけを学習します。これにより、学習パラメータ数を元のモデルの0.1〜1%に抑えつつ、フルファインチューニングに匹敵する精度を実現します。2026年現在、Llama 3やMistralなどのオープンソースLLM、Stable Diffusionなどの画像生成モデルのカスタマイズに広く使われており、PEFT(Parameter-Efficient Fine-Tuning)の代表的な手法として定着しています。
LoRAの仕組みと技術的な特徴
LoRAの核心は「低ランク分解」という線形代数のテクニックにあります。具体的な仕組みを見てみましょう。
| 項目 | フルファインチューニング | LoRA | QLoRA |
|---|---|---|---|
| 更新パラメータ | 全パラメータ(数十億) | 追加行列のみ(数百万) | 追加行列のみ(4bit量子化) |
| 7Bモデルの必要VRAM | 約56GB(bf16) | 約16GB(bf16) | 約6GB(4bit) |
| 学習速度 | 遅い | フルの50〜70% | フルの40〜60% |
| 精度(フル比) | 100%(基準) | 95〜100% | 90〜98% |
| 必要GPU | A100 80GB×複数 | A100 40GB×1 | RTX 4090(24GB)×1 |
| モデルの切り替え | 全モデルを保存・読込 | アダプタのみ差し替え | アダプタのみ差し替え |

AIを知りたい
QLoRAならRTX 4090で70億パラメータのモデルをファインチューニングできるんですね!低ランク分解って具体的にどういう仕組みですか?

AIエンジニア
分かりやすく説明するね。例えば、元のモデルの重み行列Wが4096×4096のサイズだとする。フルファインチューニングでは、この約1,677万個のパラメータ全てを更新するよね。LoRAでは代わりに、4096×16の行列Aと16×4096の行列Bを追加するんだ。ランク(r)を16とすると、追加パラメータは約13万個。元の0.8%で済むんだよ。推論時は W + A×B の結果を使い、元の重みWに低ランク行列の積を足し合わせるだけだから、推論速度の低下もほぼないんだ。
LoRAの主要パラメータと設定ガイド
LoRAを実際に使う際に重要な設定パラメータを理解しましょう。
| パラメータ | 説明 | 推奨値 | 影響 |
|---|---|---|---|
| rank(r) | 低ランク行列のランク | 8〜64(一般的に16) | 大きいほど表現力が高いが、メモリ使用量も増加 |
| alpha(α) | スケーリング係数 | rankの2倍(例: r=16なら32) | 学習率の調整に影響 |
| target_modules | LoRAを適用するレイヤー | q_proj, v_proj(最低限) | 多くのレイヤーに適用するほど精度が向上 |
| dropout | LoRAレイヤーのドロップアウト率 | 0.05〜0.1 | 過学習を防ぐ |
| learning_rate | 学習率 | 1e-4〜3e-4 | フルファインチューニングより高めに設定 |

AIを知りたい
Stable Diffusionでもよく「LoRA」を見かけますが、LLM以外にも使えるんですか?

AIエンジニア
もちろん使えるよ。LoRAはもともとTransformerアーキテクチャ向けに開発されたけど、今ではあらゆるディープラーニングモデルに適用可能だ。特にStable DiffusionのLoRAは、わずか20〜50枚の画像で特定の画風やキャラクターを学習できるため、AIイラスト界隈で爆発的に普及したよ。Civitaiなどのプラットフォームには数十万のLoRAモデルが公開されているんだ。

AIを知りたい
LoRAのおかげで、個人でもAIモデルをカスタマイズできる時代になったんですね。さっそくHugging Faceのチュートリアルを試してみます!

AIエンジニア
そうだね。Hugging FaceのPEFTライブラリを使えば、わずか数行のコードでLoRAを適用できるよ。まずはLlama 3の7Bモデルに対してQLoRAで日本語タスクのファインチューニングを試すのがおすすめだ。Google ColabのT4 GPU(無料枠)でも動かせるから、ぜひチャレンジしてみてね。
PEFTライブラリでLoRAを適用する基本設定
Hugging FaceのPEFTライブラリを使って、大規模言語モデルにLoRA(Low-Rank Adaptation)を適用する基本的な設定方法を示します。
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
import torch
# 1. ベースモデルの読み込み
model_name = "meta-llama/Llama-2-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name)
base_model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
device_map="auto",
)
# 2. LoRAの設定
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM, # タスク種別
r=8, # LoRAのランク(低いほど軽量)
lora_alpha=32, # スケーリング係数
lora_dropout=0.1, # ドロップアウト率
target_modules=[ # LoRAを適用する層
"q_proj", # Query射影
"v_proj", # Value射影
],
bias="none", # バイアスは学習しない
)
# 3. LoRAを適用
model = get_peft_model(base_model, lora_config)
# パラメータ数の比較
model.print_trainable_parameters()
# trainable params: 4,194,304 || all params: 6,742,609,920
# trainable%: 0.0622% <- 全体の0.06%だけを学習
# 4. 推論テスト
model.eval()
inputs = tokenizer("LoRAとは", return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=100,
temperature=0.7,
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
# 5. 学習済みLoRAアダプターの保存と読み込み
model.save_pretrained("./lora_adapter")
# 保存サイズ: 約16MB(7Bモデル全体の約14GBに対して0.1%)
# 別のセッションで読み込む場合:
# from peft import PeftModel
# base = AutoModelForCausalLM.from_pretrained(model_name, ...)
# model = PeftModel.from_pretrained(base, "./lora_adapter")
LoRAの設定で最も重要なのはランクr(低ランク行列の次元数)とtarget_modules(適用先の層)の2つです。rを大きくすると表現力が上がる代わりにメモリ消費が増え、一般的にはr=8~64の範囲で調整します。target_modulesはAttention層のq_projとv_projが定番ですが、k_projやo_proj、さらにMLPの層にも適用することで精度が向上するケースがあります。lora_alphaはrの4倍程度が目安です。
