学功夫的人都知道,练成绝顶高手最快的方式不是从零摸索,而是找到一位好师傅。可师傅年纪大了,总不能把自己那副筋骨也直接换了给徒弟,怎么办?师傅自有办法——他把几十年的手感、判断事物的角度、甚至招式之间的内在关系,都浓缩成一套心法口诀,让徒弟照着修炼。在深度学习中,这个过程叫做知识蒸馏(Knowledge Distillation, KD):一个已经训练好的大模型(师傅)把“它眼中的世界”教给一个小模型(徒弟),让徒弟用很小的体积继承大模型的判断能力。本文不讲怎么“拜师”,而是讲拜师之后如何进阶:怎么练内力(特征蒸馏)、怎么悟招式关系(关系蒸馏)、怎么让师兄弟互相切磋(在线蒸馏)、怎么设计练功的评分表(损失设计)、怎么把控火候(训练技巧),最后把徒弟送上擂台实战(工程实践)。

岗位关联

一句话价值:掌握知识蒸馏进阶技巧,意味着你能在手机、摄像头等资源受限设备上部署接近大模型精度的轻量模型,这是边缘计算与模型压缩工程的核心竞争力。

目录
  1. 可视化演示
  2. KD基础回顾
  3. 特征蒸馏
  4. 关系蒸馏
  5. 在线蒸馏
  6. 损失设计
  7. 训练技巧
  8. 工程实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示软标签温度蒸馏、中间层特征匹配,以及在线协同学习机制,揭示知识蒸馏从输出层到中间层的知识传递原理。

本节配有交互动效(进入视口后自动加载,约 3KB)。

'+_captions.soft+'

KD基础回顾

老掌门年事已高,他要把毕生武学传给年轻的关门弟子。可如果只让弟子拿着拳谱按部就班地学,三五年都未必摸到门道。于是掌门当着弟子的面,把每个动作放慢、拆细,甚至把那些拿捏分寸的“手感”也写进批注。在机器学习里,这个“老掌门”就是教师模型,那个抱拳学艺的弟子就是学生模型。教师模型已经在大规模数据上训练完毕,拥有强大的判断力;学生模型则小而轻,渴望从教师的判断中汲取经验。

传统硬标签只告诉模型“这张图是猫,那张图是狗”,这就像师父只说“这拳对了、那招错了”——信息量太少。知识蒸馏的关键在于:教师不只是给答案,而是给一张软标签——它不仅说这个是猫,还会说它“有 85% 像猫、10% 像狗、5% 像狐狸”。这种 0 和 1 之间的细腻程度,正是弟子快速进步的秘密。

要让输出变“软”,需要引入温度系数 T。温度把 logits(模型输出的原始分数)的差距摊平,让概率分布从一锋尖锐的独热态,变成缓缓起伏的山丘。

qi=exp⁡(zi/T)∑j=1Kexp⁡(zj/T)\displaystyle q_i = \frac{\exp(z_i / T)}{\sum_{j=1}^{K} \exp(z_j / T)}

1. 取原始分数:$z_i$ 是模型对第 $i$ 类输出的原始分数(logit),好比弟子对每个招式的本能评分。

ziz_i

2. 除以温度:$z_i / T$ 将打分整体缩放。$T > 1$ 时分数差距被压缩,分布显得“圆润”;$T < 1$ 时差距被放大,分布更“锋利”。

ziT\frac{z_i}{T}

3. 指数化:$\exp(z_i / T)$ 将分数映射为正数,确保每个类别都有正的“权重感”,也让后续归一化有意义。

exp⁡(ziT)\exp\left(\frac{z_i}{T}\right)

4. 归一化:除以所有类别的指数和 $\sum_{j=1}^{K} \exp(z_j / T)$,得到一组总和为 1 的软概率,相当于把师父批注整理成一张权重配方表。

qi=exp⁡(zi/T)∑j=1Kexp⁡(zj/T)q_i = \frac{\exp(z_i / T)}{\sum_{j=1}^{K} \exp(z_j / T)}

基本功扎实了,下一步就要练“内功”了——让弟子的内力运行轨迹与师父一致,这就是特征蒸馏。

特征蒸馏

