LoRAとは?ファインチューニングとRAGの使い分けを判断する
LoRA(低ランク適応)の仕組みを実際のモデルのパラメータ数で確認し、プロンプト改善・RAG・追加学習のどれで何が直るかを判断表と手順で整理。画像生成のLoRAや通信のLoRaとの違いも解説します。
LoRA(ローラ、Low-Rank Adaptation)とは、学習済みモデルの重みは固定したまま、層ごとに小さな行列の組を追加し、その追加分だけを学習するファインチューニングの手法です。モデル全体を学習し直すのに比べて、学習する数値の量と必要なGPUメモリが桁違いに小さくなり、成果物も元のモデルに重ねる「差分ファイル」になります。
社内でLLMの精度に不満が出たとき、候補になるのはプロンプトの改善、RAG(社内文書を検索して渡す構成)、そしてLoRAのような追加学習です。3つは直せる問題の種類が違い、選び間違えると費用をかけても改善しません。ここでは、LoRAの仕組みを実際のモデルの数値で確かめたうえで、どの問題にどれを使うかの判断手順をまとめます。
この記事でわかること
- ファインチューニングで変わるもの・変わらないものと、全体学習が重い理由
- LoRAの仕組み(差分を2つの細長い行列で表す)と、実際に学習するパラメータ数
- アダプター、マージ、QLoRAなど、導入時に出てくる用語の実体
- プロンプト・RAG・LoRAを使い分ける判断表と、試す順番
- 画像生成のLoRA、通信規格のLoRaとの違い
ファインチューニングとは:重みを追加学習して「振る舞い」を変える
ファインチューニングは、学習済みのLLMに自社で用意した入力と正解の組を追加で学習させ、重みそのものを書き換える作業です。全部の重みを更新する方法(フルファインチューニング)は効果が大きい反面、学習中に重みの勾配と最適化の途中状態も保持するため、必要なメモリが推論の何倍にもなります。計算例として、単純にfp32で広く使われるAdamという最適化手法を使う場合、1パラメータあたり重み・勾配・2種類の途中状態で16バイトかかり、パラメータ数約4.9億の小型モデルでも約7.9GB、70億パラメータ級なら100GBを超えます。
何を変えられるかも押さえておく必要があります。追加学習が得意なのは、出力の形式、文体、分類の基準、社内独自の書式に沿った文章といった「振る舞い」です。一方で、新しい事実を覚えさせる用途には向きません。学習させた事実を正確に引き出せる保証はなく、規程が改定されるたびに学習をやり直す必要があり、どの文書を根拠に答えたかも示せないためです。
LoRAの仕組み:差分を2つの細長い行列で表す
LLMの各層には、入力に掛け算をする大きな行列(重み W)があります。追加学習はこの W を少し変えることですが、LoRAは変化分 ΔW を直接学習せず、縦長の行列 B と横長の行列 A の積 B × A で表します。W が896行×896列なら、B は896×r、A は r×896 で、r(ランク)は8や16のような小さな数です。推論時の計算は「元の出力+(alpha÷r)×B×A を通した出力」で、学習するのは A と B だけです。B は0で初期化されるため、学習開始時点のモデルは元のモデルとまったく同じ振る舞いをします。
この方法は2021年にMicrosoftの研究者らが論文で提案したもので、「追加学習で必要になる重みの変化は、低いランクの行列で十分に近似できる」という考え方に立っています。どれだけ数値が減るかを、Qwen2.5-0.5B-Instruct(隠れ次元896、24層)の設定で、PEFTライブラリ(0.21.0)に実際に数えさせた結果が次の表です。
| 設定 | 対象の層 | 学習するパラメータ数 | モデル全体(約4.9億)に対する割合 |
|---|---|---|---|
| r=8 | q_proj・v_proj(注意機構の一部) | 540,672 | 0.109% |
| r=16 | 注意機構の4つ(q/k/v/o_proj) | 2,162,688 | 0.438% |
| r=16 | 注意機構+MLPの全線形層(7種類) | 8,798,208 | 1.781% |
1行目は手計算でも確かめられます。q_proj は896×896なので r=8 の追加分は8×(896+896)=14,336個、v_proj は896×128(このモデルはキーとバリューの次元を小さくしている)なので8×(896+128)=8,192個で、1層あたり22,528個、24層で540,672個です。元の q_proj 1つだけで802,816個あることと比べると、学習対象の小ささが分かります。
| 設定項目 | 意味 | 始めるときの例 |
|---|---|---|
r(ランク) | 追加する行列の細さ。大きいほど表現力が上がり、学習する数値も増える | 8〜16 |
lora_alpha | 追加分の効き具合の倍率(実際には alpha÷r が掛かる) | rの2倍 |
target_modules | LoRAを付ける層 | 最初は全線形層、効果を見て絞る |
lora_dropout | 過学習を抑えるため、学習中に一部を無視する割合 | 0〜0.1 |
表の「例」は出発点で、正解はデータとモデルで変わります。評価セットで比べながら、効果が頭打ちならrを下げてファイルと学習時間を減らし、足りなければ対象の層を増やす、という順で調整します。
成果物とQLoRA:アダプター、マージ、4ビット学習
LoRAの学習結果は、設定を書いた adapter_config.json と、A・B の値を保存した adapter_model.safetensors の2ファイル(アダプター)です。上の表の3行目なら、8,798,208個をfp32で保存して約35MB、bf16なら約18MBの計算で、元のモデルの重みファイル(Qwen2.5-0.5B-Instructは約988MB)の2〜4%程度です。アダプターは必ず学習に使ったのと同じベースモデルに重ねて使います。
- 重ねて使う:推論時にベースモデルとアダプターを両方読み込む。用途ごとにアダプターを切り替えられ、Ollamaでは Modelfile の
FROMにベースモデル、ADAPTERにアダプターを書く - マージする:
ΔW=B×Aを元の重みに足し込んで普通のモデルにする。PEFTではmerge_and_unload()を使う。推論が速く扱いも単純になるが、アダプターの切り替えはできなくなる - QLoRA:ベースモデルを4ビット(NF4という形式)に量子化して読み込み、固定したままLoRA部分だけを学習する方法。学習時のGPUメモリをさらに減らせる。学習後のアダプターは通常の手順で使える
学習データに入れた情報は、モデルの重みに溶け込み、利用者の権限で出し分けることができません。人事評価や顧客の個人情報を含むデータで学習すると、そのモデルを使える全員が質問の仕方次第で断片を引き出せる可能性があります。権限で見せる範囲を変えるべき情報は、学習ではなくRAG側で扱ってください。
プロンプト・RAG・LoRAの違い
3つの手段は、LLMのどこに手を入れるかが違います。情シスが判断に使う観点で並べると次のとおりです。
| 観点 | プロンプトの改善 | RAG | LoRA(追加学習) |
|---|---|---|---|
| 手を入れる場所 | 毎回渡す指示文 | 毎回渡す参考資料(検索結果) | モデルの重み(差分) |
| 直せる問題 | 指示のあいまいさ、出力形式の揺れ | 社内情報を知らない、情報が古い | 形式・文体・分類基準が指示では安定しない |
| 情報の更新 | 文面を直せば即時 | 文書を入れ替えれば即時 | 学習をやり直す |
| 回答の根拠の提示 | できない | 検索した文書を示せる | できない |
| 閲覧権限の反映 | できない | 検索時のフィルタで反映できる | できない |
| 準備するもの | 評価セット | 文書、検索基盤、評価セット | 正解付きの学習データ、GPU、評価セット |
| 失敗の仕方 | 境界のケースで揺れる | 検索で外すと的外れな回答 | 学習データに偏ると他の能力が落ちる |
表から分かるとおり、「社内規程に答えさせたい」「最新の手順書を反映したい」はRAGの領分で、LoRAでは解決しません。LoRAが効くのは、プロンプトで何度直しても出力の形や判断基準がそろわない場合、または大きなモデルでならできる作業を小さなモデルでも安定してこなせるようにしたい場合です。後者は、社内のGPUで動く小型モデルで費用や応答時間を下げたいときの選択肢になります。
判断の手順:どれから試すか
精度の相談を受けたら、次の順に試すと無駄が出ません。各段階で同じ評価セット(正解付きの入力20〜30件程度)を使い、数字で次に進むかを決めます。
- プロンプトと出力形式を直す。判断基準と例外時の出口を書き、評価セットで正解数を測る
- 誤りの原因が「知らない情報」なら、RAGで資料を渡す。検索結果に正解の根拠が入っているかを先に確認する
- 資料も渡しているのに、形式や分類の基準がそろわないなら、LoRAを検討する。学習用データは評価セットとは別に用意する
- 両方の問題があるなら組み合わせる。LoRAで出力の形や判断の癖を整え、事実はRAGで渡す
例えば、問い合わせメールを「障害・依頼・質問・対応不要」に分けたいのに、小型モデルではどう書き直しても特定のラベルに偏る、という状況は3段目の候補です。一方、「VPNの接続手順を答えさせたい」は2段目で解決すべき問題で、手順書でLoRAを学習させても、改定のたびに作り直しになります。プロンプトの改善と評価の進め方はプロンプトエンジニアリング実践で、RAGの設計はRAGとは?で扱っています。
LoRAを試す前に確認すること
- データの形式と量:入力と望ましい出力の組を、本番と同じ形式(チャット形式ならメッセージの配列)で用意する。境界のケースが含まれているかを、件数より先に確認する
- 評価の分離:学習データと評価セットに同じ例を入れない。混ざると、覚えた答えを採点することになり、実力以上の数字が出る
- ベースモデルのライセンス:派生モデルの配布や商用利用に条件が付いているものがある。同じ系列でもサイズで条件が違うことがあるため、使うモデルごとに確認する(今回数えたQwen2.5-0.5B-InstructはGGUFのメタデータでapache-2.0と確認)
- 版の固定:アダプターは特定のベースモデルの重みに対する差分なので、ベースモデルが更新されたら学習し直す前提で管理する
- 劣化の確認:狙った作業の精度だけでなく、元々できていた一般的な作業(要約や言い換え)が落ちていないかも測る
学習中の損失(loss)が下がり続けるのは、学習データを覚えている証拠にすぎません。評価セットの正解数が途中から下がり始めたら過学習です。学習の途中経過を保存しておき、評価セットで最も良かった時点のアダプターを採用してください。
画像生成のLoRAと、通信規格のLoRa
画像生成の分野で「LoRA」と呼ばれているものも、同じ手法を画像生成モデルに使ったものです。特定の画風や人物、キャラクターの特徴をアダプターとして学習させ、数MB〜数百MB程度の .safetensors ファイルとして配布されることが多く、使うときは学習時と同じ系列のベースモデルに重ねます。LLMと同様、ベースモデルが違うアダプターは使えません。
綴りの最後が小文字の「LoRa」はまったく別物で、少ない電力で長距離の無線通信を行うLPWA(省電力広域通信)の規格です。検索結果に混ざることが多いので、社内で話題にするときは「ローラ(AIの追加学習)」と「ローラ(IoT向け無線)」を区別しておくと話が早く進みます。
よくある質問
LoRAファイルとは何ですか?
LoRAで学習した差分(行列 A と B の値)を保存したファイルで、LLMでは adapter_model.safetensors と設定の adapter_config.json の組が一般的です。単体では動かず、学習時と同じベースモデルに重ねるか、ベースモデルにマージして使います。サイズは元のモデルの数%以下です。
LoRAは違法ですか?
手法自体に違法性はありません。問題になるのは学習データと使い方で、他人の著作物や人物の写真で学習して特定の作品や本人に似せた出力を作ると、著作権や肖像権の侵害になりうると指摘されています。日本の著作権法とAIの関係は文化庁が考え方を公表しているので、業務で使う前に確認してください。
LoRAの料金はいくらですか?
LoRAは手法の名前なので、利用料はかかりません。費用になるのは学習に使うGPUの時間と、クラウドの追加学習サービスを使う場合のその料金です。社内GPUで小型モデルに対して行えば電気代程度で済み、クラウドの料金体系は事業者ごとに異なるため、執筆時点の各社の価格表で確認してください。
LoRaとはどういう通信ですか?
AIのLoRAとは無関係の、IoT向けの無線通信規格です。通信速度は低い一方、少ない電力で数kmの距離を届けられるのが特徴で、センサーの値を定期的に送るような用途に使われます。日本では920MHz帯を使います。
まとめ
LoRAは、重みを固定したまま細い行列の組だけを学習する方法で、Qwen2.5-0.5Bでは全線形層に付けても学習対象は全体の1.8%でした。直せるのは形式・文体・判断基準のような振る舞いで、社内の事実や最新の手順を答えさせたいならRAGが先です。プロンプト、RAG、LoRAの順に、同じ評価セットで効果を測りながら進めてください。
次に読む
- RAGとは?仕組みと社内導入で失敗しない設計原則:事実を渡す側の設計と、よくある失敗
- プロンプトエンジニアリング実践:LoRAの前に試すプロンプトの改善と評価セットの作り方
- Qdrantで始めるベクトル検索:RAGの検索部分を自分で組むときの手順