【知识蒸馏】常见的知识蒸馏方式(二)

1、Distilling the Knowledge in a Neural Network

Hinton的文章"Distilling the Knowledge in a Neural Network"首次提出了知识蒸馏(暗知识提取)的概念,通过引入与教师网络(teacher network:复杂、但推理性能优越)相关的软目标(soft-target)作为total loss的一部分,以诱导学生网络(student network:精简、低复杂度)的训练,实现知识迁移(knowledge transfer)。

如上图所示,教师网络(左侧)的预测输出除以温度参数(Temperature)之后、再做softmax变换,可以获得软化的概率分布(软目标),数值介于0~1之间,取值分布较为缓和。Temperature数值越大,分布越缓和;而Temperature数值减小,容易放大错误分类的概率,引入不必要的噪声。针对较困难的分类或检测任务,Temperature通常取1,确保教师网络中正确预测的贡献。硬目标则是样本的真实标注,可以用one-hot矢量表示。total loss设计为软目标与硬目标所对应的交叉熵的加权平均(表示为KD loss与CE loss),其中软目标交叉熵的加权系数越大,表明迁移诱导越依赖教师网络的贡献,这对训练初期阶段是很有必要的,有助于让学生网络更轻松的鉴别简单样本,但训练后期需要适当减小软目标的比重,让真实标注帮助鉴别困难样本。另外,教师网络的推理性能通常要优于学生网络,而模型容量则无具体限制,且教师网络推理精度越高,越有利于学生网络的学习。

教师网络与学生网络也可以联合训练,此时教师网络的暗知识及学习方式都会影响学生网络的学习,具体如下(式中三项分别为教师网络softmax输出的交叉熵loss、学生网络softmax输出的交叉熵loss、以及教师网络数值输出与学生网络softmax输出的交叉熵loss):

联合训练的Paper地址:https://arxiv.org/abs/1711.05852

2、Exploring Knowledge Distillation of Deep Neural Networks for Efficient Hardware Solutions

这篇文章将total loss重新定义如下:

GitHub地址:https://github.com/peterliht/knowledge-distillation-pytorch

total loss的Pytorch代码如下,引入了精简网络输出与教师网络输出的KL散度,并在诱导训练期间,先将teacher network的预测输出缓存到CPU内存中,可以减轻GPU显存的overhead:

def loss_fn_kd(outputs, labels, teacher_outputs, params):
    """
    Compute the knowledge-distillation (KD) loss given outputs, labels.
    "Hyperparameters": temperature and alpha
    NOTE: the KL Divergence for PyTorch comparing the softmaxs of teacher
    and student expects the input tensor to be log probabilities! See Issue #2
    """
    alpha = params.alpha
    T = params.temperature
    KD_loss = nn.KLDivLoss()(F.log_softmax(outputs/T, dim=1),
                             F.softmax(teacher_outputs/T, dim=1)) * (alpha * T * T) + \
                             F.cross_entropy(outputs, labels) * (1. - alpha)
 
    return KD_loss

3、Ensemble of Multiple Teachers

第一种算法:多个教师网络输出的soft label按加权组合,构成统一的soft label,然后指导学生网络的训练:

第二种算法:由于加权平均方式会弱化、平滑多个教师网络的预测结果,因此可以随机选择某个教师网络的soft label作为guidance:

第三种算法:同样地,为避免加权平均带来的平滑效果,首先采用教师网络输出的soft label重新标注样本、增广数据、再用于模型训练,该方法能够让模型学会从更多视角观察同一样本数据的不同功能:

Paper地址:

https://www.researchgate.net/publication/319185356_Efficient_Knowledge_Distillation_from_an_Ensemble_of_Teachers

4、Hint-based Knowledge Transfer(这个不是很懂)

为了能够诱导训练更深、更纤细的学生网络(deeper and thinner FitNet),需要考虑教师网络中间层的Feature Maps(作为Hint),用来指导学生网络中相应的Guided layer。此时需要引入L2 loss指导训练过程,该loss计算为教师网络Hint layer与学生网络Guided layer输出Feature Maps之间的差别,若二者输出的Feature Maps形状不一致,Guided layer需要通过一个额外的回归层,具体如下:

具体训练过程分两个阶段完成:第一个阶段利用Hint-based loss诱导学生网络达到一个合适的初始化状态(只更新W_Guided与W_r);第二个阶段利用教师网络的soft label指导整个学生网络的训练(即知识蒸馏),且total loss中soft target相关部分所占比重逐渐降低,从而让学生网络能够全面辨别简单样本与困难样本(教师网络能够有效辨别简单样本,而困难样本则需要借助真实标注,即hard target):

Paper地址:https://arxiv.org/abs/1412.6550

GitHub地址:https://github.com/adri-romsor/FitNets

5、Attention to Attention Transfer(这个不是很懂)

通过网络中间层的attention map,完成teacher network与student network之间的知识迁移。考虑给定的tensor A,基于activation的attention map可以定义为如下三种之一:

