AI

PEFTとLoRAの違いとは?仕組み・使い方・QLoRA/DoRAとの比較を実装例つきで解説

「PEFT」と「LoRA」は生成AIのファインチューニング記事で並べて書かれることが多く、同じものか別物か迷いやすい用語です。結論から言うと、PEFT(Parameter-Efficient Fine-Tuning)は少ないパラメータだけを更新して大規模モデルを微調整する手法群の総称で、LoRA(Low-Rank Adaptation)はその中で最も広く使われる代表的な一手法です。両者は対立概念ではなく「PEFTという分類の中にLoRAがある」という包含関係にあります。この記事では、両者の関係、LoRAの仕組み、Hugging Faceのpeftライブラリでの実装手順、フルファインチューニングやSFTとの違い、QLoRA・DoRAなど派生手法の使い分けまでを、実装例と数値を交えて整理します。

目次

まとめ:PEFTとLoRAの関係と使い分け早見

細部に入る前に要点を先に示します。PEFTは省パラメータ微調整の総称、LoRAはその代表手法、QLoRAとDoRAはLoRAを土台にした改良版です。

  • PEFT:事前学習済みの重みを凍結し、追加した少数のパラメータだけを学習する手法の総称。Hugging FaceのpeftライブラリがLoRAやQLoRAなどをまとめて実装している。
  • LoRA:重みの更新量を低ランク行列の積(ΔW=BA)で近似し、学習対象を大幅に削減するPEFTの代表手法。
  • QLoRA:ベースモデルを4bitに量子化してVRAMを節約し、その上にLoRAを載せる手法。
  • DoRA:重み更新を「大きさ」と「方向」に分解し、低ランクでも精度を出しやすくしたLoRAの改良版。

迷ったときの初手は「まずLoRA、VRAMが足りなければQLoRA」です。以降で仕組みと選び方の根拠を掘り下げます。

PEFTとは:省パラメータ微調整の全体像

PEFT(Parameter-Efficient Fine-Tuning、パラメータ効率の良いファインチューニング)は、事前学習済みモデルの全パラメータを更新せず、ごく一部のパラメータだけを学習して特定タスクへ適応させる手法の総称です。数十億〜数千億パラメータのLLMを丸ごと再学習するコストを避けつつ、タスク性能を引き上げる狙いがあります。

PEFTが解決するフルファインチューニングのコスト問題

フルファインチューニングは全パラメータを更新するため、モデルと同じ規模のオプティマイザ状態(勾配・モーメント)をメモリに保持する必要があり、大型モデルでは数十〜数百GBのGPUメモリを要します。さらにタスクごとにモデル1個ぶんの重みが増え、保存・配布コストもかさみます。PEFTは学習・保存するパラメータを追加分だけに絞ることで、この2つのコストを同時に下げます。

PEFTに含まれる主な手法

PEFTは単一の手法ではなく、更新箇所の絞り方が異なる複数の手法を含みます。代表的なものを挙げます。

  • LoRA:注意層などの重みに低ランク行列を追加して学習する。PEFTの事実上の標準。
  • QLoRA:量子化したベースにLoRAを組み合わせ、少VRAM環境に対応する。
  • DoRA:LoRAの更新を大きさと方向に分解した改良版。
  • BitFit:バイアス項だけを更新する最小構成の手法。
  • Prompt Tuning/Prefix Tuning:入力側に学習可能なベクトルを差し込む手法。

このうち実務で最初に検討されるのがLoRAで、以降の章はLoRAを軸に進めます。

Hugging Face peftライブラリの位置づけ

「PEFT」は概念名であると同時に、Hugging Faceが公開する実装ライブラリpeftの名前でもあります。peftはLoRA・QLoRA・DoRA・IA3などを共通のインターフェースで提供し、Transformersのモデルへ数行で適用できます。検索で「peft lora」「python peft」と併記されるのは、多くの場合このpeftライブラリ経由でLoRAを使うためです。ライブラリの基礎はHugging Face(ハギングフェイス)とは?できること・使い方・主要機能をわかりやすく解説もあわせて参照してください。

LoRA(Low-Rank Adaptation)の仕組み

