体系 › LLM — 大規模言語モデル
·無料·論文·13分で読めます

知識蒸留を1から — 大きなモデルを小さく写す

正解ラベルには「犬と猫は似ている」と書かれていません。でも訓練済みモデルの出力にはそれが入っている — この差が知識蒸留の全部です。ソフトラベルと温度つきsoftmax、T²の由来、系列レベル蒸留、合成データ蒸留、そしてDeepSeek-R1が推論の手続きごと小さいモデルへ写した話まで、前提知識ゼロから。

要点

  • 知識蒸留は、正解ラベルに含まれないクラス間の類似構造(dark knowledge)を、大きな教師から小さな生徒へ写す技術である。
  • 温度つきsoftmaxはロジットを T で割って分布をぼかし、損失ではKLで教師との距離を縮める。
  • 蒸留項の勾配は温度を上げると約 1/T^2 で小さくなるため、T^2 を掛けて第1項との力関係を保つ。
  • ロジット蒸留は教師と生徒の語彙(トークナイザ)が完全に一致している必要がある。
  • DeepSeek-R1 の蒸留はSFTだけで推論の手続きを写し、同じ小型モデルに直接強化学習を回すより良い結果になった。
対象textタスクtraining

Distilling the Knowledge in a Neural Network

一次資料 — この記事の根拠

この解説の公開 2026-08-27

Distilling the Knowledge in a Neural NetworkarXiv:1503.02531論文ページ·PDF
Sequence-Level Knowledge DistillationarXiv:1606.07947論文ページ·PDF
DistilBERT"arXiv:1910.01108論文ページ·PDF
a distilled version of BERT: smallera distilled version of BERT: smaller
fasterfaster
https://arxiv.org/abs/1910.01108"cheaper and lighter
The False Promise of Imitating Proprietary LLMsarXiv:2305.15717論文ページ·PDF
DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement LearningarXiv:2501.12948論文ページ·PDF

「正解」だけでは、先生の知識は伝わらない

犬・猫・トラック・飛行機の4択で画像を分類するモデルを考えます。ある犬の写真に付いている正解ラベルは「犬」、数字にすれば (1,0,0,0)(1, 0, 0, 0) です。データセットが持っている情報はこれで全部です。

ところが、十分に訓練された大きなモデルに同じ写真を見せると、出力はたとえば (0.90, 0.09, 0.005, 0.005)(0.90,\ 0.09,\ 0.005,\ 0.005) になります。「犬だ。ただし猫の可能性も少しある。トラックや飛行機ではまずない」。ここに書かれている 犬:猫 = 10:1、犬:トラック = 180:1 という比率は、正解ラベルには一切含まれていません。しかしこの比率こそ、そのモデルが大量のデータから学び取った「世界の似ている/似ていない構造」です。

Hinton らはこれを dark knowledge(暗黙の知識) と呼びました。知識蒸留(Knowledge Distillation)とは、大きなモデル(教師)が持つこの暗黙の知識を、小さなモデル(生徒)へ写し取る技術です。

比喩: 答案を写す生徒と、迷い方まで写す生徒

同じ問題集を解く2人の生徒を想像してください。

1人目は解答欄の丸だけを見ます。「問3の答えはウ」。それ以上のことは分かりません。 2人目は先生の採点コメントまで見ます。「答えはウ。ただしイと迷った人が多い。アとエは論外」。

2人目のほうが、同じ問題数からはるかに多くを学べます。「イとウは紛らわしい」という情報が、正解そのものとは別に手に入るからです。これが知識蒸留の直感で、実務上の意味は2つあります。

1つめ: 1サンプルあたりの情報量が増える。 one-hotラベルは「正解のクラス番号」しか伝えませんが、教師の出力は全クラス分の数字を伝えます。だから同じデータ量でも学習が速く進み、ラベルの付いていないデータすら学習に使えます(教師に予測させればソフトラベルが作れるので)。

