文章目录
1.Knowledge distillation
1.1概念
https://blog.youkuaiyun.com/devcloud/article/details/108751755
知识蒸馏(knowledge distillation)是模型压缩的一种常用的方法,不同于模型压缩中的剪枝和量化,知识蒸馏是通过构建一个轻量化的小模型,利用性能更好的大模型的监督信息,来训练这个小模型,以期达到更好的性能和精度。最早是由Hinton在2015年首次提出并应用在分类任务上面,这个大模型我们称之为teacher(教师模型),小模型我们称之为Student(学生模型)。来自Teacher模型输出的监督信息称之为knowledge(知识),而student学习迁移来自teacher的监督信息的过程称之为Distillation(蒸馏)。
https://blog.youkuaiyun.com/nature553863/article/details/80568658
知识蒸馏的具体实现一般通过student模型训练时的total loss来实现:total loss包括soft loss和hard loss,其中soft loss是由student模型的输出和teacher输出的soft-target计算得到,hard loss由student模型的输出和样本真实标注(hard-target)的one-hot表示计算得到。最终total loss是soft loss和hard loss的加权平均。其中soft target交叉熵的加权系数越大,表明迁移诱导越依赖教师网络的贡献,这对训练初期阶段是很有必要的,有助于让学生网络更轻松的鉴别简单样本,但训练后期需要适当减小软目标的比重,让真实标注帮助鉴别困难样本。另外,教师网络的推理性能通常要优于学生网络,而模型容量则无具体限制,且教师网络推理精度越高,越有利于学生网络的学习。知识蒸馏过程如图1:
如上图所示,教师网络(左侧)的预测输出除以温度参数(Temperature)之后、再做softmax变换,可以获得软化的概率分布(软目标或软标签),数值介于0~1之间,取值分布较为缓和。Temperature数值越大,分布越缓和;而Temperature数值减小,容易放大错误分类的概率,引入不必要的噪声。针对较困难的分类或检测任务,Temperature通常取1,确保教师网络中正确预测的贡献
1.2知识蒸馏原理为什么有用?
(1)soft label包含了负标签的信息
softmax层的输出,除了正例之外,负标签也带有大量的信息,比如某些负标签对应的概率远远大于其他负标签。而在传统的训练过程(hard target)中,所有负标签都被统一对待。也就是说,知识蒸馏的训练方式使得每个样本给Net-Student带来的信息量大于传统的训练方式。而且因为teacher的softmax输出包含了很多信息,因此相比于直接学习hard label 的one-hot,这种方式可以更泛化的拟合数据。
(2)loss减小代表双方更靠近。
一般在知识蒸馏过程中,teahcer网络更复杂参数量更大,可以很好的学到数据集的隐藏关系和特征,然而student网络一般是轻量级参数量很小,这些参数不足以学到复杂的数据集的特征,因此让student向teacher靠拢,可以一定程度上学到teacher的能力。
(3)知识提炼
不论是对于离线蒸馏、在线蒸馏、还是自蒸馏来讲都有teacher和student,teacher虽然不一定比student整体分类性能强,但是一定有些方面比student强,student要学的就是这部分。拿在线蒸馏的Deep Mutual Learning举例,DML提出让多个网络以合作的方式进行学习,任何一个网络可以作为学生网络,其他的网络可以作为教师网络,那么假如此时有3个网络(A、B、C)在同时训练4分类(1、2、3、4)任务,此时A、B是teacher,C是student,其中C的整体分类准确率最高,但是C只是对1、2、3类分的较准,而A、B虽然整体分类性能不佳,但是对4分类较好,那么C要从A、B学的正是对4分类的能力。
1.3知识蒸馏的温度参数?
https://zhuanlan.zhihu.com/p/102038521
在知识蒸馏时,由于我们已经有了一个泛化能力较强的Net-Teacher,我们在利用Net-Teacher来蒸馏训练Net-Student时,可以直接让Net-Student去学习Net-Teacher的泛化能力。一个很直白且高效的迁移泛化能力的方法就是:使用softmax层输出的类别的概率来作为“soft target”。
温度参数是什么?有什么用?
先回顾一下原始的softmax函数:
这里的T就是温度。
原来的softmax函数是T = 1的特例。 T越高,softmax的output probability distribution越趋于平滑,其分布的熵越大,负标签携带的信息会被相对地放大,模型训练将更加关注负标签。示例如下图2:
1.4知识蒸馏的种类?
https://mp.weixin.qq.com/s/7m5DiXEMWFwBjtnwPlIi0w
(1) 离线蒸馏 Offline Distillation(离线蒸馏可以理解为知识渊博的老师给学生传授知识)
离线蒸馏方式即为传统的知识蒸馏,如上图。用户需要在已知数据集上面提前训练好一个teacher模型,然后在对student模型进行训练的时候,利用所获取的teacher模型进行监督训练来达到蒸馏的目的,而且这个teacher的训练精度要比student模型精度要高,差值越大,蒸馏效果也就越明显。一般来讲,teacher的模型参数在蒸馏训练的过程中保持不变,达到训练student模型的目的。蒸馏的损失函数distillation loss计算teacher和student之前输出预测值的差别,和student的loss加在一起作为整个训练loss,来进行梯度更新,最终得到一个更高性能和精度的student模型。
所以通常包括两个阶段:
- 在蒸馏前,教师网络在训练集上进行训练。
- 教师网络通过logits层信息或者中间层信息提取知识,引导学生网络的训练。
第一个阶段通常不被认为属于知识蒸馏的一部分,因为默认教师网络本身就是已经预训练好的。一般离线蒸馏算法关注与提升知识迁移的不同部分,包括:知识的形式,损失函数的设计,分布的匹配。
Offline Distillation优点是实现起来比较简单,形式上通常是单向的知识迁移(即从教师网络到学生网络),同时需要两个阶段的训练(训练教师网络和知识蒸馏)。
Offline Distillation缺点是教师网络通常容量大,模型复杂,需要大量训练时间,还需要注意教师网络和学生网络之间的容量差异,当容量差异过大的时候,学生网络可能很难学习好这些知识。
(2) 在线蒸馏 Online Distillation(在线蒸馏可以理解为教师和学生一起学习)
上图中,教师模型和学生模型都是to be trained的状态,即教师模型并没有预训练。
在大容量教师网络没有现成模型的时候,可以考虑使用online distillation。使用在线蒸馏的时候,教师网络和学生网络的参数会同时更新,整个知识蒸馏框架是端到端训练的。
- Deep Mutual Learning(dml)提出让多个网络以合作的方式进行学习,任何一个网络可以作为学生网络,其他的网络可以作为教师网络。
- Online Knowledge Distillation via Collaborative Learning提出使用soft logits继承的方式来提升dml的泛化性能。
- Oneline Knowledge distillation with diverse peers进一步引入了辅助peers和一个group leader来引导互学习过程。
- 为了降低计算代价,Knowledge Distillation by on-the-fly native ensemble通过提出一个多分支的架构,每个分支可以作为一个学生网络,不同的分支共享相同的的backbone。
- Feature fusion for online mutual knowledge distillation提出了一种特征融合模块来构建教师分类器。
- Training convolutional neural networks with cheap convolutions and online distillation提出使用cheap convolutioin来取代原先的conv层构建学生网络。
- Large scale distributed neural network training throgh online distillation采用在线蒸馏训练大规模分布式网络模型,提出了一种在线蒸馏的变体-co-distillation。co-distillation同时训练多个相同架构的模型,每一个模型都是经由其他模型训练得到的。
- Feature-map-level online adversarial knowledge distillation提出了一种在线对抗知识蒸馏方法,利用类别概率和特征图的知识,由判别器同时训练多个网络。
在线蒸馏法是一种具有高效并行计算的单阶段端到端训练方案。然而,现有的在线方法(如相互学习)通常不能解决在线设置中的大容量教师,因此,进一步探索在线设置中教师和学生模型之间的关系是一个有趣的话题。
(3)自蒸馏(学生自己学习知识)
自监督蒸馏相比于传统的离线蒸馏的方式是不需要提前训练一个teacher网络模型,而是student网络本身的训练完成一个蒸馏过程,即教师网络和学生网络使用的是同一个模型,如上图。具体实现方式有多种,例如先开始训练student模型,在整个训练过程的最后几个epoch的时候,利用前面训练的student作为监督模型,在剩下的epoch中,对模型进行蒸馏。这样做的好处是不需要提前训练好teacher模型,就可以变训练边蒸馏,节省整个蒸馏过程的训练时间。
- Be your own teacher: Improve the performance of convolutional neural networks via self distillation 提出了一种新的自蒸馏方法,将网络较深部分的知识蒸馏到网络较浅部分。
- Snapshot distillation:Teacher-student optimization in one generation 是自蒸馏的一种特殊变体,它将网络早期阶段(教师)的知识转移到后期阶段(学生),以支持同一网络内有监督的培训过程。
- 为了进一步减少推断的时间,Distillation based training for multi-exit architectures提出了基于蒸馏的训练方案,即浅层exit layer在训练过程中试图模拟深层 exit layer的输出。
- 最近,自蒸馏已经在Self-distillation amplifies regularization in hilbert space进行了理论分析,并在Self-Distillation as Instance-Specific Label Smoothing中通过实验证明了其改进的性能。
- Revisit knowledge distillation: a teacher-free framework 提出了一种基于标签平滑化的无教师知识蒸馏方法。
- Regularizing Class-wise Predictions via Self-knowledge Distillation提出了一种基于类间(class-wise)的自我知识蒸馏,以与相同的模型在同一源中,在同一源内的训练模型的输出分布相匹配。
- Rethinking data augmentation: Self-supervision and self-distillation提出的自蒸馏是为数据增强所采用的,并对知识进行增强,以此提升模型本身的性能。
1.5知识蒸馏的作用?
1、提升小模型精度
用户如果对目前的网络模型A的精度不是很满意,那么可以先训练一个更高精度的teacher模型B(通常参数量更多,时延更大),然后用这个训练好的teacher模型B对student模型A进行知识蒸馏,得到一个更高精度的模型。
2、降低模型体量,压缩网络参数
用户如果对目前的网络模型A的时延不满意,可以先找到一个时延更低,参数量更小的模型B,通常来讲,这种模型精度也会比较低,然后通过训练一个更高精度的teacher模型C来对这个参数量小的模型B进行知识蒸馏,使得该模型B的精度接近最原始的模型A,从而达到降低时延的目的。
3、知识迁移
用户使用狗和猫的数据集训练了一个teacher模型A,使用香蕉和苹果训练了一个teacher模型B,那么就可以用这两个模型同时蒸馏出一个可以识别狗,猫,香蕉以及苹果的模型,将两个不同与的数据集进行集成和迁移。
4、降低标注量
该功能可以通过半监督的蒸馏方式来实现,用户利用训练好的teacher网络模型来对未标注的数据集进行蒸馏,达到降低标注量的目的。
1.6 师生架构
在知识提炼中,师生架构是形成知识传递的通用载体。换句话说,从教师到学生的知识获取和提炼的质量是由设计教师和学生网络的方式决定的。
就人类的学习习惯而言,我们希望学生能找到一个合适的老师。因此,要很好地完成知识提炼中的知识捕捉和提炼,如何选择或设计合适的教师和学生的结构是非常重要而困难的问题。
这部分将探讨的教师模型和学生模型的结构之间的关系,如上图所示。
在Hinton提出的KD中,知识蒸馏先前被设计用来压缩深度神经网络,深度神经网络的复杂度主要来自于网络的深度和宽度。通常需要将知识从更深更宽的神经网络转移到更浅更窄的神经网络。学生网络被选择为:
- 教师网络的简化版:通道数和层数减少。
- 教师网络的量化版:网络结构被保留下来。
- 具有高效基本操作的小型网络。
- 具有优化全局网络结构的小型网络。
- 与教师相同的网络。
因此有些工作将关注点放在:最小化学生模型和教师模型结构上差异 。
- Model compression via distillation and quantization将网络量化与知识蒸馏相结合,即学生模型是教师模型的量化版本。
- Deep net triage: Analyzing the importance of network layers via structural compression.提出了一种结构压缩方法,将多个层学到的知识转移到单个层。
- Progressive blockwise knowledge distillation for neural network acceleration在保留感受野的同时,从教师网络向学生网络逐步进行block-wise的知识转移。
大型深度神经网络和小型学生网络之间的模型容量差距会降低知识转移的性能 。为了有效地将知识转移到学生网络中,已经提出了多种方法来控制降低模型的复杂性。比如:
- Improved knowledge distillation via teacher assistant引入教师助理,缓解教师模式和学生模式之间的训练gap。
- Residual Error Based Knowledge Distillation提出使用残差学习来降低训练gap,辅助的结构主要用于学习残差错误。
以往的研究大多集中在设计教师与学生模型的结构或教师与学生之间的知识迁移机制 。近年来,知识提炼中的神经结构搜索,即在教师模型的指导下,对学生结构和知识转移进行联合搜索(将以上两个结合),将是未来研究的一个有趣课题。
- Search to distill: Pearls are everywhere but not the eyes
- Self-training with Noisy Student improves ImageNet classification
- Search for Better Students to Learn Distilled Knowledge
以上的几个工作都是在给定教师网络的情况下,搜索合适的学生网络结构。
1.7online label smooth/自蒸馏
《Delving Deep into Label Smoothing》:该论文用作分类,在论文中实现了online label smooth,其实就是自监督蒸馏,但作者称其为online
2.label smooth
2.1介绍
2.2 label smooth + Knowledge distillation
(NeurIPS-2019) When Does Label Smoothing Help?
该论文探究知识蒸馏与label smooth结合是否有用,以及label smooth什么时候有用?
2.2.1论文贡献:
- 提出了数据经过label smooth和没经过label smooth的可视化方法。
- 证明了label smooth隐式的校准了模型
- 证明并解释经过label smooth训练过后的teacher模型会损害student模型的性能,与此同时,还列出了知识蒸馏怎样和label smooth进行结合,这也是我们关注的一点
2.2.2 Label smooth何时有用
https://zhuanlan.zhihu.com/p/73285958
- 数据中有打标噪音:数据中有打标噪音的时候,避免模型对打标结果太确信,可以使用label smooth。
- 文中理解:文中实验证明加入label smooth后,属于同一类的penultimate layer(就是倒数第二层,也就是logits的输入,一般是embedding representation)变得更紧密,不同类的分的更开。因此如果本身不同类别的数据就分的很开的话,label smooth可能不会起作用,然而如果很多类别距离很近的话(不够正交)label smooth就会起作用。
- 根据1、2两点可知数据的分类多的情况下,label smooth才会有用。比如如果是二分类的话,类别之间的distance(不够正交)、variance(错标)这些概念就很弱了。
2.2.3 知识蒸馏与label smooth结合
首先作者在手写数字识别的实验结果:
Teacher A(train with hard target + dropout)的错误率为:0.67%
不正则Student (train with knowledge from teacher A)的错误率:0.74%
Teacher B(train with label smooth)的错误率为0.59%
不正则Student (train with knowledge from teacher B)的错误率:0.91%
结论:经过label smooth会一定程度上影响teacher传给student的知识。
个人理解:label smooth已经是一种soft label,teacher给student的知识也是一种soft label。因此经过label smooth训练的teacher传给student的知识经过了两次soft,严重降低了hard
label的影响。
因此,作者好奇不正则处理的student使用teacher A的知识进行训练与student直接使用label smooth进行训练哪个更好?为此作者进行了以下四个实验:
- teacher使用不同rate 的label smooth训练。(关注teacher的acc)
- student使用不同rate的label smooth训练。(关注student的acc)
- teach使用hard target进行训练,但是温度参数T通过γ确定,最后teacher输出训练student。其中student仅使用teacher输出进行loss计算,忽略打标loss。(关注student的acc)
- teacher使用label smooth在T=1下进行训练,label smooth rate = γ;然后teacher输出训练student。其中student仅使用teacher输出进行loss计算,忽略打标loss。(关注student的acc)
在以上四个实验中,γ是平滑参数,在1、2中,γ等于噪音率,在3、4中γ有特定的计算公式:
最后结论是3的效果最好。因此作者证明了teacher(温度参数 = γ)+student without label smooth 会比直接student with label smooth要好。至于没有实验teacher(温度参数 = γ)+student with label smooth 是因为student的label smooth和蒸馏不能同时进行,因为student计算来自teacher的predict和自身的预测得形式就是label smooth计算的形式。
因此,两者的结合其实就是训练一个teacher,完全用teacher的pred(向量化的形式)作为知识让student模型进行蒸馏,即student训练时的loss只计算自身预测的和teacher的向量形式的pred。
另外再说一点,文中实验3的student的loss不计算hard target是因为是离线蒸馏模式,即有一个强有力的teacher指导;而之前实现的online label smooth是一种自蒸馏模式,即teacher 的pred(soft target)来自于上一个epoch的预测,因此没有强有力的teacher指导,因此loss计算时还需要考虑hard target。