《YOLOv11 实战:从入门到深度优化20篇》013、模型轻量化技术(三):知识蒸馏与更小模型设计写这块内容之前,先交代一个背景:我在给一个端侧设备项目做目标检测选型时,用 YOLOv11n 跑出来的精度总差那么一口气,尤其是小目标和密集场景。换更大的模型,设备推理时间直接超预算。剪枝、量化都试了一圈,最后还是靠知识蒸馏把精度补了回来。这也是我决定把蒸馏单独写一篇的原因——它是轻量化技术里“性价比”最高的一环,不改变推理结构,不需要特定推理库支持,纯粹通过训练过程让小的模型学得更聪明。这个系列前两篇分别讲了剪枝和量化,它们解决的是“模型算起来更快”的问题。但压缩之后精度下降怎么办?蒸馏解决的就是“让小模型学到更接近大模型的表达能力”的问题。加上这篇文章还要聊“更小模型设计”,也就是怎么在结构层面做一个真正适合端侧、适合蒸馏的轻量模型。两者合在一起,才是完整的轻量化方案。这篇内容面向两类人:一类是用 YOLOv11 做落地项目,设备算力受限、只能跑小模型的开发者;另一类是已经了解蒸馏概念,但不知道怎么在检测任务里具体操作的人。我会把蒸馏的原理、YOLO 这类密集预测任务的蒸馏难点、教师学生模型的选型、完整训练配置、以及更小模型的几种设计思路全部讲清楚,并且把我实际跑实验时踩过的坑一并写出来。1. 轻量化路线里,蒸馏和“更小模型设计”到底解决什么问题1.1 先明确目标:不是“小”,而是“小且准”很多同学一说到模型轻量化,第一反应就是把网络变瘦、通道变窄、分辨率降低。这确实能让模型变小,但代价是精度急剧下降。如果只是“变小”,其实很容易,难的是在变小之后保住精度,甚至逼近大模型的水平。知识蒸馏就是冲着这个“精度回补”来的。它的核心思路非常朴素:用一个强大的教师模型指导一个弱小的学生模型学习。教师模型在训练过程中不仅告诉学生“这张图里有什么类别、什么位置”,还告诉学生“它对这些预测有多大的把握、哪些类别之间比较接近、哪些特征的响应更强烈”。这种信息比单纯的标签要丰富得多,因为标签只有 0 和 1,而教师模型的输出是一个分布。放在 YOLOv11 的场景里:你有一个训练得非常好的 YOLOv11x 或者 YOLOv11l,推理速度不达标,但精度确实漂亮。现在你想换 YOLOv11n,直接从头训精度差 2 到 3 个点。用蒸馏,可以让 YOLOv11n 在部署时完全保持自身结构,却把大模型学到的知识尽量继承过来。部署端无感知,推理速度和原来一样快,精度却能往上走。1.2 为什么前两篇讲了剪枝和量化,还要单独谈蒸馏简单梳理一下轻量化的三条主线:剪枝:把模型里冗余的通道、层或连接去掉,让模型变小变快。问题在于剪完要微调,而且剪到一定程度精度会断崖式下跌。量化:把 FP32 权重换成 INT8 甚至 INT4,计算变快、内存变小。问题在于需要校准数据、可能受推理库支持限制,极端量化时掉点明显。蒸馏:不动模型结构,通过训练方式让弱模型变强。好处是不依赖推理框架,和剪枝、量化可以叠加使用。这三条路线不是互相替代,而是组合拳。蒸馏负责“补精度”,剪枝量化负责“砍体积”。实际操作里,我会先训一个大模型当教师,再用蒸馏训练一个结构经过优化的学生模型,学生模型训练完成后,如果需要再有一步量化或剪枝,精度余量会大得多。这比直接用原始小模型做完剪枝量化再去补精度要稳得多。1.3 知识蒸馏的本质:不是压缩网络,是转移表达能力很多初学者有个误区,认为蒸馏是把大模型的权重直接搬到小模型里。完全不是。大模型的参数动辄几十 MB,小模型只有几 MB,“搬运”在物理上就说不通。蒸馏转移的是“表达能力”。通俗讲,大模型看过大量数据之后,它学到了一个非常复杂的决策边界。这个决策边界里包含了数据之间的细微关系:比如一只猫和一只狐狸在低维特征上很接近,但如果模型知道“猫的耳朵更圆、狐狸的尾巴更蓬松”,它就能把这些细微差异编码在特征中。小模型受限于参数量,自己从头学这些关系很吃力,但如果大模型在训练过程中把“判断的中间状态”告诉小模型,小模型就可以走一条捷径,直接模仿大模型已经收敛好的决策过程。这也是为什么蒸馏出来的学生模型往往比独立训练的小模型精度高的根本原因。它不是让网络变得更复杂,而是让同一个网络结构在训练时获得更高质量的监督信号。2. 目标检测里的蒸馏,和分类蒸馏差别巨大2.1 检测头的多分支输出到底怎么蒸馏分类任务里做蒸馏很简单,教师和学生网络最后都输出一个类别概率分布,直接用 KL 散度对齐就行。但目标检测是密集预测,YOLOv11 的输出包括边界框回归、置信度、分类得分,且在多个尺度的特征图上都有输出。你没法像分类那样单纯对齐一个向量。这里要先理解 YOLOv11 的检测头结构。它通常是一条检测分支,分别预测类别 logits、边界框回归参数、以及目标置信度。结构上变得复杂了,蒸馏时就需要考虑三条信息流。最直接的做法是“解耦蒸馏”:把分类蒸馏和回归蒸馏分开做。分类部分继续用 KL 散度对齐 logits,让学生的类别预测分布尽可能接近教师。回归部分用 Smooth L1 或者 L1 Loss 去拟合教师输出的边界框参数。置信度部分可以蒸馏、也可以不蒸馏,我实际测试下来置信度蒸馏的增益相对有限,而且容易和分类蒸馏产生纠缠,所以多数场景下优先保证分类和回归两块对齐。2.2 三类主流做法:logits 软标签、特征对齐、mask 引导第一类是 logits 蒸馏。把教师的输出做 softmax 软化之后,作为软标签交给学生。学生既算硬标签的交叉熵,又算和教师软标签的 KL 散度。软标签的好处是包含了教师对类别相似度的“理解”。第二类是特征对齐蒸馏。不只看输出层,而是对齐教师和学生网络中间的特征图。因为 YOLO 这类检测模型,底层特征的感受野和语义信息非常丰富,学生如果能在中间层就把特征学得接近教师,最终检测头的精度会更高。典型的做法是用一个适配层把学生的特征图通道数映射到和教师一致,然后计算 L2 距离或者注意力图的差异。第三类是 mask 引导蒸馏,这是检测任务里特有的一种思路。因为图像里大部分区域是背景,直接对整个特征图做蒸馏,学生很容易被背景区域主导,忽略了前景目标。做法是让教师生成一个“目标区域的 mask”,告诉蒸馏损失只在前景区域生效,或者在前景区域加大权重。这样小模型可以集中精力学习目标区域的特征表达,而不是把大量容量浪费在纯背景上。我实际项目中的组合方式是:分类分支用 logits 蒸馏,回归分支用特征对齐加 mask 引导,中间层挑一个关键特征层做注意力图蒸馏。只选一个中间层而不是所有层,因为层数太多会让训练变得不稳定,梯度信息混乱。2.3 温度 T 该怎么选:soften 到什么程度才是合适的温度系数 T 是蒸馏里绕不开的参数。T 越大,教师输出的概率分布越平滑,类间差异越模糊,包含的“类间相似度”信息就越多;T 越小,分布越尖锐,越接近硬标签。但 T 不是越大越好,太大了反而会把噪声也带进来,让学生学到的决策边界过于平滑。我在 YOLOv11 蒸馏中的经验是:分类分支 T 设置在 3 到 5 比较合适,特征蒸馏不用温度系数,直接计算特征距离。针对检测场景,我一般先用 T=4 跑几轮看 loss 曲线,如果学生 loss 下降过慢,就降到 T=2 或 3。这里没有万能值,和目标类别数、数据集复杂度都有关。比较稳妥的做法是做一个很小的 T 值消融实验,用 1、3、5 三组对比,每组只用十分之一的数据量训练 10 个 epoch,就能大概判断哪个区间更好。3. 教师与学生选型:不是越大越好,关键是“可学”3.1 教师模型选型:同族蒸馏还是跨族蒸馏教师选择的基本原则是“精度要高,且不能太强”。听起来矛盾,但实际是有道理的。如果教师太弱,它自己都学得不准,教出来的学生自然不会好。如果教师太强,比如一个参数量是学生几十倍、用了大量额外数据训练的超大模型,它的决策边界和学生表达能力的差距太大,学生只能模仿个大概,甚至出现“负迁移”。同族蒸馏指的是教师和学生结构相似,比如教师用 YOLOv11l,学生用 YOLOv11n。结构相似的好处是特征维度、语义层级比较接近,对齐起来容易,蒸馏效率高。我倾向于优先推荐同族蒸馏,因为这个场景最可控、最好调。跨族蒸馏也有应用,比如用一个大尺寸检测模型或一个精度更高的通用视觉模型当教师,蒸馏给 YOLOv11n。跨族蒸馏在提升泛化能力上可能更好,但实现起来麻烦不少,特征对齐层要专门设计,对应关系容易错位。除非同族蒸馏效果不理想,否则我不建议新手一上来就搞跨族蒸馏。过强的教师问题,我举一个实际例子:我用一个在大型公开数据集上预训练的大模型给 YOLOv11n 当教师,在自有业务数据上蒸馏,结果 mAP 不升反降。原因是教师的预测中包含大量“在预训练数据上成立、但在业务数据上不成立”的先验知识,学生全盘接收之后反被带偏。后来改成先用业务数据把教师微调一轮,再开始蒸馏,问题就解决了。3.2 学生模型设计:深度可分离卷积与通道缩放说完了教师,再看学生。YOLOv11n 本身已经算轻量,但如果你想在 MCU 级设备、或者极小内存的 NPU 上跑,还需要继续往小做。这时就要动网络结构,做“更小模型设计”。第一个可以被替换的结构是普通卷积。把标准卷积换成深度可分离卷积,计算量能降一个数量级。深度可分离卷积分两步:先做逐通道卷积,再做逐点卷积。逐通道卷积只在一个通道内做空间卷积,逐点卷积用 1x1 卷积把各通道信息融合。整个过程参数少、计算少,表达能力略有下降,但配合蒸馏完全可以弥补。第二个思路是通道缩放。YOLOv11n 的各层通道数相对固定,你可以按比例整体缩小,比如把主要阶段的通道数乘以 0.75 或者 0.5。这个操作简单直接,但要注意不能均匀缩放每一层,特征提取早期阶段的通道数不要砍太狠,语义融合阶段可以多砍一点。经验法则是浅层保细节,深层保语义。第三个思路是简化颈部结构。YOLO 的 Neck 负责多尺度特征融合,结构本身有一定冗余。如果你通过实验确认某些融合层收益不大,可以减掉一部分 PAN 结构的重复融合节点,换一种更简洁的轻量连接方式。这一步最好是基于实际数据做消融,别拍脑袋删,否则多尺度检测能力会明显退化。3.3 结构化剪枝加重参数化:从基线模型“长出”一个小模型除了手动改结构,还有一条很实用的路线,就是从已训练好的 YOLOv11n 出发,用结构化剪枝得到更小的结构,然后配合蒸馏重新训练。和普通训练相比,这样得到的小模型往往保留了原模型已经学到的部分特征模式,训练起来起点更高。剪枝方式我用过两类:一类是 Slim 剪枝,在训练时给 BN 层的缩放系数加 L1 正则,让一部分通道的缩放系数趋近于零,然后把这些通道剪掉。另一类是基于通道重要性的剪枝,根据特征图激活幅度排序,剪掉贡献小的通道。前者实现简单,后者效果更精细一些。这里的关键组合顺序是:先训练一个大一点的学生基线,再做结构化剪枝得到目标小结构,最后在蒸馏框架下把剪枝后的模型重新训练。剪枝之后的模型结构更小,如果不重新训练,精度损失会非常明显,但放在蒸馏环境里,有了教师模型的引导,训练很容易收敛到比原始小模型更高的精度。重参数化这条路线也值得提一下。训练阶段使用多分支结构,比如类似 RepVGG 那样加入旁路卷积,让模型学得更准,推理阶段通过结构重参数化把多分支合并成单个卷积。这种方式的好处是训练时有更强的表达力,推理时又完全等价于一个小计算量的单一卷积结构。YOLO 系列里也能用这个方法,把训练和推理解耦,既享受大结构的训练优势,又享受小结构的推理效率。4. 实操全过程:用一套完整配置把知识蒸馏跑起来4.1 整体训练流程设计光讲原理容易飘,直接给出我实际跑过的一套流程,你可以照着搭。第一步,准备教师模型。用 YOLOv11l 或者 YOLOv11x 在业务数据集上完整训练到收敛。训练配置和正常训练一致,数据增强可以是偏强的版本,mAP 越高越好。教师模型的推理速度不重要,训练完成之后它只是作为“监督信号的来源”存在。第二步,确定学生模型结构。如果是直接用 YOLOv11n,那就省事;如果要做更小的自定义结构,按上一节说的深度可分离卷积、通道缩放等方式设计,然后把教师和学生的特征层对应关系列出来。比如教师第 6 层、第 12 层的特征图分别对应学生第 5 层、第 11 层。第三步,搭蒸馏损失。总损失等于学生自身检测损失加上蒸馏损失。检测损失部分和正常训练完全一致,蒸馏损失由分类蒸馏、回归蒸馏、特征蒸馏三项按权重相加。第四步,训练策略上,我建议先单独训练学生几个 epoch,让模型先具备基本的检测能力,再开启蒸馏损失。如果一开始就用完整蒸馏损失,学生定位能力还没形成,对教师预测的模仿容易变成乱学。等检测损失下降到正常水平之后再开蒸馏,蒸馏信号才是有意义的引导。4.2 关键 loss 权重与超参数配置下面这一组配置是我在多个业务数据集上验证过的起点,你可以把它当成基准再做微调:参数推荐值说明分类蒸馏损失权重1.0对齐教师分类 logits回归蒸馏损失权重2.0边界框参数回归对齐特征蒸馏损失权重0.5中间特征图对齐温度系数 T3~5分类软标签的平滑度学生自身检测损失权重1.0保证基础任务不丢失初始学习率0.01用 warmup 过渡优化器SGD 或 AdamW小模型用 SGD 更稳,大模型用 AdamWEMA开启指数移动平均能显著提升蒸馏训练稳定性这里特别说一下回归蒸馏权重为什么要偏高。YOLO 检测头的回归分支直接决定框的定位质量,教师模型在回归分支上学到的是多年经验沉淀下来的精确坐标分布,学生需要足够的梯度强度才能跟上。但也不能无限调高,权重太大会让模型只顾着模仿教师,忘记对真实标签的拟合,出现“学得很像教师,但 mAP 不涨”的问题。4.3 训练经验细节:EMA、warmup、数据增广EMA 在蒸馏场景下几乎是必开的。知识蒸馏的训练信号比较复杂,学生的权重更新容易震荡,EMA 相当于给网络权重做平滑,推理时用滑动平均后的权重,精度和稳定性都有明显提升。warmup 阶段建议拉长一点。正常训练可能 3 到 5 个 epoch 就够,蒸馏训练我习惯放到 10 到 15 个 epoch。原因是教师蒸馏信号的方差比普通标签大,一开始用太高的学习率容易让模型跑偏,warmup 期间先稳定主干,再逐步学习教师知识。数据增广这块有个容易踩的坑:教师和学生在增强强度上要适当解耦。教师已经训练完毕,推理时不受增强影响,但学生的训练增强如果太强,特征分布被扰动得太大,蒸馏对齐就会不稳定。我一般用中等强度的马赛克增强,同时关闭一部分随机擦除,保证蒸馏特征的可对齐性。还有一个小细节:多尺度训练时,教师和学生输入尺寸要保持一致。否则特征图空间尺寸对不上,蒸馏损失计算会非常别扭。如果你用 640 作为标准训练尺寸,教师推理也固定用 640,不要给学生输入 512,给教师输入 640,这样特征图尺寸差异会让对齐层设计变得极其麻烦。5. 更小模型设计:除了蒸馏,还有哪些能打出组合拳5.1 轻量级 block 设计:从常规卷积到 PConv蒸馏是在训练层面让模型变强,但模型本身的推理效率还得靠结构设计。如果你想在 YOLOv11n 的基础上再做轻量化,第一步就是重看网络的基本模块。常规卷积的 FLOPs 和参数量都比较大,尤其是在高分辨率特征图阶段。一个替代方案是通道部分卷积,这种设计最早出现在一些高实时性任务中,基本思路是只对一部分输入通道做空间卷积,其余通道保持原样。这样可以省掉大量冗余的空间计算,特别是对已经在深层语义较丰富的阶段效果明显。优点是不需要复杂的重参数化就能直接降低下采样阶段的推理开销,缺点是要人工决定哪些通道做卷积、哪些不做,选得不好会损失空间特征。另一种思路是替换激活函数和归一化方式。YOLOv11 默认的结构在推理时包含了很多 BN 层的计算,虽然 BN 在推理时可以折叠进卷积,但部分轻量级框架不一定做了优化。如果你把 BN 替换成不带均值方差统计的轻量归一化方式,可以省去一部分推理时的统计计算。是否值得,取决于你的目标推理设备对归一化层的支持情况。5.2 通道剪枝与蒸馏的结合顺序很多人问我是先蒸馏还是先剪枝,我直接给结论:先训练大教师,再设计小结构,再用蒸馏训小结构,如果还需要更小,再做剪枝,剪完之后再蒸馏一轮。这个顺序的逻辑是:第一步蒸馏已经让结构确定的学生模型学到了尽可能多的知识,此时再剪枝,剪掉的是那些对学生模型贡献度最低的通道,精度损失会比直接剪一个没经过蒸馏的模型小很多。剪完之后,模型结构变了,蒸馏教师还在,顺手再补一轮蒸馏,把精度拉回来。我试过先剪枝再蒸馏的路线,也能用,但整体效果没有“先蒸馏再剪枝再蒸馏”稳定。原因是剪枝会改变特征表达,如果你在蒸馏阶段学到的是剪枝前结构的特征分布,剪完之后特征层对应关系已经错位,重新对齐的成本更高。5.3 推理时的重参数化合并重参数化是一个在训练和推理结构之间做转换的思路。训练时用多分支结构,比如主卷积旁加一个 1x1 卷积分支、再加一个恒等映射分支,三个分支的输出相加后再过激活函数。多分支结构在训练中相当于隐式集成,梯度路径更丰富,模型能学到更精细的特征。推理时把三个分支的卷积核做代数合并,变成一个等效的单一卷积。这个合并过程在数学上是严格的,只需要把旁路卷积的核先补零到与主卷积相同尺寸,再相加即可。合并之后,推理时完全看不出多分支痕迹,计算量和参数直接就等于一个普通卷积。这个思路用在 YOLOv11 自定义结构里非常合适。如果你想构建一个比 nano 更小的模型,不要直接做一个单路小卷积网络去蒸馏,那样训练难度会大很多。更好的做法是训练时用重参数化的多分支版本,推理时转换成单路小结构。同样的小结构容量,训练时的表达能力会强很多,蒸馏接收教师知识的能力也更强。5.4 模型缩放尺度如何定:用户带宽和端侧算力很多人在“更小模型设计”这一步会犯一个错误,把模型做得无限小,最后精度崩得没法看。模型缩到什么程度,不能只看网络的参数量,而要看目标设备的推理预算、内存带宽、缓存大小。以端侧 NPU 为例,真正决定推理延迟的往往不是 FLOPs,而是内存访问次数和算子调度开销。一个通道数很窄但层数很多的模型,可能比一个通道稍宽但层数较少的模型在 NPU 上更慢。所以设计小模型之前,先在目标设备上跑一下结构基线的耗时,确认瓶颈是计算量还是访存量。实用经验是:把“模型缩放尺度”当成一个搜索问题来做。先设计 3 到 4 个不同缩放尺度的模型,分别用蒸馏训练,画一条“模型计算量与 mAP”的曲线,找出拐点位置。拐点附近的模型就是性价比最高的结构。再往小走,精度掉得厉害;再往大走,推理速度又不达标。这种方式比拍脑袋选一个宽度因子要靠谱得多。6. 常见问题与排查技巧实录6.1 蒸馏 loss 降了但 mAP 不涨这是我被问得最多的一个问题。学生模型的蒸馏损失一直在下降,说明学生对教师输出拟合得不错,但验证集 mAP 纹丝不动,甚至略降。排查思路分三步。第一步看教师模型本身的验证精度,如果教师在自己数据集上精度不高,蒸馏信号本身就是有噪声的,学生学了也不会有提升。第二步看蒸馏权重,把回归蒸馏权重降下来,只保留分类蒸馏,看 mAP 是否有变化。很多情况下回归蒸馏权重过高会让学生过度拟合教师的预测框分布,反而抑制了对真实标注的学习。第三步是看特征蒸馏的层位置,如果你强制对齐一个语义不匹配的中间层,模型会把大量容量用在“伪装成教师中间特征”上,对最终检测任务帮助很小,适当减少特征蒸馏层数。6.2 学生模型不够强,logits 对齐导致负迁移如果学生是小模型,容量本身有限,教师给的软标签信息量又太大,学生会在对齐教师的过程中失去对硬标签的敏感性,这种情况叫负迁移。典型表现是训练损失曲线比普通训练还低,但 mAP 明显不如学生独立训练的结果。解决思路是降低蒸馏学习率或者增加蒸馏损失的退火系数。让模型在训练后期逐渐从“模仿教师”过渡到“关注真实标签”,类似课程学习:早期多学教师,后期多学硬标签。另一个办法是给蒸馏损失乘以一个动态权重,比如前期 1.0,训练到一半开始线性衰减到 0.1。这样学生先通过教师搭建整个特征框架,再通过硬标签做精细微调。6.3 多尺度训练和特征图尺寸不一致多尺度训练是 YOLO 的标准操作,训练时输入尺寸会动态变化。问题在于教师和学生如果使用不同的输入尺度,同一个目标区域在特征图上的空间位置和尺寸都会变化,蒸馏对齐会直接出错。我的做法是训练过程中固定蒸馏对齐的尺度,让教师和学生使用相同输入尺寸段。如果教师资源有限,可以先离线把教师在大尺寸输入下的特征预先算好,存成特征缓存,训练学生时直接读缓存。这样做的缺点是占硬盘空间,但优点是大规模训练时非常节省时间,也更稳定。还有一种简化方案是多尺度训练时只启用检测损失,蒸馏损失固定在一个基准尺度上计算,也能避免大部分对齐问题。6.4 训练 Trick 速查表最后把我在多次蒸馏实践中沉淀下来的几个小技巧做成表格,方便你对照排查:问题现象可能原因推荐处理蒸馏 loss 下降但精度不涨教师精度不足或回归权重过大微调教师、降低回归蒸馏权重学生训练发散、loss 震荡蒸馏权重初始过大先关蒸馏训几个 epoch 再开启小目标检测精度差特征蒸馏没有 mask 引导加上前景区域 mask 加权特征对齐失效对齐层选择不合适只选 1 个关键层做注意力图对齐蒸馏后模型泛化差教师过多先验噪声先微调教师模型训练速度慢到无法接受教师推理计算量大离线缓存教师特征输出7. 蒸馏与轻量设计的进一步扩展方向前六节的内容基本覆盖了知识蒸馏在 YOLOv11 轻量化中的完整落地路径。最后再补充两个我最近在尝试的方向,这个部分可以作为你后续优化的启发。第一个方向是自蒸馏。不一定非要用一个外部大模型当教师,可以让 YOLOv11n 自己训出多个不同尺度的预测分支,利用深层的强特征去指导浅层分支学习。极端情况下,可以只在普通训练里加上一个“内部蒸馏”的辅助损失,不需要额外的教师推理步骤,训练成本几乎不增加。对于完全找不到合适教师模型的场景,自蒸馏是一个不错的兜底方案。第二个方向是特征蒸馏与半监督学习结合。之前我在一批带标注数据很少、无标注数据很多的业务场景里,先用教师模型对无标注数据生成预测,再拿这些预测当作软标签去蒸馏学生模型。效果出奇地好,相当于把教师模型在无标注数据上的泛化知识也转移给了学生。这一招对很多真实项目都有参考价值,因为业务场景里往往最缺的就是标注数据。我个人在实际操作中的体会是:知识蒸馏不是一个“训练完就结束”的单点操作,它更像一个贯穿整个模型生命周期的辅助手段。模型设计、训练、剪枝、量化、蒸馏,每一步之间都有耦合关系。你把蒸馏放在最后一步做,效果有限;把它融入每个阶段去考虑,效果会翻倍。建议拿到一个新项目时,先搭建一个完整的蒸馏训练流程,再在这个流程基础上去做结构设计,这样每一步的改动都能通过蒸馏框架快速验证,而不是等模型部署到设备上才发现精度不行又推倒重来。
《YOLOv11 实战:从入门到深度优化20篇》013、模型轻量化技术(三):知识蒸馏与更小模型设计写这块内容之前,先交代一个背景:我在给一个端侧设备项目做目标检测选型时,用 YOLOv11n 跑出来的精度总差那么一口气,尤其是小目标和密集场景。换更大的模型,设备推理时间直接超预算。剪枝、量化都试了一圈,最后还是靠知识蒸馏把精度补了回来。这也是我决定把蒸馏单独写一篇的原因——它是轻量化技术里“性价比”最高的一环,不改变推理结构,不需要特定推理库支持,纯粹通过训练过程让小的模型学得更聪明。这个系列前两篇分别讲了剪枝和量化,它们解决的是“模型算起来更快”的问题。但压缩之后精度下降怎么办?蒸馏解决的就是“让小模型学到更接近大模型的表达能力”的问题。加上这篇文章还要聊“更小模型设计”,也就是怎么在结构层面做一个真正适合端侧、适合蒸馏的轻量模型。两者合在一起,才是完整的轻量化方案。这篇内容面向两类人:一类是用 YOLOv11 做落地项目,设备算力受限、只能跑小模型的开发者;另一类是已经了解蒸馏概念,但不知道怎么在检测任务里具体操作的人。我会把蒸馏的原理、YOLO 这类密集预测任务的蒸馏难点、教师学生模型的选型、完整训练配置、以及更小模型的几种设计思路全部讲清楚,并且把我实际跑实验时踩过的坑一并写出来。1. 轻量化路线里,蒸馏和“更小模型设计”到底解决什么问题1.1 先明确目标:不是“小”,而是“小且准”很多同学一说到模型轻量化,第一反应就是把网络变瘦、通道变窄、分辨率降低。这确实能让模型变小,但代价是精度急剧下降。如果只是“变小”,其实很容易,难的是在变小之后保住精度,甚至逼近大模型的水平。知识蒸馏就是冲着这个“精度回补”来的。它的核心思路非常朴素:用一个强大的教师模型指导一个弱小的学生模型学习。教师模型在训练过程中不仅告诉学生“这张图里有什么类别、什么位置”,还告诉学生“它对这些预测有多大的把握、哪些类别之间比较接近、哪些特征的响应更强烈”。这种信息比单纯的标签要丰富得多,因为标签只有 0 和 1,而教师模型的输出是一个分布。放在 YOLOv11 的场景里:你有一个训练得非常好的 YOLOv11x 或者 YOLOv11l,推理速度不达标,但精度确实漂亮。现在你想换 YOLOv11n,直接从头训精度差 2 到 3 个点。用蒸馏,可以让 YOLOv11n 在部署时完全保持自身结构,却把大模型学到的知识尽量继承过来。部署端无感知,推理速度和原来一样快,精度却能往上走。1.2 为什么前两篇讲了剪枝和量化,还要单独谈蒸馏简单梳理一下轻量化的三条主线:剪枝:把模型里冗余的通道、层或连接去掉,让模型变小变快。问题在于剪完要微调,而且剪到一定程度精度会断崖式下跌。量化:把 FP32 权重换成 INT8 甚至 INT4,计算变快、内存变小。问题在于需要校准数据、可能受推理库支持限制,极端量化时掉点明显。蒸馏:不动模型结构,通过训练方式让弱模型变强。好处是不依赖推理框架,和剪枝、量化可以叠加使用。这三条路线不是互相替代,而是组合拳。蒸馏负责“补精度”,剪枝量化负责“砍体积”。实际操作里,我会先训一个大模型当教师,再用蒸馏训练一个结构经过优化的学生模型,学生模型训练完成后,如果需要再有一步量化或剪枝,精度余量会大得多。这比直接用原始小模型做完剪枝量化再去补精度要稳得多。1.3 知识蒸馏的本质:不是压缩网络,是转移表达能力很多初学者有个误区,认为蒸馏是把大模型的权重直接搬到小模型里。完全不是。大模型的参数动辄几十 MB,小模型只有几 MB,“搬运”在物理上就说不通。蒸馏转移的是“表达能力”。通俗讲,大模型看过大量数据之后,它学到了一个非常复杂的决策边界。这个决策边界里包含了数据之间的细微关系:比如一只猫和一只狐狸在低维特征上很接近,但如果模型知道“猫的耳朵更圆、狐狸的尾巴更蓬松”,它就能把这些细微差异编码在特征中。小模型受限于参数量,自己从头学这些关系很吃力,但如果大模型在训练过程中把“判断的中间状态”告诉小模型,小模型就可以走一条捷径,直接模仿大模型已经收敛好的决策过程。这也是为什么蒸馏出来的学生模型往往比独立训练的小模型精度高的根本原因。它不是让网络变得更复杂,而是让同一个网络结构在训练时获得更高质量的监督信号。2. 目标检测里的蒸馏,和分类蒸馏差别巨大2.1 检测头的多分支输出到底怎么蒸馏分类任务里做蒸馏很简单,教师和学生网络最后都输出一个类别概率分布,直接用 KL 散度对齐就行。但目标检测是密集预测,YOLOv11 的输出包括边界框回归、置信度、分类得分,且在多个尺度的特征图上都有输出。你没法像分类那样单纯对齐一个向量。这里要先理解 YOLOv11 的检测头结构。它通常是一条检测分支,分别预测类别 logits、边界框回归参数、以及目标置信度。结构上变得复杂了,蒸馏时就需要考虑三条信息流。最直接的做法是“解耦蒸馏”:把分类蒸馏和回归蒸馏分开做。分类部分继续用 KL 散度对齐 logits,让学生的类别预测分布尽可能接近教师。回归部分用 Smooth L1 或者 L1 Loss 去拟合教师输出的边界框参数。置信度部分可以蒸馏、也可以不蒸馏,我实际测试下来置信度蒸馏的增益相对有限,而且容易和分类蒸馏产生纠缠,所以多数场景下优先保证分类和回归两块对齐。2.2 三类主流做法:logits 软标签、特征对齐、mask 引导第一类是 logits 蒸馏。把教师的输出做 softmax 软化之后,作为软标签交给学生。学生既算硬标签的交叉熵,又算和教师软标签的 KL 散度。软标签的好处是包含了教师对类别相似度的“理解”。第二类是特征对齐蒸馏。不只看输出层,而是对齐教师和学生网络中间的特征图。因为 YOLO 这类检测模型,底层特征的感受野和语义信息非常丰富,学生如果能在中间层就把特征学得接近教师,最终检测头的精度会更高。典型的做法是用一个适配层把学生的特征图通道数映射到和教师一致,然后计算 L2 距离或者注意力图的差异。第三类是 mask 引导蒸馏,这是检测任务里特有的一种思路。因为图像里大部分区域是背景,直接对整个特征图做蒸馏,学生很容易被背景区域主导,忽略了前景目标。做法是让教师生成一个“目标区域的 mask”,告诉蒸馏损失只在前景区域生效,或者在前景区域加大权重。这样小模型可以集中精力学习目标区域的特征表达,而不是把大量容量浪费在纯背景上。我实际项目中的组合方式是:分类分支用 logits 蒸馏,回归分支用特征对齐加 mask 引导,中间层挑一个关键特征层做注意力图蒸馏。只选一个中间层而不是所有层,因为层数太多会让训练变得不稳定,梯度信息混乱。2.3 温度 T 该怎么选:soften 到什么程度才是合适的温度系数 T 是蒸馏里绕不开的参数。T 越大,教师输出的概率分布越平滑,类间差异越模糊,包含的“类间相似度”信息就越多;T 越小,分布越尖锐,越接近硬标签。但 T 不是越大越好,太大了反而会把噪声也带进来,让学生学到的决策边界过于平滑。我在 YOLOv11 蒸馏中的经验是:分类分支 T 设置在 3 到 5 比较合适,特征蒸馏不用温度系数,直接计算特征距离。针对检测场景,我一般先用 T=4 跑几轮看 loss 曲线,如果学生 loss 下降过慢,就降到 T=2 或 3。这里没有万能值,和目标类别数、数据集复杂度都有关。比较稳妥的做法是做一个很小的 T 值消融实验,用 1、3、5 三组对比,每组只用十分之一的数据量训练 10 个 epoch,就能大概判断哪个区间更好。3. 教师与学生选型:不是越大越好,关键是“可学”3.1 教师模型选型:同族蒸馏还是跨族蒸馏教师选择的基本原则是“精度要高,且不能太强”。听起来矛盾,但实际是有道理的。如果教师太弱,它自己都学得不准,教出来的学生自然不会好。如果教师太强,比如一个参数量是学生几十倍、用了大量额外数据训练的超大模型,它的决策边界和学生表达能力的差距太大,学生只能模仿个大概,甚至出现“负迁移”。同族蒸馏指的是教师和学生结构相似,比如教师用 YOLOv11l,学生用 YOLOv11n。结构相似的好处是特征维度、语义层级比较接近,对齐起来容易,蒸馏效率高。我倾向于优先推荐同族蒸馏,因为这个场景最可控、最好调。跨族蒸馏也有应用,比如用一个大尺寸检测模型或一个精度更高的通用视觉模型当教师,蒸馏给 YOLOv11n。跨族蒸馏在提升泛化能力上可能更好,但实现起来麻烦不少,特征对齐层要专门设计,对应关系容易错位。除非同族蒸馏效果不理想,否则我不建议新手一上来就搞跨族蒸馏。过强的教师问题,我举一个实际例子:我用一个在大型公开数据集上预训练的大模型给 YOLOv11n 当教师,在自有业务数据上蒸馏,结果 mAP 不升反降。原因是教师的预测中包含大量“在预训练数据上成立、但在业务数据上不成立”的先验知识,学生全盘接收之后反被带偏。后来改成先用业务数据把教师微调一轮,再开始蒸馏,问题就解决了。3.2 学生模型设计:深度可分离卷积与通道缩放说完了教师,再看学生。YOLOv11n 本身已经算轻量,但如果你想在 MCU 级设备、或者极小内存的 NPU 上跑,还需要继续往小做。这时就要动网络结构,做“更小模型设计”。第一个可以被替换的结构是普通卷积。把标准卷积换成深度可分离卷积,计算量能降一个数量级。深度可分离卷积分两步:先做逐通道卷积,再做逐点卷积。逐通道卷积只在一个通道内做空间卷积,逐点卷积用 1x1 卷积把各通道信息融合。整个过程参数少、计算少,表达能力略有下降,但配合蒸馏完全可以弥补。第二个思路是通道缩放。YOLOv11n 的各层通道数相对固定,你可以按比例整体缩小,比如把主要阶段的通道数乘以 0.75 或者 0.5。这个操作简单直接,但要注意不能均匀缩放每一层,特征提取早期阶段的通道数不要砍太狠,语义融合阶段可以多砍一点。经验法则是浅层保细节,深层保语义。第三个思路是简化颈部结构。YOLO 的 Neck 负责多尺度特征融合,结构本身有一定冗余。如果你通过实验确认某些融合层收益不大,可以减掉一部分 PAN 结构的重复融合节点,换一种更简洁的轻量连接方式。这一步最好是基于实际数据做消融,别拍脑袋删,否则多尺度检测能力会明显退化。3.3 结构化剪枝加重参数化:从基线模型“长出”一个小模型除了手动改结构,还有一条很实用的路线,就是从已训练好的 YOLOv11n 出发,用结构化剪枝得到更小的结构,然后配合蒸馏重新训练。和普通训练相比,这样得到的小模型往往保留了原模型已经学到的部分特征模式,训练起来起点更高。剪枝方式我用过两类:一类是 Slim 剪枝,在训练时给 BN 层的缩放系数加 L1 正则,让一部分通道的缩放系数趋近于零,然后把这些通道剪掉。另一类是基于通道重要性的剪枝,根据特征图激活幅度排序,剪掉贡献小的通道。前者实现简单,后者效果更精细一些。这里的关键组合顺序是:先训练一个大一点的学生基线,再做结构化剪枝得到目标小结构,最后在蒸馏框架下把剪枝后的模型重新训练。剪枝之后的模型结构更小,如果不重新训练,精度损失会非常明显,但放在蒸馏环境里,有了教师模型的引导,训练很容易收敛到比原始小模型更高的精度。重参数化这条路线也值得提一下。训练阶段使用多分支结构,比如类似 RepVGG 那样加入旁路卷积,让模型学得更准,推理阶段通过结构重参数化把多分支合并成单个卷积。这种方式的好处是训练时有更强的表达力,推理时又完全等价于一个小计算量的单一卷积结构。YOLO 系列里也能用这个方法,把训练和推理解耦,既享受大结构的训练优势,又享受小结构的推理效率。4. 实操全过程:用一套完整配置把知识蒸馏跑起来4.1 整体训练流程设计光讲原理容易飘,直接给出我实际跑过的一套流程,你可以照着搭。第一步,准备教师模型。用 YOLOv11l 或者 YOLOv11x 在业务数据集上完整训练到收敛。训练配置和正常训练一致,数据增强可以是偏强的版本,mAP 越高越好。教师模型的推理速度不重要,训练完成之后它只是作为“监督信号的来源”存在。第二步,确定学生模型结构。如果是直接用 YOLOv11n,那就省事;如果要做更小的自定义结构,按上一节说的深度可分离卷积、通道缩放等方式设计,然后把教师和学生的特征层对应关系列出来。比如教师第 6 层、第 12 层的特征图分别对应学生第 5 层、第 11 层。第三步,搭蒸馏损失。总损失等于学生自身检测损失加上蒸馏损失。检测损失部分和正常训练完全一致,蒸馏损失由分类蒸馏、回归蒸馏、特征蒸馏三项按权重相加。第四步,训练策略上,我建议先单独训练学生几个 epoch,让模型先具备基本的检测能力,再开启蒸馏损失。如果一开始就用完整蒸馏损失,学生定位能力还没形成,对教师预测的模仿容易变成乱学。等检测损失下降到正常水平之后再开蒸馏,蒸馏信号才是有意义的引导。4.2 关键 loss 权重与超参数配置下面这一组配置是我在多个业务数据集上验证过的起点,你可以把它当成基准再做微调:参数推荐值说明分类蒸馏损失权重1.0对齐教师分类 logits回归蒸馏损失权重2.0边界框参数回归对齐特征蒸馏损失权重0.5中间特征图对齐温度系数 T3~5分类软标签的平滑度学生自身检测损失权重1.0保证基础任务不丢失初始学习率0.01用 warmup 过渡优化器SGD 或 AdamW小模型用 SGD 更稳,大模型用 AdamWEMA开启指数移动平均能显著提升蒸馏训练稳定性这里特别说一下回归蒸馏权重为什么要偏高。YOLO 检测头的回归分支直接决定框的定位质量,教师模型在回归分支上学到的是多年经验沉淀下来的精确坐标分布,学生需要足够的梯度强度才能跟上。但也不能无限调高,权重太大会让模型只顾着模仿教师,忘记对真实标签的拟合,出现“学得很像教师,但 mAP 不涨”的问题。4.3 训练经验细节:EMA、warmup、数据增广EMA 在蒸馏场景下几乎是必开的。知识蒸馏的训练信号比较复杂,学生的权重更新容易震荡,EMA 相当于给网络权重做平滑,推理时用滑动平均后的权重,精度和稳定性都有明显提升。warmup 阶段建议拉长一点。正常训练可能 3 到 5 个 epoch 就够,蒸馏训练我习惯放到 10 到 15 个 epoch。原因是教师蒸馏信号的方差比普通标签大,一开始用太高的学习率容易让模型跑偏,warmup 期间先稳定主干,再逐步学习教师知识。数据增广这块有个容易踩的坑:教师和学生在增强强度上要适当解耦。教师已经训练完毕,推理时不受增强影响,但学生的训练增强如果太强,特征分布被扰动得太大,蒸馏对齐就会不稳定。我一般用中等强度的马赛克增强,同时关闭一部分随机擦除,保证蒸馏特征的可对齐性。还有一个小细节:多尺度训练时,教师和学生输入尺寸要保持一致。否则特征图空间尺寸对不上,蒸馏损失计算会非常别扭。如果你用 640 作为标准训练尺寸,教师推理也固定用 640,不要给学生输入 512,给教师输入 640,这样特征图尺寸差异会让对齐层设计变得极其麻烦。5. 更小模型设计:除了蒸馏,还有哪些能打出组合拳5.1 轻量级 block 设计:从常规卷积到 PConv蒸馏是在训练层面让模型变强,但模型本身的推理效率还得靠结构设计。如果你想在 YOLOv11n 的基础上再做轻量化,第一步就是重看网络的基本模块。常规卷积的 FLOPs 和参数量都比较大,尤其是在高分辨率特征图阶段。一个替代方案是通道部分卷积,这种设计最早出现在一些高实时性任务中,基本思路是只对一部分输入通道做空间卷积,其余通道保持原样。这样可以省掉大量冗余的空间计算,特别是对已经在深层语义较丰富的阶段效果明显。优点是不需要复杂的重参数化就能直接降低下采样阶段的推理开销,缺点是要人工决定哪些通道做卷积、哪些不做,选得不好会损失空间特征。另一种思路是替换激活函数和归一化方式。YOLOv11 默认的结构在推理时包含了很多 BN 层的计算,虽然 BN 在推理时可以折叠进卷积,但部分轻量级框架不一定做了优化。如果你把 BN 替换成不带均值方差统计的轻量归一化方式,可以省去一部分推理时的统计计算。是否值得,取决于你的目标推理设备对归一化层的支持情况。5.2 通道剪枝与蒸馏的结合顺序很多人问我是先蒸馏还是先剪枝,我直接给结论:先训练大教师,再设计小结构,再用蒸馏训小结构,如果还需要更小,再做剪枝,剪完之后再蒸馏一轮。这个顺序的逻辑是:第一步蒸馏已经让结构确定的学生模型学到了尽可能多的知识,此时再剪枝,剪掉的是那些对学生模型贡献度最低的通道,精度损失会比直接剪一个没经过蒸馏的模型小很多。剪完之后,模型结构变了,蒸馏教师还在,顺手再补一轮蒸馏,把精度拉回来。我试过先剪枝再蒸馏的路线,也能用,但整体效果没有“先蒸馏再剪枝再蒸馏”稳定。原因是剪枝会改变特征表达,如果你在蒸馏阶段学到的是剪枝前结构的特征分布,剪完之后特征层对应关系已经错位,重新对齐的成本更高。5.3 推理时的重参数化合并重参数化是一个在训练和推理结构之间做转换的思路。训练时用多分支结构,比如主卷积旁加一个 1x1 卷积分支、再加一个恒等映射分支,三个分支的输出相加后再过激活函数。多分支结构在训练中相当于隐式集成,梯度路径更丰富,模型能学到更精细的特征。推理时把三个分支的卷积核做代数合并,变成一个等效的单一卷积。这个合并过程在数学上是严格的,只需要把旁路卷积的核先补零到与主卷积相同尺寸,再相加即可。合并之后,推理时完全看不出多分支痕迹,计算量和参数直接就等于一个普通卷积。这个思路用在 YOLOv11 自定义结构里非常合适。如果你想构建一个比 nano 更小的模型,不要直接做一个单路小卷积网络去蒸馏,那样训练难度会大很多。更好的做法是训练时用重参数化的多分支版本,推理时转换成单路小结构。同样的小结构容量,训练时的表达能力会强很多,蒸馏接收教师知识的能力也更强。5.4 模型缩放尺度如何定:用户带宽和端侧算力很多人在“更小模型设计”这一步会犯一个错误,把模型做得无限小,最后精度崩得没法看。模型缩到什么程度,不能只看网络的参数量,而要看目标设备的推理预算、内存带宽、缓存大小。以端侧 NPU 为例,真正决定推理延迟的往往不是 FLOPs,而是内存访问次数和算子调度开销。一个通道数很窄但层数很多的模型,可能比一个通道稍宽但层数较少的模型在 NPU 上更慢。所以设计小模型之前,先在目标设备上跑一下结构基线的耗时,确认瓶颈是计算量还是访存量。实用经验是:把“模型缩放尺度”当成一个搜索问题来做。先设计 3 到 4 个不同缩放尺度的模型,分别用蒸馏训练,画一条“模型计算量与 mAP”的曲线,找出拐点位置。拐点附近的模型就是性价比最高的结构。再往小走,精度掉得厉害;再往大走,推理速度又不达标。这种方式比拍脑袋选一个宽度因子要靠谱得多。6. 常见问题与排查技巧实录6.1 蒸馏 loss 降了但 mAP 不涨这是我被问得最多的一个问题。学生模型的蒸馏损失一直在下降,说明学生对教师输出拟合得不错,但验证集 mAP 纹丝不动,甚至略降。排查思路分三步。第一步看教师模型本身的验证精度,如果教师在自己数据集上精度不高,蒸馏信号本身就是有噪声的,学生学了也不会有提升。第二步看蒸馏权重,把回归蒸馏权重降下来,只保留分类蒸馏,看 mAP 是否有变化。很多情况下回归蒸馏权重过高会让学生过度拟合教师的预测框分布,反而抑制了对真实标注的学习。第三步是看特征蒸馏的层位置,如果你强制对齐一个语义不匹配的中间层,模型会把大量容量用在“伪装成教师中间特征”上,对最终检测任务帮助很小,适当减少特征蒸馏层数。6.2 学生模型不够强,logits 对齐导致负迁移如果学生是小模型,容量本身有限,教师给的软标签信息量又太大,学生会在对齐教师的过程中失去对硬标签的敏感性,这种情况叫负迁移。典型表现是训练损失曲线比普通训练还低,但 mAP 明显不如学生独立训练的结果。解决思路是降低蒸馏学习率或者增加蒸馏损失的退火系数。让模型在训练后期逐渐从“模仿教师”过渡到“关注真实标签”,类似课程学习:早期多学教师,后期多学硬标签。另一个办法是给蒸馏损失乘以一个动态权重,比如前期 1.0,训练到一半开始线性衰减到 0.1。这样学生先通过教师搭建整个特征框架,再通过硬标签做精细微调。6.3 多尺度训练和特征图尺寸不一致多尺度训练是 YOLO 的标准操作,训练时输入尺寸会动态变化。问题在于教师和学生如果使用不同的输入尺度,同一个目标区域在特征图上的空间位置和尺寸都会变化,蒸馏对齐会直接出错。我的做法是训练过程中固定蒸馏对齐的尺度,让教师和学生使用相同输入尺寸段。如果教师资源有限,可以先离线把教师在大尺寸输入下的特征预先算好,存成特征缓存,训练学生时直接读缓存。这样做的缺点是占硬盘空间,但优点是大规模训练时非常节省时间,也更稳定。还有一种简化方案是多尺度训练时只启用检测损失,蒸馏损失固定在一个基准尺度上计算,也能避免大部分对齐问题。6.4 训练 Trick 速查表最后把我在多次蒸馏实践中沉淀下来的几个小技巧做成表格,方便你对照排查:问题现象可能原因推荐处理蒸馏 loss 下降但精度不涨教师精度不足或回归权重过大微调教师、降低回归蒸馏权重学生训练发散、loss 震荡蒸馏权重初始过大先关蒸馏训几个 epoch 再开启小目标检测精度差特征蒸馏没有 mask 引导加上前景区域 mask 加权特征对齐失效对齐层选择不合适只选 1 个关键层做注意力图对齐蒸馏后模型泛化差教师过多先验噪声先微调教师模型训练速度慢到无法接受教师推理计算量大离线缓存教师特征输出7. 蒸馏与轻量设计的进一步扩展方向前六节的内容基本覆盖了知识蒸馏在 YOLOv11 轻量化中的完整落地路径。最后再补充两个我最近在尝试的方向,这个部分可以作为你后续优化的启发。第一个方向是自蒸馏。不一定非要用一个外部大模型当教师,可以让 YOLOv11n 自己训出多个不同尺度的预测分支,利用深层的强特征去指导浅层分支学习。极端情况下,可以只在普通训练里加上一个“内部蒸馏”的辅助损失,不需要额外的教师推理步骤,训练成本几乎不增加。对于完全找不到合适教师模型的场景,自蒸馏是一个不错的兜底方案。第二个方向是特征蒸馏与半监督学习结合。之前我在一批带标注数据很少、无标注数据很多的业务场景里,先用教师模型对无标注数据生成预测,再拿这些预测当作软标签去蒸馏学生模型。效果出奇地好,相当于把教师模型在无标注数据上的泛化知识也转移给了学生。这一招对很多真实项目都有参考价值,因为业务场景里往往最缺的就是标注数据。我个人在实际操作中的体会是:知识蒸馏不是一个“训练完就结束”的单点操作,它更像一个贯穿整个模型生命周期的辅助手段。模型设计、训练、剪枝、量化、蒸馏,每一步之间都有耦合关系。你把蒸馏放在最后一步做,效果有限;把它融入每个阶段去考虑,效果会翻倍。建议拿到一个新项目时,先搭建一个完整的蒸馏训练流程,再在这个流程基础上去做结构设计,这样每一步的改动都能通过蒸馏框架快速验证,而不是等模型部署到设备上才发现精度不行又推倒重来。