2つめ: 正則化として効く。 「絶対に犬、他は0」と教え込むより「たぶん犬、猫も少し」と教えるほうが、生徒は極端な自信を持ちにくくなります。ラベルスムージングを、固定値ではなく教師の判断で行っているようなものです。

仕組み: 温度で分布を「ぼかす」

ただし、素直に教師の出力を使うと困ることがあります。よく訓練されたモデルの出力は (0.99, 0.009, 0.0009, … )(0.99,\ 0.009,\ 0.0009,\ \dots) のように尖りがちで、肝心の「猫とトラックのどちらがより犬っぽいか」の差が小さすぎて、勾配にほとんど乗らないのです。

そこで 温度つきsoftmax を使います。ロジット(softmaxに入れる前の生のスコア)を TT で割ってから softmax にかけます。

pi(T)=exp⁡(zi/T)∑jexp⁡(zj/T)p_i(T) = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)}
(1)

ziz_i はクラス ii のロジット、TT は温度と呼ばれる正の数、pi(T)p_i(T) は温度 TT のもとでのクラス ii の確率です。T=1T = 1 なら普通のsoftmaxで、TT を大きくするほど分母の差が縮まり、分布は平らに近づきます。逆に TT を0に近づけると、最大値だけが1になる one-hot に潰れます。

つまり温度とは、「教師にどれくらい自信のなさを表明させるか」のつまみです。T=4T = 4 くらいに上げると (0.99,0.009,… )(0.99, 0.009, \dots) が (0.6,0.2,0.13,0.07)(0.6, 0.2, 0.13, 0.07) 程度にほぐれ、埋もれていた順位関係が学習信号として使える大きさになります。

FIG 1温度スライダーを右へ動かすと、尖っていた棒が平らになっていく。教師の「2位以下の順位」が見えるようになるのがこの操作の狙いで、上げすぎると全部が同じ高さ=情報が消える

損失関数: 2つの目標を混ぜる

生徒には2つのことを同時に教えます。「正解ラベルに合わせる」ことと「教師の分布に合わせる」ことです。

L=(1−α) LCE(y, pS(1))  +  α T2 KL(pT(T) ∥ pS(T))\mathcal{L} = (1-\alpha)\,\mathcal{L}_{\mathrm{CE}}\big(y,\ p^{S}(1)\big) \;+\; \alpha\, T^{2}\, \mathrm{KL}\big(p^{T}(T)\,\|\,p^{S}(T)\big)
(2)

第1項は普通の教師あり学習です。yy が正解ラベル、pS(1)p^S(1) が温度1(=そのまま)での生徒の出力で、LCE\mathcal{L}_{\mathrm{CE}} はクロスエントロピー。第2項が蒸留の項で、pT(T)p^T(T) と pS(T)p^S(T) は温度 TT での教師と生徒の分布、KL\mathrm{KL} は2つの分布のズレを測る量です(KLダイバージェンスを1から理解するで詳しく扱っています)。α\alpha は両者の配合比で、0.9のように蒸留側を重くすることが多いです。

言葉にすれば、「答え合わせは普通にやりつつ、教師のぼかした分布との距離も同時に縮めろ」という指示です。

なぜ T2T^2 を掛けるのか

ここが実装で一番よく間違えられる箇所です。温度 TT の蒸留損失を生徒のロジットで微分すると

∂Lsoft∂zi=1T(piS(T)−piT(T))\frac{\partial \mathcal{L}_{\mathrm{soft}}}{\partial z_i} = \frac{1}{T}\big(p_i^{S}(T) - p_i^{T}(T)\big)

となり、さらに TT が大きいとき pi(T)p_i(T) 自体が zi/Tz_i/T の一次で効くため、勾配全体は 1/T21/T^2 のオーダーで小さくなります。つまり温度を上げるほど蒸留項の勾配が勝手に痩せていく。T2T^2 を掛けるのは、その痩せ方を打ち消して、TT を変えても第1項との力関係が変わらないようにするためです。これを忘れると、TT を触るたびに α\alpha を調整し直す羽目になります。