第一课教完了招式套路,但弟子打出来的拳总缺一点师父的“劲”。师父发现,问题不在手脚动作,而在内力的运行路线——徒弟的内息在经脉里走得偏了。在深度学习里,“内息”就是网络的中间层特征图。特征蒸馏的初衷是:不仅要让学生的最终输出向教师靠近,还要让它在中间层看到教师看到的东西、记住教师记下的模式。

技术实现上,我们取教师网络某一层的特征图 $f_T(x)$,与学生网络对应位置的特征图 $f_S(x)$ 做对齐。由于学生网络通道数通常更少,我们可以加一个 1×1 卷积把学生特征投影到教师特征相同的维度,再计算逐像素的差异。这个差异越小,说明弟子的“内功运行路线”越接近师父。

一种最直接的约束是均方误差损失:

Lfeat(x)=12∥fS(x)−fT(x)∥22\displaystyle \mathcal{L}_{feat}(x) = \frac{1}{2} \left\| f_S(x) - f_T(x) \right\|_2^2

1. 同时喂入样本:$x$ 是一张输入图片,同一时刻被教师和学生两个网络读取,保证两者看到的是同一道题。

xx

2. 教师中间特征:$f_T(x)$ 是教师网络在某层计算出的特征图,可以看成师父运功时在某处经脉的内力强度分布。

fT(x)f_T(x)

3. 学生中间特征:$f_S(x)$ 是学生网络在同一层输出的特征图,即徒弟同一水平线上的内力分布。

fS(x)f_S(x)

4. 逐元素差平方:$\left\| f_S(x) - f_T(x) \right\|_2^2$ 是逐元素相减、平方求和得到的标量,数值越大代表偏差越大。前面乘 $\frac{1}{2}$ 是为了后续求导时把系数抹平,计算更简约。

12∥fS(x)−fT(x)∥22\frac{1}{2} \left\| f_S(x) - f_T(x) \right\|_2^2

通过约束内息路线,弟子不用重走师父几十年的弯路,功夫直接上了一个台阶。但只练内功还不够——师父发现,徒弟不懂招式与招式之间的关系,这引出了关系蒸馏。

关系蒸馏

师父让弟子同时练“白鹤亮翅”和“云手”。弟子单独练时动作都很标准,但一串联起来就生硬。问题出在徒弟还没领悟两招之间的“关系”:白鹤亮翅要接在云手之后,重心先沉再提,才顺。这就是关系蒸馏的直觉——不要只看单样本的输出是否一致,还要让学生学会样本与样本之间的相对结构。

具体做法是:把一批样本两两配对,先计算教师眼中每对样本的关系(比如特征之间的余弦相似度),再计算学生眼中同样这对样本的关系,然后要求两边的关系数值尽量一致。

Lrel=∑i≠j(cos⁡(fT(xi),fT(xj))−cos⁡(fS(xi),fS(xj)))2\displaystyle \mathcal{L}_{rel} = \sum_{i \neq j} \left( \cos\big(f_T(x_i), f_T(x_j)\big) - \cos\big(f_S(x_i), f_S(x_j)\big) \right)^2

1. 构建样本对:$(x_i, x_j)$ 是同一个 batch 里的两张不同图片,$i \neq j$ 保证不比较同一个样本本身。

(xi,xj),i≠j(x_i, x_j), \quad i \neq j

2. 教师的关系度量:$\cos(f_T(x_i), f_T(x_j))$ 表示教师眼中这对样本的相似度——相当于师父心里这两招是不是同一路数。

cos⁡(fT(xi),fT(xj))\cos\big(f_T(x_i), f_T(x_j)\big)

3. 学生的关系度量:$\cos(f_S(x_i), f_S(x_j))$ 是学生自己心中同对样本的相似度——徒弟的“套路归类”是否与师父一致。

cos⁡(fS(xi),fS(xj))\cos\big(f_S(x_i), f_S(x_j)\big)

4. 求差平方:把两种相似度相减、取平方,误差越大惩罚越大,驱动学生向老师的“关系视角”靠拢。

(cos⁡(fT(xi),fT(xj))−cos⁡(fS(xi),fS(xj)))2\left( \cos\big(f_T(x_i), f_T(x_j)\big) - \cos\big(f_S(x_i), f_S(x_j)\big) \right)^2

当弟子学会了招式之间的关系,他的武学就不仅限于零散招式,而是成体系的套路。不过,无论是师父单方面传授还是同门对练,都需要解决一个关键问题——谁来当老师?接下来请看在线蒸馏。

