ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

论文笔记_Learning both Weights and Connections for Efficient Neural Networks

2019-06-12 15:48:15  阅读:785  来源: 互联网

标签:both 修剪 训练 剪枝 Efficient Neural 网络 参数 连接


这篇论文是韩松大佬的文章,开始膜拜吧!

文章目录

摘要

  神经网络既是计算密集型的,也是存储密集型的,这两个特点导致其无法在嵌入式设备上部署使用。另外,卷积神经网络在训练过程之前就确定了其网络架构,训练并不会改变神经网络的架构。本文提出一种基于数量级的方法,找到网络中重要的连接,在不影响神经网络性能的基础上,减少网络所需的算力和存储空间。首先,训练一个神经网络得到其最重要的连接;然后,剪掉不重要的权重连接;最后,重训练网络中剩余的连接进行微调,保证网络的性能不受影响。本文的方法在保证AlexNet(ImageNet 数据集)性能的情况下,将网络的参数数量从6.1千万降低到6.7百万,降低了9倍左右;同样,VGG-16网络性能不变的情况下,将其参数数量从1.38亿降低到1.03千万,降低了13倍。

1.介绍

  神经网络在计算机视觉、语音识别、自然语言处理等领域应用广泛。卷积神经网络用于计算机视觉任务的应用随着时间的推移而增长。1998年,LeCun等人设计了一个卷积神经网络模型LeNet-5用于手写数字识别,其参数数量少于1M,2012年时,Krizhevskyet等人使用AlexNet得到了当年的ImageNet图像识别的冠军,参数数量为60M,文献[5]的Deepface使用1.2亿个参数对人脸进行分类,Coateset等人更是将参数数量扩展到10Billion。
  虽然这些大型神经网络功能非常强大,但它们会消耗大量的存储、内存带宽和计算资源。对于嵌入式移动应用程序来说,这些资源需求令其望而却步。图1显示了在45nm CMOS工艺中基本运算和内存操作的能量消耗,从这些数据中我们可以看到,每个连接的能量由内存访问决定,每个连接的能量小号范围从片内SRAM中取得一个32位数的5pJ能量消耗,到从片外DRAM中取得一个32位数640pJ的能量消耗。大型网络不适合片上存储,因此需要更昂贵的DRAM访问。例如,在20Hz的处理器上运行一个10亿个连接的神经网络,仅仅是DRAM访问就需要(20Hz)(1G)(640pJ) = 12.8 W的能量,——远远超出了典型移动设备的功率范围。我们修剪网络的目标是减少运行如此大的网络所需的能量,以便它们能够在移动设备上实时运行。剪枝后的模型尺寸减小还有助于包含DNN的移动应用程序的存储和传输。在这里插入图片描述
  为了实现这一目标,我们提出了一种以保持原始精度的方式修剪网络连接的方法。在初始训练阶段之后,我们删除所有权重低于阈值的连接。这种修剪将密集的、完全连接的层转换为稀疏层。第一个阶段学习网络的拓扑结构,学习哪些连接是重要的,并删除不重要的连接。然后,我们对稀疏网络进行重训练,以便剩余的连接可以补偿已删除的连接。剪枝和重训练的过程可能迭代进行,以进一步降低网络复杂性。实际上,这个训练过程除了学习权重参数之外,还学习网络连接——就像哺乳动物大脑一样,在儿童发育的最初几个月里,大脑会产生神经突触,然后逐渐修剪掉一些用处小的连接,使其降至典型的成人值。

2.相关工作

  神经网络是典型的过参数化模型,且深度神经网络中存在大量的冗余参数,这对于计算或存储都是一种浪费。现存的有很多种消除冗余参数的方法:[1]提出了一个定点化方法,将32位激活函数浮点数量化为8位定点整数,[12]使用低秩分解的方法,在网络性能基本不变的情况下,将模型大小缩小至原来的1%,[13]使用向量量化方式对深度卷积神经网络进行压缩。这些近似和量化方法与剪枝方法是正交的,可以与剪枝方法混合使用,从而获得刚好的压缩性能。
  还有一种通过使用全局平均池化代替全连接层的压缩方法。[15]和[16]中的网络使用这种方式,在多个benchmark上达到了顶尖的水平。但是,例如在迁移学习中使用这种方法就比较困难,[16]最先注意到了这个问题,并在网络的最后添加一个线性层来使能迁移学习。
  一直以来,网络剪枝都被用在减小模型复杂度或者减少过拟合。最早的剪枝方式是使用偏置权重衰减[17],OBD[18]和OBS[19]都是通过损失函数的海森矩阵对网络连接进行裁剪,并且生成其方法比基于大小的剪枝(例如权重衰减)效果要好。
  HashNet[20]使用一个哈希函数将所有的参数连接分组,同一个组内的参数使用同一个数代表,从而大大减少模型参数数量。[21]和[22]则进一步解决了哈希碰撞的问题,加速了哈希过程。HashNet也许可以和剪枝一起使用。

