模型的前端压缩
一、知识蒸馏
利用迁移学习的方法,将一个复杂精度高的老师模型,与一个小但是目标与老师精度一样高的学生模型进行结合。
1. 对整个网络进行知识蒸馏
知识蒸馏的简图:
数据生成器就是我们框架产生的batch,我们将图片输入到教师模型和学生模型中,先计算出教师模型的loss然后通过教师模型的loss引导学生模型的loss,从而使学生模型的loss下降。下面是详细的图解:
将训练集图片分别放入到老师网络(已经训练好的)和学生网络(未训练)中,获得他们预测的概率。我们的目的就是要使得我们学生网络的预测结果与我们学生网络的预测结果尽可能相似,于是我们会使用的是一个KL散度
KL散度是描述两个概率分布P和Q差异的一种方法。它是非对称的,在信息论中,表示当用概率分布Q来拟合真实分布P
由于KL散度是一个双向的公式,但是我们的只是蒸馏中需要学生向老师学习,因此只使用一个就可以了
下面是loss计算方式:表示老师网络预测的概率,学生网络预测的概率,表示学生网络本身计算的loss
我们的总loss
我们通过这个总loss对知识蒸馏的训练过程进行指导
在pytorch这个loss可以使用代码(size_average表示的是是否需要除以种类数):
torch.nn.KLDivLoss(size_average=None,reduce = None,reduction='elementwise_mean')
loss = torch.nn.KLDivLoss(size_average=False)
L = loss(预测结果,真实结果)/batch_size
2. 对feture map进行知识蒸馏:
通过提取两个网络的feature map,借助MMDLoss(最大均值差异)将两者进行结合从而引导模型训练,简而言之,就是讲老师的分布与学生的分布进行温和地结合过程。
将数据映射到再生希尔伯特空间(RKHS)中进行度量
详细可参考https://blog.****.net/a529975125/article/details/81176029
二、紧致的网络结构
直接设计又小又快又好的网络,就是紧致网络设计的方法
常见的紧致网络有:
- ShuffleNet:使用通道打乱的方式实现通道信息融合,打乱过程使用reshape实现不需要参数
- MobileNet V1:DWconv+Pconv
- MobileNet V2:逆残差
- SqueezeNet:用1*1卷积,集合下采样降低通道数