模型蒸馏概述和实验

目录

 

1 杂谈

2 蒸馏方法概述。

2.1 基于最后输出层的蒸馏

2.2 基于中间结果层的蒸馏

2.3 基于元学习的蒸馏

3 实验结果和参考代码


1 杂谈

鉴于目前算法和数据的瓶颈,我最近研究了一下模型蒸馏,目的是通过大模型能够带动我需要的小模型。目前的模型蒸馏这方面的研究已经不少了,专业术语上也有了KD(Knowl-edge Distillation (KD)), knowledge transfe(KT)等,我觉得其实大致上是一样的,条条道路通罗马。

2 蒸馏方法概述。

2.1 基于最后输出层的蒸馏

这部分的研究的主要思想是,通过大模型的最后输出结果来作为先验知识,结合one-hot label数据,共同的指导小模型学习。比较典型的方法如下几篇论文。

  • 《Do Deep Nets Really Need to be Deep?》

该文章提出的是将logits(也就是送入softmax层的全连接层输出单元值)作为先验知识。将大模型和小模型的logits之间的l2 loss作为约束方法,指导小模型学习。文章认为,logtis相比较概率而言,减少了信息在变换过程中的损失。

  • 《Distilling the Knowledge in a Neural Network》

该文章作为几个大佬的合作,是一个里程碑式的文章。该文章的主旨是,通过大模型进过带温度参数的softmax输出作为soft_target已经one-hot的hard_target一起指导小模型的学习。文章中,主要提出的注意点是温度参数只使用在soft_target中,并且反传梯度需要乘上温度参数的平方项。

  • 《Paraphrasing Complex Network: Network Compression via Factor Transfer》

该文章提出的是factor transfer的方法。所谓的factor,其实是对模型最后的数据结果进行一个编解码的过程,提取出的一个factor矩阵,用T网络的factor来指导S网络的factor。

文章需要注意的是T网络的factor的构造和训练。

  • 《Learning Deep Representations with Probabilistic Knowledge Transfer》

该文章和上述文章的共同点都是对最后的输出,但是区别是这个文章借鉴的metric learning的思想。文章主要对于每个batch的输出结果做数据之间的相对概率分布,可以是余弦相似度,可以是高斯分布。然后对t和s网络的得到的概率分布做KL或者其他的metric方法。

  • 《deep mutual learning》

该文章我之前写过它的详细阅读和实现:https://blog.csdn.net/zc199329/article/details/85059539

文章也是对最后输出来做的,但是不同的是,该文章提出的是相互学习,相互提高,不同于一般的蒸馏只对小模型训练。该文章的大小模型都会训练提升。当然,这个方法的大小模型并不一定就是一大一小的模型。最后,文章用的是KL散度来衡量输出的分布。

2.2 基于中间结果层的蒸馏

  • 《FITNETS: HINTS FOR THIN DEEP NETS》

该文章主要探索蒸馏应该学习的本质是什么,文章认为不仅仅是最后的输出,而应该是一个hints。hints是指student网络和teacher网络中间层结果通过映射之后得到的大小相同的矩阵。因此,文章利用中间的hints来指导t网络中间权重的更新。

同时,文章最后还用了 soft_target来指导最后层的输出。

  • 《PAYING MORE ATTENTION TO ATTENTION:IMPROVING THE PERFORMANCE OF CONVOLUTIONAL
    NEURAL NETWORKS VIA ATTENTION TRANSFER》

该文章提出的是attention transfer的方法,本质是指导中间结果的输出。其中的attention的构造可以是对中间输出结果的求和,p范数等等。

  • 《A Gift from Knowledge Distillation:Fast Optimization, Network Minimization and Transfer Learning》

该文章提出的一个新颖的想法,他们认为学习的本质不是输出结果而是层与层之间的关系。文章提出这种层与层之间的关系为flow of solution procedure。因此,他们主要对层与层之间的关系建模,得出关系矩阵G,对S网络和T网络的G矩阵进行l2 loss比较。

  • 《Like What You Like: Knowledge Distill via Neuron Selectivity Transfer》

该文章的思想上,我认为和Attention  transfer(AT)有点类似。只不过区别在于,文章用MMD来衡量分布之间的距离。

其中,当MMD取线性核的时候,其本质和AT是一样的。

2.3 基于元学习的蒸馏

《Learning What and Where to Transfer》

该文章作为元学习或者迁移学习的范畴,提出的在蒸馏过程中,不限制两个网络结构的前提下如何更好的迁移知识。文章利用元学习的特性,自己学习需要迁移哪些层的知识,迁移哪些channel的知识。

3 实验结果和参考代码

感谢:https://github.com/AberHu/Knowledge-Distillation-Zoo

参考大佬的代码,自己复现了一遍,结果略有差异,在cifar10 上的结果普遍比原始复现的代码要好一些,猜测原因可能我是在蒸馏的时候,小模型也加载了预训练的参数。

最后,我在自己的模型和数据上也实验了一小部分,部分比较复杂的实验未做,总体来说,比较有效的还是SOFT_TARGET的经典论文。

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
YOLOv8是一个非常强大的目标检测模型,但是它的大小和计算复杂度可能会限制它在某些设备上的使用。为了解决这个问题,可以使用模型蒸馏来将YOLOv8转化为轻量化模型。以下是YOLOv8模型蒸馏的步骤: 1.准备教师模型和学生模型。教师模型是一个较大的预训练模型,可以是YOLOv8或其他模型。学生模型是一个较小的模型,可以是YOLOv8或其他模型。 2.使用教师模型生成训练数据。使用教师模型对训练数据进行预测,并将预测结果作为学生模型的标签。 3.训练学生模型。使用生成的训练数据对学生模型进行训练。在训练过程中,可以使用教师模型输出作为额外的损失函数,以帮助学生模型更好地学习。 4.微调学生模型。使用原始数据对学生模型进行微调,以进一步提高其性能。 5.评估学生模型。使用测试数据对学生模型进行评估,以确定其性能是否达到预期。 以下是一个使用Keras实现YOLOv8模型蒸馏的示例代码: ```python # 准备教师模型和学生模型 teacher_model = create_yolov8_teacher_model() student_model = create_yolov8_student_model() # 使用教师模型生成训练数据 train_data = generate_yolov8_train_data(teacher_model) # 训练学生模型 student_model.fit(train_data, epochs=10) # 微调学生模型 student_model.fit(raw_data, epochs=5) # 评估学生模型 test_data = generate_yolov8_test_data() student_model.evaluate(test_data) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值