1.2 知识蒸馏的定义与核心思想


文档摘要

1.2 知识蒸馏的定义与核心思想 本节摘要:知识蒸馏是让小模型以大模型的输出分布为学习目标的迁移训练方法。本节从 Hinton 2015 年的奠基工作讲起,说清硬目标与软目标的差别、温度的原始直觉,并给出全册沿用的定义——蒸馏学的不是答案本身,而是老师傅对答案之间关系的判断。 上一节算清了三道墙的账,知道"直接换小模型"会掉精度;本节回答蒸馏凭什么能把这个坑填上一截。答案是它改了学习对象:让徒弟不背标准答案,改学老师傅的判断方式。这个思想定位在第一章、也在全册的概念地基上,第二章讲的三种知识形态都从这里生发。 一个反例开场:错误答案里也有营养 设想一个手写数字分类器,看到一张写得很潦草的"3"。它输出:数字 3 的概率 0.85,数字 8 的概率 0.12,数字 5 的概率 0.

1.2 知识蒸馏的定义与核心思想

本节摘要:知识蒸馏是让小模型以大模型的输出分布为学习目标的迁移训练方法。本节从 Hinton 2015 年的奠基工作讲起,说清硬目标与软目标的差别、温度的原始直觉,并给出全册沿用的定义——蒸馏学的不是答案本身,而是老师傅对答案之间关系的判断。

上一节算清了三道墙的账,知道"直接换小模型"会掉精度;本节回答蒸馏凭什么能把这个坑填上一截。答案是它改了学习对象:让徒弟不背标准答案,改学老师傅的判断方式。这个思想定位在第一章、也在全册的概念地基上,第二章讲的三种知识形态都从这里生发。

一个反例开场:错误答案里也有营养

设想一个手写数字分类器,看到一张写得很潦草的"3"。它输出:数字 3 的概率 0.85,数字 8 的概率 0.12,数字 5 的概率 0.03,其余接近零。标准答案只说"这是 3",但模型这份输出还说了两句悄悄话:它觉得这字有点像 8,不太像 5。这个"像 8 不像 5"的判断,就是关于类别之间相似性的知识——数字 8 和 3 长得像,3 和汽车完全不像。硬标签把这些信息全部抹掉了:对就是对,错就是错,一律平等地错。

教师模型经过海量数据训练,它的"错误倾向"远比随机猜更有结构。让学生模型学习这种结构,等于在标准答案之外又发了一份"相似度地图"。这就是蒸馏全部魔力的来源。

核心思想与定义

综合 Hinton 及后续研究者的表述,本册采用如下定义:

知识蒸馏(Knowledge Distillation)是一类模型压缩与知识迁移方法:以一个或多个训练完成的教师模型的输出(概率分布、中间特征或样本间关系)作为监督信号的一部分,训练一个轻量的学生模型,使其在推理精度上逼近教师、在计算与存储成本上远小于教师。

拆开看有三个关键成分。其一,监督信号不再只有真实标签;其二,信号形式是"分布"而非"点位",分布天然携带类间关系;其三,目标是逼近教师而非超越教师,但实践中学生常能反超同规模从头训练的模型,机理留到 3.3 细讲。

把"像 8 不像 5"这类信息显形,靠的是温度。普通 softmax 在概率差距大时输出近乎 one-hot,小概率类别被压得几乎为零;把 logits 除以一个大于 1 的温度 T 再做 softmax,分布立刻平缓下来:

import torch import torch.nn.functional as F logits = torch.tensor([[8.0, 6.5, 1.2, 0.3]]) # 某样本在猫、狗、鸟、汽车上的原始打分 for T in [1.0, 2.0, 4.0, 8.0]: p = F.softmax(logits / T, dim=-1) print(f"T={T}: 概率分布 = {p.numpy().round(3)}") # 输出示例: # T=1.0: 概率分布 = [[0.817 0.182 0.001 0. ]] # T=2.0: 概率分布 = [[0.655 0.309 0.022 0.014]] # T=4.0: 概率分布 = [[0.496 0.341 0.091 0.072]] # T=8.0: 概率分布 = [[0.379 0.314 0.162 0.145]]

