目录
- 前言
- 1. Lecture Plan
- 2. What Is Knowledge Distillation
- 2.1 Why Distillation: Small Models Are Hard to Train
- 2.2 Teacher-Student Setup and Temperature
- 3. What to Match
- 3.1 Logits and Weight Matching
- 3.2 Activation, Gradient and Sparse Pattern Matching
- 3.3 Relation Matching
- 4. Self and Online Distillation
- 5. Distillation for Different Tasks
- 5.1 Object Detection
- 5.2 Segmentation and GAN Compression
- 5.3 NLP and Large Language Models
- 6. Network Augmentation
- 7. Summary
- 结语
- 参考
前言
学习 MIT 韩松教授讲授的 MIT 6.5940: Tiny ML and Efficient AI Computing 课程,本篇文章记录第九讲:知识蒸馏的学习内容,和大家一起分享交流😄
Website:https://hanlab.mit.edu/courses/2026-fall-65940
Video:https://www.youtube.com/playlist?list=PLH7PIPKvCm38
1. Lecture Plan
今天的讲座我们讨论知识蒸馏—继剪枝、量化和神经架构搜索之后的又一个新主题。
今天我们先给出知识蒸馏的定义,并介绍一些基本概念,例如教师模型、学生模型,以及需要匹配哪些信息—也就是教师与学生之间的知识。然后介绍不同的蒸馏方法,例如logits 匹配、权重匹配、激活匹配等;接着讨论自蒸馏、在线蒸馏这些技术,以及图像分割、目标检测等应用。最后简要讨论网络增强。
2. What Is Knowledge Distillation
2.1 Why Distillation: Small Models Are Hard to Train
关于蒸馏要讲的东西很多,我们先从动机开始。
我们已经讨论了很多关于高效神经网络、高效深度学习的内容,而核心话题是:我们见证了 AI 模型的飞速发展,也看到不同平台上的硬件资源可能天差地别。即使使用像 B300 这样最大的云端 GPU,其内存容量仍然受到限制,更不用说较小的微控制器和移动设备了。
因此,我们可能只有几百 KB 的片上内存,而不是几十或几百 GB 的内存。在云 GPU 上,我们可以运行大型模型,例如 ResNet、大型 Transformer 模型以及大型语言模型。但是对于小型设备,我们需要非常小的网络,例如 MCUNet 和 MobileNetV2-Tiny。我们会在后续课程里详细介绍它们。但现在你只需要知道,这些是非常小巧、专为移动部署而设计的模型。
而这里的核心问题是,我们如何在不损失太多精度的情况下得到这些较小的模型?这就是我们今天要讨论的知识蒸馏的核心目的。如你所知,小型模型很难训练,因为它们往往无法很好地处理大型数据集。
这里有两条不同的学习曲线。左侧可以看到,ResNet-50 在训练集上可以达到大约 80% 的准确率,在验证集上大约 76%;但对于较小的 MobileNetV2-Tiny,训练集只能达到大约 50% 的准确率,验证集大约 47%。这其实就是分别训练一个较大的模型和一个较小的模型的结果。由此可见,模型越小,越难训练。
2.2 Teacher-Student Setup and Temperature
这张图展示了知识蒸馏的基本设置:我们把同一份输入分别喂给两个模型—一个教师模型、一个学生模型,两个网络都会产生自己的输出 logits。比如在图像分类里,学生模型和教师模型都会对同一张输入图像给出预测。
知识蒸馏的不同之处在于:除了分类损失之外,我们还有一个来自教师模型的蒸馏损失,这样我们就可以从教师模型获得额外的监督信号,更好地教学生模型去拟合潜在的分布。
这里有一个更直观的例子。我们有一个猫的输入图像,并把它分别送进教师网络和学生网络。所以你可以看到,教师模型产生了输出 logits,比如猫是 5,狗是 1。经过 softmax 归一化后,我们得到 98% 和 2% 的概率。但对于学生网络来说,虽然该模型仍然能预测出正确的类别,但猫的 logit 是 3,狗的 logit 是 2。归一化后,概率约为 73% 和 27%。
两个模型都能预测出正确的类别,但置信度不同:较小模型的置信度低得多,较大模型的高得多。因此,仅使用分类损失监督,学生模型无法学习到过多的信息。而通过知识蒸馏损失,我们可以把较大模型的置信度分布迁移到较小模型中。
在定义损失之前,我们需要引入温度的概念。当温度等于 1 时,我们使用普通的 softmax 分布,正如你在第二列中看到的那样;但如果把温度提高到 10,分布会变得更平滑、更接近均匀。
接下来,我们将介绍知识蒸馏的正式定义。
下面我们引入温度,写出带温度的 softmax。
p ( z i , T ) = exp ( z i / T ) ∑ j exp ( z j / T ) p(z_i,T) = \frac{\exp(z_i/T)}{\sum_j \exp(z_j/T)}p(zi,T)=∑jexp(zj/T)exp(zi/T)
模型会生成输出 logitsz i z_izi,再用 softmax 生成概率。温度T TT出现在指数里:针对每个类别i ii,我们先把 logit 除以温度,再计算 softmax。所以温度越高,softmax 的分布就越均匀、越平坦;温度越低,分布就越尖锐。
因此,知识蒸馏的目标是:在给定的温度下,我们把学生模型和教师模型的类别概率对齐,让学生模型从教师的置信度分布中学习,从而在更多输入上获得更好的预测。
3. What to Match
我们提出一个更广泛的问题:学生模型可以从教师模型中学习到哪些信息?这里有几种不同的选择。例如,我们可以直接把教师模型的输出 logits 与学生模型的输出 logits 进行匹配。
3.1 Logits and Weight Matching
这里我们还有更多的选择:可以匹配中间权重、中间特征、激活值,也可以匹配梯度、稀疏模式和关系信息。
我们逐一来看。最直接的做法是匹配输出 logits:除了正常的分类损失之外,我们还比较教师分布和学生分布。这里可以用交叉熵,也可以用两种分布之间的 KL 散度,还可以用最朴素的 L2 损失来度量教师和学生 logits 的差异。因此,我们在教师模型和学生模型的 logits 之间应用蒸馏损失,这样给定相同的输入(例如输入图像),学生就能从教师分布中学习。
我们讲完了输出 logits 匹配,接下来讨论中间权重匹配。它比输出匹配稍微复杂一些,因为教师模型和学生模型可能有不同的张量形状。
例如,我们可以有一个更大、更深或更宽的教师模型来指导一个更小、更浅、更瘦的学生模型。因此,两者的权重不能直接一一对应地匹配。那么,我们如何利用中间权重进行监督呢?
我们可以采取不同的方法。例如,我们可以使用投影层来匹配学生模型和教师模型之间权重矩阵的通道大小。还可以使用一些技巧,例如低秩近似。但是,我们将主要关注投影方法。
这里有一个例子,它使用投影层来匹配学生模型和教师模型之间的中间权重。在这个图中,我们有一个蓝色的投影层,它将输入映射到学生模型的权重张量,使其大小与教师模型的大小相匹配。训练时我们会同时训练学生模型和投影层,最终得到投影后的学生权重。
然后比较投影后的学生权重与教师权重之间的差异,比如用 L2 损失。请注意,训练时我们需要用原始分类损失来监督学生模型,否则它可能会过拟合到更大模型的权重分布中,而不是从真实示例中学习。
Q & A
Q:为什么我们不直接用教师模型,而需要学生模型?
A:我认为动机之一是:把一个较大的教师模型蒸馏成较小的模型,可以得到更紧凑的小模型,方便部署到移动设备上—这和我们之前做的剪枝、量化等压缩方法非常相似。稍后我们还会介绍从同一模型、也就是从自身进行蒸馏的方法。说到底,都是为了在提升效率的同时不丢准确率:用蒸馏就能换来更高的准确度和更低的延迟。
Q:投影层是只在训练时存在,还是推理时也要?
A:这主要是训练时的安排,推理过程中不会有投影层。
Q:这个例子里具体匹配的是哪一层的权重?
A:这个例子里我们主要匹配的是线性层—实际上我认为这是一个卷积神经网络,所以主要匹配的是学生模型和教师模型之间不同的卷积核。由于通道大小不同,我们需要把学生的输出通道数提升到与教师一致,再逐个比较两个权重矩阵的元素。
3.2 Activation, Gradient and Sparse Pattern Matching
以上就是权重匹配,现在我们要讨论的是中间特征匹配中的激活匹配。除了比较学生模型和教师模型的不同参数,我们还可以比较特征图或激活值。
所以这里的直觉是,如果教师和学生接收相同的输入,两者的中间激活应该在某种程度上相似,这表明这些模型只是在做类似的事情,提取相似的特征。所以这也是教师模型和学生模型之间非常有效的监督方式。
现在我们要讨论更高级或更复杂的蒸馏方法。首先,我们来谈谈梯度匹配。
这里我们来看一个图像预测的例子。我们可以看到这里有两幅不同的图像。左侧是原始输入图像,右侧是注意力图。注意,这里 “注意力机制” 的定义与 Transformer 或语言模型里说的注意力有所不同:它主要关注输入中每个位置对最终输出的影响有多大。
更准确地说,我们可以用梯度来定义注意力图。某个区域的梯度较高,就意味着输出对该区域的输入非常敏感—稍微改动这里的输入,最终输出就会明显不同。可以看到,人脸尤其是眼睛和鼻子受到了更多关注。
为了做分布匹配,我们可以基于教师和学生的注意力图构建蒸馏损失,让学生关注相似的地方。下面是一个例子。
可以看到,在第二行和第三行中,经过蒸馏的模型在不同层级都集中在相似区域。
所以除了原始的分类损失之外,我们还有更多跨越不同层、不同激活的蒸馏损失。
以上就是关于梯度蒸馏的内容,现在我们要讨论稀疏模式。
因为我们引入了诸如 ReLU 之类的激活函数,所以特征图中自然会出现一些稀疏模式:如果特征图中存在负值,ReLU 会把它们全部变成零,只保留正值。所以激活矩阵是稀疏的,我们需要做的就是让教师和学生的非零值分布、也就是稀疏模式匹配起来。
因此,如果我们匹配稀疏模式,可以想象学生也会从教师的分布中学到东西,输出也会更接近。
3.3 Relation Matching
最后,我们要讨论关系信息匹配。它刻画的是不同层之间、甚至是不同输入示例之间更复杂的关系。
首先,让我们考虑一下各层之间的关系。教师模型和学生模型可能有不同的深度、宽度和通道尺寸,但它们都可以被切分成若干个残差模块,让每个模块都有形状相似的输入和输出。因此,我们可以使用内积来刻画模块输入和输出之间的关系。
例如在教师模型中,我们把同一个残差模块的输入和输出做内积,就得到残差块前后两个激活之间的关系;对学生模型做同样的事,就得到它对应模块输入与输出特征图之间的关系。这样我们就能描述不同层之间的关系。而这种特征关系匹配,也可以应用到不同的输入示例上。
这里我们对每个输入样本做关系蒸馏,下面来看这张图。我们这里有不同的输入特征,而且不同样本之间存在关系。例如在教师模型里,示例一在左、示例二在右、示例三在下(对应 T1、T2、T3);学生模型也保持同样的相对位置:左边是 S1,右边是 S2,最下面是 S3。所以我们需要在隐藏空间中匹配这种空间关系。
因此,匹配之后,我们就可以利用不同输入示例之间的关系来更好地监督学生模型:把输入两两配对,计算成对距离。
例如,假设我们这里有 n 个不同的输入图像,并且我们将其中一些两两配对,那么我们有多少对图像呢?这等于n × ( n − 1 ) / 2 n \times (n - 1)/2n×(n−1)/2。每一对样本之间都有一个距离,我们可以对这些距离(包括教师和学生之间的距离)施加蒸馏损失,这样就能对学生与教师在不同输入图像之间的关系做某种程度的监督。
以上就是我们讨论过的、可以用来匹配的各种类型的信息。
4. Self and Online Distillation
我们已经介绍了输出 logits、权重、中间激活值、梯度和稀疏模式,以及不同示例和不同层之间的关系。接下来,我们将介绍自蒸馏和在线蒸馏。
首先,我们来谈谈自蒸馏。之前我们讨论的都是学生从更大更强的教师模型学习,现在要讨论的是模型如何从自身学习—也就是从与学生张量形状相同的模型里学习。
所以之前我们的教师模型比学生模型大,但自蒸馏里教师和学生大小相同—为什么要让两者的张量形状一致?这里的动机是:如果要从一个更大的固定教师模型进行蒸馏,成本会很高—你得先单独训练一个教师模型,再训练那个真正要部署的小模型,这在如今的大语言模型上尤其昂贵。所以本节要讲的是:如何从同样大小的模型做自蒸馏,从而拿到更高的准确率。
首先,让我们从一篇名为《Born-Again Neural Networks》的论文开始。它对教师和学生采用相同的架构,并且在训练阶段可以产生许多代学生。第 0 代(或第 1 步)里,我们不做任何蒸馏,只用原始分类损失训练一个网络,然后进入下一代。现在我们有了从第一代训练中得到的原始教师模型,在这一代中,我们将使用相同的模型大小和相同的架构初始化新的学生模型,并且在这里我们使用两种损失。
首先是原始分类损失,其次是从第 0 步或第 0 代获得的教师模型中得到的蒸馏损失,然后我们可以继续进行下一步,依此类推。这样就得到了一个自蒸馏的世代序列,最后在部署时,我们可以使用最终的学生模型来对原始任务进行预测。
我们还可以把几代模型集成起来,或者做统一的重新初始化等操作。这样我们就能获得更高的准确度。因此,实验表明,自蒸馏可以使最终的学生模型比原始教师模型学得更好,而且完全不需要额外的监督,即使整个流程中没有包含更大更强的教师模型。
以上就是关于自蒸馏的内容。现在我们要讨论的是在线蒸馏,这意味着教师模型在学生训练阶段不再需要固定不变。
这里我们以深度互学习(Deep Mutual Learning)为例,它是在线蒸馏方法的代表。在这个例子中,我们同时训练两个不同的网络来完成同一个任务。例如,当我们训练网络 1 时,我们会更新网络 1,并使用网络 2 作为蒸馏的教师模型。这样,网络 1 将从任务结果和教师损失中学习。
然后在下一步中,我们将更新网络 2,并用网络 1 作为教师模型,以此类推。两个模型在整个蒸馏流程中同时更新,并在不同步骤里轮流充当教师和学生。这里要注意:我们并不要求两个网络具有相同的模型架构—它们可以是不同的模型、不同的规模、不同的结构,相互学习对方的长处。实验发现,两个网络互相学习的表现通常都优于各自单独训练。所以核心概念是:你可以在在线蒸馏过程中向同伴学习。
以下是一些关于在线蒸馏示例的结果。
可以看到,在 CIFAR-10 和 CIFAR-100 上,相互学习相比独立训练能同时改进两个网络。换句话说,教师也能从学生身上学到东西。所以,在这两种不同的模式下,教师和学生的角色可以互换。
最后,我们将把在线蒸馏与自蒸馏结合起来。这里的目标是在一次训练过程中生成有用的教师预测,而无需维护单独的预训练教师模型。
这里有一个例子,一篇名为《Be Your Own Teacher》的文章:整个蒸馏流程只用一个模型,它本身可以同时充当教师和学生—所以它既是自蒸馏,也是在线蒸馏。作者只是在原始卷积神经网络的若干中间位置引入了额外的分类层。以前我们只在卷积神经网络的所有层之后才进行分类,但现在会在中间层也放上分类头。
这样我们就可以有不同的分类层。我们有第一层、第二层、第三层,以此类推,直到最后一层。所以你可以想象,最后一层会做出最准确的预测,而中间的几层则会做出相对较弱的预测。因此,我们可以将最终预测结果作为中间分类器的 “教师”。这样做是为了提高中间分类器的准确率。
因此,我们可以看到,这种蒸馏方法可以使最终层的结果比原始基线好得多,而且中间层分类器的输出也优于原始基线。这意味着一旦模型足够自信,我们就可以只使用中间特征进行分类,让模型提前退出。这样我们就可以节省一些计算资源和延迟,使模型更高效、更准确。
5. Distillation for Different Tasks
以上是讲座的前几部分。接下来我们看蒸馏在几个现实任务中的应用,先从目标检测开始,然后讨论针对不同任务的蒸馏方法。
5.1 Object Detection
目标检测可以预测目标类别和边界框。所以这里的蒸馏要复杂得多,因为我们要预测多个目标,而不是对单张图像做一个分类。但这里的基本原理与我们之前讨论的图像分类示例非常相似,我们可以模仿教师的中间特征、类别预测以及定位输出。
所以我们可以看一下这张图。
所以在目标检测示例中,我们既要预测边界框,又要对框内的内容分类,因此蒸馏也有两种不同的做法。对于特征模仿,教师和学生的特征可能映射到不同的通道维度,我们将添加一个逐点卷积—也就是卷积核大小为 1、类似全连接层的那种,用于调整通道大小。这就是教师和学生之间通过通道维度进行匹配的输入特征。
之后,我们可以对两个张量施加 L2 损失以匹配中间特征。检测结果里可能有大量背景区域和相对较少的前景目标,如果对不同区域(比如前景和背景)施加均匀的权重,蒸馏损失就会被过多的背景像素主导。所以这里需要加权蒸馏:前景的权重更高,背景的权重更低。
所以在这里,我们对前景物体施加更强的监督,降低背景的权重,这样背景就不会对蒸馏产生太大影响,因为我们并不关心背景中实际存在什么。我们更关注前景中的物体,我们需要检测和分类这些物体。
这里我们不仅需要对分类做蒸馏,还需要对边界框回归做蒸馏。教师不只在强于学生时指导学生—反过来,学生更强时也该如此。右上角就是损失函数。所以我们有学生的回归模型、教师的回归模型以及原始的真实标签。
可以看到,如果学生的预测非常接近真值、并且明显优于教师的预测—这里有一个阈值 m:当学生的回归误差比教师小出一段余量 m 时,就采用学生损失,否则不做边界框蒸馏。
这里还有另一种方法。除了回归监督之外,我们还可以将回归之类的东西应用到分类问题中。
我们把坐标离散到不同的单元格里:原本要预测连续坐标,现在模型只需要预测它落在哪个单元格(也就是单元格的索引号),而原始坐标仍然保留。这样就把回归变成了分类问题,可以用和图像分类相同的蒸馏损失。
现在我们要讨论定位蒸馏,它将教师模型和学生模型对每个坐标预测的概率分布进行比较。
上面是教师的分布,下面是学生的分布:教师有两个峰,学生只有一个—可见教师分布包含更多信息,这正是学生要从教师那里学的东西。我们可以用 KL 散度之类的损失,让学生分布与教师对齐。
5.2 Segmentation and GAN Compression
语义分割就是对每个像素做一次预测:假设一张图里有狗和猫在草地上奔跑,我们要预测这个像素是猫、那个像素是狗,还有天空、草地等等。这就是对输入图像进行语义分割的过程。
所以,在这类任务中,我们可以运用类似的知识,教会学生模型如何更好地完成这类新任务。一种直接且直观的方法是,我们对输入激活值使用蒸馏损失,因为我们要进行像素级分类。
除了原始的蒸馏损失之外,我们还添加了一个判别器网络来提供对抗损失,让判别器区分学生模型的预测结果和教师模型的预测结果。学生的任务就是骗过判别器,让它分不清哪些输出是教师产生的、哪些是学生产生的—这就是一个对抗性目标。这正是生成对抗网络(GAN)背后的核心思想,你们中一些人可能已经听说过它了。
这里有一篇我们团队的研究论文,名字是 GAN 压缩(GAN Compression),主要讲述我们如何引入蒸馏损失,使 GAN 模型运行得更快、更高效、更准确。本文中教师生成器具有更多通道,而学生生成器具有更少通道,因为我们希望学生模型比教师模型运行得更快—它比教师小得多。
我们仍然会使用一个逐点卷积层,或者你可以把它看作是一个全连接层,来调整学生模型和教师模型之间的通道大小,学生模型还会使用针对目标图像的重建损失和来自判别器的对抗损失。这三个目标结合起来,使规模小得多的生成器能够达到教师的输出质量。
这里是 GAN 压缩的演示。上面是 CycleGAN 的例子,原始 CycleGAN 的速度大约是每秒 12 帧,而底部(用了 GAN 压缩)把 FPS 提高了三倍以上。可以看到,它的速度快得多。这里的生成任务是把马变成斑马,底部那组图像生成得明显更流畅。
这里是另一个交互式图像编辑示例,用户只需调整局部区域,即可把原始鞋子转换成不同的设计。因此我们可以看到,在原始的 GAN 循环中,这种转换速度较慢,并不是实时的。你可以看到,用户执行操作与生成图像的响应之间存在非常明显的延迟。而用 GAN 压缩方法后,右侧明显比原始模型更快、响应更灵敏。你还可以看到,输出质量与原始模型非常接近,这使得它更适用于实时交互式的图像编辑应用。
5.3 NLP and Large Language Models
我们已经介绍了目标检测、图像语义分割和图像生成或图像编辑。现在我们来探讨一下自然语言处理。
这是 Transformer 模型的架构,它为蒸馏提供了另一个有用的目标,因为这里有注意力图。所以除了匹配原始的隐藏特征之外,学生还可以模仿教师逐个 token 的注意力分布。比如第一行是教师的注意力图,第二行是蒸馏后的学生,最后一行是未蒸馏的学生。可以看到,经过蒸馏的学生与教师的注意力分布非常接近,而未经蒸馏的学生就差得多。
这里是大型语言模型知识蒸馏的例子。可以看到,剪枝和蒸馏非常重要,而且通常一起使用:我们希望减少参数量、同时尽量不损失精度,于是先把原始模型剪枝成更小的规模。例如在 MiniLLM 这项工作里,把 Nemotron 模型从 150 亿参数剪枝到 80 亿—几乎缩小了一半,然后对较小的模型应用蒸馏损失,把精度恢复到基线水平。
所以在这里,我们可以在预训练阶段和微调阶段都使用蒸馏,既可以用原始的人类收集数据,也可以用生成的数据进行蒸馏。因此我们可以看到,使用较小的模型尺寸和较少的训练 token,80 亿参数的模型就能达到与原始大模型、或与同尺寸但用更多 token 训练的模型非常接近的准确度。
这张幻灯片展示了 MiniLLM 是如何创建学生模型的:首先教师会进行一些剪枝。嵌入层保持不变,但 Transformer 层更小,而且我们这里可能会有不同类型的蒸馏损失。例如,我们有来自 MLP 层的蒸馏损失。我们还可以从最终的 LM head(语言模型输出头)得到蒸馏损失,并且我们还有 logit 损失。我们可以应用不同类型的损失来进行更好的监督。
当然,我们还可以将注意力图损失应用于知识蒸馏,尤其是在训练较小模型时。原始模型可以作为该流程中的教师模型,蒸馏过程可以匹配最终输出和中间特征,就像我们在之前的幻灯片中所做的那样,例如图像生成、图像分类等。
6. Network Augmentation
现在我们已经详细讨论了视觉、语言和生成任务的知识蒸馏,最后一个主题是网络增强。核心问题仍然是如何提高模型的准确率,这也是提升微型模型性能的一项关键技术。
这里介绍一些对深度学习模型进行数据增强的传统方法,当然,你们大多数人可能已经听说过数据增强了。这是训练过程中解决过拟合问题的一个非常重要的技术。例如,你可以做随机擦除,从原始输入图像中移除一些像素、一些块;也可以把两张不同的图像混合在一起—这里有一只猫和一只狗,把它们混合起来就生成了一个新的样本。假设猫的标签是 1、0,狗的标签是 0、1。混合之后,我们把图像和标签分别取平均,就得到一个预测目标为 0.5 和 0.5 的新样本。这样训练阶段就有了更多样化的输入分布。
还有另一种数据增强方法叫 AutoAugment,它会搜索各种改变几何形状、颜色、对比度等图像属性的策略,例如剪切、旋转和翻转等等。它的关键在于不靠人工设计策略,而是自动搜索出适用于特定数据集或模型的最佳组合。
这里还有一种众所周知的正则化方法,即 dropout:在训练期间随机选择一些神经元并把它们的输出置零,以避免过拟合。这能减少协同适应,帮助大模型避免对训练数据集过拟合。
这里还有一些不同类型的 dropout 方法,特别是对于图像分类这类任务的卷积神经网络。例如,第一种是空间丢弃(SpatialDropout),它可以从特定通道中移除整个特征图,是专门为图像任务设计的。这是一个非常直观的设计,因为神经网络有时会从彼此紧密相连的空间激活里拿到非常相似的信息。
还有一种方法叫 DropBlock。它是从原始特征图中删除一些连续区域,或者你可以想象它是从原始输入图像中删除一些块。它是一种结构版的 dropout,可以防止神经网络只依赖某个特定区域,而是关注不同样本的整个输入图像。
对于像 ResNet-50 这样的大型模型,这些技术可以发挥非常好的作用。例如,Mixup、AutoAugment 和 DropBlock 都能提高基线图像网络的准确性。你可以看到右上角的那个数字。可见引入这类增强方法后,测试集上的准确率更好。
但对于较小的模型,结论可能截然不同。如果把数据增强用在小模型上—比如删掉一些神经元—效果往往更差。这也不难理解:大模型最大的问题是过拟合数据集,而小模型最大的问题是容量不够、吃不消这么大的数据集。所以对它们做数据增强(比如移除一些神经元),实际上会让学习问题更难,较小的模型反而学得更差。
这一观察说明,小型网络可能遭受的是欠拟合而不是过拟合。它们没有足够的容量来处理所有的输入数据、吸收数据集中的所有知识。所以,我们不应该让训练问题变得更难,而是应该给小模型增加更多容量或灵活性,使学习更容易发生。
因此,这就导致了网络的扩展。这与数据集增强的方向不同:最终部署的模型仍然很小,但在训练时,我们可以临时把较小的模型变大。例如,我们可以添加一些额外的通道或层,为较小的模型提供额外的自由度,这可能有助于较小的模型在优化过程中摆脱局部最小值;训练完成后,我们只需剪掉所有新增的神经元或通道。部署时模型大小与训练前完全一致。
以上是对这类网络增强技术的更详细的讨论。在训练步骤中,我们同时运行基础网络和采样出来的增强网络(这个例子里后者更宽)。共享的基础权重既接收基础目标的梯度,也通过增强路径接收另一个梯度,因此它同时受原始损失和增强损失的监督。这样,当训练结束、把模型大小和张量形状恢复原状之后,原始模型依然能正常工作。
所以我们需要保留原始任务的损失,而不是仅仅保留增强网络的损失,并且在不同的步骤中,我们还可以对不同的增强部分进行采样。有时,临时增强网络可能会更大、更宽或更深;有时,它可能更接近原始模型。这些因素可以在不同训练步骤中调整,而内部权重始终保持不变,但我们想要确保的是,原始模型权重始终在增强网络中得到保留。我们没有从原始模型中删除任何权重。
以下是网络增强论文的一些结果。
从图上就可以看出,它比原始基线在训练集和验证集上都提供了更高的准确率,而没有进行任何数据增强。因此,训练期间较高的准确率表明临时容量减少了欠拟合问题,而较高的验证准确率表明,即使我们删除了训练期间添加的额外模型权重,改进也可以从训练集转移到验证集。
还有一些针对更大模型的网络增强实验。你可以看到,网络增强可以提高模型的训练准确率,但会降低验证准确率。这也是意料之中的,因为像 ResNet-50 这样的大型模型,主要问题不是欠拟合,而是过拟合。因此,扩大模型实际上会让过拟合更严重一点。所以你可以看到,训练集上的准确率更高,但验证集上的准确率明显更低,网络增强也无力回天。
我们可以看到,网络增强是对知识蒸馏的补充。这里我们比较了原始基线、仅知识蒸馏和仅网络增强的结果,最后把网络增强与知识蒸馏结合。可以看到,这些技术都能让原始模型在特定任务上表现更好,而且可以叠加使用。
以下是迁移学习的一些结果示例。
因此,与知识蒸馏或简单地增加训练时长和 epoch 数来完成原始任务相比,ImageNet 上的准确率可能相似,但网络增强使模型能更好地迁移到 Food-101、Flowers-102、Pascal VOC 等数据集。这是因为它学习了更多可重用的特征,从而使模型能够更好地迁移到不同的任务。我们可以看到,虽然有时 KD 和更多训练 epoch 反而会让准确率变差,但网络增强在所有这些基准测试中、在较小的模型上表现良好。
同样的想法也适用于目标检测,就像我们之前讨论过的任务一样,在固定的计算预算下,网络增强可以提高检测精度;反过来,在给定目标精度时,它可以减少所需的计算量。目前这项研究主要集中在视觉模型上。因此,一个有趣的开放方向是,在训练紧凑型大语言模型、视觉语言模型时测试网络增强,这可能也会为本课程的最终任务引入一些项目思路。
7. Summary
我们来总结一下今天的讲座内容。
总结一下今天的知识蒸馏:它利用教师模型帮助学生模型更好地学习,从而得到更小、更高效、准确率更高的模型,而不会引入额外的推理成本。我们还讨论了蒸馏过程中要匹配哪些内容:先是基本的输出 logits 匹配,然后是中间权重匹配和激活匹配,还有梯度匹配(借助注意力图来指导神经网络学习),以及不同层、不同输入示例之间的关系匹配。
之后还讨论了自蒸馏和在线蒸馏。这意味着我们不再需要一个更大的、固定不变的教师模型—可以用模型本身当教师,去教一些较小的模型,从而提高整体任务准确率、帮助模型更好地学习。我们还讨论了知识蒸馏在图像分割、图像编辑和目标检测等方面的应用。我们还简单介绍了大型语言模型,你可能知道,蒸馏在当今的大型语言模型中非常流行,尤其是在开源模型中,有很多开源实践。最后我们讨论了网络增强,它可以帮助我们在给定任务上更好地训练小型模型,解决欠拟合问题。
今天的讲座就到这里,在下一讲中,我们将介绍适用于 TinyML 或微控制器的算法-系统-硬件协同设计案例研究 MCUNet。
结语
第九讲把第四种武器—知识蒸馏—讲透了,它要解决的核心问题是小模型很难训练:同一份数据上,ResNet-50 能到 80%/76%,而 MobileNetV2-Tiny 只有 50%/47%。于是我们请大模型当老师,把它的"信心分布"教给学生—猫的例子最直观,教师给出 5 和 1 的 logit、归一化成 98% 与 2%,学生给出 3 和 2、只有 73% 与 27%,两者都答对了,但教师知道得更多;温度则决定这份分布有多"软",T=1 时尖锐、T=10 时接近均匀,蒸馏就是在这个温度下让学生逼近教师的分布。接下来是一道很长的选择题:到底匹配什么?从最简单的 logits(KL 或 L2),到中间权重(形状不一致就用投影层对齐,而投影层只在训练时存在),再到中间激活、梯度(用梯度定义注意力图,人脸的眼睛和鼻子会被"点亮")、ReLU 带来的稀疏模式,最后是关系—不只是同一残差模块输入输出之间的内积,还有不同样本之间的距离关系,n 张图就配出 n(n−1)/2 对。
但训练一个固定的大教师本身也很贵,于是有了自蒸馏和在线蒸馏:Born-Again Networks 让同架构的学生一代代"重生"、每代向上一代学习,完全不需要更大的教师;Deep Mutual Learning 干脆让两个网络同时训练、轮流当老师—有趣的是教师也能从学生身上学到东西,CIFAR-10/100 上互相学习都优于各自独立训练;《Be Your Own Teacher》则在网络中间插入分类头,让最终层当老师教中间层,模型够自信时就能提前退出,省下计算和延迟。再往后是任务应用:目标检测要处理背景远多于前景的问题,蒸馏损失必须按前景加权,边界框回归还有个"学生明显比老师好就听学生的"阈值;分割任务引入判别器做对抗蒸馏,GAN Compression 用同样的思路把 CycleGAN 从 12 fps 提了三倍多,交互式修图终于能实时响应;NLP 这边可以逐 token 匹配注意力图,大语言模型上则是剪枝加蒸馏的组合拳—Nemotron 从 150 亿剪到 80 亿再蒸馏,用更少的训练 token 保住了接近原模型的精度。
最后是这一讲最反直觉的部分:网络增强。数据增强、Mixup、DropBlock 这些"让训练更难"的技巧对大模型是良药,对小模型却是毒药—因为小模型的主要矛盾不是过拟合,而是欠拟合、容量不够。所以它们的解药方向相反:训练时临时把模型变宽、变深(共享基础权重、原始任务损失照常监督),给优化过程更多自由度跳出局部最优,训练完再把新增的通道和层剪掉,部署时模型大小分毫未增;实验也印证了这一点—小模型的训练与验证精度同时提升,而 ResNet-50 这类大模型只会训练精度上涨、验证精度反而下降。网络增强还能与知识蒸馏叠加,并让模型学到更可迁移的特征。
下一讲,我们进入 MCUNet 的案例研究,看算法、系统与硬件如何协同,把模型塞进微控制器 🤗。
参考
- https://hanlab.mit.edu/courses/2026-fall-65940
- https://www.youtube.com/playlist?list=PLH7PIPKvCm38