🧪 知识蒸馏(Knowledge Distillation)

用大模型(教师)的「软知识」训练小模型(学生)

← 返回主页

📚 核心思想

知识蒸馏由 Hinton 等人在 2015 年系统推广:先训练一个能力强但笨重的教师模型, 再让一个轻量的学生模型不仅学习真实标签(硬标签),还学习教师对各类别的概率分布(软标签)。

软标签里含有「各类别相对可能性」——例如某张图 90% 像猫、8% 像狗,这种暗知识(dark knowledge)比单纯的「是猫」信息更丰富,小模型更容易学到类间相似性。

① 训练好教师 \(f_T\)
② 教师对样本输出 logits / 概率
③ 学生 \(f_S\) 拟合硬标签 + 软标签
④ 部署轻量学生
🎓 生活类比: 资深老师(教师)不只告诉你「选 A」,还会说「A 最像,但 B 也沾点边」。 学生若只听标准答案(硬标签),容易学得生硬;若也听这种带相对关系的讲解(软标签),往往用更小本子(更少参数)也能考得更好。

🧮 损失函数与温度 \(T\)

\[ p_i = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)} \]

对 logits \(z\) 除以温度 \(T\) 再 softmax:\(T\) 越大,分布越「软」(各类概率更接近);\(T=1\) 为普通 softmax。

\[ \mathcal{L} = \alpha\, \mathcal{L}_{\text{hard}}(y,\, p^S) + (1-\alpha)\, T^2\, \mathcal{L}_{\text{KL}}\bigl(p^T \,\|\, p^S\bigr) \]

\(\mathcal{L}_{\text{hard}}\):学生与真实标签的交叉熵;\(\mathcal{L}_{\text{KL}}\):学生与教师软分布的 KL 散度。 乘以 \(T^2\) 是为了保持梯度尺度(Hinton 原文中的标准做法)。\(\alpha\) 在硬/软损失间权衡。

🏷️ 硬标签 vs 软标签

对同一个样本 \((x_1, x_2)\),本演示里会有两种「正确答案」形式: 硬标签来自数据生成规则算出的真实类别 \(y\); 软标签来自已训练教师对该点的类别概率(经温度 \(T\) 的 softmax)。

硬标签(Hard Label)

只告诉你唯一正确类别,常见写法是 one-hot 向量或整数 \(y \in \{0,1\}\)。 例如真实类别为 1 时,硬标签可写成 \([0,\,1]\)——类 0 概率为 0,类 1 概率为 1,没有「也许有点像另一类」的信息。

在本页散点图上,每个点的颜色就是硬标签:蓝点 \(y=0\),橙点 \(y=1\)。 点 ② 学生(仅硬标签) 的损失只含 \(\mathcal{L}_{\text{hard}}\),相当于只背标准答案。

示例:真实 y=1 → 硬标签 phard = [0, 1]

软标签(Soft Label)

教师对各类别给出的概率分布,各类概率之和为 1,且错误类上往往仍有非零概率。 例如 \([0.12,\,0.88]\) 表示「更像类 1,但类 0 也有一点可能」——这就是暗知识:类间相对关系。

温度 \(T\) 越大,分布越平坦(更「软」);\(T=1\) 为教师普通预测。 点 ③ 学生(蒸馏) 同时学硬标签与教师的软分布(\(\mathcal{L}_{\text{hard}} + \mathcal{L}_{\text{KL}}\))。 下方大图里的紫色背景即教师在各处的软概率(类 1 越深紫越高)。

示例:教师输出(T=4)→ 软标签 pT ≈ [0.22, 0.78]
📌 本演示的数据设定: 教师与两种学生使用的是同一批 120 个合成样本(同一份坐标与硬标签 \(y\))。 点击「重新生成数据」会整批换点,但换完后教师、硬标签学生、蒸馏学生仍共用这一批; 没有划分训练集 / 测试集,准确率也是在同一批点上统计的。

这与常见知识蒸馏流程一致:学生在与教师相同(或教师已标注)的训练数据上学习; 差别在于监督信号——② 只有硬标签,③ 额外用教师在同一点上给出的软标签。 真实项目里教师可能先在更大数据上预训练,也可能另有验证集;本页为便于对比做了简化。

⚖️ 为何有效 & 常见变体

