Network Slimming & Knowledge Distillation

Network Slimming

(Learning Efficient Convolutional Networks through)

Network Slimming

channel 贡献和Batchnorm 层关联,若channel scaling factors小,说明该channel的贡献可以被忽略

对每一个通道都引入一个缩放因子 $\gamma$ ,然后与通道的输出相乘

接着联合训练网络权重$W$和这些缩放因子$\gamma$,最后将小缩放因子的通道直接剪除,微调剪枝后的网络

image-20191225010729627

$\lambda \sum_{\gamma \in \Gamma} g(\gamma)$ 中$\lambda$ 平衡因子,$g(\gamma)$缩放因子惩罚项,g(s)=|s|,即L1-正则化

Contrast

在每个mini-batch中计算得到mini-batch mean和variance来替代整体训练集的mean和variance

卷积层之后插入一个BN层(直接结合channel-wise的缩放/平移参数),

直接将BN层的 $\gamma$ 参数作为我们网络瘦身的缩放因子,优势在于没有给网络带来额外的花销

引入缩放因子正则项之后,我们得到的模型中许多缩放因子都会趋于0

缩放因子扮演的是通道选择的角色,因为我们缩放因子的正则项和权重损失函数联合优化,网络自动鉴别不重要的通道,然后移除掉,几乎不影响网络的泛化性能

假设经过卷积之后的feature map 的维度为 h x w x c,h和w分别为特征图的高和宽,c为通道数,将其送入BN层会得到归一化之后的特征图,c个feature map中的每一个都对应一组 $\gamma$和λ,前面所说的剪掉小的对应的通道实质上就是直接剪掉这个feature map对应的卷积核

对应的通道实质上就是直接剪掉这个feature map对应的卷积核 (filter level Prune)

Channel Pruning for Accelerating Very Deep Neural Networks

Matrix Computing

For instance, we prune 70% channels with lower scaling factors by choosing the percentile threshold as 70%. By doing so, we obtain a more compact network with less parameters and run-time memory, as well as less computing operations.剪掉整个网络中70%的通道,那么我们先对缩放因子的绝对值排个序,然后取从小到大排序的缩放因子中70%的位置的缩放因子为阈值,通过这样做,我们就可以得到一个较少参数、运行时占内存小、低计算量的紧凑网络

Multi-pass方案

Multi-pass Method

YoloV3

基本工作流程是,使用yolov3训练自己数据集,达到理想精度后进行稀疏训练,稀疏训练是重中之重,对需要剪枝的层对应的bn gamma系数进行大幅压缩,然后就可以对不重要的通道或者层进行剪枝,剪枝后可以对模型进行微调恢复精度

通道剪枝策略一:保守

YOLOv3 Network Architecture

策略源自Lam1360/YOLOv3-model-pruning,这是一种保守的策略,因为yolov3中有五组共23处shortcut连接,对应的是add操作,通道剪枝后如何保证shortcut的两个输入维度一致,这是必须考虑的问题。而Lam1360/YOLOv3-model-pruning对shortcut直连的层不进行剪枝,避免了维度处理问题,但它同样实现了较高剪枝率,对模型参数的减小有很大帮助。虽然它剪枝率最低,但是它对剪枝各细节的处理非常优雅,后面的代码也较多参考了原始项目。在本项目中还更改了它的阈值规则,可以设置更高的剪枝阈值。

20190628205342

部分ConvNet 通道数大幅减少

Index

毕设目标:

以YOLOv3为基准,压缩后的模型全局精度下降不超过2%,参数量和模型大小压缩率不低于85%,计算量不超过7B FLOPS

EfficientDet

通道剪枝策略二:提高剪枝率

策略源自coldlarry/YOLOv3-complete-pruning,这个策略对涉及shortcut的卷积层也进行了剪枝,剪枝采用每组shortcut中第一个卷积层的mask,一共使用五种mask实现了五组shortcut相关卷积层的剪枝,进一步提高了剪枝率。本项目中对涉及shortcut的剪枝后激活偏移值处理进行了完善,并修改了阈值规则,可以设置更高剪枝率,当然剪枝率的设置和剪枝后的精度变化跟稀疏训练有很大关系,这里再次强调稀疏训练的重要性

Index

通道剪枝策略三