LoRAは2021年にMicrosoftの研究チーム(Hu et al.)が提案した手法で、事前学習済みの重み行列を凍結したまま、その更新量だけを低ランクの行列で近似します。GPT-3 175Bに適用した論文報告では、学習対象パラメータをフルファインチューニング比で約1万分の1、GPUメモリ要件を約3分の1に削減しています。

低ランク行列ΔW=BAで更新量を近似する原理

元の重み行列を W とすると、フルファインチューニングは W 自体を W+ΔW へ更新します。LoRAは W を凍結し、更新量 ΔW を2つの小さな行列の積 BA で表現します。A は次元を r(ランク)へ落とし、B は元の次元へ戻す役割で、r は元の次元よりはるかに小さく取ります。学習するのは A と B だけなので、パラメータ数は r に比例して小さくなります。推論時は BA を W に足し込めば、追加の計算コストなしで元の重みと同じ形に戻せます。

rank(r)・lora_alpha・target_modulesの役割

LoRAの挙動を決める主要な設定は3つです。

  • r(rank):低ランク行列の次元。大きいほど表現力が増すが学習パラメータも増える。8〜16から始めるのが一般的。
  • lora_alpha:学習した更新へ掛けるスケーリング係数。実効的な倍率は alpha/r で決まり、alpha を r と同じか2倍に設定するのが定石。
  • target_modules:LoRAを差し込む対象層。Llama系など多くのモデルで既定は注意層のクエリ・バリュー(q_proj・v_proj)で、精度を追うなら全線形層へ広げる。既定の対象はモデルの構造ごとに定義される。

rを上げるほど良くなるとは限らず、rが小さすぎるとタスクを学習しきれず、大きすぎると過学習やメモリ増を招きます。まず小さいrで学習曲線を見て、不足なら段階的に上げる運用が扱いやすいです。

学習・推論時の挙動(アダプタの差し替えとマージ)

LoRAで増えるのはアダプタと呼ばれる小さな重み(AとB)だけで、タスクごとにこのアダプタを保存・差し替えできます。ベースモデルは1つ共有し、用途別のアダプタを載せ替えるだけで複数タスクへ対応できるのが運用上の利点です。本番では BA をベース重みへマージして単一モデルとして配布すれば、推論時のオーバーヘッドをなくせます。

PEFTとLoRAの関係を正しく理解する

「peft lora」という検索が示すのは、多くの人がこの2語の関係を確かめたいという意図です。ここを明確にしておきます。

LoRAはPEFTの一手法という包含関係

PEFTは手法の分類名、LoRAはその分類に属する具体的な手法名です。「PEFTとLoRAはどちらが優れているか」という比較は成り立たず、正しくは「PEFTという枠の中でLoRAを使う」という関係になります。BitFitやDoRAもPEFTですが、実務でPEFTと言えばLoRAを指す場面が多いため、両者がほぼ同義で使われることもあります。

「PEFT/LoRA」と併記される理由

技術記事やコードで「PEFT/LoRA」と併記されるのは、Hugging Faceのpeftライブラリを使ってLoRAを実装する構図が定着しているためです。つまり「PEFT(ライブラリ・手法群)でLoRA(具体手法)を動かす」という実装の流れがそのまま語順に表れています。混乱しやすいですが、片方がライブラリ/分類、もう片方が個別手法だと押さえれば整理できます。

LoRAでファインチューニングする手順(Hugging Face peft)

実際にLoRAでLLMを微調整する流れを、peftライブラリを例に示します。「loraファインチューニング例」で検索される実装の骨格はこの3ステップです。

LoraConfigの設定

まずLoRAの適用条件をLoraConfigで定義します。rank・alpha・対象層・ドロップアウトを指定します。

from peft import LoraConfig, get_peft_model

config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.05,
    task_type="CAUSAL_LM",
)

r=16・alpha=32はalpha/r=2の設定です。target_modulesを増やすほど適応力は上がりますが、学習パラメータとVRAMも増えるため、まずは既定の注意層から始めて必要に応じて広げます。

get_peft_modelとSFTの学習ループ

ベースモデルへ設定を適用すると、学習対象がLoRAアダプタだけに絞られたモデルが得られます。

