神经网络压缩

视频教程链接:https://www.bilibili.com/video/BV1Wv411h7kN?p=86

本文的内容主要讲解如何压缩一个较为庞大的神经网络,使其在较少参数的情况下,拥有和原来差不多的效能。这是因为在一些场景中,例如智能手表,它的内存是有限的,如果模型太过庞大,会导致无法运行在这样的小型智能物件上。下面来介绍五个常用做法:

Network Pruning

顾名思义,我们可以对神经网络进行修剪,树大必有枯枝。因此我们可以把没有用的参数找出来扔掉。

在这里插入图片描述

确定参数重要性的方法有多种,我们可以把绝对值大的参数视为重要的参数,也可以把life-long-learning中的方法用进来,例如用这个参数在Loss中的梯度,梯度大则重要。另外,我们也可以判断一个节点的重要性决定是否删除它,通过计算它输出不为0的次数可以判断一个节点的重要性。在删除了部分参数之后,必然对模型的识别正确率产生影响,我们必须重新对其进行评估,然后对这个修改后的模型参数进行微调(fine-tuning)。然后再对参数重要性进行评估,如此经过多次的修剪,我们期望能得到一个性能差不多的小型网络。注意:不要一次性对网络进行大量的修剪,否则性能损失过大,无法通过微调调整回来。

但往往在实际操作时我们更倾向于删除节点,因为在进行矩阵运算的编程中,删除某个参数后的网络形状是不规则的,无法调用矩阵运算的库,唯一方法是把删掉的参数都设为零,但这其实并没有把网络变小。如果你自己来实现这个功能,往往也会因为缺乏显卡矩阵运算加速的功能反而拖慢运算速度。

为什么不直接训练一个小的Network呢?那是因为大的Network比较好训练,往往训练小的Network没有办法达到跟大的Network一样的正确率,但先训练一个大的Network,然后把它变小,正确率也不会掉太多。关于大模型为什么容易训练有一个大乐透假说(Lottery Ticket Hypothesis):大模型可以看作是很多小模型合起来的结果,训练大的模型等于同时训练很多小模型,每一个小模型都不一定能通过Gradient Descent找到一个好的Solution。但是只要有一个小模型成功,就能使大模型成功。相当于买彩票买的越多,中奖概率越高。

在这里插入图片描述

因此我们更倾向于训练一个大的模型然后缩小,而不是直接训练一个小的模型。这是由于我们在小的模型中很难随机到一组好的可优化参数。而在大模型中我们可以利用它的“抽奖”特性,使其得到众多参数,然后我们选出好的参数来作为小模型的初始化参数。这样往往能得到较好的结果。

这里还有一篇有趣的论文,尝试了不同的修剪策略。得出结论:

1、一个参数训练前和训练后绝对值的差距越大,那么修剪掉的效果越好。

2、一组好的初始化参数,只要不改变其正负号,任意改变它的值,训练效果也不会有太大改变。正负号是初始化参数能不能训练起来的关键。

3、其实一个大的模型,经过训练后,只有进行适当的修剪,得到的小模型可以直接使用。可以得到和supervised-learning相当的正确率。

在这里插入图片描述

这里还有一篇打脸“大乐透假说”的文章,实验结论是,小模型其实训练更多地epoch效果就优于Prunning的结果了。“大乐透假说”只有在学习率设定较小,以weight为单位修剪的时候才能观察到。因此这个假说还尚待研究。

在这里插入图片描述

Knowledge Distillation

在这里插入图片描述

这个是神经网络压缩的第二个做法。首先也是训练一个大的模型,称为Teacher Net。拥有较高的正确率,然后我们的目标是再训练一个小模型Student Net,Student Net并不是根据资料给的label进行学习,而是根据teacher Net的输出进行学习。也就是说,无论是正确还是错误,Student Net的输出都要跟随Teacher Net的输出。

这样做的理由和Network Pruning一样,直接训练一个小的Network,没有小Network根据大Network学习效果好。因为让一个Student Net直接根据label来进行学习可能会太难了,1跟7比较像,1跟9也有点像,直接让小模型学习1的概率是1,其他概率是0可能学不起来。但Teacher Net会详细告诉它,大网络也不能把图片完全区分,其实图片是1的概率是0.7,7的概率是0.2,9的概率是0.1,这样反而会学得比较好。

而且就算训练资料中缺少某个数字,但Teacher Net之前看过这个数字,Student Net没见过。但凭借Teacher Net告诉Student Net概率分布,Student Net都有可能准确识别这个数字。