随着网络层次的加深,关键区域的attention-level也随之提高。文章最后采用了第二种形式的attention map,取p=2,并且activation-based attention map的知识迁移效果优于gradient-based attention map,loss定义及迁移过程如下:

Paper地址:https://arxiv.org/abs/1612.03928

GitHub地址:https://github.com/szagoruyko/attention-transfer

6、Flow of the Solution Procedure

暗知识亦可表示为训练的求解过程(FSP: Flow of the Solution Procedure),教师网络或学生网络的FSP矩阵定义如下(Gram形式的矩阵https://blog.youkuaiyun.com/u013066730/article/details/80940781):

训练的第一阶段:最小化教师网络FSP矩阵与学生网络FSP矩阵之间的L2 Loss,初始化学生网络的可训练参数:

训练的第二阶段:在目标任务的数据集上fine-tune学生网络。从而达到知识迁移、快速收敛、以及迁移学习的目的。

Paper地址:

http://openaccess.thecvf.com/content_cvpr_2017/papers/Yim_A_Gift_From_CVPR_2017_paper.pdf

7、Knowledge Distillation with Adversarial Samples Supporting Decision Boundary(这个不是很懂)

从分类的决策边界角度分析,知识迁移过程亦可理解为教师网络诱导学生网络有效鉴别决策边界的过程,鉴别能力越强意味着模型的泛化能力越好:

文章首先利用对抗攻击策略(adversarial attacking)将基准类样本(base class sample)转为目标类样本、且位于决策边界附近(BSS: boundary supporting sample),进而利用对抗生成的样本诱导学生网络的训练,可有效提升学生网络对决策边界的鉴别能力。文章采用迭代方式生成对抗样本,需要沿loss function(基准类得分与目标类得分之差)的梯度负方向调整样本,直到满足停止条件为止:

loss function:

沿loss function的梯度负方向调整样本:

停止条件(只要满足三者之一):

结合对抗生成的样本,利用教师网络训练学生网络所需的total loss包含CE loss、KD loss以及boundary supporting loss(BS loss):

Paper地址:https://arxiv.org/abs/1805.05532

8、Label Refinery:Improving ImageNet Classification through Label Progression

这篇文章通过迭代式的诱导训练,主要解决训练期间样本的crop与label不一致的问题,以增强label的质量,从而进一步增强模型的泛化能力:

诱导过程中,total loss表示为本次迭代(t>1)网络的预测输出(概率分布)与上一次迭代输出(Label Refinery:类似于教师网络的角色)的KL散度:

文章实验部分表明,不仅可以用训练网络作为Label Refinery Network,也可以用其他高质量网络(如Resnet50)作为Label Refinery Network。并在诱导过程中,能够对抗生成样本,实现数据增强。

GitHub地址:https://github.com/hessamb/label-refinery

9、Meal V2 KD (Ensemble of Multi-Teachers)

具体请看博客https://blog.youkuaiyun.com/u013066730/article/details/111933231

MEAL V2的基本思路是通过知识蒸馏,将多个Teacher模型的效果ensemble、迁移到一个Student模型中,包括:Teacher模型集成,KL散度loss以及判别器:

  • 多个Teacher的预测概率求平均;
  • 仅依靠Teacher的Soft label;
  • 判别器起到正则化作用;
  • Student从预训练模型开始,减少蒸馏训练的开销;

Paper地址:https://arxiv.org/abs/2009.08453

GitHub:https://github.com/szq0214/MEAL-V2

10、Miscellaneous

-------- 知识蒸馏可以与量化结合使用,考虑了中间层Feature Maps之间的关系,可参考:

https://blog.youkuaiyun.com/nature553863/article/details/82147933

-------- 知识蒸馏与Hint Learning相结合,可以训练精简的Faster-RCNN,可参考:

https://blog.youkuaiyun.com/nature553863/article/details/82463249

-------- 知识蒸馏在Transformer模型压缩方面,主要采用Self-attention Knowledge Distillation,可参考:

https://blog.youkuaiyun.com/nature553863/article/details/106855786

-------- 模型压缩方面,更为详细的讨论,请参考:

https://blog.youkuaiyun.com/nature553863/article/details/81083955

<think>好的,用户想了解YOLO模型的知识蒸馏方法或实现。首先,我需要回忆一下知识蒸馏的基本概念,它通常是指将大型教师模型的知识迁移到小型学生模型上,以提高学生模型的效率和性能。YOLO作为目标检测模型,知识蒸馏的应用可能有其特定的挑战,比如如何处理检测任务中的定位和分类双重任务。 接下来,我应该查找YOLO知识蒸馏的相关资料。记得在参考引用中有一个关于目标检测的概述,可能提到了单阶段方法,比如YOLO[^1]。此外,用户提供的引用[2]可能包含实践代码或教程,但内容看起来比较宽泛,可能需要更多的具体信息。 需要确定YOLO知识蒸馏的具体技术。常见知识蒸馏方法包括特征模仿、响应蒸馏以及注意力转移等。在目标检测中,可能不仅需要处理分类输出,还要处理边界框回归。例如,教师模型和学生模型在特征图上的对齐可能很重要,尤其是不同尺度的特征图。 实现方面,YOLOv5或YOLOv8可能有相关的开源项目或代码示例。用户可能需要具体的实现步骤,比如如何定义损失函数,如何结合教师和学生的输出。例如,在YOLOv5中,可以在模型训练时加载教师模型的权重,并在损失函数中加入蒸馏损失项,如KL散度或MSE损失。 还需要考虑蒸馏策略,比如是否在特征层、预测层或两者同时进行蒸馏。比如,一些方法提出在neck部分进行特征模仿,或者在head部分进行响应蒸馏。同时,可能需要调整损失权重,平衡原始检测损失和蒸馏损失。 另外,数据增强在蒸馏中的作用也很重要,弱增强和强增强的组合使用可能影响蒸馏效果。例如,教师模型在强增强数据上训练,学生模型在弱增强数据上学习教师的输出,这样可以提升泛化能力。 可能遇到的问题包括教师模型和学生模型的结构差异,如何处理不同尺度的特征图,以及如何有效传递定位知识。例如,使用自适应层来匹配教师和学生特征图的尺寸,或者设计针对边界框回归的蒸馏损失函数。 最后,需要总结常见的实现技巧,如损失函数设计、特征对齐方法、训练策略等,并给出具体的代码示例或参考资源。可能还需要提到一些优化技巧,如温度参数调整、逐步蒸馏等。</think>### YOLO知识蒸馏方法及实现 知识蒸馏(Knowledge Distillation)在YOLO系列中的应用主要通过**特征模仿**、**响应蒸馏**和**注意力转移**三种形式实现,核心目标是让轻量级学生模型(Student)模仿高性能教师模型(Teacher)的输出特征或中间特征。以下是具体方法和技术实现: --- #### 一、核心蒸馏方法 1. **特征模仿(Feature Mimicking)** - **操作方式**:对齐教师模型和学生模型的特征图,例如在YOLOv5中通过设计自适应层(Adaptation Layer)匹配不同尺度的特征图尺寸 - **损失函数**: $$L_{feat} = \sum_{l} \lambda_l \cdot MSE(F_{T}^{(l)}, F_{S}^{(l)})$$ 其中$F_{T}^{(l)}$和$F_{S}^{(l)}$分别表示教师和学生模型第$l$层的特征图,$\lambda_l$为权重系数 2. **响应蒸馏(Response Distillation)** - **分类分支**:使用KL散度对齐分类得分: $$L_{cls} = KL(\sigma(\frac{p_T}{\tau}), \sigma(\frac{p_S}{\tau}))$$ 其中$\tau$为温度参数,$\sigma$为Softmax函数 - **回归分支**:通过L1/L2损失对齐边界框坐标预测: $$L_{reg} = \sum_{i} ||b_{T}^{(i)} - b_{S}^{(i)}||_2$$ 3. **注意力蒸馏(Attention Distillation)** - 提取教师模型的特征图注意力权重(如Grad-CAM),强制学生模型学习相似的注意力分布[^2] --- #### 、实现步骤(以YOLOv5为例) ```python # 伪代码示例 import torch from models.yolo import Model # 加载教师模型和学生模型 teacher = Model("yolov5x.yaml").load("yolov5x.pt") student = Model("yolov5s.yaml") # 定义蒸馏损失函数 def distillation_loss(t_output, s_output, tau=3.0): # 分类损失 t_cls = torch.softmax(t_output[0]/tau, dim=-1) s_cls = torch.log_softmax(s_output[0]/tau, dim=-1) loss_cls = F.kl_div(s_cls, t_cls, reduction='batchmean') # 回归损失 loss_reg = F.mse_loss(t_output[1], s_output[1]) return 0.5*loss_cls + 0.5*loss_reg # 训练循环 for images, targets in dataloader: with torch.no_grad(): t_preds = teacher(images) s_preds = student(images) # 总损失 = 原始检测损失 + 蒸馏损失 loss = original_detection_loss(s_preds, targets) + distillation_loss(t_preds, s_preds) loss.backward() optimizer.step() ``` --- #### 三、优化技巧 1. **渐进式蒸馏**:逐步增加蒸馏损失的权重,避免早期训练不稳定 2. **多教师蒸馏**:融合多个教师模型的输出提升鲁棒性 3. **特征解耦**:对分类和回归任务分别设计蒸馏路径[^1] 4. **自适应温度**:动态调整$\tau$参数平衡软标签的平滑度 --- #### 四、典型应用场景 1. 移动端/边缘设备部署(如YOLOv5n → YOLOv5s) 2. 多任务模型压缩(检测+分割联合蒸馏) 3. 跨模态知识迁移(RGB→红外检测模型) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值