知識蒸留を1から — 大きなモデルを小さく写す
正解ラベルには「犬と猫は似ている」と書かれていません。でも訓練済みモデルの出力にはそれが入っている — この差が知識蒸留の全部です。ソフトラベルと温度つきsoftmax、T²の由来、系列レベル蒸留、合成データ蒸留、そしてDeepSeek-R1が推論の手続きごと小さいモデルへ写した話まで、前提知識ゼロから。
要点
- 知識蒸留は、正解ラベルに含まれないクラス間の類似構造(dark knowledge)を、大きな教師から小さな生徒へ写す技術である。
- 温度つきsoftmaxはロジットを T で割って分布をぼかし、損失ではKLで教師との距離を縮める。
- 蒸留項の勾配は温度を上げると約 1/T^2 で小さくなるため、T^2 を掛けて第1項との力関係を保つ。
- ロジット蒸留は教師と生徒の語彙(トークナイザ)が完全に一致している必要がある。
- DeepSeek-R1 の蒸留はSFTだけで推論の手続きを写し、同じ小型モデルに直接強化学習を回すより良い結果になった。
Distilling the Knowledge in a Neural Network
一次資料 — この記事の根拠
この解説の公開 2026-08-27
Distilling the Knowledge in a Neural NetworkarXiv:1503.02531論文ページ·PDFSequence-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択で画像を分類するモデルを考えます。ある犬の写真に付いている正解ラベルは「犬」、数字にすれば です。データセットが持っている情報はこれで全部です。
ところが、十分に訓練された大きなモデルに同じ写真を見せると、出力はたとえば になります。「犬だ。ただし猫の可能性も少しある。トラックや飛行機ではまずない」。ここに書かれている 犬:猫 = 10:1、犬:トラック = 180:1 という比率は、正解ラベルには一切含まれていません。しかしこの比率こそ、そのモデルが大量のデータから学び取った「世界の似ている/似ていない構造」です。
Hinton らはこれを dark knowledge(暗黙の知識) と呼びました。知識蒸留(Knowledge Distillation)とは、大きなモデル(教師)が持つこの暗黙の知識を、小さなモデル(生徒)へ写し取る技術です。
比喩: 答案を写す生徒と、迷い方まで写す生徒
同じ問題集を解く2人の生徒を想像してください。
1人目は解答欄の丸だけを見ます。「問3の答えはウ」。それ以上のことは分かりません。 2人目は先生の採点コメントまで見ます。「答えはウ。ただしイと迷った人が多い。アとエは論外」。
2人目のほうが、同じ問題数からはるかに多くを学べます。「イとウは紛らわしい」という情報が、正解そのものとは別に手に入るからです。これが知識蒸留の直感で、実務上の意味は2つあります。
1つめ: 1サンプルあたりの情報量が増える。 one-hotラベルは「正解のクラス番号」しか伝えませんが、教師の出力は全クラス分の数字を伝えます。だから同じデータ量でも学習が速く進み、ラベルの付いていないデータすら学習に使えます(教師に予測させればソフトラベルが作れるので)。
2つめ: 正則化として効く。 「絶対に犬、他は0」と教え込むより「たぶん犬、猫も少し」と教えるほうが、生徒は極端な自信を持ちにくくなります。ラベルスムージングを、固定値ではなく教師の判断で行っているようなものです。
仕組み: 温度で分布を「ぼかす」
ただし、素直に教師の出力を使うと困ることがあります。よく訓練されたモデルの出力は のように尖りがちで、肝心の「猫とトラックのどちらがより犬っぽいか」の差が小さすぎて、勾配にほとんど乗らないのです。
そこで 温度つきsoftmax を使います。ロジット(softmaxに入れる前の生のスコア)を で割ってから softmax にかけます。
はクラス のロジット、 は温度と呼ばれる正の数、 は温度 のもとでのクラス の確率です。 なら普通のsoftmaxで、 を大きくするほど分母の差が縮まり、分布は平らに近づきます。逆に を0に近づけると、最大値だけが1になる one-hot に潰れます。
つまり温度とは、「教師にどれくらい自信のなさを表明させるか」のつまみです。 くらいに上げると が 程度にほぐれ、埋もれていた順位関係が学習信号として使える大きさになります。
損失関数: 2つの目標を混ぜる
生徒には2つのことを同時に教えます。「正解ラベルに合わせる」ことと「教師の分布に合わせる」ことです。
第1項は普通の教師あり学習です。 が正解ラベル、 が温度1(=そのまま)での生徒の出力で、 はクロスエントロピー。第2項が蒸留の項で、 と は温度 での教師と生徒の分布、 は2つの分布のズレを測る量です(KLダイバージェンスを1から理解するで詳しく扱っています)。 は両者の配合比で、0.9のように蒸留側を重くすることが多いです。
言葉にすれば、「答え合わせは普通にやりつつ、教師のぼかした分布との距離も同時に縮めろ」という指示です。
なぜ を掛けるのか
ここが実装で一番よく間違えられる箇所です。温度 の蒸留損失を生徒のロジットで微分すると
となり、さらに が大きいとき 自体が の一次で効くため、勾配全体は のオーダーで小さくなります。つまり温度を上げるほど蒸留項の勾配が勝手に痩せていく。 を掛けるのは、その痩せ方を打ち消して、 を変えても第1項との力関係が変わらないようにするためです。これを忘れると、 を触るたびに を調整し直す羽目になります。
コードで書く蒸留
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 の向きも効いてきます。(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エンジニアや推論基盤の担当者が、「精度は足りているが、レイテンシか単価が要件を満たさない」ときに最初に検討する手段です。量子化が「同じモデルの数値を粗くする」圧縮なのに対し、蒸留は「別の小さいモデルに中身を移す」圧縮で、両者は併用できます。順序は蒸留 → 量子化が普通です。
触るもの: 温度 (画像分類なら2〜10、LLMのトークン分布は元々広いので1〜2に留めることが多い)、配合比 、生徒の層数・隠れ次元。ライブラリなら Hugging Face TRL の GKDTrainer(on-policy蒸留)や SFTTrainer(合成データ蒸留)、教師の大量生成には vLLM のバッチ推論、ロジットが要るなら logprobs の取得上限を先に確認します。検証可能なタスク(数学・コード)なら、教師の出力を正誤でふるいにかける rejection sampling を必ず挟みます。
事故になる落とし穴:
- 教師を審査員にする。教師の出力で学習した生徒を、その教師に採点させれば当然高得点が出ます。独立した評価セットと、人手または実行可能な検証(テストを通るか等)を必ず併用します。
- 温度を推論時にも掛ける。 は学習時の損失計算にだけ使うもので、デプロイした生徒は温度1で動かします。学習コードの温度がそのまま推論設定に混入する事故は珍しくありません。
- 一般能力を失う。狭い合成データだけで長く訓練すると、元々できていたことが崩れます。元データを混ぜる、学習率を下げる、LoRAで差分だけ動かす、といった手当てが要ります(破滅的忘却)。
- 語彙の不一致に気づかず logit 蒸留を書く。別ファミリー間ではロジットの次元も意味も揃いません。テキストレベルの蒸留に切り替えるのが素直な解です。
- ライセンスと規約。商用APIの出力を競合モデルの学習に使うことは、多くの利用規約で明示的に禁止されています。オープンウェイトでも、派生モデルの命名や再配布条件が定められている場合があります。技術的に可能かどうかとは別に、必ず先に確認してください。
面接や設計レビューで問われる形: 「なぜソフトラベルのほうが情報量が多いのか」「温度を上げると何が起きて、なぜ が要るのか」「forward KL と reverse KL のどちらを使うか、その理由は」。いずれも、この記事の式を1本ずつ言葉に戻せれば答えられます。
まとめ
- 知識蒸留は「正解ラベルに書かれていない、クラス間の類似構造」を教師から生徒へ渡す技術
- 温度つきsoftmaxで分布をぼかし、KLで距離を縮める。 は勾配の目減りを打ち消す係数
- 言語モデルでは、分布を写す蒸留よりも教師の生成テキストを写す蒸留が主流になった
- DeepSeek-R1 の蒸留はその極点で、写しているのは確率ではなく推論の手続きそのもの
- ただし「文体だけ写る」現象は実在する。評価設計を教師から独立させないと、良くなったつもりで終わる
コメント
コメントにはログインが必要です