在线蒸馏

虽然离线蒸馏稳定可靠,但有个前提:必须有一位已经练成的大师兄或老师傅给你当标杆。很多时候我们手里只有一群水平相近的“同龄弟子”,没有现成的大师。在线蒸馏的思路由此而生:两个(或多个)学生模型一起训练,一边学真实标签,一边把自己的预测“软观点”告诉对方,互为老师。

这种做法最典型的算法叫互学习(Mutual Learning):两个结构不同的网络同时被训练,每个网络同时受两条监督——硬标签监督让它扎实掌握基本功,软标签监督让它吸收对手的判断偏好。这样,虽然两个模型都没见过大师,但在互相切磋中,它们的决策边界能相互修正,最终都比单独训练表现更好。

如果把 A 的损失写下来,它长这样:

LA=(1−α) LCE(y,pA)+α DKL(pBτ∥pAτ)\displaystyle \mathcal{L}_{A} = (1-\alpha)\,\mathcal{L}_{CE}\left(y, p_A\right) + \alpha\,\mathcal{D}_{KL}\left(p_B^{\tau} \| p_A^{\tau}\right)

1. 硬标签监督:$\mathcal{L}_{CE}(y, p_A)$ 是网络 A 在真实标签上的交叉熵损失,保证弟子不离基本功的谱。

LCE(y,pA)\mathcal{L}_{CE}\left(y, p_A\right)

2. 软化对方的观点:$p_B^{\tau}$ 表示网络 B 在经过温度 $\tau$ 软化后的输出分布,也就是 B 的心得批注。

pBτ=softmax⁡(zB/τ)p_B^{\tau} = \operatorname{softmax}\left(z_B / \tau\right)

3. KL 散度对齐:$\mathcal{D}_{KL}\left(p_B^{\tau} \| p_A^{\tau}\right)$ 度量 A 的分布与 B 的分布之间的差异,令 A 向 B 的“手感”靠近。

DKL(pBτ∥pAτ)\mathcal{D}_{KL}\left(p_B^{\tau} \| p_A^{\tau}\right)

4. 加权融合:$(1-\alpha)$ 与 $\alpha$ 权衡“基本功”与“同门经验”,$\alpha$ 常取 0.5~0.7,让两边均衡吸收。

(1−α) LCE+α DKL(1-\alpha)\,\mathcal{L}_{CE} + \alpha\,\mathcal{D}_{KL}

对应地,B 的损失就是把角色互换,也要去拟合 A 的软标签。这就像两个弟子在比武场上互喂招:你暴露你的偏误,我修正我的偏误,最后两个人都变得更全面。

损失设计

前面讲了三种从不同层面传递知识的手段——软标签、特征、关系。实战中很少只用其中一种,而是把它们拼成一张“总成绩单”,分别赋予不同的权重。就像师父期末考评:基本功占 50%,实战切磋占 30%,内功特色占 20%。损失函数的配方决定了学生最终的火候偏向,这是调参工程里最核心的一步。

我们可以把最终损失写成:

Ltotal=α Lsoft+β Lhard+γ Lfeat+λ Lrel\displaystyle \mathcal{L}_{total} = \alpha\,\mathcal{L}_{soft} + \beta\,\mathcal{L}_{hard} + \gamma\,\mathcal{L}_{feat} + \lambda\,\mathcal{L}_{rel}

1. 软标签损失:$\mathcal{L}_{soft}$ 是学生与教师 logits 用温度 T 软化后的 KL 散度或交叉熵,负责传承“知识手感”。

Lsoft=1N∑iT2⋅DKL(pTτ∥pSτ)\mathcal{L}_{soft} = \frac{1}{N}\sum_i T^2 \cdot \mathcal{D}_{KL}\left(p_T^\tau \| p_S^\tau\right)

2. 硬标签损失:$\mathcal{L}_{hard}$ 是学生与真实标签的交叉熵,负责兜底,避免学生被教师的偏见带偏。

Lhard=1N∑iCE(yi,pS(xi))\mathcal{L}_{hard} = \frac{1}{N}\sum_i \mathrm{CE}\left(y_i, p_S(x_i)\right)

3. 特征损失:$\mathcal{L}_{feat}$ 是师生中间特征图差异的均方误差,负责矫正“内功走向”。