3.Learning Connections in Addition to Weights

  本文的剪枝方法主要分为3个步骤,如图2所示。首先,通过一般的神经网络训练学习网络的连接,不像是传统的网络训练,本文训练学习的不是最终的权重值,而是学习连接的重要程度。然后,将数值低于某一阈值的权重对应的连接全部删除,从而将一个连接稠密的网络转换为一个稀疏的网络,如图3所示;最后,重训练网络中剩余的连接从而学习到连接对应的最终权重值,这一步很关键,如果剪枝之后的网络没有重训练,那么网络的性能会受到很大的影响。

3.1正则化

  选择正确的正则化对剪枝和重训练的性能都有影响。L1正则化对非零参数进行惩罚,使得更多的参数接近于零,这可以在剪枝之后取得更好的准确性,但在重训练之后,L1正则化的准确性不如L2正则化好。总的来说,L2正则化给出了最佳修剪结果。这将在实验部分进一步讨论。

3.2 调整Dropout ratio

  在神经网络训练中,dropout被广泛应用来防止过拟合,在本文的重训练中,也需要使用dropout。然而,在重训练期间,dropout率必须调整,以适应模型容量的变化。在训练过程中使用dropout时,每个参数都有一定的可能性(即概率)被丢弃,但是在推理过程中,被dropout掉的参数还是会参与运算。但是,在剪枝过程中删除掉的参数,不管是训练还是推理阶段,都不会再参与运算。当参数变得稀疏时,分类器将选择信息量最大的预测器,从而使预测方差大大减小,从而减少了过拟合。由于在剪枝阶段已经降低了模型容量,所以在重训练过程中的dropout率应该更小。
  定量的说,令CiC_iCi​表示第iii层的连接数量,CioC_{io}Cio​表示剪枝之前的第iii层的连接数量,CirC_{ir}Cir​表示重训练之后的第iii层的连接数量,NiN_iNi​表示第iii层的神经元数量。因为dropout作用的是神经元,根据等式1可知,CiC_iCi​与NiN_iNi​成二次方变化。剪枝之后的dropout率应该由等式2算出,其中D0D_0D0​表示原始的dropout率,DrD_rDr​表示重训练过程中应该使用的dropout率。
Ci=NiNi1(1)C_i = N_i N_{i-1} \qquad\quad(1)Ci​=Ni​Ni−1​(1)
Dr=D0CirCio(2)D_r = D_0\sqrt{\frac{C_{ir}}{C_io}}\qquad\quad(2)Dr​=D0​Ci​oCir​​​(2)

3.3局部剪枝和参数共适应

  在重训练过程中,对于保留下来的连接来说,不需要重新初始化其权重值,可以直接根据现有的值进行训练。CNNs包含脆弱的协适应特性:梯度下降能够在网络初始训练时找到一个很好的解决方案,但是在重新初始化一些层并对它们进行再训练之后就不能了。所以,当我们重训练被剪枝之后的层时,我们应该使用当前值,而不是重新初始化。
  从保留权值开始重新训练修剪后的层所需的计算量更少,因为我们不必在整个网络中进行反向传播。此外,随着网络的深入,神经网络容易遭受消失梯度问题的困扰,这使得对深层网络的修剪误差更难恢复。为了防止这种情况发生,在剪枝和重训练过程中,剪枝层是卷积层的话,我们就固定住全连接层,只对卷积层进行剪枝和重训练,反之亦然。

3.4迭代剪枝

  学习正确的连接是一个迭代的过程。剪枝及之后的重训练是一次迭代,在多次这样的迭代之后,可以找到最小数量的连接。在不损失精度的前提下,与单步大胆剪枝相比,迭代剪枝可以将AlexNet上的剪枝率从5倍提高到9倍。每次迭代都是一次贪婪搜索,因此我们找到了最好的连接。我们还试验了基于绝对值的概率剪枝参数,但结果更糟。

