LoRA(低ランク適応)とは|重みを凍結して差分だけ学ぶ仕組みと、全パラメータの微調整に届かない場面


LoRA(Low-Rank Adaptation、低ランク適応)は、LLMを追加学習するときに、元の重みには手を付けず、小さな「差分」だけを学習する手法です。2021年6月にHuらがarXivで公開した論文が出発点で、オープンウェイトのモデルを自社データで調整するときに広く使われています。
原論文は、GPT-3 175BをAdamで全パラメータ微調整する場合と比べて、学習するパラメータを約1万分の1、GPUメモリの必要量を約3分の1にできると報告しました。一方で2024年の比較研究は、プログラミングと数学の継続事前学習では、一般的な設定のLoRAが全パラメータの微調整を大きく下回ると報告しています。この記事では、この「軽いが、何でも覚えられるわけではない」という両面を、一次資料の数値で整理します。
LoRAの仕組み|更新分を2つの細い行列で表す
LLMの中には、巨大な行列(重み)が層ごとに並んでいます。普通の微調整では、この重みWそのものを更新します。LoRAの考え方は、更新後の重みを「元の重みW + 更新分ΔW」と分け、Wを凍結したまま、ΔWだけを学習することです。
このとき、ΔWをそのまま持つと元の行列と同じ大きさになってしまいます。そこでLoRAは、ΔWを細長い行列B(d×r)と横長の行列A(r×k)の積BAで表します。rはランクと呼ばれる小さな数で、8や16といった値がよく使われます。学習するのはAとBだけです。
| 例: 4096×4096の重み行列1つ | 学習する値の数 |
|---|---|
| 全パラメータの微調整 | 16,777,216 |
| LoRA(r=8) | 8×(4096+4096)=65,536(約0.39%) |
| LoRA(r=64) | 64×(4096+4096)=524,288(約3.1%) |
Hugging FaceのPEFTライブラリの説明では、学習開始時はAをランダムに、Bをゼロに初期化します(init_lora_weights=Trueの既定)。BAが最初はゼロなので、LoRAを付けた直後のモデルは元のモデルとまったく同じ出力を返し、学習が進むにつれて差分が育っていきます。差分には倍率s=lora_alpha/rが掛かり、use_rslora=Trueにするとs=lora_alpha/√rに変わります。
学習が終わったら、BAを元の重みに足し込めば(マージすれば)、通常のモデルと同じ形に戻ります。原論文が「アダプター方式と違い、推論時の遅延を追加しない」と主張しているのはこのためです。PEFTではmodel.merge_and_unload()がこの操作で、インプレースではないので戻り値を受け取る必要があります。
何が軽くなり、何は軽くならないか
LoRAで減るのは、主に「学習する値」と、それに付随するメモリです。Adamのような最適化手法は、学習する値ごとに勾配と状態を持つため、学習する値が1万分の1になれば、その分のメモリが大きく減ります。原論文のGPUメモリ約3分の1という数字はこの効果です。
一方で、ベースモデルの重み自体は学習中もGPUに載せておく必要があります。ここを減らしたのがQLoRAです。2023年5月公開の論文は、ベースモデルを4ビットに量子化して凍結し、その上にLoRAを載せる方法で、65Bのモデルを48GBのGPU1枚で、16ビットでの微調整と同等の性能を保ったまま学習できると報告しました。そのために、正規分布に従う重みに向く4ビットの型NF4(4-bit NormalFloat)、量子化定数をさらに量子化するDouble Quantization、メモリの急増を逃がすPaged Optimizersの3つを導入しています。
あわせて読みたい
量子化(quantization)とは|LLMを軽く・速く・安く動かすモデル圧縮の仕組み
計算量はメモリほどは減りません。Thinking Machinesの分析では、N×Nの行列1つあたりの順伝播と逆伝播の計算量は、全パラメータの微調整が3N²、LoRAが2N²+6NRで、LoRAは全パラメータ微調整の3分の2をわずかに上回る程度です(注意機構の計算は含まない試算)。凍結した重みについても、誤差を手前の層へ伝えるための計算は必要だからです。「学習が1万倍速くなる」わけではない点は押さえておきます。
全パラメータの微調整に届かない場面
LoRAの限界を体系的に調べたのが、2024年5月公開のBidermanらの論文「LoRA Learns Less and Forgets Less」(TMLR 2024年8月採録)です。プログラミングと数学の2領域で、約10万件の指示学習と、200億トークンの継続事前学習を比べました。
| 観点 | 論文の報告 |
|---|---|
| 対象領域の性能 | 標準的な低ランク設定では、LoRAは全パラメータの微調整を大きく下回る |
| 対象外の性能 | LoRAのほうがベースモデルの性能を保ちやすく、weight decayやdropoutより忘却を抑える |
| 出力の多様性 | LoRAのほうが多様な生成を保ちやすい |
| 差の原因の手がかり | 全パラメータの微調整が学ぶ更新は、典型的なLoRA設定の10倍から100倍のランクを持つ |
つまり、学習させる情報の量が、選んだランクで表せる容量を超える条件(新しい領域の大規模なコーパスでの継続事前学習など)では、標準的な低いランクのLoRAは全パラメータの微調整を下回ることがあります。一方で、対象外の能力を壊しにくいという利点は、学習データの量によらずLoRAを選ぶ理由になります。
Thinking Machinesの「LoRA Without Regret」(2025年9月29日)も、同じ方向の結果をより細かく報告しています。小中規模の指示学習・推論データセット(Tulu3、OpenThoughts3)では、ランクを十分に取ったLoRAは全パラメータの微調整と同じ学習曲線をたどり、容量を超えたところで低ランクのLoRAだけが離れていきます。損失が急に止まるのではなく、学習効率が落ちていく形です。
効かせるための設定|層・学習率・バッチサイズ
同じブログは、実務の設定に直結する知見をいくつか出しています。
- 掛ける層: 注意機構の行列だけに掛けたLoRAは、MLP層だけに掛けたLoRAを大きく下回りました。Llama-3.1-8Bでは、注意機構のみのランク256(約0.25Bパラメータ)が、MLPのみのランク128(約0.24B)に負けており、パラメータ数では説明できません。MoEモデルでも同じ傾向で、MLPに掛けた上に注意機構を足しても上積みはありませんでした。
- 学習率: 同社の実験はα=32、倍率α/r、既定の初期化という設定です。その条件で、最適な学習率は全パラメータ微調整の約10倍(当てはめた倍率は9.8)でした。100ステップ未満の短い学習では約15倍という予備的な結果もあります。1/rの倍率のおかげで、最適な学習率はランク4から512の間でも2倍未満しか変わりません。rsLoRA(α/√r)のように倍率の式を変えたり、初期化を変えたりした場合は、この10倍をそのまま当てはめず探索し直す必要があります。
- バッチサイズ: LoRAは大きなバッチサイズへの耐性が全パラメータ微調整より低く、バッチを大きくするほど差が開きます。
- 強化学習: 方策勾配法の強化学習では、ランク1のLoRAでも全パラメータの微調整と同等でした。1エピソードから得る情報量が小さいため、少ない容量で足りるという説明です。
PEFTで書く場合、MLPを含むすべての線形層に掛けるにはtarget_modules="all-linear"を指定します(出力層は除外されます)。QLoRAの論文も全線形層に掛ける構成をとっています。ただし対象になるのは線形層(LinearとConv1D)として実装されたモジュールです。MoEモデルでエキスパートの重みがnn.Parameterとして実装されている場合、PEFTのドキュメントはtarget_parametersで別途指定する方法を案内しています。使うモデルの実装を確かめ、エキスパートに掛かっているかを学習前に確認してください。古い解説記事にあるtarget_modules=["q_proj", "v_proj"]のような注意機構だけの設定は、上の結果からすると最初の選択としては勧めにくくなっています。
ヒント
あわせて読みたい
LLMアプリの評価(eval)の作り方|「動いた気がする」で止めないための実務手順
業務で使うときの判断ポイント
LoRAを検討しやすいのは、社内の文書形式に合わせた出力、決まった分類や抽出のやり方、特定の口調など、学習データが比較的少なくて済む用途です。学習させる量が大きくなるほど、ランクの容量を超えて全パラメータの微調整との差が出やすくなります。これとは別の理由で、社内規程や製品情報のように頻繁に変わる情報は、学習させるより先にRAGで外から渡す方法を検討します。情報が変わるたびに学習し直す負担がかかり、どの版の情報で答えたかも追いにくいからです。
あわせて読みたい
ファインチューニングとRAGの使い分け|LLMをカスタマイズする2つの道の選び方
運用面では、アダプターが小さいことが効きます。ベースモデル1つの上に、部署やタスクごとのアダプターを切り替えて使えます。PEFTではload_adapterで複数のアダプターを読み込み、set_adapterで切り替えられ、推論時にはgenerate(..., adapter_names=[...])でバッチ内のサンプルごとに別のアダプターを当てることもできます(DoRAやマージ済みのアダプターでは使えません)。マージせずに切り替える運用では、マージしたときのような「追加の遅延なし」にはならない点は見込んでおきます。
量子化したベースモデルにマージする場合は、PEFTのドキュメントが注意を書いています。マージ時にベースの重みが再量子化されるため、マージの取り消しは厳密には元に戻らず、マージと取り消しを繰り返すと丸め誤差が積み重なります。本番に出す重みは、量子化前のベースにマージしてから量子化し直すか、アダプターを分けたまま配る、のどちらにするかを決めておくと手戻りが減ります。
注意
あわせて読みたい
Mistral Large 4がオープンウェイトに|「Model-as-a-Service」条項を読み、自社運用・製品組み込み・API利用の線引きを確かめる
よくある質問
LoRAとファインチューニングは別物ですか
LoRAを使うと推論が遅くなりますか
ランクはいくつにすればよいですか
注意機構(q_proj、v_proj)だけに掛ければ十分ですか
社内の最新情報をLoRAで覚えさせるのは有効ですか
まとめ
LoRAで追加学習する前に確認すること
- 覚えさせたいのが「やり方」か「知識」かを切り分け、知識ならRAGを先に検討した
- 評価セットを作り、対象タスクの改善と対象外タスクの劣化の両方を測る準備をした
- 掛ける層をMLPを含む全線形層(all-linear)から始め、MoEならエキスパートに掛かっているか確認した
- 学習率は同等の設定(α/rの倍率)なら全パラメータ微調整の約10倍を探索の起点にし、数通り振って決める計画にした
- マージするか、アダプターを分けて配るかを決め、量子化ベースへのマージの丸め誤差を確認した
- ベースモデルのライセンスで、派生物やアダプターを社外に出す条件を確認した
LoRAは「巨大な重みの更新を、低いランクの差分で近似する」というひとつの仮定で、追加学習のメモリと保存の負担を大きく下げた手法です。ただし学習させる量がランクの容量を超えると、全パラメータの微調整に届かなくなります。軽さに頼る前に、何をどれだけ覚えさせたいのかを決め、評価セットで改善と劣化を両方測る。この順番を守れば、LoRAは小さなチームでも扱える現実的な選択肢になります。
出典・参考
- LoRA: Low-Rank Adaptation of Large Language Models(arXiv:2106.09685、Hu et al.、2021)
- QLoRA: Efficient Finetuning of Quantized LLMs(arXiv:2305.14314、Dettmers et al.、2023)
- LoRA Learns Less and Forgets Less(arXiv:2405.09673、Biderman et al.、TMLR 2024)
- LoRA Without Regret(Thinking Machines Lab、2025-09-29)
- LoRA - PEFT documentation(Hugging Face)
関連する記事
ファインチューニングとRAGの使い分け|LLMをカスタマイズする2つの道の選び方
LLMを自社用途に寄せる方法には、プロンプト、RAG、ファインチューニングの階層があります。RAGとファインチューニングはそれぞれ何を得意とし、どこで選ぶべきか。知識の更新性、出力の安定性、コストとトラフィックの観点から使い分けの原則を整理し、実務で有効なハイブリッド構成と落とし穴まで、公式ドキュメントを確認しながら冷静にまとめます。
量子化(quantization)とは|LLMを軽く・速く・安く動かすモデル圧縮の仕組み
量子化はモデルの重みや活性の数値精度を下げてメモリと計算を節約する技術です。FP16からINT8/INT4への圧縮の狙い、GGUF・GPTQ・AWQ・NF4といった方式、PTQとQATの違い、VRAM見積りと実務での選び方を、優劣を断定せず実証的に整理します。
知識蒸留(distillation)とは|大きな教師モデルの知識を小さな生徒モデルへ移す仕組み
知識蒸留は大きな教師モデルの振る舞いを小さな生徒モデルに真似させて学習させる技術です。原典のsoft targetとtemperature、量子化やMoEとの違い、現代LLMでのデータ蒸留、教師の質が上限になる勘所、商用APIの出力を学習に使う際の規約上の注意まで、優劣を断定せず整理します。