base_model = AutoModelForCausalLM.from_pretrained("model-name")
model = get_peft_model(base_model, config)
model.print_trainable_parameters()
# 例: trainable params: 数百万 / all params: 数十億(1%未満)

この状態で通常の教師ありファインチューニング(SFT)と同じ学習ループを回します。LoRAは「どのパラメータを更新するか」を決める仕組みで、SFTは「入力と正解のペアで学習する」という学習目的を指すため、両者は競合せず組み合わせて使います。

アダプタの保存・読み込み・マージ

学習後はアダプタだけを保存でき、ファイルサイズはベースモデルよりはるかに小さくなります。

model.save_pretrained("my-lora-adapter")
# 推論側でベースへ適用
from peft import PeftModel
merged = PeftModel.from_pretrained(base_model, "my-lora-adapter")
merged = merged.merge_and_unload()  # ベース重みへ統合

merge_and_unloadでBAをベース重みへ統合すると、LoRA由来の追加計算が消え、通常のモデルと同じ速度で推論できます。学習した知識を提供側で配信する構成はLLM Servingとは何か?大規模言語モデルを提供するための基本概念とその役割も参考になります。

LoRAとフルファインチューニング・SFTの違い

LoRAを検討するときに最も問い合わせが多いのが、フルファインチューニングやSFTとの違いです。混同されやすい2つの軸を分けて整理します。

フルファインチューニングとの違い

フルファインチューニングは全パラメータを更新するため学習・保存コストが大きく、LoRAは追加パラメータのみを更新するため軽量です。性能面ではタスクによって差が出ます。2024年に公開された論文「LoRA vs Full Fine-tuning: An Illusion of Equivalence」(後にNeurIPSで発表)は、LoRAで学習した重みには元の特異ベクトルにない成分(intruder dimensions)が生じ、フルファインチューニングとは内部構造が異なると報告しました。多くの実務タスクでは同等に近い精度を出せますが、大幅にドメインが変わる学習では差が開くことがあります。

観点 フルファインチューニング LoRA QLoRA
更新対象 全パラメータ 低ランク行列のみ 低ランク行列のみ
ベース重み 更新 凍結 4bit量子化して凍結
VRAM
タスク切替 モデルごと保存 アダプタ差し替え アダプタ差し替え

VRAMと保存効率を優先するなら、多くのケースでLoRAが第一候補になります。

SFTとの関係(学習目的とパラメータ更新方法は別の軸)

「LoRA vs SFT」という比較は本来かみ合いません。SFT(Supervised Fine-Tuning)は入力と正解のペアで学習する学習目的の分類、LoRAはそのときにどの重みを更新するかの方法です。実際には「SFTをLoRAで行う」構成が一般的で、両者は排他ではありません。混同を避けるには、SFT・強化学習などを「何を学ばせるか」、LoRA・フル更新を「どこを更新するか」と別軸で捉えると整理できます。学習に頼らず外部知識で回答精度を上げる選択肢はナレッジチューニングの重要性とRAGへの応用方法で扱っています。

LoRAの派生手法(QLoRA・DoRA・BitFit)の違いと使い分け

「qlora lora 違い」「peft lora qlora dora」で検索されるとおり、LoRAには複数の派生があります。それぞれの狙いと適する場面を押さえます。

QLoRA(4bit量子化+LoRA)

QLoRAは2023年にDettmersらが提案した手法で、ベースモデルを4bit(NF4)に量子化してVRAMを大幅に削り、その上にLoRAアダプタを学習します。ベースは量子化された状態で凍結し、勾配はLoRA部分にのみ流れます。単一GPUで大型モデルを微調整したい、VRAMが不足するといった場面で有効です。実装ではモデル読み込み時にBitsAndBytesConfigで4bit量子化を指定し、あとは通常のLoRAと同じ流れに乗せます。

from transformers import BitsAndBytesConfig
import torch

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
)
base_model = AutoModelForCausalLM.from_pretrained(
    "model-name", quantization_config=bnb_config
)
# このあとは通常のLoRAと同じく get_peft_model(base_model, config) を適用

peftではQLoRA構成のとき全線形層をtarget_modulesに含めるのが一般的です。bitsandbytesの導入が前提になる点に注意してください。