コードで書く蒸留

PyTorch なら本体は数行です。

import torch.nn.functional as F

def distill_loss(student_logits, teacher_logits, labels, T=2.0, alpha=0.9):
    soft = F.kl_div(
        F.log_softmax(student_logits / T, dim=-1),   # input は「対数確率」
        F.log_softmax(teacher_logits / T, dim=-1),   # target 側も対数で渡す
        reduction="batchmean", log_target=True,
    ) * (T ** 2)                                     # 勾配の痩せを打ち消す
    hard = F.cross_entropy(student_logits, labels)
    return alpha * soft + (1 - alpha) * hard

引っかかりやすい点を3つ。F.kl_div の第1引数は生徒の対数確率、第2引数が教師で、順序を逆にすると別物(reverse KL)になります。reduction は既定の "mean" だと要素数で割ってしまうので、数学的なKLにしたければ "batchmean" です。そして教師側は torch.no_grad() の中で計算し、勾配を流さないこと。

蒸留の3つの型

応答ベース(logit distillation) — いま書いたもの。出力層だけを合わせます。実装が軽い代わりに、教師と生徒の語彙(トークナイザ)が完全に一致している必要があるという強い制約が付きます。ロジットは語彙に対応する数字の並びなので、語彙が違えば引き算する相手がいません。

特徴ベース — 中間層の隠れ状態も合わせます。DistilBERT は教師 BERT の層を1つ飛ばしに使って半分の層数の生徒を初期化し、MLM損失・出力のKL・隠れ状態のコサイン類似度の3つを同時に最適化しました。

関係ベース — 個々の出力ではなく、サンプル同士の関係(距離や角度の構造)を合わせます。表現空間の形が違っても「AとBは近く、AとCは遠い」だけは写せる、という発想です。

言語モデルでは何が変わるか

分類器と違い、言語モデルは1トークンずつ出力を積み上げます。素直にやればトークンごとにKLを取る(word-level KD)ことになりますが、生成タスクではもっと乱暴な方法が効くことが知られています。教師に文を生成させ、その文を正解として生徒を普通に学習させる — Kim と Rush が sequence-level KD と呼んだやり方です。分布を写すのをやめて、分布から引いたサンプルを写す。これが後述する合成データ蒸留の原型になります。

もう1つ、言語モデル特有の問題が exposure bias です。生徒は本番では自分が生成した文脈の上を歩くのに、学習時は教師やデータが作った文脈しか見ていません。一度ずれると、見たことのない状況に放り出されて崩れます。対策が on-policy 蒸留 で、生徒自身に生成させ、その生徒が実際に通った系列の上で教師のロジットを取ります(GKD や MiniLLM の系統)。

ここで KL の向きも効いてきます。KL(pT∥pS)\mathrm{KL}(p^T \| p^S)(forward)は教師が少しでも確率を置いた場所を生徒に全部カバーさせようとするので、容量の足りない生徒はどっちつかずのぼやけた分布になります。逆向きの reverse KL は主要な山だけを狙うので、生成が鋭くなる代わりに多様性を捨てます。

合成データ蒸留 — ロジットが見えなくてもできる

APIしか叩けない教師や、語彙の違うモデル間では、ロジットは手に入りません。そこで通貨になるのがテキストそのものです。教師にプロンプトを与えて出力を作らせ、その (プロンプト, 応答) の組を普通のSFT(教師ありファインチューニング)データとして生徒に学習させる。近年「小さいモデルが急に賢くなった」ように見える現象の多くは、この形の蒸留です。

