1、模型优化背景
最近深度学习算法在计算机视觉上取得了很大成就,由于有了GPU的支持,为了更好的性能,CNN模型可以设计的大而复杂。这就对运行模型的设备有了更高的要求。在资源受限的设备(如手机或者IoT设备)上应用CNN模型,限制主要体现在3方面:1. 模型大小 2.运行时内存 3.计算次数。
举个例子,一个VGG-16模型,需要 138 million参数,占用500MB的存储空间。用这个模型预测一张224*224的图片,需要16 billion FLOPs,93MB额外的运行时内存用于存储中间的结果。因此,大家开始研究模型的优化算法。
模型优化是一个广阔的领域,可以通过量化、快速卷积、低秩分解、剪枝、知识蒸馏等方法实现。知识蒸馏就是模型优化的一个DarkKnowledge[1]。
为什么不直接训练一个小模型,而要采取各种手段进行模型优化呢?
首先,这和遇到问题处理的过程有关。对神经网络来说,有一个共识:模型越大,层数越深,学习能力越强。对CNN,为了完成对数据特征的提取,它往往是过参的。当面对一个任务时,我们并不知道多大的模型是合适的,这时通常会选用一个大模型进行训练,然后再根据训练情况进行调整。如果一开始模型过小,容易欠拟合,不能完成对数据的特征提取。
其次,任何现有的模型不管是VGG16、ResNet50还是近年来的精简模型MobileNet V1/V2,都是精心设计出来的。不是任意的小模型,经过训练,都能达到理想的精度要求。小模型在训练过程中,会碰到欠拟合、训练不收敛、精度低,结果震荡等各种问题。
在剪枝的时候,也不是随意剪枝,就可以完成模型的精简。提出剪枝时,是否对原有模型进行训练并不重要,重要的是在原有模型基础上搜索出一个适合的结构。
正是因为找出适合的模型困难,在深度学习领域,模型设计才会发展为其研究的一个方向,目的是从模型结构出发,设计出一个参数精简,精度足够高的模型;在处理现实问题时,我们很难去设计一个模型,这样模型优化就成为了另一个方向,目的是在训练完成后,解决部署侧的问题。
2、什么是知识蒸馏
知识蒸馏是把大模型(teacher网络)的知识迁移到小模型(student网络)的过程,在蒸馏的过程中,小模型学习到了大模型的泛化能力,保留了接近于大模型的性能。这个大模型可以是单个模型,也可以是多个模型的集成。
蒸馏的做法一般是先训练一个大模型(teacher网络),然后对大模型进行升温,使用这个大模型的输出作为soft target,用数据的真实标签作为hard target,两者联合起来去训练小模型(student网络)。
2.1 为什么会提出蒸馏
大规模的机器学习通常分为2个阶段:训练阶段和部署阶段。
在训练阶段,为了从大量、冗余的数据集中提取特征,通常需要耗费很多计算资源,且对实时性没有要求。最简单有效的提高性能的方法是集成学习,即并行训练多个模型,然后利用多个模型去提取数据特征。
在部署的时候,如果把一个或多个大模型部署到设备中,是相当耗费计算和内存资源的。知识蒸馏提供了一种训练手段,可以把一个或多个大模型的知识迁移到一个小模型上,便于模型部署,加快推理速度。蒸馏能够让小模型很快的学习到大模型的泛化能力,即知识。所谓知识,是一种非常抽象的概念,可以认为知识是输入向量到输出向量的一种映射。
大模型的有价值的知识,也就是这种泛化能力存在于哪里呢?对于普通的分类任务,一般都会将输出类概率最大的那个作为输出,但是错误答案也是有概率的,只不过概率值相对正确的概率较小。这些错误概率的值会有所不