3.5修剪神经元

  修剪连接后,具有零输入连接或零输出连接的神经元可能会被安全地剪掉,通过去除与修剪过的神经元之间的所有连接来进一步修剪这种修剪。重训练阶段会自动到达这样的结果:死神经元将同时拥有零输入连接和零输出连接,这是由于梯度下降和正则化引起的。具有零输入连接(或零输出连接)的神经元对最终损失没有贡献,导致其输出连接(或输入连接)的梯度分别为零。只有正则化项才会将权重推到零。因此,在重训练期间,死亡的神经元将被自动移除。

4.实验结果

  我们的使用caffe来进行神经网络的裁剪。本文对Caffe添加掩码,该掩码在网络操作期间将剪掉的参数置零。剪枝阈值被选择为质量参数乘以层的权重的标准偏差。我们在Nvidia Titanx和GTX980 GPU上进行了实验。
  我们修剪了四个代表性网络:MNIST上的Lenet-300-100和Lenet-5,以及ImageNet上的AlexNet和VGG-16。 修剪前后的网络参数和精度1如表1所示:
在这里插入图片描述

4.1 LeNet on MNIST

  我们首先使用Lenet-300-100和Lenet-5在MNIST上进行实验,Lenet-300-100是一个有两个隐含层,每个隐含层神经元数量为300和100的全连接神经网络,其在MNIST上达到98.4%的准确率,Lenet-5是一个两个卷积层和两个全连接层的神经网络,其在MNIST上达到99.2%的准确率。在经过剪枝之后,再对网络模型进行重训练(学习率为原始学习率的110\frac{1}{10}101​)。表2、3展示了经过剪枝重训练之后,在Lenet-300-100上精简了12倍的参数。表中从左到右分别是原始权重的数量、该层所需的浮点数计算次数、非零激活函数的平均比例、剪枝之后非零参数所占比例、剪枝之后实际所需的浮点数运算次数。
  剪枝的结果产生了一个有趣的副产品:剪枝探测到了视觉注意区域,图4展示了Lenet-300-100第一个卷积层的稀疏性,矩阵大小为784300。图中一共包含28个数据带,每个数据带的宽度为28,对应着输入图片的尺寸为2828。图中有颜色的部分表示非零权重,可以看到,非零权重大部分分布在中间位置,正好对应着输入图片的中间位置(原始图片中数字是在图片正中间的),图中的最左边和最右边代表了输入图片中不重要的的顶部和底部,在剪枝之后,神经网络发现了图片的中心是最重要的,而图片外围的区域则大量的剪掉。
在这里插入图片描述

4.2 Alexnet on ImageNet

  我们进一步检查了AlexNet(在ILSVRC-2012,有着1.2M的训练数据和50k的验证数据)。本文使用caffe中自带的Alexnet模型(有61million的参数,5个卷积层和3个全连接层),其在ImageNet上的top1准确率为57.2%,top5准确率为80.3%。原始的Alexnet在NVIDIA Titan C GPU上训练需要需要75个小时,剪枝之后,整个网络使用的重训练学习率为原始学习率的1100\frac{1}{100}1001​,花费了173个小时用来重训练,当迭代地对模型进行原型化时,并不使用剪枝,而是在模型准备部署时使用剪枝,因此,重训练的时间不是需要考虑的问题。表4表明了Alexnet可以在网络精度不损失的情况下,将模型大小缩减至原来的19\frac{1}{9}91​,且将原来的计算次数减少3倍。
在这里插入图片描述

4.3 VGG-16 on ImageNet

  在Alexnet上取得不错的结果之后,本文也在一个更大的网络VGG-16(在ILSVR-2012数据集上)上进行了实验,VGG-16相比而言,有着更多的卷积层,但仍然只有3个全连接层。使用上述类似的方法,我们对VGG-16进行了大胆的剪枝,使用5次剪枝重训练的迭代,表5展示了在该模型上减少的参数数量。
