欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

机器学习笔记 network compression

发布时间:2025/4/5 35 豆豆
生活随笔 收集整理的这篇文章主要介绍了 机器学习笔记 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的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。