量子化と蒸留:モデル圧縮の原理
巨大モデルを軽くする量子化・蒸留・プルーニングを数理で腑分け。なぜビットを削っても壊れないかが腹落ちし、圧縮の打ち手を自分で選べるようになる。
- 1.量子化は連続値の重み・活性を少ビット整数に丸める写像。INT8 は r=round(x/s)+z の一次変換で、誤差は1ステップ幅 s の量子化ノイズに支配される。校正(calibration)で s を決め、外れ値の扱いが精度を左右する。
- 2.知識蒸留は教師の出力分布(ソフトターゲット)を生徒に写す。温度 T でロジットを割ってから softmax すると暗黙知(クラス間の類似度)が伝わり、ハードラベルだけより多くの情報が流れる。損失の勾配は T² でスケールする。
- 3.プルーニングは重みの一部をゼロにする圧縮。要素単位は理論圧縮率が高いが疎行列の実機高速化が難しく、構造化(チャネル/ヘッド単位)は速いが粒度が粗い。三手法は削る軸が直交し、組み合わせられる。
モデル圧縮は「何を削るか」で三つに割れる
学習を終えた巨大モデルをそのまま動かすと、メモリ帯域・容量・電力のどれかが先に音を上げます。KV キャッシュと LLM 推論の最適化 で見たとおり、推論の多くは演算ではなくデータの読み出しで律速します。だから圧縮の本質は「読み出すバイト数を減らす」ことにあり、削る軸で三つに分かれます。
| 手法 | 削る対象 | 数理的な操作 | 主な効果 |
|---|---|---|---|
| 量子化 | 1要素あたりのビット数 | 連続値→低ビット整数への丸め写像 | メモリ量と帯域を 1/2〜1/4 に |
| 知識蒸留 | パラメータ数(小さな別モデルへ) | 教師の出力分布を生徒に回帰 | モデル本体を小型化 |
| プルーニング | 重みの個数(不要要素をゼロ化) | 重要度の低い重みを除去 | 実効パラメータ・演算を削減 |
三者は直交します。量子化はビット軸、蒸留はモデル全体の容量軸、プルーニングは要素数軸。だから「蒸留した小モデルを INT4 量子化し、さらにプルーニングする」といった重ね掛けが成立します。以下、それぞれの内部動作を数理で押さえます。
量子化:丸め写像と校正
量子化の核は、浮動小数点の重み・活性を少ビット整数の格子点に丸めることです。最も基本的なアフィン(非対称)量子化は次の一次変換で定義されます。
量子化: q = clip( round(x / s) + z, q_min, q_max )
逆量子化: x̂ = s · (q - z)
x : 元の実数値(重みや活性)
s : スケール(ステップ幅)= (x_max - x_min) / (q_max - q_min)
z : ゼロ点(zero-point)。実数の0が整数のどの格子点に来るか
q : 量子化後の整数(INT8 なら -128..127、UINT8 なら 0..255)
round で最寄りの格子点に丸め、clip で表現範囲の外を端に張り付かせます。INT8 なら格子点は 256 個しかないので、連続値はその間隔 s の幅に押し込められます。復元値 x̂ と元 x の差が量子化誤差で、丸めだけなら -s/2 〜 +s/2 の範囲に収まり、おおむね一様分布の量子化ノイズとして振る舞います。
ここで決定的なのが**スケール s の決め方=校正(calibration)**です。s は値域 [x_min, x_max] をどう取るかで決まります。
| 校正方式 | 値域の決め方 | 性質 |
|---|---|---|
| min-max | 観測した最小・最大をそのまま使う | 外れ値1個で s が広がり、大半の値の分解能が落ちる |
| パーセンタイル/飽和 | 上下数%を切り捨てて値域を狭める | 外れ値を犠牲に、本体の分解能を確保 |
| MSE/KL 最小化 | 量子化誤差や分布のKL距離を最小化する値域を探索 | 計算は重いが精度が出やすい |
s は値域の幅に比例します。重みや活性にごく少数でも極端に大きい値があると、s がそれに引きずられて広がり、値の大半が占める狭い帯域の分解能が一気に落ちます。LLM の活性には特定チャネルだけ桁違いに大きい「外れ値チャネル」が現れることが知られ、これが素朴な INT8 量子化で精度が崩れる主因です。チャネルごとに別の s を持つ(per-channel)、外れ値だけ高精度で別扱いする、といった対策が要ります。
対称 vs 非対称:z=0 に固定するのが対称量子化で、x̂ = s·q と単純化でき乗算器に優しい。重みは0を中心に分布しがちなので対称が好相性です。一方 ReLU 後の活性は非負に偏るため、z を使う非対称が値域を無駄なく使えます。粒度も効きます——テンソル全体で1つの s(per-tensor)は軽いが粗く、行・チャネル単位(per-channel)は分解能が高い。
量子化の流派は2つ。**PTQ(Post-Training Quantization)**は学習後に校正データを流して s, z を決めるだけで、再学習が不要・高速。**QAT(Quantization-Aware Training)**は学習時に丸め演算を順伝播へ挟み、モデルに「丸められる前提」を学ばせます。丸めは微分不可能なので、勾配は丸めを恒等関数とみなす **STE(Straight-Through Estimator)**で通します。INT4 のような低ビットでは PTQ では精度が保ちにくく、QAT が有利になりがちです。
INT8 は多くのモデルでほぼ無劣化、INT4 は工夫しないと崩れる、という温度差は、格子点が 256→16 へ激減して s が広がり量子化ノイズが増えるという、この一次変換から素直に説明できます。LoRA と QLoRA の QLoRA が NF4 という専用4bit型を使うのも、正規分布する重みに格子点を最適配置して同じビット数で誤差を抑えるためです。
知識蒸留:温度付きソフトターゲット
蒸留は量子化と発想が違います。大きな教師モデルの振る舞いを、小さな生徒モデルに教え込んでパラメータ数そのものを減らす。鍵は、教師の出力をハードラベル(正解クラスだけ1)でなく、**確率分布(ソフトターゲット)**として使う点です。
なぜソフトターゲットが効くのか。「犬」の画像で教師が 犬=0.9, 狼=0.08, 猫=0.001 と出したとき、ハードラベルは「犬」しか伝えませんが、ソフトターゲットは**「狼に似ていて猫には似ていない」というクラス間の暗黙知(dark knowledge)**まで伝えます。この余分な情報が、少ないパラメータの生徒の学習を強く導きます。
ただし学習済み教師の softmax は正解クラスがほぼ1に飽和し、他クラスがゼロ近くに潰れて差が見えません。そこで温度 T を導入し、ロジット z を T で割ってから softmax します。
ソフトマックス(温度付き):
p_i(T) = exp(z_i / T) / Σ_j exp(z_j / T)
T = 1 : 通常の softmax(飽和して鋭い)
T > 1 : 分布が「なめらか」になり、小さな確率の差が浮き上がる
T → ∞ : 一様分布に近づく
T を上げるとロジットの差が圧縮され、潰れていたクラス間の相対関係が表に出ます。蒸留の損失は、この温度を上げた生徒と教師のソフト分布を一致させる項と、通常の正解ハードラベルとの項を重み付き和にします。
L = α · T² · KL( 教師_soft(T) ‖ 生徒_soft(T) ) ← ソフトターゲット項
+ (1 - α) · CE( 正解ラベル, 生徒_soft(T=1) ) ← 通常の分類項
ソフトターゲット項の勾配は、ロジットを T で割る効果で大きさが約 1/T² にスケールダウンします。T² を前掛けしてこれを打ち消すことで、温度を変えてもソフト項とハード項の勾配の大きさの釣り合いが保たれ、T を上げただけで学習が弱まる事故を防げます。蒸留を実装して「高温にすると学習が進まない」場合、この T² 補正の欠落をまず疑います。
出力分布を写すのは応答ベース(response-based)蒸留。ほかに、中間層の特徴マップを合わせる特徴ベース(feature-based)、層間の関係を写す**関係ベース(relation-based)**があります。LLM では、教師にサンプルさせた文章で生徒を学習させる手法や、自分自身の強化版を教師にする自己蒸留も使われます。共通原理は「ハードラベルより情報量の多い教師信号を使う」ことです。
プルーニング:要素を削る、ただし「速くなるか」は別問題
プルーニングは、重要度の低い重みをゼロにして取り除く圧縮です。最も単純な基準は重みの絶対値——小さい重みは出力への寄与が薄いとみなして刈る(magnitude pruning)。より原理的には、重みを動かしたときの損失の増加量で重要度を測ります。
重要度の近似(テイラー展開):
ΔL ≈ (∂L/∂w) · Δw + (1/2) · Δw² · (∂²L/∂w²)
→ 重みを w から 0 にする(Δw = -w)ときの損失増加で重要度を評価
学習が収束していれば一次の勾配項は小さく、二次(ヘシアン)項が効きます。これを使うのが OBD/OBS 系の古典手法で、現代の LLM 向け手法(SparseGPT 等)も二次情報の近似を用いて、刈った分を残りの重みで補正します。
決定的なのは、「ゼロを増やす=速くなる」ではないことです。粒度で性質が割れます。
| 粒度 | 削る単位 | 理論圧縮率 | 実機での高速化 |
|---|---|---|---|
| 非構造化(unstructured) | 個々の重み | 高い(任意の要素を刈れる) | 難しい。疎行列はGPUで非効率になりがち |
| 半構造化(2:4 など) | 連続 N 個中 M 個をゼロ | 中程度(パターン固定) | 対応ハードで効く。実用的な折衷 |
| 構造化(structured) | チャネル/フィルタ/ヘッド丸ごと | 低め(粒度が粗い) | 高い。行列が小さくなり密のまま速い |
非構造化プルーニングで重みの90%をゼロにしても、汎用GPUは密行列積に最適化されているため、飛び飛びのゼロは演算をスキップできず期待ほど速くなりません。間接参照やマスク処理のオーバーヘッドで逆に遅くなることすらあります。実機の速度が欲しいなら、行列の形そのものを小さくする構造化プルーニングか、ハードが直接支援する2:4 半構造化を選ぶのが定石です。「圧縮率(ゼロの割合)」と「実測スループット」は別物として評価します。
刈った直後は精度が落ちるため、再学習(fine-tune)で回復させるのが通例です。一度に大きく刈らず、刈る→微調整を繰り返す反復的プルーニングのほうが、同じ最終疎度でも精度を保ちやすい。これは ニューラルネットワーク の重み分布が、急な摂動より緩やかな変化に強いことの現れです。
三手法をどう組み合わせるか
削る軸が直交するので、圧縮は単一手法でなくパイプラインで考えます。
| 観点 | 量子化 | 知識蒸留 | プルーニング |
|---|---|---|---|
| 削減の軸 | ビット数(値の分解能) | モデル容量(パラメータ数) | 要素数(ゼロ化) |
| 精度低下の主因 | 量子化ノイズ・外れ値 | 教師との容量差 | 重要な重みの除去 |
| 再学習の要否 | PTQ は不要 / QAT は要 | 蒸留学習が前提 | 回復のため通常要 |
| 実機高速化の確実さ | 高い(帯域・容量に直結) | 高い(行列が小さい) | 粒度依存(構造化なら高い) |
実務の順序は、まず蒸留でアーキテクチャ規模を落とし、プルーニングで残りの冗長を削り、最後に量子化でビットを詰める、という流れが噛み合います。蒸留と量子化を一体化したのが、4bit に凍結した土台へ高精度アダプタを乗せる QLoRA の発想で、LoRA と QLoRA に詳説があります。
- 量子化の式:
q = round(x/s) + z、x̂ = s·(q-z)。誤差はステップ幅sの量子化ノイズ。sは校正で決まり、外れ値がsを広げて精度を壊す。 - PTQ vs QAT:PTQ は学習後に校正のみ、QAT は丸めを学習に挟む(勾配は STE)。低ビット(INT4)ほど QAT が有利。
- 蒸留の核:温度
Tで割ってから softmax しソフトターゲットを写す。損失はKL(教師‖生徒)中心で、勾配の1/T²を打ち消すためT²を前掛けする。 - プルーニングの粒度:非構造化=高圧縮だが速くなりにくい、構造化=粗いが密のまま速い、2:4=実用的折衷。圧縮率と実速は別物。
- 直交性:三手法は削る軸が違い組み合わせ可能。蒸留→プルーニング→量子化が定番の重ね方。
まとめ:圧縮は「どのバイトを諦めるか」の設計
モデル圧縮は魔法ではなく、情報をどこで捨てるかの選択です。量子化は値の分解能を、蒸留はモデルの容量を、プルーニングは重みの個数を諦め、その代わりにメモリと速度を得ます。
| 問い | 答えの軸 | そこから言えること |
|---|---|---|
| なぜ量子化で壊れないのか | 誤差はステップ幅 s の量子化ノイズ | s を決める校正と外れ値処理が精度の急所 |
| なぜ蒸留が効くのか | ソフトターゲットがクラス間類似を伝える | 温度 T と T² 補正で情報の流れを最大化 |
| なぜ疎でも速くないのか | 汎用GPUは密行列に最適化 | 実速が欲しければ構造化/2:4 を選ぶ |
| どう組み合わせるか | 削る軸が直交している | 蒸留→プルーニング→量子化の重ね掛け |
この三軸を持つと、「INT8 にしたら急に精度が落ちた」「蒸留した生徒が伸びない」「刈ったのに速くならない」といった現象を、校正・温度・粒度の言葉で切り分けられます。土台となる重み更新の感覚は ニューラルネットワーク と、巨大モデルを実際に動かす推論側の制約は KV キャッシュと LLM 推論の最適化 や LLM と Transformer と合わせて読むと、「何を削れば何が軽くなるか」が一枚の地図につながります。
AI/機械学習 Article
量子化と蒸留:モデル圧縮の原理を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
量子化
比較で見る軸
難易度: advanced / カテゴリ: AI/機械学習 / タグ数: 5
導入後に効く点
知識蒸留は教師の出力分布(ソフトターゲット)を生徒に写す。温度 T でロジットを割ってから softmax すると暗黙知(クラス間の類似度)が伝わり、ハードラベルだけより多くの情報が流れる。損失の勾配は T² でスケールする。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- AI/機械学習
- タグ数
- 5
判断チェックリスト
- 自社の用途が「量子化 / 知識蒸留」に近いか確認する。
- 強みである「量子化は連続値の重み・活性を少ビット整数に丸める写像。INT8 は r=round(x/s)+z の一次変換で、誤差は1ステップ幅 s の量子化ノイズに支配される。校正(calibration)で s を決め、外れ値の扱いが精度を左右する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。