🎓 レベル:標準 | 重要度:A(必須)
📎 前提:事前学習とスケーリング則 | 関連:表現学習と埋め込み(転移学習)
要点(BLUF)
- ファインチューニングは、事前学習で得た汎用表現を下流タスクや指示追従に適応させる転移学習です。少データで効くのは、ゼロからではなく良い初期点から微調整するからです。
- **SFT(教師ありファインチューニング)**は入出力ペアで重みを更新し、指示チューニングで「指示に従う」能力そのものを汎化させます。
- 全パラメータ更新は重く破滅的忘却を招きます。そこで重み更新を低ランク分解する LoRA などの PEFT が、ごく一部だけ学習してコストを桁違いに下げます。
1. 事前学習からファインチューニングへ:なぜ少データで効くのか
LLM はまず事前学習で、膨大なテキストの次トークン予測から汎用的な言語表現を獲得します。ファインチューニングは、この事前学習済みモデルを初期値として、目的のタスクのデータで追加学習する転移学習です(表現学習と埋め込み)。
少データで効く理由は、最適化の言葉で言えば「良い初期点」にあります。損失 を最小化するとき、ランダム初期化 からではなく、事前学習で得た から探索を始めます。
要するに、汎用的な特徴抽出(文法・意味・世界知識)はすでにできあがっていて、タスク固有の「使い方」だけを少しずらせばよいので、必要なデータも更新量も小さくて済む、ということです。これは深層学習の特徴階層が再利用可能だという経験則(表現学習と埋め込み)の、LLM 版です。
2. SFT(教師ありファインチューニング)と指示チューニング
SFT(supervised fine-tuning) は、ラベル付きの「入力 → 望ましい出力」ペアでモデルを微調整する、最も素直なファインチューニングです。損失は事前学習と同じ次トークンの交差エントロピーですが、計算するのは応答部分のトークンだけにします。
入力(プロンプト)を 、望ましい応答を とすると、
要するに、「この入力にはこう答えてほしい」という正解列をモデルに教師として与え、その応答を出す確率を上げているだけです。事前学習との違いは、学習データが自由なウェブテキストではなく人手で用意した目的志向のペアである点です。
指示チューニング(instruction tuning)
SFT の特に重要な使い方が指示チューニングです。「要約して」「翻訳して」「コードを書いて」のような多様なタスクを自然言語の指示として与え、その応答ペアを大量に集めてSFT します。
ねらいは個々のタスクを覚えさせることではなく、「指示に従う」というメタな振る舞いそのものを汎化させることです。多様な指示で訓練すると、訓練時に見ていない新しい指示にも従えるようになります。事前学習しただけのモデルは「次に来そうな文」を続けるだけで、指示に従う保証はありません。指示チューニングは、その素のモデルを「対話アシスタント」に変える最初の段階です(人間の選好にさらに合わせるのがアラインメント)。
flowchart LR Pre["事前学習済みLLM(次トークン予測のみ)"] --> SFT["SFT:入出力ペアで微調整"] SFT --> Inst["指示チューニング(多様な「指示→応答」)"] Inst --> Follow["「指示に従う」汎化を獲得"] Follow --> Align["さらに人間の選好へ:[[12-04_アラインメント]]"]
3. フルファインチューニングの課題
全パラメータを更新するフルファインチューニングは素直ですが、LLM 規模では二つの大きな問題があります。
(1) 計算・保存コスト:数十億〜数千億のパラメータすべてに勾配と最適化状態(Adam なら勾配・一次/二次モーメントで実質パラメータ数の数倍のメモリ)を持つ必要があり、学習が非常に重くなります。さらにタスクごとに元モデルと同サイズの新モデルが丸ごとできてしまうため、複数タスクに展開すると保存コストが膨らみます。
(2) 破滅的忘却(catastrophic forgetting):新しいタスクのデータだけで全重みを動かすと、事前学習で得ていた汎用能力が上書きされて劣化します。
要するに、新タスクに最適化するあまり、もとの「何でも屋」としての力を失ってしまう現象です。狭いデータに全パラメータを合わせ込むほど起きやすく、過学習(ニューラルネットの正則化)とも地続きの問題です。緩和の定石は、学習率を小さくする・一部の層を凍結する・更新するパラメータ自体を減らすことです。最後の「更新を減らす」を体系化したのが次の PEFT です。
4. PEFT(parameter-efficient fine-tuning)
PEFT は、事前学習済みの重みの大半を凍結し、ごく一部のパラメータだけを学習・追加してタスクに適応させる手法の総称です。
| 観点 | フルファインチューニング | PEFT |
|---|---|---|
| 更新するパラメータ | 全部 | ごく一部(数 % 以下) |
| 保存サイズ(タスクごと) | 元モデル丸ごと | 小さな差分だけ |
| 破滅的忘却 | 起きやすい | 起きにくい(元重みを凍結) |
| 学習コスト | 高い | 低い |
PEFT にはいくつか系統があります。追加型(アダプタ:層の間に小さな学習可能モジュールを挿入)、プロンプト型(入力側に学習可能なベクトルを足す)、そして重み更新を低ランクで近似する LoRA です。元の重みを凍結するので、事前学習の知識が保たれ忘却が起きにくいのが共通の利点です。
5. LoRA:重み更新を低ランク分解する(中心)
LoRA(Low-Rank Adaptation) は PEFT の中でも現在もっとも広く使われる手法です。アイデアは一行で言えば、「重みの更新分 を、低ランクの積 で近似する」です。
着想:更新は低い「内在ランク」を持つ
LoRA の出発点は、事前学習済みモデルの適応に必要な重みの変化 は、本質的に低ランクであるという仮説です(Hu ら 2021)。巨大なパラメータ空間でも、解は低い内在次元(intrinsic dimension)に乗るという観察にもとづきます。
要するに、 をフルランクで自由に学ぶ必要はなく、わずかな方向(低ランク)だけ動かせばタスク適応には十分だろう、という賭けです。
定式化
事前学習済みの重み行列を とします。フルファインチューニングはこれを に更新しますが、LoRA は を二つの小さな行列の積に制約します。
学習中、 は凍結して勾配を流さず、低ランクの と だけを更新します。入力 に対する順伝播は次のようになります。
実装上は安定化のため、 をガウス分布で、 をゼロで初期化します。すると学習開始時は 、つまり となり、ちょうど事前学習済みモデルそのものから微調整が始まるので破綻しません。さらにスケーリング係数 を使い、更新の大きさを で調整するのが一般的です。
flowchart LR X["入力 x"] --> W0["W0(凍結・更新しない)"] X --> A["A(r×k・学習する)"] A --> B["B(d×r・学習する、初期値ゼロ)"] W0 --> ADD["足し合わせ:h = W0 x + B A x"] B --> ADD ADD --> H["出力 h"]
なぜコストが桁違いに下がるのか
全更新では の自由度は 個です。LoRA はそれを の と の 、合わせて 個に減らします。
たとえば 、 なら、 に対し 。学習する数が約 250 分の 1 になります。
要するに、勾配と最適化状態を持つべきパラメータが激減するので、必要メモリと計算がまとめて小さくなります。保存も同様で、タスクごとに丸ごとモデルを複製せず、小さな (数 MB 程度)だけを差分として残せばよくなります。1 個の凍結した事前学習モデルに、タスクごとの LoRA を付け替える運用ができます。
推論時はマージできる
LoRA のもう一つの利点は、推論時に追加コストがゼロにできることです。学習が終われば を一度だけ計算して元の重みに足し込み、
という単一の行列 にマージできます。こうすると推論経路は普通の線形層と同じで、アダプタを別計算する遅延が生じません。差分のまま付け替えたいときはマージせず分離しておく、という使い分けも可能です。
⚠️ 要最新確認:派生手法とどれを使うか
LoRA を起点に多くの派生が出ており、ここは移り変わりが速いので最新確認が必要です(2026年6月時点)。
- QLoRA:ベースモデルを 4-bit などに量子化して凍結し、その上で LoRA を学習する手法。メモリをさらに大きく削減し、大型モデルを単一 GPU で微調整する用途で広く使われます。量子化方式や推奨設定は更新が速いので要最新確認。
- その他のアダプタ系・プロンプト系:挿入位置や形を変えた多数の変種があります。どれが最良かはモデル規模・タスク・計算予算で変わり、定説化していない部分が多いです。
- どれを選ぶか(一般論):データが少〜中規模で計算予算が限られるなら LoRA / QLoRA が第一候補。十分なデータと計算があり最高精度を狙うならフルファインチューニングが上回ることもあります。データがごく少量なら、そもそも微調整せず文脈内学習(few-shot)の方が良い場合もあります。タスクごとに小さく検証して選ぶのが原則です。
まとめ
ファインチューニングは、事前学習の汎用表現を下流に転用する転移学習です。SFT と指示チューニングで「指示に従う」モデルを作り、フルファインチューニングの重さと破滅的忘却を、重み更新を低ランク分解する LoRA を中心とした PEFT で回避します。LoRA の本質は「 と低ランク近似し、 を凍結して だけ学ぶ」ことに尽き、これが学習・保存コストを桁違いに下げ、推論時にはマージで追加コストをゼロにできます。人間の選好にさらに合わせるアラインメントへ続きます。
対応するシミュレーション
simulations/lora_low_rank.py:ファインチューニングでの重みの変化 を、低ランクの積 (細い2枚)で近似します。ランク を少し上げるだけで近似誤差が急に下がること、必要パラメータ数 がフルの よりずっと少ないこと(例:15.6%のパラメータで更新の9割を再現)を可視化します。重みの変化が実質的に低ランクなので LoRA が成り立ち、1つの基盤モデルに複数のLoRAを差し替えられます。