Lfeat=12∥fS(x)−fT(x)∥22\mathcal{L}_{feat} = \frac{1}{2}\left\| f_S(x) - f_T(x) \right\|_2^2

4. 关系损失:$\mathcal{L}_{rel}$ 是师生在样本对关系上的误差平方和,负责传承“招式间的结构观”。

Lrel=∑i≠j(cos⁡ij(T)−cos⁡ij(S))2\mathcal{L}_{rel} = \sum_{i \neq j}\left( \cos_{ij}^{(T)} - \cos_{ij}^{(S)} \right)^2

5. 加权求和:$\alpha, \beta, \gamma, \lambda$ 四个超参数是调参“火候”,通常先用验证集搜索一组基准,再根据任务难度微调。

Ltotal=α Lsoft+β Lhard+γ Lfeat+λ Lrel\mathcal{L}_{total} = \alpha\,\mathcal{L}_{soft} + \beta\,\mathcal{L}_{hard} + \gamma\,\mathcal{L}_{feat} + \lambda\,\mathcal{L}_{rel}

光有好的成绩单还不够,练功的时间安排同样重要,比如什么时候把火候加大、什么时候该平滑过渡,这就是下一节的训练技巧。

训练技巧

同样的师父、同样的弟子,不同练功节奏可能会练出截然不同的水平。知识蒸馏里也有类似的经验:什么时候用高温把软标签调“软”、什么时候降温让它变“锐利”,哪个阶段该加入特征层对齐,都是可以设计的。

一个常用的技巧是温度退火:训练初期让 T 大一些,学生在平滑分布下先掌握大致的类别关系;随着训练进行逐步降低 T,让软标签逐渐向硬标签过渡,学生就能从“粗学”进入“精修”。另一个实用技巧是 EMA(指数移动平均),它把模型参数的最近若干步平均值作为最终权重,能有效抑制训练后期梯度的抖动。

把 EMA 写成式子:

wema(t)=m⋅wema(t−1)+(1−m)⋅wstudent(t)\displaystyle w_{ema}^{(t)} = m \cdot w_{ema}^{(t-1)} + (1 - m) \cdot w_{student}^{(t)}

1. 上一步的记忆:$w_{ema}^{(t-1)}$ 是历史平均的参数——像一个记录着师父多年练功数据的“身体记忆”。

wema(t−1)w_{ema}^{(t-1)}

2. 最新的学生参数:$w_{student}^{(t)}$ 是当前训练步学生模型的参数——弟子今天新领悟的“肌肉感觉”。

wstudent(t)w_{student}^{(t)}

3. 衰减系数:$m$ 通常取 0.99~0.999,控制记忆的衰减速度,$m$ 越大越依赖历史记忆。

mm

4. 加权合并:$m \cdot w_{ema}^{(t-1)} + (1 - m) \cdot w_{student}^{(t)}$ 把“旧经验”与“新直觉”融合在一起,实现参数的平滑演进。

m⋅wema(t−1)+(1−m)⋅wstudent(t)m \cdot w_{ema}^{(t-1)} + (1 - m) \cdot w_{student}^{(t)}

除了温度退火和 EMA,课程蒸馏也常被提及:先让学生学简单的样本子集,再逐步加入困难样本,就像弟子先从站桩、马步练起,再上擂台对练。火候、节奏对了,功夫就水到渠成。

工程实践

训练最终要落到部署上。知识蒸馏的终极目标不是让学术指标好看,而是让弟子真正能“下山独当一面”。在移动端、嵌入式设备上,大模型往往跑不动;但小模型很轻松。蒸馏出的学生模型通常参数只有教师的 1/5 到 1/10,推理速度却有数倍提升。

可以用一个加速比来量化成果:

S=tteachertstudent\displaystyle S = \frac{t_{\text{teacher}}}{t_{\text{student}}}

1. 教师推理耗时:$t_{teacher}$ 是教师模型在目标设备上推理一次的平均耗时,比如 30 ms。

tteacher=30 mst_{\text{teacher}} = 30\ \mathrm{ms}

2. 学生推理耗时:$t_{student}$ 是学生模型在同一设备上的平均推理耗时,比如只有 5 ms。

tstudent=5 mst_{\text{student}} = 5\ \mathrm{ms}