在这里插入图片描述
  与Alexnet结果一样,VGG实验的结果让我们充满了希望。整个神经网络减到其原始大小的7.5%,大约是压缩了13倍。特别注意,两个全连接层都可以减少到原始数量的4%,这种减少对于实时图像处理是至关重要的,因为在实时图像处理中很少重用全连接层(与训练期间的批处理不同)。

5.讨论

  图5中展示了精度与参数数量的一个平衡曲线,剪枝掉的参数越多,精度就越低。本文实验了使用L1或L2正则化、重训练或者不重训练、使用L2正则化迭代剪枝五种都在图5中展示。图中实线是使用重训练,虚线是不使用重训练,可以很明显的看出,不使用重训练,精确度在连接剩余110\frac{1}{10}101​时就开始下降,而使用重训练,在连接剩余110\frac{1}{10}101​处时才开始下降。有趣的是,我们有“免费午餐”,即使没有再培训,也可以减少2×连接而不会失去准确性; 通过再培训,我们可以将连接减少9倍。
  另外,从图中可以看出,使用L1正则化比L2正则化的效果要好(蓝色虚线和紫色虚线),因为L1正则化使得更多的参数值接近于0,但是,比较黄色实线和绿色实线可以看出,在加入重训练之后,L2正则化比L1正则化要好,因为进一步将参数逼近0没有好处。一个扩展是使用L1正则化进行修剪,然后使用L2进行重新训练,但这并不是简单地使用L2进行两个阶段,并且 来自一种模式的参数不能很好地适应另一种模式。
  最大的收益来自迭代剪枝(红线实心圆实线)。这里是将剪枝重训练之后的网络(绿色空心圆实线)再次进行剪枝重训练,即迭代剪枝。这条曲线上最左边的点对应于绿线上80%(5倍剪枝率)的点,然后剪枝到8倍,在剪枝到9倍的情况下,没有发生精度损失,剪枝到10倍时开始精度开始快速下降。
  图中有两个绿点的精度略高于原始模型。我们认为这种精确的改进是由于剪枝找到合适的网络容量,从而减少过度拟合。
在这里插入图片描述
  卷积层和全连接层都可以进行剪枝,但是其剪枝敏感度不同。图6展示了每个层的剪枝敏感度。该图显示了在逐层基础上对参数进行修剪时精度如何下降,conv层(左侧)对修剪的敏感度高于全连接层(右侧)。第一卷积层直接与输入图像交互,对修剪最敏感。我们怀疑这种灵敏度是由于输入层只有3个信道,因此比其他卷积层的冗余度更低。我们使用敏感度结果来找到每一层的阈值:例如,最小的阈值应用于最敏感的层,即第一个卷积层。
  将修剪后的层存储为稀疏矩阵的存储开销仅为15.6%。存储相对于绝对索引的相对索引将FC层索引占用的空间减少到5位。同样,CONV层索引也能只用8位表示。
在这里插入图片描述
  经过修剪后,AlexNet和VGGNet的存储需求都足够小,所有的权重都可以直接片上存储
,而不是存储在芯片外的DRAM上,访问DRAM需要多几个数量级的能量(表1)。考虑到一般硬件在稀疏计算方面的局限性,我们针对针对稀疏DNN的固定功能硬件,提出了一种剪枝方法。
  图7展示了Alexnet第一个全连接层剪枝前后的权重分布直方图,左右两个子图的y轴刻度不同,权值的初始分布以零为中心,尾部迅速下降。几乎所有的参数都在[0.015,0.015]之间。修剪后,大的中心区域被删除。在重训练阶段,网络参数会自动调整。结果是,参数形成了一个双峰分布,并在[0.025,0.025]之间更广泛地分布在x轴上。
在这里插入图片描述

6. 结论

  我们提出了一种方法,通过找到正确的连接来提高神经网络的能量效率和存储,而不会影响精度。 我们的方法,部分是由于哺乳动物大脑中的学习工作,通过学习哪些联系很重要,修剪不重要的联系,然后重新训练剩余的稀疏网络来运作。我们强调了AlexNet和VGGNet在ImageNet上的特性,显示了完全连接层和卷积层都可以被修剪,在不损失计算能力的情况下将连接数减少9倍到13倍。这使得实时图像处理的内存容量和带宽需求更小,从而更容易部署到移动系统上。

标签:both,修剪,训练,剪枝,Efficient,Neural,网络,参数,连接
来源: https://blog.csdn.net/maqian5/article/details/90697480

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有