1. 知识蒸馏介绍
1.1 什么是知识蒸馏?
在化学中,蒸馏是一种有效的分离不同沸点组分的方法,大致步骤是先升温使低沸点的组分汽化,然后降温冷凝,达到分离出目标物质的目的。化学蒸馏条件:(1)蒸馏的液体是混合物;(2)各组分沸点不同。
蒸馏的液体是混合物,这个混合物一定是包含了各种组分,即在我们今天讲的知识蒸馏中指原模型包含大量的知识。各组分沸点不同,蒸馏时要根据目标物质的沸点设置蒸馏温度,即在我们今天讲的知识蒸馏中也有“温度”的概念,那这个“温度“代表了什么,又是如何选取合适的”温度“?
什么是知识蒸馏?
一般地,大模型往往是单个复杂网络或者是若干网络的集合,拥有良好的性能和泛化能力,而小模型因为网络规模较小,表达能力有限。因此,可以利用大模型学习到的知识去指导小模型训练,使得小模型具有与大模型相当的性能,但是参数数量大幅降低,从而实现模型压缩与加速,这就是知识蒸馏与迁移学习在模型优化中的应用。
Hinton等人最早在文章《Distilling the Knowledge in a Neural Network》中提出了知识蒸馏这个概念,其核心思想是先训练一个复杂网络模型,然后使用这个复杂网络的输出和数据的真实标签去训练一个更小的网络,因此知识蒸馏框架通常包含了一个复杂模型(被称为Teacher模型)和一个小模型(被称为Student模型)。
1.2 为什么要有知识蒸馏?
大多数模型在计算上过于昂贵,无法在移动端或嵌入式设备上运行。因此需要对模型进行压缩,且知识蒸馏是模型压缩中重要的技术之一。
1. 提升模型精度
如果对目前的网络模型A的精度不是很满意,那么可以先训练一个更高精度的teacher模型B(通常参数量更多,时延更大),然后用这个训练好的teacher模型B对student模型A进行知识蒸馏,得到一个更高精度的A模型。
2. 降低模型时延,压缩网络参数
如果对目前的网络模型A的时延不满意,可以先找到一个时延更低,参数量更小的模型B,通常来讲,这种模型精度也会比较低,然后通过训练一个更高精度的teacher模型C来对这个参数量小的模型B进行知识蒸馏,使得该模型B的精度接近最原始的模型A,从而达到降低时延的目的。
3. 标签之间的域迁移(将两个不同域的数据集进行集成和迁移)
假如使用狗和猫的数据集训练了一个teacher模型A,使用香蕉和苹果训练了一个teacher模型B,那么就可以用这两个模型同时蒸馏出一个可以识别狗、猫、香蕉以及苹果的模型,将两个不同域的数据集进行集成和迁移。
因此,在工业界中对知识蒸馏和迁移学习也有着非常强烈的需求。
补充模型压缩的知识:
模型压缩大体上可以分为 5 种:
模型剪枝:即移除对结果作用较小的组件,如减少 head 的数量和去除作用较少的层,共享参数等,ALBERT属于这种;
量化:比如将 float32 降到 float8;
知识蒸馏:将 teacher 的能力蒸馏到 student上,一般 student 会比 teacher 小。我们可以把一个大而深的网络蒸馏到一个小的网络,也可以把集成的网络蒸馏到一个小的网络上。
参数共享:通过共享参数,达到减少网络参数的目的,如 ALBERT 共享了 Transformer 层;
参数矩阵近似:通过矩阵的低秩分解或其他方法达到降低矩阵参数的目的;
1.3 这与从头开始训练模型有何不同?
显然,对于更复杂的模型,理论搜索空间要大于较小网络的搜索空间。但是,如果我们假设使用较小的网络可以实现相同(甚至相似)的收敛,则教师网络的收敛空间应与学生网络的解空间重叠。
不幸的是,仅此一项并不能保证学生网络在同一位置收敛。学生网络的收敛可能与教师网络的收敛大不相同。但是,如果指导学生网络复制教师网络的行为(教师网络已经在更大的解空间中进行了搜索),则可以预期其收敛空间与原始教师网络收敛空间重叠。
知识蒸馏的各种方式
根据教师网络是否和学生网络一起更新,可以分为离线蒸馏,在线蒸馏和自蒸馏。
感性上理解三种蒸馏方式:
- 离线蒸馏可以理解为知识渊博的老师给学生传授知识。
- 在线蒸馏可以理解为教师和学生一起学习。
- 自蒸馏意味着学生自己学习知识。
1. 离线蒸馏 Offline Distillation(在大容量教师网络有现成模型的时候,可以考虑使用Offline distillation)
上图中,红色表示pre-trained, 黄色代表To be trained。
早期的KD方法都属于离线蒸馏,将一个预训练好的教师模型的知识迁移到学生网络,所以通常包括两个阶段:
- 在蒸馏前,教师网络在训练集上进行训练。
- 教师网络通过logits层信息或者中间层信息提取知识,引导学生网络的训练。
第一个阶段通常不被认为属于知识蒸馏的一部分,因为默认教师网络本身就是已经预训练好的。一般离线蒸馏算法关注与提升知识迁移的不同部分,包括:知识的形式,损失函数的设计,分布的匹配。
Offline Distillation优点是实现起来比较简单,形式上通常是单向的知识迁移(即从教师网络到学生网络),同时需要两个阶段的训练(训练教师网络和知识蒸馏)。
Offline Distillation缺点是教师网络通常容量大,模型复杂,需要大量训练时间,还需要注意教师网络和学生网络之间的容量差异,当容量差异过大的时候,学生网络可能很难学习好这些知识。
2. 在线蒸馏 Online Distillation(在大容量教师网络没有现成模型的时候,可以考虑使用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. 自蒸馏 Self-Distillation(教师和学生模型使用相同的网络)
自蒸馏可以看作是在线蒸馏的一种特殊情况,因为教师网络和学生网络使用的是相同的模型。
- 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提出的自蒸馏是为数据增强所采用的,并对知识进行增强,以此提升模型本身的性能。
4. 教师学生架构
在知识提炼中,从教师到学生的知识获取和提炼的质量是由 设计教师和学生网络的方式 决定的。就人类的学习习惯而言,我们希望学生能找到一个合适的老师。因此,要很好地完成知识提炼中的知识捕捉和提炼,如何选择或设计合适的教师和学生的结构 是非常重要而困难的问题。
最近,在蒸馏过程中,教师和学生的模型设置几乎是预先固定的,其尺寸和结构都不尽相同,这样就容易造成模型容量差距。这部分将探讨的教师模型和学生模型的结构之间的关系,如上图所示。
在Hinton提出的KD中,知识蒸馏先前被设计用来压缩深度神经网络,深度神经网络的复杂度主要来自于网络的深度和宽度。通常需要将知识从更深更宽的神经网络转移到更浅更窄的神经网络。学生网络被选择为:
- 教师网络的简化版:通道数和层数减少。
- 教师网络的量化版:网络结构被保留下来。
- 具有高效基本操作的小型网络。
- 具有优化全局网络结构的小型网络。
- 与教师相同的网络。
大型深度神经网络和小型学生网络之间的模型容量差距会降低知识转移的性能 。为了有效地将知识转移到学生网络中,已经提出了多种方法来控制降低模型的复杂性。比如:
- Improved knowledge distillation via teacher assistant引入教师助理,缓解教师模式和学生模式之间的训练gap。
- Residual Error Based Knowledge Distillation提出使用残差学习来降低训练gap,辅助的结构主要用于学习残差错误。
还有一些工作将关注点放在:最小化学生模型和教师模型结构上差异 。
- 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的知识转移。
以往的研究大多集中在设计教师与学生模型的结构 或教师与学生之间的知识迁移机制 。为了使一个小的学生模型与一个大的教师模型相匹配,以提高知识提炼的绩效,需要具有适应性的师生学习架构。近年来,知识提炼中的神经结构搜索,即在教师模型的指导下,对学生结构和知识转移进行联合搜索,将是未来研究的一个有趣课题。
- 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
以上的几个工作都是在给定教师网络的情况下,搜索合适的学生网络结构。