3. 求比值:$S = t_{teacher} / t_{student}$ 把成本折算成一个倍数,方便向业务方汇报压缩收益。

S=305=6S = \frac{30}{5} = 6

工程上,常用流程是:先在 GPU 上用大模型做离线推理,生成软标签;再用软标签和硬标签一起训练小模型;最后把学生模型导出为 ONNX / TensorRT / 量化格式部署到端侧。评测时不能只看准确率,还要看延迟、吞吐、内存占用三个维度,才能证明这套“传功”真的带来了实际收益。

AI 应用场景

移动端实时人像分割模型轻量化

阶段:模型训练与部署优化

解决的问题:手机端算力有限,直接跑大模型会导致发热、掉帧。传统的量化裁剪虽然能压缩模型,但精度损失明显。知识蒸馏让大模型当“老师”,把已学到的判别逻辑教给轻量学生网络,能在压缩参数的同时保住精度。

具体案例:某美颜团队在 GPU 上训练了 ResNet-101 人像分割大模型,用特征蒸馏技术将知识传给 MobileNetV3 结构的学生模型。部署后单帧推理时间从 45ms 降到 8ms,IoU 仅下降 1.2 个百分点,实现了 60fps 的实时分割。

推荐系统双模型在线互蒸馏

阶段:训练阶段(无预训练大模型)

解决的问题:实际项目中往往没有现成的教师模型,但又希望多个小模型比单一模型更强。在线蒸馏让多个模型在训练过程中互相做软标签指导,相当于团队协作,成本低收益明显。

具体案例:某推荐团队用两个不同结构的精排模型(DIN 与 DeepFM)做在线互蒸馏,互相拿对方的 logits 作软标签。离线 AUC 各提升约 0.4%,线上点击率提升 0.15%,且没有任何额外推理成本。

Python 演示

python80 行
import torchimport torch.nn as nnimport torch.nn.functional as Ffrom torch.utils.data import DataLoader, TensorDataset torch.manual_seed(42)  class NetA(nn.Module):    def __init__(self):        super().__init__()        self.layers = nn.Sequential(            nn.Linear(16, 24), nn.ReLU(),            nn.Linear(24, 3)        )     def forward(self, x):        return self.layers(x)  class NetB(nn.Module):    def __init__(self):        super().__init__()        self.layers = nn.Sequential(            nn.Linear(16, 12), nn.ReLU(),            nn.Linear(12, 3)        )     def forward(self, x):        return self.layers(x)  def soft_loss(student_logits, teacher_logits, T):    s_log = F.log_softmax(student_logits / T, dim=1)    t_prob = F.softmax(teacher_logits.detach() / T, dim=1)    return F.kl_div(s_log, t_prob, reduction="batchmean") * T * T  def train_one_epoch(net_a, net_b, loader, opt_a, opt_b, alpha=0.7):    for batch_x, batch_y in loader:        logits_a = net_a(batch_x)        logits_b = net_b(batch_x)        loss_a = (1 - alpha) * F.cross_entropy(logits_a, batch_y) + alpha * soft_loss(logits_a, logits_b, T=3.0)        opt_a.zero_grad()        loss_a.backward()        opt_a.step()        loss_b = (1 - alpha) * F.cross_entropy(logits_b, batch_y) + alpha * soft_loss(logits_b, logits_a, T=3.0)        opt_b.zero_grad()        loss_b.backward()        opt_b.step()  def evaluate(net, X, y):    with torch.no_grad():        pred = net(X).argmax(dim=1)        return (pred == y).float().mean().item()  def main():    X = torch.randn(600, 16)    y = ((X[:, 0] > 0).long() + (X[:, 1] > 0).long()) % 3    loader = DataLoader(TensorDataset(X, y), batch_size=64, shuffle=True)     net_a = NetA()    net_b = NetB()    opt_a = torch.optim.Adam(net_a.parameters(), lr=1e-2)    opt_b = torch.optim.Adam(net_b.parameters(), lr=1e-2)     for epoch in range(15):        train_one_epoch(net_a, net_b, loader, opt_a, opt_b)        if (epoch + 1) % 5 == 0:            acc_a = evaluate(net_a, X, y)            acc_b = evaluate(net_b, X, y)            print(f"epoch {epoch + 1:2d} | NetA acc: {acc_a:.3f} | NetB acc: {acc_b:.3f}")     print("在线蒸馏完成:两个陪练网络互相传递软标签,共同提升")  if __name__ == "__main__":    main()
目的:这段脚本演示在没有预训练大模型的情况下,用两个小模型做在线互蒸馏——互相监督软标签,共同进步。
  1. def soft_loss(student_logits, teacher_logits, T):定义软标签蒸馏损失函数,用 KL 散度让“学生”贴近“老师”的手感。
  2. t_prob = F.softmax(teacher_logits.detach() / T, dim=1)把教师的 logits 按温度 T 软化,detach() 保证教师侧不回传梯度,师徒关系单向稳定。
  3. return F.kl_div(s_log, t_prob, reduction="batchmean") * T * T返回 KL 散度;乘 $T^2$ 恢复梯度尺度,让损失不会因温度任意缩放而失真。
  4. loss_a = (1 - alpha) * F.cross_entropy(logits_a, batch_y) + alpha * soft_loss(logits_a, logits_b, T=3.0)网络 A 的总损失:30% 靠自己看真实标签,70% 从同伴 B 那里学软标签。
  5. opt_a.zero_grad(); loss_a.backward(); opt_a.step()PyTorch 标准三步:清梯度、反传、更新参数。
  6. loss_b = (1 - alpha) * F.cross_entropy(logits_b, batch_y) + alpha * soft_loss(logits_b, logits_a, T=3.0)网络 B 的损失是对称的,它也在认真听 A 的“心得”,形成互教互学。