温度为 1 时分布尖锐,"像汽车"的可能性被压成零;温度升到 4、8,次优类别的存在感被逐级放大,教师对全类别空间的判断全貌暴露在徒弟面前。训练学生时用高温度,推理时回到温度 1,一来一回,暗知识完成交付。温度取多少合适,是第三章的主题,此处先建立直觉:温度是放大镜,把教师概率分布里被压扁的细节放大到学生看得见。

一条完整案例:手写数字上的第一次蒸馏

背景。 团队第一次接触蒸馏,想验证"学软目标比学硬标签强"到底是不是真的。选 MNIST 手写数字:任务简单、单卡几分钟能出结果,适合当蒸馏的第一次实验台。

操作。 先训练一个大网络当教师:两层 1200 单元的全连接,加 dropout,测试集准确率约 98.6%。再准备一个小网络:两层 20 单元,参数量不到教师的千分之二。学生分两版训练:A 版只用真实标签做交叉熵;B 版用真实标签加教师软化输出做 KL 散度(温度 4,软硬损失对半配),其余超参完全一致。

import torch import torch.nn as nn import torch.nn.functional as F def kd_step(student, teacher, x, y, T=4.0, alpha=0.5): teacher.eval() # 教师不更新参数 s_logits = student(x) with torch.no_grad(): t_logits = teacher(x) hard_loss = F.cross_entropy(s_logits, y) # 对标准答案的损失 soft_loss = F.kl_div( F.log_softmax(s_logits / T, dim=-1), # 学生软化后的对数概率 F.softmax(t_logits / T, dim=-1), # 教师软化后的概率 reduction="batchmean", ) * T * T # 梯度按温度平方补偿 loss = alpha * hard_loss + (1 - alpha) * soft_loss loss.backward() return loss.item() # 输出说明: # kd_step 返回本轮总损失标量;软损失让 20 单元的小网络 # 在测试集上从约 96.0%(纯硬标签)提升到约 97.2%(加软目标)

结果。 与论文及大量复现一致:小模型只用硬标签约 96.0%,加软目标后约 97.2%,差距一点二个点;而教师与"放大版学生"的组合集成再加软目标蒸馏,学生还能再吃进一点集成收益。

解读。 两个点在简单任务上是不小的数目。软目标起作用的机制有二:一是它为每个样本提供了比 one-hot 丰富得多的梯度方向,等价于一种样本自适应的正则;二是软目标的梯度方差更小,小模型训练更平稳,不容易在难例上震荡。另外注意损失里那个 T*T:除以温度后 KL 梯度会缩小约温度平方倍,乘回去才能让软硬两股力量的实际量级保持可比——这是新手最容易漏的一行。

变式。 把温度从 4 调到 2 与 8 各跑一轮,会发现温度太低软目标退化成近似 one-hot、收益缩水;温度太高分布过平、类间差异被抹平,同样掉点。这个"温度两头都不讨好"的现象在 3.1 展开成系统化的调试方法。

概念辨析:蒸馏不是什么

⚠️ 常见坑:蒸馏不等于"用小模型微调"。微调的监督信号仍是标签;蒸馏的监督信号里必须有教师的输出(分布、特征或关系),这是唯一的分界线。

💡 关键直觉:把教师输出存成文件再训练学生,和教师在线陪跑,学到的分布完全一样——蒸馏的原料是"教师对数据的判断",与判断发生在训练时还是推理前无关。这也解释了为什么离线蒸馏(4.1)如此常用:教师输出可以提前批量算好。

本节要点回顾

  • 定义:以教师输出为部分监督信号训练轻量学生,精度逼近教师、成本远小于教师。
  • 软目标的本质:教师输出分布携带类间相似性结构,硬标签把它全部抹掉了。
  • 温度的直觉:温度放大镜把小概率类别显形,让暗知识可见;训练用高温、推理用常温。
  • 温度平方补偿:软化损失的梯度按温度平方缩小,实现时乘回去,否则软损失形同虚设。
  • 首轮实验的标准动作:同数据、同超参,跑硬标签版与加软目标版学生,差值就是蒸馏的直接收益。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U