深度学习模型压缩技术
模型压缩
概述
随着深度学习的发展与高性能GPU处理能力的增强,神经网络结构变得越来越复杂,模型参数量也越来越庞大,这使得深度学习在移动嵌入式设备上的部署遇到巨大的困难和挑战
因此,如何在不影响深度学习模型性能的情况下进行模型压缩与加速成为了研究热点
在深度学习中,模型压缩是一种通过减小模型的大小、参数数量或计算量来降低模型复杂度的技术。以下是一些常见的模型压缩技术:
- 参数剪枝(Pruning):通过剪除模型中不重要的连接或参数,减少模型的参数数量和计算量。剪枝可以基于权重的重要性进行,剪除较小的权重或通过稀疏化技术将权重设置为零
- 权重共享(Weight Sharing):将模型中的一些权重共享,减少模型中需要存储的参数数量。这可以通过对权重进行聚类或使用哈希函数将相似的权重映射到同一个值来实现
- 低秩近似(Low-Rank Approximation):通过将模型的权重矩阵分解为较低秩的矩阵乘积形式,减少模型的参数数量。常见的方法包括奇异值分解(SVD)和矩阵分解技术
- 知识蒸馏(Knowledge Distillation):将一个复杂的模型的知识传递给一个较简单的模型,通过让学生模型学习教师模型的输出概率分布或中间表示来提高学生模型的性能
- 网络量化(Network Quantization):减少模型中参数的位数表示,例如将浮点数参数转换为较低位数的整数表示,从而减小模型的存储需求和计算复杂度
- 网络剪枝(Network Pruning):除了剪枝权重和连接之外,还剪枝模型的网络结构。这包括剪枝层、剪枝通道或剪枝模块等
- 网络蒸馏(Network Distillation):类似于知识蒸馏,但是不仅传递教师模型的输出概率分布或中间表示,还传递教师模型的激活值或其他辅助信息
这些技术可以单独应用或结合使用,以减小深度学习模型的大小、复杂度和计算需求,从而实现模型压缩和加速的效果
参数剪枝
对模型的网络进行修剪,比如减掉多余的头(因为Transformer使用多头注意力机制),或者直接粗暴的使用更少的Transformer层数
权重共享
等待…
低秩近似
等待…
知识蒸馏
概述
知识蒸馏的概念最早是2015年Geoffrey Hinton在《Distilling the Knowledge in a Neural Network》这篇论文中提出来的
在深度学习中,知识蒸馏(Knowledge Distillation)
指的是将一个复杂的模型(称为教师模型
)的知识传递给一个较简单的模型(称为学生模型
)的过程
这种方法旨在通过训练学生模型使其能够学习教师模型的推理能力和泛化能力
通常情况下,教师模型是一个较大、复杂、准确度较高的模型,而学生模型则是一个较小、简化的模型
知识蒸馏通过让学生模型学习教师模型的输出概率分布或中间表示,从而提高学生模型的性能。这种知识传递可以帮助学生模型更好地捕捉数据集的特征,提高泛化能力,并且在具有较少训练数据的情况下取得较好的性能
例子: TextCNN知识蒸馏
BERT这类大模型精度高但是线上推理速度慢,传统的文本分类模型比如TextCNN等线上推理速度快(因为模型比较小)但是精度有待提升。针对上面的问题,我们的需求是获得媲美BERT等大模型的精度,还能满足线上推理速度的时延要求
业务中可以把BERT作为老师模型去教作为学生模型的TextCNN来学习知识,从而使TextCNN不仅达到了媲美BERT的分类效果,而且还能很好的满足线上推理速度的要求
暗知识
对于老师或者没有使用知识蒸馏的小模型来说,主要是通过训练数据来学习知识。我们的训练数据集是一张一张手写数字的图片,还有对应0到9十个数字的标签。在这种学习中我们可以用的只有十个类别值,比如一张手写数字1的图片样本的标签是1,告诉模型的知识就是这个样本标签是1,不是其他类别
而使用知识蒸馏的时候模型可以学到更多的知识,比如手写数字1的图片样本有0.7的可能是数字1,0.2的可能是数字7,还有0.1的可能是数字9
这非常有意思,模型不仅学到了标签本身的知识,还学习到了标签之间的关联知识,就是1和7、9可能存在某些关联,这些知识称为暗知识
其他的蒸馏
对抗蒸馏、多教师蒸馏、跨模态蒸馏、无数据蒸馏
蒸馏的目的
- 模型压缩(Model Compression):通过知识蒸馏,可以将一个较大、复杂的模型压缩成一个更小、轻量级的模型,减少模型的存储空间和计算资源的消耗。这使得模型可以在资源受限的设备上运行,同时仍保持较高的性能
- 模型加速(Model Acceleration):知识蒸馏可以加速模型的推理过程,使得模型在实时性要求较高的场景中能够更快地进行预测。通过将较复杂的模型的知识转移给简化的模型,可以加快推理速度
- 提升泛化能力(Improving Generalization):知识蒸馏可以通过将一个复杂模型的知识传递给一个简化模型,帮助简化模型学习到更好的特征表示和泛化能力。较复杂的模型通常具有更强大的表示能力和表达能力,通过知识蒸馏,这些能力可以传递给简化模型,提升其泛化性能
- 迁移学习(Transfer Learning):知识蒸馏可以通过将一个在大规模数据集上训练过的复杂模型的知识迁移到一个相似任务的简化模型上,从而加快简化模型在新任务上的学习速度和性能
总之,知识蒸馏的主要目的是通过将一个复杂模型的知识转移到一个简化模型上,从而实现模型压缩、加速、提升泛化能力和迁移学习等目标
蒸馏机制
根据教师网络是否和学生网络一起更新,可以分为离线蒸馏
,在线蒸馏
和自蒸馏
感性上理解三种蒸馏方式:
- 离线蒸馏(Offline Distillation): 可以理解为知识渊博的老师给学生传授知识
- 在线蒸馏(Online Distillation): 可以理解为教师和学生一起学习
- 自蒸馏(Self-Distillation): 意味着学生自己学习知识
离线蒸馏
早期的知识蒸馏方法都属于离线蒸馏
,将一个预训练好的教师模型的知识迁移到学生网络,所以通常包括两个阶段:
- 在蒸馏前,教师网络在训练集上进行训练
- 教师网络通过logits层信息或者中间层信息提取知识,引导学生网络的训练
第一个阶段通常不被认为属于知识蒸馏的一部分,因为默认教师网络本身就是已经预训练好的
一般离线蒸馏算法关注与提升知识迁移的不同部分,包括:知识的形式,损失函数的设计,分布的匹配
优点
实现起来比较简单,形式上通常是单向的知识迁移(即从教师网络到学生网络),同时需要两个阶段的训练(训练教师网络和知识蒸馏)
缺点
教师网络通常容量大,模型复杂,需要大量训练时间,还需要注意教师网络和学生网络之间的容量差异,当容量差异过大的时候,学生网络可能很难学习好这些知识
模型蒸馏(Model Distillation)最初由Hinton等人在2015年提出,其核心思想是通过知识迁移的方式,将一个复杂的大模型(教师模型)的知识传授给一个相对简单的小模型(学生模型),简单概括就是利用教师模型的预测概率分布作为软标签对学生模型进行训练,从而在保持较高预测性能的同时,极大地降低了模型的复杂性和计算资源需求,实现模型的轻量化和高效化
在线蒸馏
教师模型和学生模型都是to be trained的状态,即教师模型并没有预训练
在大容量教师网络没有现成模型的时候,可以考虑使用online distillation。使用在线蒸馏的时候,教师网络和学生网络的参数会同时更新,整个知识蒸馏框架是端到端训练的
可以参考本站图像分类算法章节下的DeiTModel,DeiTModel模型是对Vit模型的改进和优化,使用了在线蒸馏策略(还是离线?)
自蒸馏
自蒸馏中,教师和学生模型使用相同的网络。自蒸馏可以看作是在线蒸馏的一种特殊情况,因为教师网络和学生网络使用的是相同的模型
温度参数
等待…
网络量化
等待…
网络剪枝
等待…
网络蒸馏
等待…