首页 > 编程知识 正文

神经网络压缩算法,深度神经网络有哪些

时间:2023-05-06 13:45:50 阅读:13217 作者:566

目录标题序言1.1网络剪枝1.2问题解答2.1模型蒸馏2.2问题解答3.1参数量化4.1网络结构调整4.2回忆CNN知识点

序言

目前,我们关注的网络结构是一个大参数的模型,精度可能较好,但实际应用中需要将模型应用于移动设备,但由于移动设备上的计算能力有限,无法应用模型。 此时,提出了模型压缩、模型蒸馏、Teacher-student等方法。 模型压缩是为了用更少的参数实现更好的效果。 延迟性、隐私性方面的性能正在提高。

1.1网络剪枝剪切网络的复杂参数。 一些参数没有起到很大的效果。 我们需要做的是找到这些复杂的参数,然后进行切割。

90年代已经发表了optimal brain damage等优秀论文。

那么网络剪枝是怎么做的呢,大概的流程是怎么样子的呢?

)1)首先训练的大网络

)2)评价各参数/神经元的重要程度

那么我们如何评价这一重要性呢? 最简单的方法是看他的绝对值。 该参数的绝对值越大,表示对网络的影响力越大。 越接近0,表示对网络影响越小。 或生命长学习的bi值。

对于神经元,计算神经元输出不为0的次数。

)3)剪切不重要的参数

)通常,此时的accuracy会稍微下降

)5)通常在训练数据中重新训练精细,以提高acc

)6)然后重复2、3切取部分参数,训练微调。

为什么不一次性切掉大量的参数? 一次剪切大量参数是因为可能对你的网络造成太大的伤害。 伤害可能很大,以至于微调后也无法顺利恢复。 所以一次剪一点。 重复重新训练、参数切割和重新训练。 我知道会得到比较小的模型。

1.2问题解答问题1:裁剪参数和裁剪神经元的区别是在哪呢?

)1)修剪参数时,网络结构变得不规则,pytorch上的写入和安装变得困难。 另外,网络形状不规则时,既不能用矩阵乘法的方法加速,也很难用gpu加速。 所以,我们一般将修剪后的微信设置为0,使网络结构有序化。 但是,这样做的话,我们就没有保存这些参数,实现缩小参数和缩小网络的目标。 内存是一样的。 由于参数数量相同,某些参数值为0 .因此即使您认为已修剪了95%的参数,训练速度和内存也不行。 因为模型没有变小。

)2)如果要修整神经元,可以直接去掉与神经元对应的参数,在出现的网络结构上操作方便,也可以加速。 也许修剪神经元会更好。

问题2:为什么不先训练一个小的network,再慢慢变大? --答案不可以

因为大网络容易train,小网络难train。

为什么你觉得大网络容易训练? 一个很小的原因可能是大网络的最佳化更好。

具体来说,可以参考大乐透的假说来假设这种理解。 https://arxiv.org/abs/1810.05270

直接train小的模型越大的模型效果越好。

即使大模型变小,效果也不会特别差。

问题3:如何裁剪冗杂的参数

评估网络中每个权重和neuron的重要性,并修剪不重要的权重或neuron

)1)权重的重要性)如果该值接近0,则该权重不重要,所以可以计算权重的L1或L2来判断权重的重要性

)2) neuron的重要性:给出dataset,如果某个neural的输出都为0,则该neural就不那么重要了

问题4: 相关prune参数的论文研究

(1)大乐透假说- Lottery Ticket Hypothesis

大乐透假说的论文链接: https://arxiv.org/abs/1803.03635

)2) rethinkingthevalueofnetworkpruning

链接是https://arxiv.org/abs/1810.05270

2.1模型蒸馏模型蒸馏是先三网大网,再三网小网学习大网的行为。

大的网络被称为Teacher; 小网络被称为Student

也就是说,当Teacher预测一张数字照片为0.7的可能性为1,0.2的可能性为7,0.1的可能性为9时。

此时,Student的网络结构是学习Teacher的结果,而不是真正的结果。

以交叉熵为损失函数更新迭代。

2.2问题解答1:为什么让Student跟着Teacher学习会有好的结果呢?

因为Teacher为标签数据提供了更丰富的资料。 例如,如上图所示,Student直接与data学习,只知道真值为1。 但是,如果

跟Teacher去学,不仅仅会教导你这张照片有很大的可能性是1,而且,这张照片跟7长的很像,跟9也长的有点像。所以Student跟Teacher学习的话,会学到更多的东西。甚至有研究发现,对Student的训练中,从来没有给它看过7这个数字,Student也仍然可能正确地识别7,因为Student跟Teacher学习过 关于7的信息。

Student网络还可以把多个ensemble的teacher的行为学习起来,并成一个Student Net,具体做法是:
把多个Teacher的networks输出的结果,做一个平均得到的一个结果。接下来让Student去学习这个行为结果。所以最终就可以 让一个小的Student network去学习多个Teacher Nets,从而达到一个ensemble的效果。

最后在softmax输出类别的内容上Teacher需要做一个改进的是
正常是直接用Softmax输出判别为某一个label的概率是多少,如果是x1,x2,x3 = 100,10,1
结果就会像下图所示,输出的Y结果区分的并不明显。y1=1,y2=0,y3=0。那么跟直接从label data学习有什么区别呢,Student根本学习不到区别,这个时候加上一个temperature值,来使得y结果值区别比较明显。 能够让Student学习到不一样的信息。

3.1 参数量化

方法一,比如你之前用的是32个bit存参数,现在改为用16个bit来存参数/
方法二是 weights clustering。把不同的clustering取一个均值,压缩成一个小的网络
方法三是 binary weights,即weights are always -1 or +1
里面涉及到binary connect以及 binary nets 以及XNOR net。可以参观相关的论文。
比正常的网络好一点点,可能是因为规定-1和1 起到了 正则化的作用。

4.1网络结构调整

调整网络结构是提高网络效率最有效的方法。
在中间插多一层,参数其实是变少的。比如本身是 5x5 变成3x3 和3x3 其实参数是变少了。

参数减少了,但是感受野是一样的,做的事情是差不多的

4.2 回忆CNN知识点

假设我们是的图片是只有两个channel。如下图所示:

传统的方法是用 2x3x3的滤波器来提取特征;假设我们有4个这样的滤波器。则我们
将产生4个这样的feature maps。所需要训练的参数是 2x3x3x4 = 72
为了能够减少参数,提出一种改进的方法:depthwise convolution + pointwise convolution
depthwise convolution是指用2d的矩阵来滤波,不再像传统的3d的滤波器来滤波。
如果有一张照片是2个channel的,则直接用两个 矩阵一一对应出来的两张feature maps。具体如下图所示:

然后再用pointwise convolution来整合。pointwise convolution其实就是用4个 2x1x1的滤波器来做。然后出来就是4个feature maps,如下图所示:

所以这样子的做的,总共·需要的参数是 2x3x3 + 4x2x1x1= 18 + 8 = 26
相对于传统方法的参数有72个 大大的减少了参数量。
所以我们可以算一个公式:
计算传统的参数所需:
假设m个滤波器 ,矩阵长度是 LxL,channel数为n 则参数所需是: m x n x L x L
而新的方法是:
n x L x L + m x n x 1 x 1 = L x L + mn

所以ratio为
(mm+LL) / mnLL= 1/LL + 1/mm

广泛的应用有 SquzzzeNet MobileNet ShuffleNet Xception

其中最有名就是MobileNet,MobileNet就是为了深度学习可以应用在手机上而提出的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。