ただし有名な落とし穴があります。The False Promise of Imitating Proprietary LLMs は、模倣モデルが教師の文体は驚くほど正確に写す一方、事実性や推論能力はそれほど追いつかないことを示しました。人間評価や「LLMに採点させる」評価では良く見えるのに、知識を問うベンチマークでは差が縮まらない。スタイルだけが蒸留された状態です。合成データ蒸留を評価するときは、この乖離を前提に測る指標を選ぶ必要があります。

DeepSeek-R1 の蒸留 — 推論の手続きごと写す

2025年の DeepSeek-R1 は、この路線でもっとも分かりやすい例です。R1 は強化学習によって、答える前に長い思考(chain of thought)を書き出すようになったモデルでした。DeepSeek はその R1 に大量の問題を解かせ、良質なものを選別して数十万件規模の学習データを作り、Qwen2.5 と Llama の各サイズをSFTだけで訓練しました。公開されたのが DeepSeek-R1-Distill-Qwen / Llama のシリーズです。生徒側には強化学習を一切回していません。

論文が報告した重要な点は、同じ小さいモデルに直接大規模な強化学習を回すよりも、大きな推論モデルから蒸留したほうが良い結果になったことです。直感的にはこう理解できます。強化学習は「良い推論の道筋」を試行錯誤で自力で発見しなければなりませんが、小さいモデルには探索でそこへ到達する力がありません。蒸留は、すでに発見済みの道筋を答えとして直接渡します。

そしてここで写されているのは確率分布ではなく、推論の手続きそのものです。どこで場合分けするか、どこで検算するか、どこで「待って、これは違う」と戻るか。ロジットのKLは1行も使われていません。蒸留という言葉の射程が、出力層の数字から振る舞いのパターンへ広がった例です。R1 の成り立ちはDeepSeekファミリー総覧で扱っています。

現場ではこう使う

誰が、いつ: MLエンジニアや推論基盤の担当者が、「精度は足りているが、レイテンシか単価が要件を満たさない」ときに最初に検討する手段です。量子化が「同じモデルの数値を粗くする」圧縮なのに対し、蒸留は「別の小さいモデルに中身を移す」圧縮で、両者は併用できます。順序は蒸留 → 量子化が普通です。

触るもの: 温度 TT(画像分類なら2〜10、LLMのトークン分布は元々広いので1〜2に留めることが多い)、配合比 α\alpha、生徒の層数・隠れ次元。ライブラリなら Hugging Face TRL の GKDTrainer(on-policy蒸留)や SFTTrainer(合成データ蒸留)、教師の大量生成には vLLM のバッチ推論、ロジットが要るなら logprobs の取得上限を先に確認します。検証可能なタスク(数学・コード)なら、教師の出力を正誤でふるいにかける rejection sampling を必ず挟みます。

事故になる落とし穴:

面接や設計レビューで問われる形: 「なぜソフトラベルのほうが情報量が多いのか」「温度を上げると何が起きて、なぜ T2T^2 が要るのか」「forward KL と reverse KL のどちらを使うか、その理由は」。いずれも、この記事の式を1本ずつ言葉に戻せれば答えられます。

まとめ

🎬 この内容の解説動画(Manim・字幕つき)

参考文献

  1. Distilling the Knowledge in a Neural Network. arXiv:1503.02531論文ページ·PDF
  2. Sequence-Level Knowledge Distillation. arXiv:1606.07947論文ページ·PDF
  3. DistilBERT. "arXiv:1910.01108論文ページ·PDF
  4. a distilled version of BERT: smaller. a distilled version of BERT: smaller
  5. faster. faster
  6. https://arxiv.org/abs/1910.01108". cheaper and lighter
  7. The False Promise of Imitating Proprietary LLMs. arXiv:2305.15717論文ページ·PDF
  8. DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning. arXiv:2501.12948論文ページ·PDF

本記事は上記論文の本文にもとづいて執筆しています。数値・主張は原典を優先してください。

運営: TechAthletes · 編集方針 · 出典の付け方 · 訂正の記録

コメント

コメントにはログインが必要です