要点 说明
暗知识 错误类上的非零概率揭示类间相似度(如 7 与 1 的写法)
正则化效果 软目标相当于平滑标签,减轻学生过拟合硬 one-hot
模型压缩 大模型 → 小模型,适合边缘部署、低延迟推理
自蒸馏 / 在线蒸馏 同一网络不同层或不同 checkpoint 互教,无需独立大模型
特征蒸馏 对齐中间层表示,不只对齐输出概率

📦 演示数据如何生成?

本页数据全是合成的二维二分类,用于教学,并非真实采集数据。生成方式统一为两步:

  1. 随机采样坐标 \((x_1, x_2)\):按所选规则从某种分布里抽点(多为高斯或均匀);
  2. 确定性打标签 \(y \in \{0,1\}\):用固定公式由坐标算出类别(同一坐标永远同一标签)。

点击「重新生成数据」会重新随机抽点,但打标公式不变;切换下方数据类型会换一套公式。网络权重初始化也含随机性,故每次完整实验结果会略有波动。

🎮 交互演示:二维分类小例子

教师是较大的神经网络(2→24→24→2,tanh),学生是线性分类器(2→2,容量小)。 三者共用当前画面上的同一批 120 个点(见上文「硬标签 vs 软标签」)。 对比「只学硬标签」(②)与「硬标签 + 教师软标签蒸馏」(③)时的决策边界与准确率。

选择数据生成规则

300

👀 如何从图上看蒸馏效果?

建议按顺序点按钮:① 训练教师 → ② 仅硬标签 → ③ 蒸馏,再对照下面三张图与损失曲线。参数可先设 T≈4α≈0.3,数据类型选「环带⊕象限」或「XOR」更容易看出差别。

散点颜色
● 蓝点 = 真实类别 0, ● 紫点 = 真实类别 1。 分类对了 = 边界把同色点分在同侧。
决策边界线
线是模型「认为 0/1 分界」的位置(须先点对应训练按钮才会出现):紫线+白边教师、灰线硬标签学生、绿线蒸馏学生。 紫线与紫点同色,教师图用白边描边以便辨认。
准确率数字
各图上方「训练集准确率」= 有多少散点被分对(本演示未单独划测试集)。 一般:教师最高 → 蒸馏学生次之且接近教师 → 仅硬标签最低。
大图背景色
仅蒸馏图有:淡紫区域 = 教师认为「更像类 1」。 绿线若贴着紫色背景形状走,说明学生在学教师的软知识,而不只是死记 0/1。
✅ 蒸馏「有效」时,你通常会看到:
  • 蒸馏图 绿线 与教师 紫线 形状更接近,而 灰线 更直、更偏、或明显偏到一侧;
  • 蒸馏学生准确率 高于 仅硬标签学生(可多试几次「重新生成」或换 XOR / 环带数据);
  • 错分点(边界切进对方色块里的点)在蒸馏图上 更少
  • 损失曲线里 绿色(蒸馏)最终往往不低于灰色,且边界更合理时准确率更高。
⚠️ 若看不出差别,可尝试: 把 T 调到 3–6(太小≈硬标签)、α 降到 0.2–0.4、选更难的数据(XOR / 双螺旋)、或增加学生训练轮数。

完成训练后,这里会显示针对当前结果的简要读图提示。

🎓 教师(大网络)

未训练

点击 ① 训练教师 后:淡紫背景 = 教师认为「像类 1」的区域;紫线/橙点 = 决策边界(P=50%)。若准确率约 60% 且无紫线,多为教师塌缩成「几乎全判一类」——请再点训练或看「概率跨度」是否 >20%。

📋 学生 · 仅硬标签

未训练

线性学生能力弱:灰线多为直线或很简单;错分点多、准确率通常明显低于教师。

✨ 学生 · 知识蒸馏(硬 + 软)

未训练
背景:教师对「类 1」的置信度(越紫越像 1) 绿线:蒸馏学生边界 灰虚线:硬标签学生边界(需先训练②)

重点对比:绿线是否比灰线更贴近背景紫区与教师紫线;绿线若更贴合弯曲分界,即蒸馏在起作用。

损失曲线:数值越低不一定等于分得更准,最终以图上边界与准确率为准;绿色为蒸馏总损失(含软标签项)。

🌍 应用场景

  • BERT → DistilBERT、大语言模型 → 小模型部署
  • 视觉 backbone 压缩(ResNet → MobileNet 系列常结合蒸馏)
  • 集成多模型蒸馏为单模型(ensemble distillation)

📖 扩展阅读