机器学习笔记 network compression
来自于李宏毅教授的ML课件,作业七部分
Hung-yi Lee (ntu.edu.tw)
0 前言
我们为什么要进行network compression呢?
因为在某些环境中(比如在手机,手环等设备中),如果我们要嵌入深度学习model的话,那么鉴于设备的原因,其存储空间,或是计算能力,都是有限的。所以我们不能需要太大的模型。
1 network pruning
对于很大的模型来说,并不是它的所有参数都是有用的,我们也许不需要那么多的参数
以人脑神经元的pruning过程为例,人脑也是在成长过程中先是有很多的神经元连接,然后慢慢地将冗余的神经元连接去掉
比如我们以用L1范数评估weight的重要性为例:
我们现在有3个filter(橙、蓝、绿),我们通过计算这三个filter的L1范数,判断各个filter权重的重要性,把小的那个去掉
1.1 为什么不一开始train一个小模型
那么问题来了:为什么不一开始就trian一个小的network呢?而是要从一个大的network再慢慢地prune成一个小model呢
因为如果只是一个小模型的话,可能会遇到鞍点或者局部最小值,不一定能learn得很好。但是大模型的话(尤其是足够大的模型),是可以避开鞍点和local minimal的
1.1.1 lottery ticket hypothesis
这是19ICLR的一篇paper,大致意思是这样的
对于一个大模型,我首先随机初始化一组参数(红色部分),然后进行tuning,得到效果还不错的模型(紫色部分)
之后我们进行model pruning,得到一个小一点的模型(但是剩下的这些部分参数不变,仍然为紫色的部分)
此时如果我们对剩下的模型部分重新随机初始化(绿色部分),可能是learn不出一个很好的模型的。但是如果我们将原来随机初始化大模型对应的参数直接复制过来,是可以train得不错的
1.2 network pruning 实际操作上的选择
如果我们是weight pruning,那么这会使得模型不易实现,也不易用GPU加速
- 因为这样的话模型就不是一个矩阵的形式,那么无论是pytorch这种深度学习框架,还是依靠矩阵运算来加速的GPU,都无法实现
- 如果我们只是将prune的weight用0表示,那么模型参数的规模还是不变的
如果我们是neuron pruning,那么我们只是减掉矩阵的一定的维度,依然很方便地实现&GPU加速
2 knowledge distillation
在知识蒸馏中,我们的目标是train一个大的network(teacher network)和一个小的network(student network)。其中teacher network学习的label就是ground truth的label,而小的student network所需要学习的内容是teacher network的输出
这样的好处在哪里呢?相比于一个冷冰冰的ground label 1,teacher network可以学到这个label更丰富的信息(比如7和9这两个数字跟1很像,同时7比9更像)
——>这样就会导致,哪怕student没有看到过7和9,他也有可能learn出一定的7&9的特征
——>teacher network 往往是一个很大的/集成了很多模型的大model,student network则可以用较少的参数实现近似的效果
2.1 label temperature
由于知识蒸馏希望teacher学习到更丰富的信息,不希望他仅仅学习到(接近)one-hot label的信息,所以我们希望各个label之间的差距稍微拉近一些,这时候就需要用到temperature的内容
2.2 TA network
如果teacher network 和student network 相差太大,那么student network可能没法很好地学习teacher network
于是引入一个参数量介于teacher network和student network之间的TA networl 来帮助student network 学习
3 parameter quantization
有两种思路:
第一种是使用更少的比特数来表示一个参数值
第二种是进行weight clustering
比如我们根据某种clustering的方法把weight分成四个cluster,每个cluster的weight值都使用这个cluster的平均值来表示
这样的好处是省内存,我们只需要一个记录每个cluster是什么数值的table,以及一个元素为属于哪个cluster的矩阵就可以了(比如我们分成四个cluster,只需要2bit)
但是这种方法势必会减少一定的精度
第三种方法是使用类似于哈夫曼编码的方式进行编码
使用比较频繁weight用较少的比特表示,使用比较少的weight用较多的比特表示
4 模型架构设计
比如,我们本来想创建一个N维到M维的全连接层,我们需要M*N个参数
现在我们在中间插入一层维度为K的中间层,那么我们只需要M*K+N*K个参数
包括mobilenet,就是一种很明显的依靠模型架构设计的方法来进行
NTU 课程 7454 (5) CNN进阶_UQI-LIUWJ的博客-CSDN博客
5 动态计算
如果资源充足的时候,那么就做到最好;如果资源不足的时候,那么就在不怎么影响性能的情况下,先求有再求好【类似于省电模式】
一种解决方法是,在中间的hidden layer 就接一些输出,如果计算资源不足的时候,那么从中间就把结果输出出来了
6 多种network compression方法混合
总结
以上是生活随笔为你收集整理的机器学习笔记 network compression的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 论文笔记:Matrix Completi
- 下一篇: NLP 笔记: 序列标注与BIO标注