みんなのAI
機械学習AI論文
読み込み中…

学ぶ

🏅マイ実績

Ch.08

PEFT 1:PEFTとLoRA

大きい表より、小さな二枚

大きな重み表を一から全部書き換えるのではなく、縦に長い B と 横に長い A を掛けて更新を作ります。真ん中の幅 r が小さいほど、学習する数はずっと少なくなります。
図の格子は例として 4×2 · 2×5 → 4×5 のサイズです。
① B: 縦② r: 狭い③ A: 横④ 一枚に
B: 4行×2列A: 2行×5列×=ΔW: 4行×5列真ん中がいちばん狭い
学習する数は小さな二枚の行列ぶんに抑えられ、表全体をマス目ごとに合わせるよりずっと少なくなります。LoRA はその二枚だけを更新します。

PEFT・LoRA: 少ないパラメータだけで微調整

巨大な本線 $W_0$ はそのまま、狭いLoRAランプ $A,B$ だけ敷いてタスクへ合わせます。

大きな事前学習ブロック(W₀)はそのまま。小さなA·Bだけ学習して出力を少し動かします。太い道と細い近道が合わさって最終出力になります。

バックボーン読込W₀凍結A·B学習α/rスケール出力/マージ

学習の流れ

  1. ① バックボーン読込: すでに学習済みの大きなモデルをそのまま用意する。
  2. ② 凍結: もとの重みは触らず、LoRAと上の層側に学習信号を通す。
  3. ③ LoRA学習: 小さな二枚(A·B)だけを新しく合わせて、出力を少し動かす。
  4. ④ 強さの調整: LoRAがどれだけ効くか、スケール(多くは α÷r など)で合わせる。実装ごとに違う。
  5. ⑤ 使う・統合・配布: 十分か確認したあと、更新を本体にまとめるか、アダプターだけ配る。
AIモデルを学習させることを家をリフォームすることに例えてみませんか?第05章の ViT や巨大言語モデルは、すでに立派に建った大邸宅(事前学習モデル)のようなものです。好みに合わせて変えたいとき、柱と壁を全部壊して建て直すのがフルファインチューニングです。性能は上がるかもしれませんが、膨大なメモリと保存容量、そして時間がかかります。
救世主が PEFT(Parameter-Efficient Fine-Tuning) です。PEFTは「家の骨組みはそのまま、本当に必要な小さなオーダーメイド家具(アダプター)だけ足そう」という、賢く経済的な戦略です。
そのPEFT一族でいちばん有名なのが LoRA(Low-Rank Adaptation) です。元の巨大な知識行列はそのままに、横にとても狭い迂回路(低ランク行列)を敷いてショートカットを作ります。式では、巨大な W0W_0W0​ の代わりに、小さな二つの行列の積 BABABA から新しく学ぶ知識 ΔW\Delta WΔW を作ります。
モデルの出力は h=W0x+ΔWxh = W_0x + \Delta Wxh=W0​x+ΔWx になります。もともとの賢さ(W0xW_0xW0​x)に、新しく教えた知識(ΔWx\Delta WxΔWx)をそっと足す原理です。本章では、大きなモデルを自分のPCでも軽く扱えるようにしてくれるLoRAの魔法を、やさしく噛み砕いて説明します。

数式の読み方(LoRA・線形層1つ)

1) 事前学習重みと凍結
ひとこと: 大きな W0W_0W0​ はそのまま、小さな 補正 ΔW\Delta WΔW だけ学びます。
重み W0∈Rdout×dinW_0\in\mathbb{R}^{d_{\mathrm{out}}\times d_{\mathrm{in}}}W0​∈Rdout​×din​, 入力 xxx, 出力 hhh とすると、LoRA でよく見る形は「元の出力 + 追加分」です。
h=W0x+ΔWxh = W_0 x + \Delta W xh=W0​x+ΔWx
- W0xW_0 xW0​x: 事前学習で得た部分(多くは凍結)
- ΔWx\Delta W xΔWx: タスク用に足す部分(LoRA は主に ΔW\Delta WΔW を学習)
フルFTは W0W_0W0​ の全要素を更新しますが、LoRA は W0W_0W0​ を触らず補正だけを軽く合わせるイメージです。
xW0凍結×W0xAB×α/rΔWx+h
1層あたり: 上は 凍結 W0W_0W0​ による W0xW_0xW0​x、下は 学習する A ⁣→ ⁣BA\!\to\!BA→B と α/r\alpha/rα/r が付いた ΔWx\Delta W xΔWx。足して h=W0x+ΔWxh=W_0x+\Delta W xh=W0​x+ΔWx になります。
2) ΔW\Delta WΔW を低ランクで書く
ひとこと: ΔW\Delta WΔW を巨大な1枚として保存しないで、真ん中が rrr だけ細い二枚 BBB と AAA の積で表します。
r≪min⁡(din,dout)r\ll \min(d_{\mathrm{in}},d_{\mathrm{out}})r≪min(din​,dout​) とし、B∈Rdout×rB\in\mathbb{R}^{d_{\mathrm{out}}\times r}B∈Rdout​×r, A∈Rr×dinA\in\mathbb{R}^{r\times d_{\mathrm{in}}}A∈Rr×din​ のとき
ΔW=αrBA\Delta W = \frac{\alpha}{r} B AΔW=rα​BA
- BABABA: 細い通路 rrr を通ってできる補正の形
- α/r\alpha/rα/r: 補正を出力にどれだけ混ぜるかのスケール(実装で α\alphaα と rrr の結合の書き方はやや異なることがあります)
学習するパラメータ数は、ざっくり BBB と AAA の要素数の和、すなわち doutr+rdind_{\mathrm{out}} r + r d_{\mathrm{in}}dout​r+rdin​ です。W0W_0W0​ 全体を書き換えるよりずっと少なくなります。
3) なぜ低ランクか
直感: 必要な変化が「すべての方向」ではなく、主要な少数方向に集まると考えると、中間の幅 rrr を小さくしても足りることがあります。
- rrr を大きく → 表現力は上がるが、コストも増える
- どこに付けるか(注意の WQ,WK,…W_Q,W_K,\dotsWQ​,WK​,… か FFN か)で効き方が変わります
4) 推論時のマージ(任意)
ひとこと: 毎回 LoRA 経路を別に通さず、一枚の重みにまとめたいときに使います。
学習後に ΔW\Delta WΔW を W0W_0W0​ に足して
W=W0+ΔWW = W_0 + \Delta WW=W0​+ΔW
とすると、普通の線形層のように 行列積一回で推論でき、遅延を抑えやすくなります(数値・実装はフレームワーク依存)。

