Network Compression
文章目录
摘要
复杂的Network所占内存较大,对算力要求较高,无法移植到资源有限的小型设备上,所以需要缩小Network。本章主要讲的就是在降低network所占内存的同时又保证network一定的计算能力。用的的方法有:Network Prunning(丢弃不重要的neurons)、Knowledge Distillation(训练简单的network去模仿复杂的network)、Parameter Quantization(用一个参数代替多个相似的参数)、Architecture Design(设计中间层用增加深度来减少参数)。一、Network Pruning
1.1 Network中的neurons是可以丢弃的
Network的参数往往是过多的,有很多weights等于0或者接近0的,这些whights是可以被丢弃的。
1.2 Network Pruning 步骤
- 评估neuron的重要性,按重要性对neuron进行排序。
- 移除不重要的neuron(移除参数时通常不能一次性移除太多)。
- 用training data重新训练。
- 观察新的model是否合适,不合适就重复上述操作。
1.3 Why Pruning?
为什么不直接train得到小的network,而是train一个大的network,再在大的network上进行修减?
小的network比较难train,要想得到好的结果,小的network往往需要更多的trainning data。也有实验证明,同样的小network,一个是随机weihhts,一个是用train好的大network的weight,前者train失败了,后者train成功了。
二、Knowledge Distillation
2.1 基本思想
先train一个或者多个大的network,再train一个小的network去模仿大的network。
2.2 实际使用细节
小network向大的network学习时,需要将大network输出改变一下,即选择一个合适的T缩小输出间的差异,扩大联系,方便让小的network学到更多的东西。
三、Parameter Quantization
3.1 常用方法
- 用更少bits来存参数。
- 做weight clustering。就是将参数分群,如下图,将原本的16个参数分为4群,虽然降低了精准度,但是大幅度减少了所需内存。
3.2 Binary Weights
只用+1,-1表示一个Weight,如下图灰色点代表二元化的参数值,蓝色表示真实的参数值。
再做梯度下降求解时,不是直接求真实参数的梯度,而是找与真实值最接近的Binary Weight的值,求后者梯度,后后者梯度来更新真实值,最后输出时,也是输出真实值最近的Binary Weight的值。
四、Architecture Design
4.1 基本思想
调整network的架构设计,让network变得更简单。
4.2 对不同network的调整方法
4.2.1 Low rank approximation
如下图,N代表前一次的neuron,M代表下一次的Neuron,w代表参数个数。
此时w=MN,我们在这中间再插入一个linear的中间层,此时w’=Mk+N*k,这时,我们只要设计一个合适的中间层,就可使得w’<w。
4.2.2 Depthwise Separable Convolution
无处理前的CNN,如下图用4个feature做卷积,需要72个参数。
- Depthwise Convolution
就是将原本深度为2的feature,用2个深度为1的代替,分别对不同深度的输入进行卷积,不考虑它们之间的关系。
- Pointwise Convolution
再用一个1x1的深度为2的feature将上面得到的结果联系起来。
可以发现优化后的network只用了26个参数。
五、Possible Solutions
就是让机器根据不同现实条件,选择最佳的network。比如设备电量不足时,选择省电的network。
5.1 Train multiple classifers
训练多个network,让设备在不同条件下,选择合适的network。
显然这样做有一个大的坏处,需要存很多neywork,很耗内存。
5.2 Classifiers at the intermedia layer
在一些层加一些classifier,让设备能够自己选择在network运行到多少层时,直接输出结果。
这样做有较多的缺点。
第一:在靠近input的那些层,输出的结果是比较差的。
第二:在每一层加入的Classifier,会伤害原本的network,即降低整体model的准确率。
总结
上述方法单独使用的效果不会很明显,需要联合使用效果才好,例如可以对一个network先做Architecture Design减少参数得到新的network,对该network做Network Pruning去除掉一些影响小的neurons,再做Parameter Quantization用更小的bits来存储参数。