DoRA(大きさと方向の分解)

DoRAは重みの更新を「大きさ(magnitude)」と「方向(direction)」に分解し、方向を通常のLoRAで、大きさを別の学習可能パラメータで扱う手法です。低いrankでもフルファインチューニングに近い挙動を得やすいのが特徴で、LoRAで精度が伸び悩むときの改良版として使えます。量子化ベースと組み合わせた「QDoRA」も利用できます。

BitFit・IA3などその他のPEFT

BitFitはバイアス項だけを更新する最小構成の手法で、学習パラメータが極端に少なく軽量な反面、表現力は限定的です。IA3は内部のアクティベーションをスケーリングするベクトルを学習します。これらはLoRAより更新箇所が狭く、ごく小さな適応や資源が厳しい環境での選択肢になります。まずLoRA、精度が足りなければDoRA、VRAMが厳しければQLoRA、という順で検討すると迷いにくいです。

手法選択の判断基準と失敗パターン

ここは競合記事が手法解説で止まりがちな部分を補う独自の観点です。「どれを選ぶか」と「なぜ失敗するか」を条件付きで示します。

フル・LoRA・QLoRAを選ぶ条件

選択は資源とタスクの性質で決まります。指針は次のとおりです。

  • LoRAを選ぶ:VRAMに余裕があり、既存ドメインの範囲でタスク適応したいとき。最初の一手として妥当。
  • QLoRAを選ぶ:単一GPUなどVRAMが不足し、多少の量子化誤差を許容できるとき。
  • フルファインチューニングを選ぶ:学習データが事前学習分布から大きく外れ、LoRAでは精度が頭打ちになるとき。資源を投じる価値がある場合に限る。

「とりあえずフル」で始めるのは資源の無駄になりやすく、まずLoRAで基準線を作ってから不足分を見極めるのが実務的です。

LoRAで精度が出ない・崩れるケース

LoRAがうまくいかない典型は3つに集約されます。第一に、rが小さすぎてタスクの複雑さを表現しきれないケース。学習誤差が下がりきらないときはrを段階的に上げます。第二に、target_modulesが注意層だけで、MLP層の適応が必要なタスクに届いていないケース。全線形層へ広げると改善することがあります。第三に、alpha/rが過大で更新が強すぎ、事前学習の知識を上書きして出力が崩れるケース。この場合はalphaを下げます。学習が乗らないときはデータ量ではなく、まずこの3つの設定を疑うのが近道です。

よくある質問

PEFTとは何の略ですか?

Parameter-Efficient Fine-Tuning(パラメータ効率の良いファインチューニング)の略です。事前学習済みモデルの全パラメータを更新せず、少数の追加パラメータだけを学習して特定タスクへ適応させる手法の総称で、同名のHugging Face製ライブラリpeftも指します。

LoRAとQLoRAの違いは何ですか?

QLoRAはLoRAにベースモデルの4bit量子化を組み合わせた手法です。仕組みの中心(低ランク行列で更新を近似する)は同じで、QLoRAはベースを量子化してVRAMをさらに削る点が異なります。VRAMが不足する環境ではQLoRA、余裕があれば標準のLoRAが基本です。

LoRAとSFTは併用できますか?

併用できます。SFTは入力と正解ペアで学習する学習目的、LoRAはどの重みを更新するかの方法で、軸が異なります。実際には「SFTをLoRAで行う」構成が一般的で、両者は排他ではありません。

rankとlora_alphaはどう設定すればよいですか?

rankは8〜16から始め、学習誤差が下がりきらなければ段階的に上げます。lora_alphaは実効倍率がalpha/rで決まるため、alphaをrと同じか2倍に設定するのが定石です(例:r=16ならalpha=16〜32)。出力が崩れる場合はalphaを下げます。

peftライブラリはどうインストールしますか?

Pythonでpip install peftを実行します。TransformersやPyTorchと併用するのが前提で、量子化を使う場合はbitsandbytesも合わせて導入します。バージョンによって対応手法や引数が変わるため、最新の対応状況は公式ドキュメントで確認してください。

関連記事

資料請求

RELATED POSTS 関連記事