本文主要是介绍蒸馏Knowledg Distilling,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 蒸馏基础知识
- Distilling the Knowledge in a Neural Network 2015-Hinton
- Deep mutual learning 2017
- Improved Knowledge Distillation via Teacher Assistant 2019
- FitNets:Hints for thin deep nets 2015-ICLR
- 蒸馏的分类
蒸馏基础知识
Distilling the Knowledge in a Neural Network 2015-Hinton
- 什么是知识蒸馏:
知识蒸馏中的"知识",其实指的就是对于网络模型中参数权重的一些抽取/迁移的操作。 - 知识蒸馏的作用:
模型压缩。 - 模型压缩一般有什么其他的方法
1、模型剪枝(Model Pruning)
1.1权重剪枝
是将模型中的一些不重要的权重删除,最简单的判断"不重要"的方式,就是"约等于0"。但是删除后,这个原来可以被GPU加速的矩阵运算,删除一些部分,就不能享受加速了。那如果,将权重变成0怎么样,但是这样又并不能很显著地降低模型的大小。所以这个方法并不是很实用。
1.2神经元剪枝
神经元剪枝就是去掉网络中的一些神经元。神经元其实可以随机选取,就是删除参数矩阵的一行元素。剪枝需要记住一点:如果想获得一个减小50%的模型,不可以直接踢掉50%的神经元。需要一点点剔除掉,每次提出掉之后,都需要再训练几个epoch,去fine-tuning剩下的model,不然模型整个容易剪坏掉。
为什么要训练一个大模型,然后剪枝成小模型,而不是直接训练一个小模型。
很多paper都通过研究得到了这样一个认知:小模型相对大模型而言,更加不容易训练,比如掉入鞍点出不来,拟合能力过弱达不到要求等等,大模型反而没有很多优化上面的问题,虽然需要大量数据来训练,但是拟合能力很强。用大模型每一步进行剪枝,就等同于用一个很接近GroundTruth的强大网络,为小模型做pretrain,这样小模型效果就好起来了。
2、网络架构设计(Network Architecture)
2.1 DNN添加中间层
假设原本有一层N个神经元的layer,下面接了一个M个神经元的layer,对于第二层而言,它就有M * N个参数需要拟合;然而,如果在这两层中添加一个小于M 和 N的全连接层,有K个神经元,加入之后,虽然新增了一层,但是参数却变小了。参数量从M *N降低到了 M *K + N *K 。
然而模型的拟合能力却并没有降低很多,因为可以从矩阵分解的角度理解。 UV两个参数矩阵可以是原M矩阵的奇异值分解矩阵,重要信息都保留了。
2.2 深度可分离卷积(depthwise separable conv)
参考MobileNet。
3、其他方案
3.1压缩权重的精度位数
3.2将权重分桶聚类 - 知识蒸馏到底怎么压缩模型
首先一个复杂而强大的Teacher Model(简称Net-T),以及另一个简单而弱小的Student Model(简称Net-S),由Net-T完整地学习Ground Truth,然后再由Net-S同时学习Net-T的Logit和Ground Truth,最终Net-S作为应用模型,而Net-T并不进行部署上线
所以知识蒸馏是一种"伪"压缩,或者广义的压缩方法。 - 为什么要学习logit
logit是我们模型输出的对于各个类别的概率预测值。
学习logit的一个非常感性的认知是:除了正例GroundTruth之外,负例也携带了很多有价值的信息。
比如说:有一个手写字体识别分类任务,0~9的数字中,7和1写起来很像,但是7和5就很不像,GroundTruth只告诉了我们,这个图片是7,但是logit还告诉了我们:这个图片大概率是7,小概率是1,几乎不太像其他数字。这其中携带了的信息量,也就是我们后面希望Net-S蒸馏学到的知识。 - Net-S要学习两部分的知识,那损失函数
Net-S需要学习的两部分知识,分别对应了Net-S的输出和Net-T的分布差异Loss-soft和与GroundTruth的分布差异Loss-hard。q是我们Net-S的输出,p是Net-T的输出,c是Ground Truth。q、p的输出叫做softmax-T,softmax-T公式如下。
参数T的属性:
如果将T取1,这个公式就是softmax,根据logit输出各个类别的概率;
如果T接近于0,则最大的值会越近1,其它值会接近0,近似于onehot编码
如果T越大,则输出的结果的分布越平缓,相当于平滑的一个作用,起到保留相似信息的作用
为什么加T参数:
如果使用原始的softmax,我们都明白它的属性,它会使得那个最大值的类别,在经过自然指数操作后,在概率上显得"更大"。举例来说,如果0-9的手写字体识别中,7-1-5这三个数值的预测,在softmax转化前,是[7,2,1],在经过了softmax转化后,基本也就变成和[1,0,0]无差异的一个结果了,这并不是我们想要学习logit。我们希望的效果是学习数字1-5之间的差异,然而这点"知识"被正常的softmax给"吃掉了"。所以需要做点小变更,把本来差异较小的"知识"给"蒸馏"出来,让Net-S能学习到这些知识。
参考:
一文搞懂知识蒸馏
Deep mutual learning 2017
此方法不再是学生网络学习教师网络,本篇论文打破这种预先定义好的“强弱关系”,提出了一种深度相互学习策略,即一组学生网络在整个训练过程中相互学习。
此方法为什么work?复杂的教师网络一定比学生网络好吗?
Baseline kd中teacher性能并非student的上界,实验中student性能偶尔优于teacher
由于label refinery的效应,使用soft label会比hard label学到更多的信息。
在这里引入KL散度的概念,KL 散度是一种衡量两个概率分布的匹配程度的指标,两个分布差异越大,KL散度越大。p1和p2的KL散度距离计算公式为:
对于θ1网络来说,此时总的损失函数就由两部分构成:自身监督损失函数,来自θ2网络的匹配损失函数:
同理,θ2可以表示为:
网络的扩展:前面用两个网络θ1和θ2说明了DML的结构、算法。其实DML不仅在两个网络中有效,还可以扩展到多个网络中去。
参考:
让学生网络相互学习,为什么深度相互学习优于传统蒸馏模型?| 论文精读
Improved Knowledge Distillation via Teacher Assistant 2019
在较大的teacher和很小的student之间加入容量介于二者之间的Teacher Assistant,teacher先蒸馏TA,TA再蒸馏student。
为什么work:teacher和student的hypothesisspace差别太大(模型容量、结构差别大),导致student无法直接学习teacher,需要一个TA在二者之间过渡。
FitNets:Hints for thin deep nets 2015-ICLR
本篇论文侧重feature蒸馏。为什么要蒸馏feature呢?logits相当于“答案”,feature相当于“思路”。student学习“思路”比学习“答案”容易,即feature学习使得模型一层一层接受更难的问题,而不是直接接受最难的问题。FitNets简单来说就是剖开teacher和student的某一层,而让二者这一层的输出间的mse最小。所有之前的工作都是专注于压缩teacher网络到更浅更宽的网络,没有充分利用深度。该论文通过利用深度解决网络压缩的问题,提出新方法训练thin and deep网络FitNets。注意:由于这一层feature map的shape不一定一样,student在蒸馏过程中这一层后会接一个wr来调整,蒸馏结束拆掉这一层。
两个loss function:
(1)
其中:
uh代表teacher网络中的第一层到hint层的函数映射,Whint表示其中的参数;
vg代表student网络中的第一层到hidden层的函数映射,Wguided表示其中的参数;
r代表hidden层的一个额外的映射关系,Wr是其中的参数,这是为了使得hidden层与hint层的神经元大小一致。
Wt=Whint,Ws=Wguided,使用一个映射函数Wr来使得Wguided的维度匹配Whint,得到Ws’。
(2) 另外一个是改造的softmax loss(具体见Hinton的论文):
FitNets的缺点:
- Teacher和student网络的hypothesis space差别太大,student无法学习所有信息。
- Teacher中存在冗余信息,student无法鉴别哪些信息重要。
蒸馏的分类
logist蒸馏
feature蒸馏
位置蒸馏
参考:https://zhuanlan.zhihu.com/p/92269636?from_voters_page=true
这篇关于蒸馏Knowledg Distilling的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!