常见误区

误区“软标签就是要平滑,把 T 设成 20,所有类别都分不太清,学生学起来应该最轻松、效果最好。”

正解温度太大,分布被摊成近似均匀,教师好不容易学到的类别区分信息全被“抹平”,学生从这种软标签里学不到有效结构。实践中 T 常在 3~6 之间效果较好,既能传递类别间的相似度,又不丢失关键对比信息。就像师父说话太温和、每句都不痛不痒,徒弟反而抓不住重点。

为何常见:人的直觉是“越平滑 = 越柔和 = 越容易学”,却没意识到过高的温度会让信号完全淹没在噪声里。

误区“蒸馏时把学生的损失换成软标签损失就可以了,真实标签没必要再用了。”

正解软标签来自教师,教师的判断并非总是正确。硬标签提供“标准答案基准”,让模型保持正确方向。实践中通常把两者按比例相加(如软标签 0.7、硬标签 0.3),一主一辅,互补前行。就像徒弟不能只模仿师父的偏好,还得每天对照拳谱校正基本功。

为何常见:初学者认为蒸馏的核心就是软标签,误以为硬标签是旧方法,不自觉地把它“扔掉”。

误区“干脆把每一层的特征都拿出来做损失,对齐的层数越多,学生肯定越接近老师。”

正解学生的容量远小于教师,强行逐层对齐会让它丧失自己的特征提取自由度,容易“学形不学神”,反而过拟合到模仿。通常只对齐最后两个高层语义特征或特定注意力图即可,效果更好还省显存。练武也是一样,师父只需纠正几个关键发力点,不必每块肌肉都捏一遍。

为何常见:把“越严格越精细”等同于“越好”,忽略了学生容量有限的限制。

误区“我的 NetA 明显比 NetB 强,让 NetA 去拟合 NetB 的软标签,会拉低 NetA 的成绩。”

正解在线蒸馏中,A 拟合的是 B 的“错误模式 + 决策倾向”,这种正则化信号能帮 A 减少对训练样本的过拟合。就像两个棋手对弈,即使对方水平稍逊,也会暴露出新的思路漏洞,帮强者补全盲区。

为何常见:大家习惯用“强者恒强”的竞争思维看待模型,忽略了高质量协作可以互相受益。

面试题

Q1. 在知识蒸馏中,温度系数 T 越大,教师模型的软标签分布会怎样变化?

单选题 · easy

  • A.分布变得更加尖锐
  • B.分布变得更加平滑← 正确答案
  • C.分布完全不发生变化
  • D.分布向硬标签靠拢

答案:B。T 越大,logits 除以 T 后差距被压缩,softmax 后分布越平缓;T 越小越尖锐。就像师父说话越温和,各个招式的批注差距就越不悬殊。

Q2. 相比硬标签,软标签最大的优势是什么?