PEFTとLoRA: 少ないパラメータだけ直してファインチューニング

1. なぜ PEFT?(骨組みは残して家具だけ)
* 概念: ChatGPT級の巨大モデルはパラメータが数百億あります。フルファインチューニングはすべて更新するため強力なGPUと巨大な保存が要ります。PEFTは全体のごく一部(通常1%未満)だけ学習して、モデルを効率よく賢くする技術の総称です。
* 比喩: 冬の雰囲気のためにスマホを買い替える人はいません。冬用ケース(PEFT)を付けるだけでしょ?用途に合わせてケースを替えるように、モデルも軽く変身できます。
* 実戦: コスパは最高ですが、追加するパラメータが小さすぎたりデータが足りなかったりすると知識が吸収できません。学習率などの設定調整が鍵です。
2. LoRAの秘密: 巨大行列の代わりに二つの小さい行列の積
* 概念: ディープモデルは巨大な表(行列)の集まりです。元の巨大行列を W0W_0W0​ とします。LoRA は W0W_0W0​ を凍結し、新しい知識を学ぶ小さな二つの行列 BBB と AAA を作ります。核は ΔW=BA\Delta W = BAΔW=BA です。
* 比喩: 1000ページの百科事典(W0W_0W0​)の誤植を直すのに全刷りは非効率。小さな付箋(BABABA)をそのページに貼るようなものです。
* 詳細: AAA は情報を要約(圧縮)し、BBB はそれを元のサイズに戻す(復元)役です。巨大行列を直接いじるより、学習する数が劇的に減ります。
3. LoRAの操縦席: ランク rrr とスケール α\alphaα
* 概念: LoRA を操るには二つのダイアル、ランク rrr と スケール α\alphaα が重要です。
* ランク rrr(補助レーンの本数): 付箋の大きさのイメージ。r=8r=8r=8 なら8車線の迂回路、r=16r=16r=16 なら広い——賢くなるほどメモリも増えます。
* スケール α\alphaα(知識の混ぜ方の強さ): 新しく学んだ BABABA を凍結した W0W_0W0​ にどれだけ強く混ぜるかの増幅器です。
* 実戦のコツ: メモリがきつければ rrr を下げる!データに合わないなら rrr を少し上げてみる。
4. 他章とのつながり
* 概念: 第04・05章の注意(Attention)モジュール、覚えていますか?LoRA は多くの場合 Q,K,VQ,K,VQ,K,V などの部品に付箋を貼るように使われます。線形層(重み行列)がある所ならどこにでも貼れます。
* 予告: それでも元の巨大な家(W0W_0W0​)自体が太ってメモリを食います。だから第09章では、モデル本体を軽い素材に圧縮する量子化と LoRA を組み合わせた QLoRA が登場します。

重要性

誰でも部屋の片隅のGPUで巨大モデルを育てられる
昔は巨大モデルを自在に変えるのに巨大データセンターが要りました。LoRA なら学習するパラメータが100分の1、1000分の1に減ります。スタートアップや学生でも、限られたGPUで自分のドメイン(医療・金融・法律など)に合わせて微調整できます。
カメレオンのようなモデル: マルチタスク配布の魔法
一つのモデルを「翻訳家」「プログラマー」「料理人」にするには、本来はモデル全体を3つ保存する必要があります。PEFT なら賢い共通の脳(ベース)は1つだけ、翻訳用・コーディング用の付箋(LoRAアダプター)だけ軽く保存すればよい。アダプターだけ差し替えれば運用と管理が格段に楽になります。
過去を忘れない賢さ: 忘却リスクの低減
新しい知識を無理やり詰め込む(フル微調整)と、元の常識を忘れる「忘却」が起きがちです。大学数学を覚えて九九を忘れるようなもの。LoRA は脳(W0W_0W0​)を凍結し補助だけ学習するので、汎化を保ちつつ新しい知識を安全に足せます。
大きな絵の中の効率
第01〜03章の骨格(線形層)の上に、どう効率よく肉付けするか——その答えが本章です。むやみに全部を変えずパラメータ効率を極めたなら、より高度な最適化へ進む準備はできています。

