WDK李宏毅学习笔记第六周01_Network Compression

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 步骤

  1. 评估neuron的重要性,按重要性对neuron进行排序。
  2. 移除不重要的neuron(移除参数时通常不能一次性移除太多)。
  3. 用training data重新训练。
  4. 观察新的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 常用方法

  1. 用更少bits来存参数。
  2. 做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个参数。
在这里插入图片描述

  1. Depthwise Convolution
    就是将原本深度为2的feature,用2个深度为1的代替,分别对不同深度的输入进行卷积,不考虑它们之间的关系。
    在这里插入图片描述
  2. 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来存储参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值