单选题 · mid

  • A.能提供类别间的相对相似度← 正确答案
  • B.能够减少模型的参数量
  • C.训练过程不再需要真实标签
  • D.保证模型一定不会过拟合

答案:A。软标签不仅是“猫 vs 狗”的二分答案,还包含“猫和狗很像、猫和汽车差很远”的相对关系,能传递教师看到的类间结构。它不减少参数,也不能替代真实标签。

Q3. 特征蒸馏中,拉近师生中间特征差异时,通常用什么损失?

单选题 · mid

  • A.交叉熵损失
  • B.均方误差损失← 正确答案
  • C.余弦角度损失
  • D.对比增强损失

答案:B。均方误差损失能对特征图逐元素计算差平方和,直接对齐“内功走向”。交叉熵用于分类输出,余弦角度更适合关系度量,对比损失则用于表征学习,都不如 MSE 直接。

Q4. 关系蒸馏主要关注样本之间的什么信息?

单选题 · mid

  • A.样本间的相对相似度← 正确答案
  • B.样本的独立特征数值
  • C.样本的独热标签编码
  • D.样本的推理速度差异

答案:A。关系蒸馏把样本两两配对,比较教师与学生眼中对样本关系的相似度判断,让学生学到“招式之间”的结构化关系,而不是单个样本的孤立特征。

Q5. 在线蒸馏与离线蒸馏的核心区别是什么?

单选题 · hard

  • A.只有在线蒸馏需要用温度软化
  • B.教师模型在训练中持续更新← 正确答案
  • C.在线蒸馏不需要任何损失函数
  • D.学生模型的网络层数必须相同

答案:B。离线蒸馏的教师模型参数冻结、只做静态标杆;在线蒸馏没有固定教师,两个网络同时训练、彼此把对方当老师持续更新。所以在在线训练中,“教师”也在持续进化。

Q6. 在线蒸馏中,网络 A 的损失通常包含哪两大部分?

单选题 · mid

  • A.硬标签交叉熵与软标签 KL 散度← 正确答案
  • B.生成对抗损失与重建损失
  • C.特征距离损失与梯度惩罚
  • D.对比损失与三元组损失

答案:A。在线蒸馏的每个网络既要用真实标签兜底,也要拟合同伴的软化分布,这正是“基本功 + 同门切磋”的双通道设计。GAN 与重构属于生成模型方法,不在标准蒸馏框架内。

Q7. 知识蒸馏训练结束后,实际部署时应该怎么处理模型?

单选题 · easy

  • A.部署教师模型
  • B.部署学生模型← 正确答案
  • C.教师学生融合
  • D.交替部署两者

答案:B。蒸馏只是训练手段,最终目的是让轻量学生模型继承教师的知识。部署时只保留学生模型,才能获得速度、体积上的收益;教师模型只在训练阶段发挥作用。

Q8. 在温度 T=1 的情况下,软化后的分布与原模型输出有什么关系?

单选题 · easy

  • A.与原始 Softmax 分布相同← 正确答案
  • B.变成均匀分布的随机噪声
  • C.演变为独热硬标签形式
  • D.不再具有概率性质

答案:A。T=1 相当于不软化,$\operatorname{softmax}(z/1)=\operatorname{softmax}(z)$,与原始输出一致。只有 T>1 时才产生平滑效果,T 趋近 0 时才接近独热。

Q9. 下面哪些属于蒸馏训练中的进阶技巧?

多选题 · hard

  • A.温度退火调整← 正确答案
  • B.课程蒸馏安排← 正确答案
  • C.EMA 参数平稳← 正确答案
  • D.冻结教师全部层

答案:ABC。温度退火(逐渐降低 T)、课程蒸馏(由易到难)、EMA 参数平滑都是进阶训练技巧。冻结教师层属于离线蒸馏的标准设定,不算特殊技巧。

Q10. 常见的蒸馏损失成分包括哪些?

多选题 · mid

  • A.软标签损失← 正确答案
  • B.硬标签损失← 正确答案
  • C.特征对齐损失← 正确答案
  • D.梯度惩罚损失

答案:ABC。总损失通常由软标签损失、硬标签损失、特征对齐损失、关系损失等按权重组合。梯度惩罚属于 GAN 与正则化领域的概念,不是通用蒸馏损失的组成。