使い方

第1段階: ベースは氷!LoRAだけ解凍(学習戦略)
1. まず巨大モデルの重みに凍結の鍵をかけます。
2. 重要な関節(注意層など)ごとに空の LoRA モジュールを取り付けます。
3. この LoRA だけが学習するようにします。全体より速いですが、データが少ないときは検証セットで過学習を見張ってください。
第2段階: 配布は合体!(マージと推論)
学習が終われば、付箋(BABABA)の内容を百科事典(W0W_0W0​)に印刷してしまうこともできます。これを重みマージ(Weight Merge)といいます。
* Wmerged=W0+BAW_{merged} = W_0 + BAWmerged​=W0​+BA
合体すれば、推論時に二回も行列積を回す必要がなく、レイテンシの悪化を避けられます。
第3段階: 自分に合うPEFTの服を選ぶ
* アダプター: 各層の末尾に小さなネットを足す方式。
* プロンプトチューニング: プロンプトの前に「仮想の単語」を足して誘導します。
* LoRA: 重み行列そのものを滑らかに直すので制約が少なく性能が良く、今どきの業界標準です。
✅ 実戦チェックリスト
* 性能: 物足りなければランク(rrr)、スケール(α\alphaα)、または `target_modules` の範囲を広げる。
* メモリ: まだ足りなければバッチを減らし、次章の 量子化+LoRA(QLoRA) を検討。
* 再現性: どの層にどの rrr で LoRA を付けたか、実験ログに残す。

まとめ

一行まとめ — 巨大な事前学習重み W0W_0W0​ は安全に凍結し、更新は低ランク行列 ΔW=BA\Delta W = BAΔW=BA にまとめて学習パラメータを劇的に減らす魔法です。
前章とのつながり: 第01〜03章の線形層・注意の上で、モデルを自分好みに適応させる最も経済的でスマートな方法が LoRA と PEFT です。
実務: ランク(rrr)、スケール(α\alphaα)、ターゲットモジュールのダイアルを合わせ、メモリがまだ厳しければ第09章の QLoRA(量子化) にバトンを渡してさらに軽く最適化します。

解法のヒント

LoRA/PEFTの問題は 凍結した W0W_0W0​ と 低ランク BABABA、そして 学習可能パラメータ数・rrr・α\alphaα をセットで考えると解きやすいです。ViTのパッチ数(第05章復習)は (H/p)×(W/p)(H/p)\times(W/p)(H/p)×(W/p)。正方形 d×dd\times dd×d 層にLoRAを付けた典型形では およそ 2dr2dr2dr パラメータと結びつけます。
① セッションで出やすい数値型の例(銀行と同じ形)
LoRA 学習パラメータ数(aggregate) — 1層で d=64d=64d=64, r=4r=4r=4 のとき おおよそ 2dr2dr2dr = 512

一辺のパッチ数(config) — 縦横とも 8 個ずつなら総マス数は? → 8×8=8\times8=8×8= 64

パッチ数(vote型) — 入力 32×3232\times3232×32、パッチ 16×1616\times1616×16、CLSなし → (32/16)2=(32/16)^2=(32/16)2= 4

パッチトークン数(ensemble) — 224×224224\times224224×224、パッチ 161616、CLS除く → (224/16)2=142=(224/16)^2=14^2=(224/16)2=142= 196

密な注意のスケール(ensemble) — トークン数 N=20N=20N=20 のとき N2N^2N2 は? → 400
例(概念) — 「PEFTの主目的に最も近いのは?」
② 少ない追加パラメータで適応 → 2

例(計算) — 「d=64d=64d=64, r=4r=4r=4 で LoRA パラメータをおおよそ 2dr2dr2dr とみなすと?」 → 2⋅64⋅4=5122\cdot64\cdot4=5122⋅64⋅4=512 → 512

例(○×) — 「LoRAでは通常 W0W_0W0​ 全部を学習する」→ 通常 凍結 → 0

例(応用) — 「多タスクを安く運びたい?」
② PEFTアダプターだけ保存 → 2

ViT復習 — 224×224224\times224224×224, パッチ 161616, CLSなし → 142=14^2=142= 196
定義 — 「LoRAは常にフルランクの ΔW\Delta WΔW を直接学習する」→ 誤り(低ランク)。0

○× — 「rrr を上げると学習パラメータは増えがち」→ 正。1

選択 — 「LoRA を使いながらさらに VRAM を節約するには、次章で何と組み合わせる?
① 量子化
② データラベルだけ削除」→ 1

計算 — 「d=32d=32d=32, r=2r=2r=2, 2dr2dr2dr は?」→ 128