Network compression 网络压缩
摘要:
实践背景:想要将深度模型放到移动设备上,例如智能手机,无人机,机器人等等,但是移动设备上的存储空间是有限的,这就需要进行网络压缩。
理论基础:现在的模型中,多数参数和神经元对于输出结果没有影响,也就是没用到。这样可以将这些参数和神经元剪掉,得到一个更小的网络。
这节课主要讲的是网络压缩的几种方法,分别是网络剪枝,知识蒸馏,参数量化,结构设计和动态计算。(这节课只考虑软件方向)
网络剪枝是指评估weight和neuron的重要性,然后把不重要的删除掉。
知识蒸馏是指让small network去拟合多个big network的结果,达到网络压缩的目的。
参数量化主要是从参数的存储空间角度考虑,尽可能让参数占用更少的空间。
结构设计是在cnn中两个layer中添加中间层,虽然层数变多了,但是参数的个数却神奇的变少了。
动态计算是对cnn中间层的输出进行分类并使用。
目录
一、network pruning网络剪枝
1.network pruning的做法:
1.首先有一个训练好的network
2.评估weight和neuron的重要性:
对于weight来说,可以通过计算l1,l2
对于neuron来说,根据给定的数据集,得到的输出都是0,那这个neuron就是不重要的。
3.删除不重要的weight和neuron
4.用之前的训练数据进行训练
5.观察调整后的结果
注意:可以进行多次,小幅度的调整。一次调整不要删除太多,不然会导致fine-tune的结果有很大的偏差。
问题:为什么不直接训练一个比较小的network
因为小的network比较难训练。
只要网络足够大,就可以找到全局最小点。
2.为什么要进行修剪?
两种观点:
1.对一个随机初始化的网络,进行训练,修剪得到的模型,如果使用新的random init的weight进行训练,没法得到结果,但是用之前的random init的weight进行训练,是可以训练成功的。
解释:
首先,一个random small network是不一定可以训练出来的。
大的network中包含很多small network,network越大,其中包含small network越多。其中的small network有的可以训练起来,有的不可以。想要big network可以训练起来,只需要其中某一个small network可以训练起来就足够了,这就是big network容易训练成功的原因。。
图中的修剪过程就是找到big network中可以训练的small network。对这个small network使用之前的weight,结果当然是可以训练成功的。
2.在这个paper中,得到了不同的观点,作者认为不需要进行修剪,可以直接进行训练,scratch-E和scratch-B的数据表明,直接训练的结果是优于修剪后的结果。
3.实践时的注意事项
1.weight pruning
对weight进行修剪时,得到不规则的network。Keras实现起来不方便,gpu也没办法加速。(无法进行矩阵计算)
实际操作时,没有删除这些weight,只是把它们设成0。(这样network的大小并没有改变)