LoRAとは──元の重みを凍結し、小さな行列2つだけを学習する仕組み。原論文はGPT-3 175Bで「学習パラメータ1万分の1・GPUメモリ3分の1」、QLoRAは「65Bを48GB未満」。画像生成での使われ方と作り方の流れ
LoRA(Low-Rank Adaptation)は、巨大なモデルの重みを凍結したまま、低ランクの小さな行列2つ(AとB)だけを学習する手法。原論文(Hu et al., 2021)はGPT-3 175Bで学習パラメータを1万分の1、GPUメモリを3分の1に減らせると書く。4bit量子化と組み合わせたQLoRAは、65Bモデルの学習に要るGPUメモリを780GB超から48GB未満にしたと報告する。この記事は、原論文・QLoRA論文・Hugging FaceのPEFTとdiffusersの公式ドキュメントを2026年10月2日に自分で開き、仕組み、画像生成での使われ方、作り方の流れ、ダウンロードして使う時の注意を整理する。

目次
2026年10月2日・日本時間時点の情報です。 LoRA(ローラ)は Low-Rank Adaptation の略で、巨大なAIモデルを追加学習させる時に、元の重みには手を付けず、小さな行列2つだけを新しく学習する手法です。Stable Diffusion系の画像生成で「キャラクターや画風を足すファイル」として配られているものも、大規模言語モデル(LLM)を用途に合わせて調整する時に使われるものも、同じ仕組みです。以下は、原論文・QLoRA論文・Hugging Faceの公式ドキュメント(PEFTとdiffusers)を筆者が10月2日に開いて確かめた範囲の整理です。なお、表記の似た「LoRa」(最後のaが小文字)は、Semtech社がIoT向けの無線通信として説明している別の技術で、この記事の対象ではありません。
3行まとめ
- LoRAは「元の重みW0を凍結し、低ランクの行列AとBだけを学習する」手法。 原論文(Hu et al.)は、GPT-3 175Bで学習パラメータを1万分の1、GPUメモリを3分の1に減らせると書く。
- QLoRAは凍結した元モデルを4bitに量子化してLoRAを学習する方法。 QLoRA論文は、65Bモデルの学習に要るGPUメモリを780GB超から48GB未満にしたと報告する。
- 画像生成ではdiffusersの公式スクリプト(train_text_to_image_lora.py)が、LoRAの重みを
pytorch_lora_weights.safetensorsとして出力する。 Hugging Face Hubには、筆者が2026年10月2日11時すぎに数えた時点で、loraタグが付いたモデルが136,650件あった。
| 項目 | 内容(出どころ) |
|---|---|
| 原論文 | 「LoRA: Low-Rank Adaptation of Large Language Models」(Hu et al.、arXiv 2106.09685) |
| 原論文の削減幅(GPT-3 175B) | 学習パラメータ 1万分の1、GPUメモリ 3分の1(abstract) |
| 4bit版 | QLoRA(arXiv 2305.14314)。65Bを48GBのGPU1枚で学習 |
| Hubのloraタグ付きモデル数 | 136,650件(筆者が2026年10月2日11時06分に取得) |
LoRAとは何か:「差分」を小さな行列2つで持つ
大きなモデルを追加学習する普通のやり方(フルファインチューニング)は、すべての重みを更新します。原論文のabstractは、その代わりに次の方法を提案しています。
We propose Low-Rank Adaptation, or LoRA, which freezes the pre-trained model weights and injects trainable rank decomposition matrices into each layer of the Transformer architecture, greatly reducing the number of trainable parameters for downstream tasks.
(訳)我々はLow-Rank Adaptation、すなわちLoRAを提案する。事前学習済みモデルの重みを凍結し、Transformerの各層に、学習可能な階数分解行列を挿入することで、下流タスクで学習するパラメータ数を大きく減らす。
論文の本文(HTML版)は、事前学習済みの重み行列 W0(d×k)の更新を W0 + ΔW = W0 + BA と表します。B は d×r、A は r×k で、ランク r は min(d, k) よりずっと小さく、学習中 W0 は凍結されてAとBだけが学習されます。初期化は「We use a random Gaussian initialization for A and zero for B, so ΔW = BA is zero at the beginning of training」(訳:Aにはランダムなガウス分布、Bにはゼロを使うので、学習開始時点ではΔW=BAはゼロになる)。つまり学習の最初は元のモデルと同じ出力で、そこから「差分」だけがずれていきます。
式を使わずに言い換えると、「大きな表(W0)は触らず、横長と縦長の細い表2枚(AとB)の掛け算で、足したい変化だけを表す」ということです。細い表を何列にするか(r)が「ランク」で、大きいほど学習する数が増えます。
なぜ軽いのか:4096×4096の行列で数えてみた
筆者は、4096×4096の重み行列1枚にLoRAを付けた時の学習パラメータ数を手元のPythonで計算しました。Bが d×r、Aが r×k なので、LoRAで学習する数は r×(d+k) です。
| ランク r | LoRAの学習パラメータ数 r×(d+k) | 元の行列(4096×4096 = 16,777,216)に対する比率 |
|---|---|---|
| 4 | 32,768 | 約0.195%(512分の1) |
| 8 | 65,536 | 約0.391%(256分の1) |
| 16 | 131,072 | 約0.781%(128分の1) |
これは行列1枚だけの算数で、特定のモデルの構成ではありません。モデル全体では「どの行列にLoRAを付けるか」で比率が変わります。原論文のabstractは、GPT-3 175Bについて次のように書いています。
Compared to GPT-3 175B fine-tuned with Adam, LoRA can reduce the number of trainable parameters by 10,000 times and the GPU memory requirement by 3 times.
(訳)Adamでファインチューニングした GPT-3 175Bと比べて、LoRAは学習可能なパラメータ数を1万分の1、GPUメモリの要求量を3分の1に減らせる。
本文では、GPT-3 175Bの学習時のVRAM消費が「1.2TBから350GBに」減り、ランク r=4 でクエリとバリューの射影行列だけにLoRAを付けるとチェックポイントは「350GBから35MB」になる、と書かれています。理由は、凍結した重みの分だけオプティマイザの状態(Adamが持つ補助変数)を持たなくてよくなるから、と論文は説明しています。
品質については、abstractが「LoRA performs on-par or better than fine-tuning in model quality on RoBERTa, DeBERTa, GPT-2, and GPT-3」(訳:RoBERTa・DeBERTa・GPT-2・GPT-3で、品質はファインチューニングと同等かそれ以上)と書きます。論文が試したモデルとタスクの範囲の記述です。推論時の遅延は「unlike adapters, no additional inference latency」(アダプタと違い、推論時の遅延が増えない)とされています。
画像生成のLoRAは何をするものか
Stable Diffusionなどの画像生成モデルで「LoRAを使う」とは、ベースモデルはそのままに、特定のキャラクターや画風などを追加で学習した小さな差分ファイルを読み込むことです。PEFTの概念ガイドは、原論文は言語モデルが対象だったが、全結合層(dense layers)ならどこにでも使えるので拡散モデルにも使える、と説明しています。
diffusersの公式ドキュメントは、LoRAでの学習は速くメモリ効率がよく、「produces smaller model weights (a few hundred MBs), which are easier to store and share」(保存や共有が楽な、数百MBの小さい重みができる)と紹介しています。読み込みは、パイプラインを作ったあとに load_lora_weights を呼びます。
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16).to("cuda")
pipeline.load_lora_weights("path/to/lora/model", weight_name="pytorch_lora_weights.safetensors")
image = pipeline("A naruto with blue eyes").images[0]
(diffusers公式ドキュメント「LoRA」の推論例。"cuda" は "mps"、"xpu"、"cpu" も可と同ページにあります。)複数のLoRAを同時に使う時は set_adapters で名前と重みを指定する、とLoRAローダーのAPIページにあります。
注意点として、配られているLoRAファイルは、学習に使われたツールによって形式が異なることがあります。LoRAローダーのAPIページは「We support loading A1111 formatted LoRA checkpoints in a limited capacity. This function is experimental and might change in the future.」と書きます(訳:A1111形式のLoRAチェックポイントの読み込みは限定的に対応している。この機能は実験的で、将来変わるかもしれない)。AUTOMATIC1111のWebUIやComfyUIで使う手順は、それぞれのツールの説明が出どころになります。環境づくりはStable Diffusion ローカル導入ガイドとローカルAIの画像生成は単体グラボなしでも動くのかで扱っています。
LLMのLoRAとQLoRA:4bitにして、その上にLoRAを載せる
LLMのファインチューニングでもLoRAは使われ、Hugging FaceのPEFTライブラリが実装しています。費用や手法の選び方はファインチューニング やり方・費用・いつ使うべきかにまとめてあります。QLoRA論文のabstractは次のように書きます。
We present QLoRA, an efficient finetuning approach that reduces memory usage enough to finetune a 65B parameter model on a single 48GB GPU while preserving full 16-bit finetuning task performance. QLoRA backpropagates gradients through a frozen, 4-bit quantized pretrained language model into Low Rank Adapters (LoRA).
(訳)QLoRAは、16bitのフルファインチューニングのタスク性能を保ったまま、65Bパラメータのモデルを48GBのGPU1枚でファインチューニングできるほどメモリ使用量を減らす手法。凍結した4bit量子化済みの事前学習モデルを通して、勾配を低ランクアダプタ(LoRA)に逆伝播する。
本文の冒頭では、65Bモデルの学習に要る平均メモリを「>780GB」から「<48GB」に減らし、16bitのフルファインチューニングと比べて実行時間も予測性能も落としていない、と書かれています。メモリを減らす工夫は、abstractによると次の3つです。
| 工夫 | 論文の説明 |
|---|---|
| 4-bit NormalFloat(NF4) | 正規分布に従う重み向けの新しいデータ型。論文は「information theoretically optimal」(情報理論の意味で最適)と書く |
| Double Quantization | 量子化定数そのものを量子化して、平均のメモリ使用量を減らす |
| Paged Optimizers | メモリの急増(スパイク)を管理する |
論文はこの方法で作ったモデル群「Guanaco」について、Vicunaベンチマークで「reaching 99.3% of the performance level of ChatGPT while only requiring 24 hours of finetuning on a single GPU」と書いています(訳:1台のGPUで24時間のファインチューニングだけで、ChatGPTの性能の99.3%に到達)。ただし同じabstractの後半で、論文自身が「current chatbot benchmarks are not trustworthy to accurately evaluate the performance levels of chatbots」(訳:現行のチャットボット向けベンチマークは、性能を正確に評価するには信頼できない)とも述べているので、この99.3%は「そのベンチマークでの数字」として読む必要があります。
作り方の流れ:公式のスクリプトの範囲で
公式ドキュメントに書かれている範囲の流れです。実行前に公式ページを開いてください(どちらも開発版 main のドキュメントです。末尾の注記を参照)。
画像生成のLoRA(diffusers)
diffusersの学習ガイドが扱うのは train_text_to_image_lora.py です。公式の手順は、ライブラリをソースからインストールし、examples/text_to_image で pip install -r requirements.txt、accelerate config を実行し、accelerate launch train_text_to_image_lora.py を呼ぶ流れです。LoRA固有の引数として、ガイドは --rank(低ランク行列の内側の次元。大きいほど学習パラメータが増える)と --learning_rate(既定は1e-4。「with LoRA, you can use a higher learning rate」=LoRAでは高めの学習率を使える)を挙げています。
ガイドの例は lambdalabs/naruto-blip-captions のデータセットでNaruto風のキャラクターを生成できるように学習するもので、所要時間についてガイドは「A full training run takes ~5 hours on a 2080 Ti GPU with 11GB of VRAM.」(2080 Ti・VRAM 11GBで、学習を最後まで回すと約5時間)と書いています。これは公式ガイドの記載で、筆者が測った時間ではありません。学習済みのLoRAの重みは pytorch_lora_weights.safetensors として出力されます。
LLMのLoRA・QLoRA(PEFT)
PEFTの概念ガイドは流れを4段階で書いています。①ベースモデルを用意する、②LoraConfig(ランク r、LoRAを付ける target_modules、スケーリング係数 lora_alpha など)を作る、③get_peft_model() でベースモデルを包む、④普通のモデルと同じように学習する。QLoRAにする時は、PEFTの量子化ガイドの例のとおり、①で BitsAndBytesConfig(load_in_4bit=True、bnb_4bit_quant_type="nf4" など)を渡して4bitで読み込み、prepare_model_for_kbit_training() を呼んでから②③に進みます。学習後に1つのモデルにまとめたい時は merge_and_unload() を使う、とPEFTのガイドにあります。
ダウンロードして使う時の注意:Hubには13万件超あり、ライセンスは1件ずつ確かめる
筆者は2026年10月2日11時06分に、Hugging Faceのモデル一覧ページ(https://huggingface.co/models?other=lora)をcurlで取得し、ページに埋め込まれた総数(numTotalItems)が「136650」であることを確かめました。取得したHub APIのレスポンスには総数を示すヘッダ(X-Total-Count)が無かったので、API(https://huggingface.co/api/models?filter=lora&limit=1000)を Link: rel="next" で最後まで辿って数え直すと、137ページ・136,650件で一致しました(11時06分から11時08分にかけて実行)。このタグは画像生成用にもテキスト生成用にも付いていて(APIを用途別に絞ると両方が返りました)、規模の目安にはなりますが、安全性や品質を表す数字ではありません。
ダウンロードして使う前に、少なくとも次の2つは1件ごとに確認してください。
- ライセンス。 LoRAはベースモデルと組み合わせて使う差分なので、LoRA自体のライセンスに加えて、ベースモデルの規約も確かめる必要があります。筆者が最初に取得した1件のAPI結果には
license:otherのタグが付いていました。この「other」の意味は推測せず、そのモデルのページとベースモデルの規約を読んでください。商用利用や再配布の可否はそこが答えです。 - 実在の人物・既存のキャラクターを学習したものかどうか。 特定の人物の顔や既存作品のキャラクターを学習したLoRAは、肖像やパブリシティ、著作権の問題が生じる可能性があります。日本の法律上の整理はAI画像生成と著作権──日本の法律はどうなっている?にまとめてあります。この記事は法的な判断をするものではありません。
LoRAの限界と、この記事が確かめていないこと
- LoRAは万能ではない。 原論文は、試したモデル(RoBERTa・DeBERTa・GPT-2・GPT-3)とタスクでの比較結果を示しており、それ以外のモデル・用途で常に同等になるとは書いていません。
- 派生手法が多い。 PEFTのドキュメントの目次には、DoRA、AdaLoRA、LoHa、LoKrなど多数の手法が並びます。最近の派生はPEFTライブラリに3つの新しいLoRA派生手法、LoRAを切り替える応用はMacaron-V1やMixture-of-LoRA Harnessで扱っています。
- 筆者は学習そのものを実行していない。 4096×4096の計算とHub件数の取得は自分で実行しましたが、diffusersやQLoRAの学習は走らせていません。PEFTはこのMacに入っていなかったため、ライブラリを動かした確認もしていません。
LoRA・QLoRAの論文とHugging Faceの文書
2026年10月2日11時すぎに、LoRA原論文(arXiv 2106.09685)とQLoRA論文(arXiv 2305.14314)のabstractとHTML版、Hugging FaceのPEFT(LoRAの概念ガイド・量子化ガイド)とdiffusers(LoRA学習ガイド・LoRAローダーAPI)のドキュメント、Hubのloraタグのモデル一覧を筆者のMacからcurlで取得し、数字と引用を原文で確かめました。各ページのURLは出典欄にあります。
PEFT・diffusersのページは、いずれもソースからのインストールを前提にした main(開発版)のドキュメントで、各ページの上部にそう表示されています。pipで入る安定版は、取得時点の表示で PEFT が v0.21.0、diffusers が v0.40.0 です。diffusersのLoRA学習ガイドは冒頭で「This is experimental and the API may change in the future.」(実験的で、APIは将来変わるかもしれない)とも書いています。実行する時は、その時点の公式ページで確かめてください。
出典・参照資料
- 一次資料LoRA: Low-Rank Adaptation of Large Language Models(arXiv 2106.09685・abstractページとHTML版・2026年10月2日11時すぎ取得) ↗
- 一次資料LoRA(arXiv 2106.09685 HTML版・式(3)・初期化・1.2TBから350GB・35MBの記述) ↗
- 一次資料QLoRA: Efficient Finetuning of Quantized LLMs(arXiv 2305.14314・abstractとHTML版・2026年10月2日取得) ↗
- 一次資料PEFT documentation: LoRA(概念ガイド・LoraConfigのパラメータ・merge_and_unload・mainの開発版ドキュメント・2026年10月2日取得) ↗
- 一次資料PEFT documentation: Quantization(QLoRAのBitsAndBytesConfig設定例・mainの開発版ドキュメント・2026年10月2日取得) ↗
- 一次資料Diffusers documentation: LoRA(train_text_to_image_lora.py・--rank・出力ファイル・読み込み・mainの開発版ドキュメント・2026年10月2日取得) ↗
- 一次資料Diffusers documentation: LoRA loaders API(load_lora_weights・set_adapters・A1111形式の注記・mainの開発版ドキュメント・2026年10月2日取得) ↗
- 一次資料Hugging Face Hub: loraタグのモデル一覧(numTotalItems・2026年10月2日11時06分取得)/Hub API(filter=lora) ↗
- 一次資料Semtech: What is LoRa?(IoT向け無線通信LoRaの説明・表記の区別のため・2026年10月2日11時14分取得) ↗
大きいニュースはYouTubeでも解説しています。Xでは新着記事をお知らせしています。
コメント
まだコメントはありません。最初のコメントを書いてみませんか?
AIについて聞きたいことはありますか?
質問箱で無料で受け付けています。回答は公開され、他の方の参考にもなります。
質問箱を見る →