LoRA(Low-Rank Adaptation/低ランク適応)は、学習済みモデルの重みを凍結したまま、各層に足した2つの小さな行列だけを学習するファインチューニング(微調整)の手法です。読み方は「ローラ」。2021年にMicrosoftの研究者らが論文(arXiv:2106.09685)で発表し、GPT-3 175BをAdamで全パラメータ微調整する場合と比べて、学習するパラメータを1万分の1、GPUメモリを3分の1に減らせると報告しました。
いまは大規模言語モデル(LLM)の微調整だけでなく、Stable Diffusionなどの画像生成で画風やキャラクターを足す「LoRAファイル」としても広く使われています。本記事では、仕組みを式と実測値で確かめたうえで、ランクrとlora_alphaの決め方、画像生成ツールでの使い方、改良版のLoRA-Proや派生手法との違いを整理します。版番号と仕様は2026年10月21日時点の確認値です。
まとめ:LoRAの仕組みとr=16・全線形層を起点とする設定
- 仕組み:元の重みWは固定し、更新分ΔWを「縦長の行列B×横長の行列A」で表して、BとAだけを学習する。Bは0で初期化するので、学習前の出力は元のモデルと同じ。
- 効果:Qwen2.5-0.5Bで実測すると、r=16・全線形層でも学習するのは全体の約1.8%(8,798,208個)、保存ファイルは35.24MB。学習後はWに足し込める(マージ)ため推論は遅くならない。
- 決め方:r=8〜16、lora_alpha=rか2r、適用先は全線形層(all-linear)から始める。2025年の検証では、α=32固定の条件で最適な学習率がフル微調整の約10倍となった。αをrに比例させる設定では学習率も再探索する。
- LoRA-Pro:勾配を補正してフル微調整に近づける改良版(ICLR 2025)。Llama-2-7BのGSM8Kで42.08→57.57。ただしPEFT 0.21.2には未収録で、公式実装を動かす必要がある。
- 画像生成:AUTOMATIC1111系は
models/Loraに置いて<lora:ファイル名:強さ>、ComfyUIはmodels/lorasに置いてLoraLoaderノードで読む。
LoRAの仕組み:凍結した重みWと低ランク差分B·A
ある線形層の重みをW(d×k行列)とします。フル微調整はWそのものを書き換えますが、LoRAは更新分ΔWを2つの行列の積で表し、Wには触れません。
| 記号 | 形 | 役割 |
|---|---|---|
| W | d×k | 学習済みの重み(凍結) |
| A | r×k | 入力をr次元に縮める(ランダム初期化) |
| B | d×r | r次元から出力へ戻す(0で初期化) |
| 出力 | h = Wx + (α/r)·BAx | αはlora_alpha |
rは「ランク」で、AとBの間の細い次元です。dやkが数千あってもrは4〜64程度なので、学習する数はd×k個からr×(d+k)個に減ります。論文はこの前提を「適応で生じる重みの変化は、本質的なランク(intrinsic rank)が低い」と表現しています。
Bのゼロ初期化:学習開始時の出力の一致
原論文は「Aをランダムなガウス分布、Bを0で初期化するので、学習開始時のΔW=BAは0」と書いています。PEFT 0.21.2の既定(init_lora_weights=True)はAをKaiming一様分布、Bを0で初期化します。初期出力が変わらない点は原論文と共通しており、Qwen2.5-0.5B-Instructにr=8のLoRAを付けた直後の出力(logits)は、元のモデルとの差の最大値が0.0でした。学習を始めた瞬間に元の能力を壊さないための設計です。
LoRAのマージ:W+ΔWへの統合と推論時の追加計算の解消
学習後はΔWを計算してWに足し込めば、普通の1枚の重みに戻ります。アダプタ方式のように層が増えないため、原論文はアダプタと違って推論の追加遅延が無いとしています。実測では、3文を20ステップ学習したあと merge_and_unload() でマージしたモデルと、マージ前のモデルの出力差は最大0.00056(float32の丸め誤差の範囲)で、マージ後のモデルにLoRAの層は残っていませんでした。学習したΔW(896×896)の行列ランクを測ると8で、r=8の上限どおりです。
逆にマージしない運用にも利点があります。ベースモデルを1つだけメモリに載せ、用途別のLoRAを差し替えれば複数タスクを切り替えられます。原論文の試算では、GPT-3のチェックポイントは350GBですが、r=4でQueryとValueだけに入れたLoRAは35MBで、100タスク分を持っても約354GBで済みます(全部をフル微調整で持つと約35TB)。
フル微調整・アダプタ・プロンプトチューニングとの違い
LoRAは「PEFT(Parameter-Efficient Fine-Tuning=パラメータ効率のよい微調整)」と呼ばれる手法群の1つです。代表的な方式と比べると、何を学習し、推論に何が残るかが違います。
| 方式 | 学習する対象 | 推論の追加計算 | 保存するもの |
|---|---|---|---|
| フル微調整 | 全パラメータ | なし | モデル一式 |
| アダプタ | 層間に挿す小さな層 | あり(層が増える) | アダプタ層 |
| プロンプトチューニング | 入力に足す仮想トークン | あり(入力が長くなる) | 埋め込みベクトル |
| LoRA | 低ランク行列AとB | マージすればなし | AとB(数MB〜数百MB) |
フル微調整との違いは「全部を書き換えるか、差分だけを足すか」です。LoRAの表現容量が不足する条件では、フル微調整が有利になる場合があります。データ量や知識更新という目的だけでは優劣を断定できず、ランクと評価結果で判断します。Thinking Machines Labの検証(LoRA Without Regret、2025年9月29日)も、LoRAの容量を超える量のデータではフル微調整に劣ると結論しています。手法全体の位置づけとpeftライブラリでの切り替え方はPEFTとLoRAの違いとは?peftライブラリの使い方とQLoRA・DoRAの比較【2026年10月】で扱っています。
ランクrとlora_alphaの決め方:Qwen2.5-0.5Bでの実測
LoRAの設定で結果を左右するのは、ランクr、lora_alpha、適用する層(target_modules)、学習率の4つです。まずrと適用先で、学習パラメータ数とファイル容量がどう変わるかを測りました。
ランクrと適用先で変わる学習パラメータとファイル容量
Qwen2.5-0.5B-Instruct(4億9,403万パラメータ)に、lora_alpha=2rのLoRAを付けて save_pretrained() し、学習対象の数と adapter_model.safetensors の容量を測った結果です(Intel MacのCPU、torch 2.2.2・transformers 4.46.3・peft 0.21.2。float32で保存)。
| 適用先 | r | 学習パラメータ | ベース比 | ファイル容量 |
|---|---|---|---|---|
| q_proj,v_proj | 4 | 270,336 | 0.055% | 1.09MB |
| q_proj,v_proj | 8 | 540,672 | 0.109% | 2.18MB |
| q_proj,v_proj | 16 | 1,081,344 | 0.219% | 4.34MB |
| q_proj,v_proj | 64 | 4,325,376 | 0.876% | 17.31MB |
| all-linear | 4 | 2,199,552 | 0.445% | 8.84MB |
| all-linear | 8 | 4,399,104 | 0.890% | 17.64MB |
| all-linear | 16 | 8,798,208 | 1.781% | 35.24MB |
| all-linear | 64 | 35,192,832 | 7.124% | 140.82MB |
適用層と保存精度を固定してrを2倍にすると、学習パラメータ数は2倍、保存容量はほぼ2倍になります。q_proj,v_proj・r=8の540,672個は手計算と一致します。q_projは896×896なので1層あたり8×896+896×8=14,336個、v_projはGQA(グループ化クエリアテンション)で出力が128次元なので8×896+128×8=8,192個、これが24層で540,672個です。容量はおよそ「パラメータ数×4バイト」で、bf16で保存すれば半分になります。
LoRAのランクr:初期値の目安と適用層の比較
原論文のGPT-3の実験(Table 6)では、QueryとValueに入れたLoRAはr=1でもWikiSQLの正解率73.4%、r=64で73.5%とほとんど差がありませんでした。同じパラメータ数ならQueryだけに大きなrを入れるより、QueryとValueの両方に小さなrを入れた方が良い(Table 5)という結果も出ています。
LoRA Without Regretは、さらに「LoRAは全層に入れるべきで、特にMLP(FFN)層が重要。注意機構だけに入れても、MLPだけに入れた場合を上回らない」と述べています。PEFTの LoraConfig() の既定はr=8・lora_alpha=8で、target_modulesを省くとQwen2系やLlama系ではq_projとv_projだけに入ります。原論文の構成に合わせた既定値なので、まず target_modules="all-linear" を明示し、rは8〜16で始めるのが現実的です。rを上げるかは、学習率やデータ品質を確認したうえで、検証損失とタスク指標の改善を比較して判断します。
lora_alphaとスケーリング:α/rとrsLoRAのα/√r
LoRAの出力はα/r倍されます。実測でもr=8・lora_alpha=16のスケーリングは2.0でした。原論文は「Adamで最適化する場合、αの調整は学習率の調整とほぼ同じ。最初に試したrの値をαにして調整しない」と書いています。つまりαは最初に試したrの値に置き、その後rを変えても固定します。本記事が起点として挙げるα=rやα=2rは、PEFTで最初の1回を組むときの候補です。
ただしα/rのままrを大きくすると、更新が弱くなりすぎて学習が進まないことがあります。これを直したのがrsLoRA(arXiv:2312.03732)で、スケーリングをα/√rにします。PEFTでは use_rslora=True の1行で切り替わり、r=8・α=16では5.657(16/√8)になることを確認しました。r=64以上の大きなランクを試すときに使います。
学習率・lora_dropoutの目安と、損失が下がりすぎるときの過学習
学習率はフル微調整より高めにします。LoRA Without Regretは、同じ用途での最適な学習率はフル微調整の約10倍で、r=4とr=512の間でも最適値の変化は2倍未満だったと報告しています。この約10倍という結果はα=32固定の実験条件によるものです。同条件なら1e-5に対して1e-4前後を探索候補にできますが、α=r・2rやrsLoRAに変更する場合は学習率も再探索します。lora_dropoutのPEFT既定は0.0で、データが少ないときに0.05〜0.1を入れます。
損失の値だけで成功を判断しないでください。実測では3文だけを学習率1e-3で20ステップ回すと、損失は5.36から0.0135まで下がりました。この結果だけでは、文の記憶と未知データへの汎化を区別できません。学習に使わない検証データの損失を追跡し、改善が止まった状態が続けば早期終了を検討して、元のタスク(一般的な質問への応答など)の評価が落ちていないかも併せて確認します。データの件数や形式の決め方はファインチューニング用データセットの作り方|サンプル形式・件数・品質の要件にまとめています。
PEFTのLoRA最小コード:適用・学習・保存・マージ
Hugging FaceのPEFT(2026年10月1日公開の0.21.2が最新・Python 3.10以上)を使うと、LoRAは数行で付けられます。上の実測に使ったコードを、学習・保存・マージの流れに絞ったものです。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model
name = "Qwen/Qwen2.5-0.5B-Instruct"
tok = AutoTokenizer.from_pretrained(name)
model = AutoModelForCausalLM.from_pretrained(name, torch_dtype=torch.float32)
config = LoraConfig(r=16, lora_alpha=32, lora_dropout=0.05,
target_modules="all-linear", task_type="CAUSAL_LM")
model = get_peft_model(model, config)
model.print_trainable_parameters() # 学習対象の数と割合を表示
texts = ["LoRAは低ランク行列AとBだけを学習します。"]
enc = tok(texts, return_tensors="pt")
opt = torch.optim.AdamW([p for p in model.parameters() if p.requires_grad], lr=2e-4)
model.train()
for step in range(10):
loss = model(**enc, labels=enc["input_ids"]).loss
loss.backward(); opt.step(); opt.zero_grad()
model.save_pretrained("out/qwen-lora") # AとBだけを保存(この設定で約35MB)
merged = model.merge_and_unload() # W+ΔWの通常モデルを返す
merged.save_pretrained("out/qwen-merged")
merge_and_unload() は戻り値のモデルを使います。4bit量子化したモデルにLoRAを付けるQLoRAでは、学習後のマージに別の注意点があるため、QLoRAとは?4bit量子化+LoRAの仕組み・VRAM目安・実装手順と採用判断を解説【2026年版】の手順を参照してください。実務の学習ではTRLのSFTTrainerや、1枚のGPUで速く回すUnslothとは?読み方・使い方とDesktop・Studio・Coreの違い【2026年9月】を使うことが多く、GPUの選び方はファインチューニングの実行環境と実装|必要GPUと学習コードで扱っています。
Stable DiffusionでのLoRAの使い方:配置フォルダと強さの指定
画像生成のLoRAは、拡散モデル本体(UNetやTransformer)とテキストエンコーダの重みに差分を足したファイルです。数枚〜数十枚の画像とキャプションで画風やキャラクターを学習でき、元のチェックポイント(数GB)を作り直さずに数MB〜数百MBの差分だけを配布できます。.safetensors 形式が一般的です。
AUTOMATIC1111・Forgeでの使い方
ファイルを models/Lora フォルダに置き、プロンプトの任意の位置に <lora:ファイル名:強さ> と書きます。公式Wikiによれば、ファイル名は拡張子を除いた名前で、強さは「一般に0〜1」で効き具合を決めます。ネガティブプロンプトには入れられません。なおAUTOMATIC1111の最新リリースはv1.10.1で、それ以降の版は出ていません。FLUX系を使う場合は、ForgeやComfyUIで対象モデルとLoRA形式への対応を確認して選びます。
ComfyUI・diffusersでの使い方
ComfyUI(2026年10月19日時点でv0.42.1)は models/loras に置き、「LoraLoader」ノードをチェックポイントとサンプラーの間につなぎます。強さは拡散モデル側(strength_model)とテキストエンコーダ側(strength_clip)を別々に指定でき、既定は1.0です。Pythonから使う場合はdiffusers(v0.41.0)の pipeline.load_lora_weights() で読み込み、set_adapters("名前", adapter_weights=0.7) で強さを変えます。
import torch
from diffusers import DiffusionPipeline
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.float16).to("cuda")
pipeline.load_lora_weights(
"ostris/ikea-instructions-lora-sdxl",
weight_name="ikea_instructions_xl_v1_5.safetensors",
adapter_name="ikea")
pipeline.set_adapters("ikea", adapter_weights=0.7) # 0でベースのみ、1でLoRAを全量
pipeline.fuse_lora(adapter_names=["ikea"], lora_scale=1.0) # 重みに統合して速くする
pipeline.unload_lora_weights()
これはdiffusersの公式ガイドに載っている例で、fuse_lora() はPEFTのマージと同じく差分を重みに足し込みます。
配布LoRAの確認事項:対応ベースモデルとライセンス
LoRAは特定のベースモデル向けの差分なので、SD1.5用のLoRAはSDXLやFLUXでは使えません。配布ページで対応するベースモデルを必ず確かめます。商用で使う場合は、LoRA作者が設定した利用条件に加えて、ベースモデルのライセンスも効きます。たとえばFLUX.1 [dev] Non-Commercial License v1.1.1は、微調整したモデルを「派生物(Derivative)」と定義しており、LoRAを含む派生物の利用は非商用・非本番の目的に限られます(生成した画像そのものの扱いは別の条項で定められています)。特定の作家の画風や実在人物を再現するLoRAは、著作権や肖像権・パブリシティ権の問題になりやすく、業務では避けるのが安全です。
LoRA-Proとは:勾配を補正してフル微調整に近づける改良版
LoRA-Pro(arXiv:2407.18242)は、Zhengbo Wang氏・Jian Liang氏らが2024年7月25日に公開し、ICLR 2025に採択された手法です。論文の副題は「Are Low-Rank Adapters Properly Optimized?(低ランクアダプタは適切に最適化されているか)」です。
LoRA-Proの仕組み:等価勾配とフル微調整の勾配との差の補正
著者らは、AとBを1ステップずつ更新した結果をまとめると、Wに「低ランクに制限された勾配(等価勾配)」を当てたフル微調整と同じ形になることを示しました。通常のLoRAではこの等価勾配がフル微調整の勾配からずれ、それが積み重なって精度差になる、というのが論文の見立てです。LoRA-Proは、等価勾配とフル微調整の勾配の差が最小になるようAとBの勾配を解析的に決め、その計算にr×rの行列Xを含むSylvester方程式を使います。Xを0にした場合はGSM8Kが31.74にとどまり、Sylvester方程式の解では57.57でした。
論文の実測値:同じ条件で派生手法と並べた結果
論文のTable 2から、Llama-2-7Bの3シードの平均値を抜粋しました。ランクは明記した行を除き8です。MT-Benchは第1ターンの評価点、GSM8Kは正解率(%)、HumanEvalはpass@1(%)で、原表の標準偏差は省略しています。派生手法を同じ条件でそろえて比べた一次データとしても使えます。
| 手法 | MT-Bench | GSM8K | HumanEval |
|---|---|---|---|
| フル微調整 | 5.30 | 59.36 | 35.31 |
| LoRA | 5.61 | 42.08 | 14.76 |
| rsLoRA | 5.25 | 45.62 | 16.01 |
| AdaLoRA | 5.57 | 50.72 | 17.80 |
| LoRA+ | 5.71 | 52.11 | 18.17 |
| DoRA | 5.97 | 53.07 | 19.75 |
| LoRA-GA | 5.95 | 53.60 | 19.81 |
| LoRA-Pro | 5.72 | 57.57 | 22.97 |
| LoRA-Pro(r=128) | 5.67 | 61.08 | 30.28 |
差が大きいのは数学とコードで、対話のMT-Benchはどの手法もほぼ横並びです。LoRA-Proはr=128でGSM8Kがフル微調整の59.36を上回りましたが、HumanEvalはなお約5ポイント届きません。追加の負荷はTable 4で、GPU1枚あたりのメモリがLoRAの約17GBに対して約21GB、学習時間は1時間30分に対して1時間41分でした(フル微調整は約40GB・4時間20分)。ただし測定に使ったGPU台数とデータセットの書き方が表の注記と本文で食い違っているため、約4GB・約11分の増加という差の大きさで読むのが安全です。
LoRA-Proを採用する条件と見送る場面
公式実装はgithub.com/mrflogs/LoRA-Pro(MITライセンス)で、READMEにpre-release版と書かれ、同梱のDeepSpeed 0.15.1を改変してAdamの更新に補正を組み込む作りです。リポジトリの最終更新は2025年4月で、PEFT 0.21.2には収録されていません(PEFTに入っているのはrsLoRA・DoRA・LoRA+・LoRA-FA・LoRA-GAなど)。
採用してよいのは、標準のLoRAで基準値を取って数学やコード生成でフル微調整との差がはっきり残り、対象モデル・ランク・系列長で追加メモリを測定して確保でき、改変版DeepSpeedを自分たちで保守できる場合です。対話の口調合わせや社内用語の習得のように差が小さいタスクでは効果が薄く、PEFTの範囲で切り替えられるDoRAやLoRA+、target_modulesの見直しを先に試す方が手戻りは少なく済みます。論文自身も、事前学習や大量データの微調整では低ランクの前提が崩れて効果が下がり得ること、DoRAのように構造が違う派生には適用できないことを限界として挙げています。
派生手法の違い:QLoRA・DoRA・AdaLoRA・LoRA+・LoRA-FA・LoRA-GA
LoRAの派生は「メモリをさらに減らす」「精度を上げる」の2系統に分かれます。PEFT 0.21.2での指定方法と並べると次のとおりです。
| 手法 | 発表 | 変える点 | PEFTでの指定 |
|---|---|---|---|
| QLoRA | 2023年5月 | ベースを4bit(NF4)に量子化 | bitsandbytesと併用 |
| AdaLoRA | 2023年3月 | 層ごとにランクを配分 | AdaLoraConfig |
| LoRA-FA | 2023年8月 | Aを固定しBだけ学習 | create_lorafa_optimizer |
| rsLoRA | 2023年11月 | スケーリングをα/√rに | use_rslora=True |
| DoRA | 2024年2月 | 重みを大きさと方向に分解 | use_dora=True |
| LoRA+ | 2024年2月 | Bの学習率をAより大きく | create_loraplus_optimizer |
| LoRA-GA | 2024年7月 | 勾配の近似で初期化 | LoraGAConfig |
| LoRA-Pro | 2024年7月 | 学習中の勾配を補正 | 未収録(公式実装) |
QLoRA(arXiv:2305.14314)は読み方「キューローラ」で、16bitのフル微調整なら780GBを超えるGPUメモリが要る65Bモデルを、48GBのGPU1枚で微調整できると示しました。VRAMが足りないときの第一候補です。LoRA-GAとLoRA-Proはどちらも「フル微調整の勾配に寄せる」発想ですが、LoRA-GAは学習開始時の初期値で寄せ、LoRA-Proは毎ステップ補正する点が違います。上の表のとおり、同じ条件ではLoRA-Proの方がGSM8Kで約4ポイント高い結果でした。
LoRAを選ぶべきでない場面と、よくある失敗
LoRAは万能ではありません。次の3つに当てはまるなら、別の手段を先に検討します。
- 社内文書の知識を答えさせたいだけ:知識の追加は微調整より検索拡張生成(RAG)が向く場合が多い。切り分けはRAGとファインチューニングの違いと使い分け|判断基準とコストで選ぶ2026年の実装方針で整理しています。
- ランクを調整してもLoRAが必要な評価水準に届かない:LoRAの容量を超えるとフル微調整に劣る。LoRA Without Regretでは、一部の実験条件で大きなバッチサイズによる性能低下がフル微調整より大きく、rを上げても解消しなかった。
- 精度が出ない原因を手法のせいにしている:データの重複・形式の揺れ・評価指標のずれを直さずにrや派生手法を変えても改善しない。基準値(標準LoRA)→設定調整→派生手法の比較、の順で、同じデータ・同じ評価・同じ乱数シードで比べる。
よくある失敗は、target_modulesを既定のまま(q_proj,v_projのみ)にして「LoRAは効かない」と判断すること、訓練データの損失だけを見て、検証データでの汎化を確かめないこと、ベースモデルの版を変えたのに古いLoRAを使い回すことの3つです。モデル選定から学習基盤・評価設計までまとめて相談したい場合は、一創の生成AI開発・AI受託開発でお受けしています。
よくある質問
Q. LoRAの読み方は?QLoRAは何と読みますか?
LoRAは「ローラ」、QLoRAは「キューローラ」と読みます。LoRAはLow-Rank Adaptation(低ランク適応)の略で、IoT向けの無線通信規格「LoRa(ローラ)」とは別物です。
Q. LoRAとファインチューニングの違いは何ですか?
LoRAはファインチューニングの方法の1つです。全パラメータを更新するフル微調整に対し、LoRAは重みを凍結して低ランク行列AとBだけを学習します。Qwen2.5-0.5Bでは、r=16・全線形層でも学習対象は全体の約1.8%でした。
Q. LoRAのランク(rank)はいくつにすればよいですか?
r=8〜16から始め、lora_alphaはrか2rにします。原論文ではr=1でもr=64とほぼ同じ精度が出たタスクがあり、同じパラメータ数なら1種類の層に大きなrを入れるより、複数の層に小さなrを入れた方が良い結果でした。rを64以上にするならrsLoRA(use_rslora=True)を併用します。
Q. LoRAファイルのサイズはどのくらいですか?
パラメータ数×保存精度のバイト数で決まります。実測ではQwen2.5-0.5Bのr=8・q_proj,v_projで2.18MB、r=16・全線形層で35.24MB(float32)でした。画像生成用のLoRAは数MB〜数百MBが一般的です。
Q. LoRA-ProはPEFTやStable DiffusionのWebUIで使えますか?
LoRA-Proで学習する機能は、2026年10月時点でPEFT 0.21.2にもWebUIにもありません。学習には公式実装(改変版DeepSpeed同梱)を動かします。一方、LoRA-Proは学習時の勾配の扱いを変える手法で、出来上がるのは通常のLoRAと同じAとBの行列です。推論で使えるかどうかは、ベースモデルと保存形式がツールに対応しているかで決まります。