策略参考自PengyiZhang/SlimYOLOv3,这个策略的通道剪枝率最高,先以全局阈值找出各卷积层的mask,然后对于每组shortcut,它将相连的各卷积层的剪枝mask取并集,用merge后的mask进行剪枝,这样对每一个相关层都做了考虑,同时它还对每一个层的保留通道做了限制,实验中它的剪枝效果最好。在本项目中还对激活偏移值添加了处理,降低剪枝时的精度损失。

层剪枝

这个策略是在之前的通道剪枝策略基础上衍生出来的,针对每一个shortcut层前一个CBL进行评价,对各层的Gmma最高值进行排序,取最小的进行层剪枝。为保证yolov3结构完整,这里每剪一个shortcut结构,会同时剪掉一个shortcut层和它前面的两个卷积层。是的,这里只考虑剪主干中的shortcut模块。但是yolov3中有23处shortcut,剪掉8个shortcut就是剪掉了24个层,剪掉16个shortcut就是剪掉了48个层,总共有69个层的剪层空间;实验中对简单的数据集剪掉了较多shortcut而精度降低很少。

剪层对于精度的损害的确较大,但是提速明显。精度可以通过微调回升,不同的剪层数也会有不同的效果。另外影响最大的是稀疏训练,稀疏压缩的好,精度也能保持的高

同时剪层和通道

前面的通道剪枝和层剪枝已经分别压缩了模型的宽度和深度,可以自由搭配使用,甚至迭代式剪枝,调配出针对自己数据集的一副良药。这里整合了一个同时剪层和通道的脚本,方便对比剪枝效果,有需要的可以使用这个脚本进行剪枝。

知识蒸馏:

增加了知识蒸馏策略。蒸馏是用高精度的大模型指导低精度的小模型,在结构相似的情况下效果尤为明显。而剪枝得到的小模型和原模型在结构上高度相似,非常符合蒸馏的应用条件。这里更新了一个参考Hinton大神Distilling the Knowledge in a Neural Network的蒸馏策略,原策略是针对分类模型的,但在这里也有不错的表现。调用只需要在微调的时候指定老师模型的cfg和权重即可:–t_cfg –t_weights。最近会更新第二种针对yolo检测的知识蒸馏策略。

回归部分会分别计算学生和老师相对target的L2距离,如果学生更远,学生会再向target学习,而不是向老师学习。调用同样是指定老师的cfg和权重即可。需要强调的是,蒸馏在这里只是辅助微调,如果注重精度优先,剪枝时尽量剪不掉点的比例,这时蒸馏的作用也不大;如果注重速度,剪枝比例较大,导致模型精度下降较多,可以结合蒸馏提升精度。

Knowledge Distillation

  • Make use of the well-trained large network

  • Let the small network mimic the behavior of large network

    • Mimic the value of neuron (Hints)

      • Usually use ensemble of models as teacher
    • Mimic the final output (probability) of large network

    • They are the same when T is large

      PARAM-qi

普通onehot

teacher 概率

qi 第i类的可能性, zi 预测最终预测那一层的神经元,T 软化:猫和狗的概率上升,不要和人一样,把老师汉得信息放大些(老师预测的标签里有一些人工不含有的信息,泛化能力强(暗藏的信息))

(Learning Efficient Object Detection Models with Knowledge Distillation) 以Faster RCNN为例

Knowledge Distillation in Faster RCNN
  • Adopt Faster-rcnn as the object detection framework
    • Region Proposal Network (RPN)
    • Region Classification Network (RCN)
    • Hints learning with adaptive layer.
  • Obiective function
Obiective function

区域产生网络,区域分类网络,每个网络有两个任务cls 和 回归

神经元模仿的目标函数

设计了不同的目标函数

Classification:

Classification

目标分类问题:交叉熵,每一类加了不同的权重(负类远多于正类)给一个权重区分开不同的类别

Regression:

Regression Function

回归问题:利用老师(盖脸)是不合理的,当成下界来用

训练一个比较好,比较慢的网络当做老师,压缩(tuker分解,svd)

学生,ImageNet分类pretrain,否则收敛慢

比较深的网络作为老师引导学生的训练

模仿中间神经元,对图像特定的位置有不同的反应,感知到老师怎么看待图像的(欠拟合)更好的绕过鞍点(局部最小)

解决过拟合

solve overfitting

提升测试效果,中间模拟神经元都提升

有了老师,更快更精确模拟人类给的标签

压缩后进行提升,不改变网络结构基础

vgg 参数多(深),泛化能力好

方法融合


   Reprint policy


《Network Slimming & Knowledge Distillation》 by David Qiao is licensed under a Creative Commons Attribution 4.0 International License
  TOC