Teacher Net也可以是多个Network的Ensemble。也就是训练多个Network,分类的最终结果由这些Network投票进行决定。这也是机器学习比赛中的常用技巧。但在实际运用中这样的计算量未免太大,因此我们可以用Knowledge Distillation的技术把这些Network综合起来变成一个。具体做法是把Teacher Net中所有Network的输出取平均值,然后再让Student Net去学这个平均值。这样就可以让Student Net逼近一堆Network综合起来的正确率。

在这里插入图片描述

下面是Knowledge Distillation的一个小技巧,我们需要对Teacher Net的Softmax函数进行修改。就是对输入进行除以T的处理,T是一个大于1的数,这样的处理使得输出更为平滑,Student Net更容易学习,因此T是我们需要自己调的参数。同时我们也可以让Student Net里面的其他层向Teacher Net学习,而不只是输出层,这样做比较多的限制往往的到更好的结果。

在这里插入图片描述

Parameter Qrantization

这是一个压缩参数大小的技巧。

在这里插入图片描述

1、我们可以使用更少的储存空间来储存一个参数,这样能大大减小模型的大小。例如本来16bit一个数据变成8bit。

2、更进一步压缩的方法是Weight Clustering。我们按照数值的大小事先设定好分群数量进行分群,然后每一群只拿一个数值表示,这个数字可以是平均数。这样我们就只用记录每个参数属于哪一群和那一群的平均数就行了。

3、还有一个叫做Huffman encoding,比较常见的用比较多的bit描述,罕见的用较少的bit进行描述。

4、最极限的程度是每个参数只用一个bit就能存下来,也就是参数只有1和-1两种可能。而这种做法的效果居然是比正常的做法好的,原因是给了Network比较大的限制后,比较不容易Overfitting。

在这里插入图片描述

在这里插入图片描述

Architecture Design

这个方法主要通过Network架构的设计来达到减少参数量的目的。这个方法是在CV领域减少参数量的利器。

在这里插入图片描述

我们回顾CNN的结构,我们知道卷积层所需要的参数是远小于一般的全连接层的,这部分可以回顾我的《Pytoch实战教学》中卷积神经网络章节。

Depthwise Separable Convolution

这个做法和卷积层有共同之处,但不是一个东西,因为它使用的filter数和输入的通道数是一样的,而每一个filter只负责输入的一个通道。因此输入是几个通道,输出就是几个通道。但是这种只检查一个通道的方式,对于一些跨通道的特征是检查不出来的。

在这里插入图片描述

因此这里还有一个Pointwise Convolution,和一般的卷积层是一样的,但我们使用的卷积核大小都是1 * 1的。这是由于我们上面已经检查了一个通道内部的关系,这里只用检查通道之间的关系。

在这里插入图片描述

可以看到,采取Depthwise + pointwise的方法比采用一般的卷积层的参数量更少。

在这里插入图片描述

对于线性层我们减少参数的一个简单做法是在中间插入一层节点较少的线性层。

在这里插入图片描述

我们Depthwise + Pointwise的方法也是一样,其实我们只是把卷积层拆分成两层,第一层的Depthwise复制把9个像素整合为一个,第二层Pointwise复制将双通道变成四通道。

在这里插入图片描述

更多网络结构的设计请参考论文:

在这里插入图片描述

Dynamic Computation

核心想法:我们希望Network可以自由调整它需要的运算量。因为同一个模型通常是需要跑在不同的设备上的,因此我们期待当模型转移到一个新设备时,我们不需要重新训练,而让这个模型自由调整所需的运算资源。就算在同一个设备我们也需要动态调整运算资源,例如手机没电的时候我们希望运算资源用少一些。

在这里插入图片描述

Dynamic Depth:一个做法是我们让模型可以动态调整神经网络的层数,当运算资源不充足时采用较少的层数进行运算,这样的网络训练方法是在中间引出一个点接到额外的layer进行输出,训练的时候只需要让这个额外的输出也接近label的输出就好(在Loss函数中加入计算额外输出的Loss)。但这个不是现在最好的方法,如果想深入学习,请查看上图的链接。

在这里插入图片描述

Dynamic Width:另一个做法是动态改变网络的宽度,方法和改变深度一样,但直接这么做也存在问题,详情可以查看上图链接。

对于自由决定网络的宽度和深度有相当的好处,我们可以在处理简单图片时使用较少的网络,处理复杂图片时使用更多的网络,具体内容请查看论文。

在这里插入图片描述


后记

前面的四个技术都可以让Network变小,在实际运用的时候我们往往使用多个技术。我们可以既用Architecture Design,也用Knowledge Distillation,然后再用Network Pruning,最后再做Parameter Qrantization。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微笑小星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值