CNN模型压缩与加速算法综述

更新于 2017年10月13日 机器学习
我来说两句
wx:   网页版 2017-10-13 06:56
会议活动 深度学习 视觉 算法 资源 ICLR KNN Song H Yann Lecun 分类 会议 矩阵 聚类 神经网络 书籍
「CNN模型压缩与加速算法综述」前言自从AlexNet一举夺得ILSVRC 2012 ImageNet图像分类竞赛的冠军后,卷积神经网络(CNN)的热潮便席卷了整个计算机视觉领域。CNN模型火速替代了传统人工设计(hand-crafted)特征和分类器,不仅提供了一种端到端的处理方法,还大幅度地刷新了各个图像竞赛任务的精度,更甚者超越了人眼的精度(LFW人脸识别任务)。CNN模型在不断逼近计算机视觉任务的精度极限的同时,其深度和尺寸也在成倍增长。表1 几种经典模型的尺寸,计算量和参数数量对比ModelModel Size(MB)MillionMult-AddsMillionParametersAlexNet[1]>20072060VGG16[2]>50015300138GoogleNet[3]~5015506.8Inception-v3[4]90-100500023.2随之而来的是一个很尴尬的场景:如此巨大的模型只能在有限的平台下使用,根本无法移植到移动端和嵌入式芯片当中。就算想通过网络传输,但较高的带宽占用也让很多用户望而生畏。另一方面,大尺寸的模型也对设备功耗和运行速度带来了巨大的挑战。因此这样的模型距离实用还有一段距离。在这样的情形下,模型小型化与加速成了亟待解决的问题。其实早期就有学者提出了一系列CNN模型压缩方法,包括权值剪值(prunning)和矩阵SVD分解等,但压缩率和效率还远不能令人满意。近年来,关于模型小型化的算法从压缩角度上可以大致分为两类:从模型权重数值角度压缩和从网络架构角度压缩。另一方面,从兼顾计算速度方面,又可以划分为:仅压缩尺寸和压缩尺寸的同时提升速度。本文主要讨论如下几篇代表性的文章和方法,包括SqueezeNet[5]、DeepCompression[6]、XNorNet[7]、Distilling[8]、MobileNet[9]和ShuffleNet[10],也可按照上述方法进行大致分类:表2 几种经典压缩方法及对比MethodCompression  ApproachSpeed  ConsiderationSqueezeNetarchitectureNoDeep CompressionweightsNoXNorNetweightsYesDistillingarchitectureNoMobileNetarchitectureYesShuffleNetarchitectureYes   一、SqueezeNet1.1 设计思想SqueezeNet是F. N. Iandola,S.Han等人于2016年的论文《SqueezeNet: AlexNet-level accuracy with 50xfewer parameters and <0.5MB model size》中提出的一个小型化的网络模型结构,该网络能在保证不损失精度的同时,将原始AlexNet压缩至原来的510倍左右(<0.5MB)。SqueezeNet的核心指导思想是——在保证精度的同时使用最少的参数。而这也是所有模型压缩方法的一个终极目标。基于这个思想,SqueezeNet提出了3点网络结构设计策略:策略 1.将3×3卷积核替换为1×1卷积核。这一策略很好理解,因为1个1×1卷积核的参数是3×3卷积核参数的1/9,这一改动理论上可以将模型尺寸压缩9倍。策略 2.减小输入到3×3卷积核的输入通道数。我们知道,对于一个采用3×3卷积核的卷积层,该层所有卷积参数的数量(不考虑偏置)为:式中,N是卷积核的数量,也即输出通道数,C是输入通道数。因此,为了保证减小网络参数,不仅仅需要减少3×3卷积核的数量,还需减少输入到3×3卷积核的输入通道数量,即式中C的数量。策略 3.尽可能的将降采样放在网络后面的层中。在卷积神经网络中,每层输出的特征图(feature map)是否下采样是由卷积层的步长或者池化层决定的。而一个重要的观点是:分辨率越大的特征图(延迟降采样)可以带来更高的分类精度,而这一观点从直觉上也可以很好理解,因为分辨率越大的输入能够提供的信息就越多。上述三个策略中,前两个策略都是针对如何降低参数数量而设计的,最后一个旨在最大化网络精度。1.2 网络架构基于以上三个策略,作者提出了一个类似inception的网络单元结构,取名为fire module。一个fire module 包含一个squeeze 卷积层(只包含1×1卷积核)和一个expand卷积层(包含1×1和3×3卷积核)。其中,squeeze层借鉴了inception的思想,利用1×1卷积核来降低输入到expand层中3×3卷积核的输入通道数。如图1所示。                        图1 Fire module结构示意图[5]其中,定义squeeze层中1×1卷积核的数量是s1x1,类似的,expand层中1×1卷积核的数量是e1x1, 3×3卷积核的数量是e3x3。令s1x1 < e1x1+ e3x3从而保证输入到3×3的输入通道数减小。SqueezeNet的网络结构由若干个fire module组成,另外文章还给出了一些架构设计上的细节:·      为了保证1×1卷积核和3×3卷积核具有相同大小的输出,3×3卷积核采用1像素的zero-padding和步长·      squeeze层和expand层均采用RELU作为激活函数·      在fire9后采用50%的dropout·      由于全连接层的参数数量巨大,因此借鉴NIN[11]的思想,去除了全连接层而改用global average pooling。 1.3 实验结果表3 不同压缩方法在ImageNet上的对比实验结果 [5]上表显示,相比传统的压缩方法,SqueezeNet能在保证精度不损(甚至略有提升)的情况下,达到最大的压缩率,将原始AlexNet从240MB压缩至4.8MB,而结合Deep Compression后更能达到0.47MB,完全满足了移动端的部署和低带宽网络的传输。此外,作者还借鉴ResNet思想,对原始网络结构做了修改,增加了旁路分支,将分类精度提升了约3%。1.4 速度考量尽管文章主要以压缩模型尺寸为目标,但毋庸置疑的一点是,SqueezeNet在网络结构中大量采用1×1和3×3卷积核是有利于速度的提升的,对于类似caffe这样的深度学习框架,在卷积层的前向计算中,采用1×1卷积核可避免额外的im2col操作,而直接利用gemm进行矩阵加速运算,因此对速度的优化是有一定的作用的。然而,这种提速的作用仍然是有限的,另外,SqueezeNet采用了9个fire module和两个卷积层,因此仍需要进行大量常规卷积操作,这也是影响速度进一步提升的瓶颈。二、DeepCompressionDeep Compression出自S.Han 2016 ICLR的一篇论文《Deep Compression: Compressing Deep NeuralNetworks with Pruning, Trained Quantization and Huffman Coding》。该文章获得了ICLR 2016的最佳论文奖,同时也具有里程碑式的意义,引领了CNN模型小型化与加速研究方向的新狂潮,使得这一领域近两年来涌现出了大量的优秀工作与文章。2.1 算法流程与前面的“架构压缩派”的SqueezeNet不同,Deep Compression是属于“权值压缩派”的。而两篇文章均出自S.Han团队,因此两种方法结合,双剑合璧,更是能达到登峰造极的压缩效果。这一实验结果也在上表中得到验证。Deep Compression的算法流程包含三步,如图2所示:图2 Deep Compression Pipeline[6]1)        Pruning(权值剪枝)剪枝的思想其实早已在早期论文中可以窥见,LeCun等人曾经就利用剪枝来稀疏网络,减小过拟合的风险,提升网络泛化性。图3是MNIST上训练得到的LeNet conv1卷积层中的参数分布,可以看出,大部分权值集中在0处附近,对网络的贡献较小,在剪值中,将0值附近的较小的权值置0,使这些权值不被激活,从而着重训练剩下的非零权值,最终在保证网络精度不变的情况下达到压缩尺寸的目的。实验发现模型对剪枝更敏感,因此在剪值时建议逐层迭代修剪,另外每层的剪枝比例如何自动选取仍然是一个值得深入研究的课题。图3 LeNet conv1层权值分布图2)        Quantization(权值量化)此处的权值量化基于权值聚类,将连续分布的权值离散化,从而减小需要存储的权值数量。·      初始化聚类中心,实验证明线性初始化效果最好;·      利用k-means算法进行聚类,将权值划分到不同的cluster中;·      在前向计算时,每个权值由其聚类中心表示;·      在后向计算时,统计每个cluster中的梯度和将其反传。图4 权值量化前向和后向计算过程[6]        3)        Huffmanencoding(霍夫曼编码)霍夫曼编码采用变长编码将平均编码长度减小,进一步压缩模型尺寸。2.2 模型存储前述的剪枝和量化都是为了实现模型的更紧致的压缩,以实现减小模型尺寸的目的。·      对于剪枝后的模型,由于每层大量参数为0,后续只需将非零值及其下标进行存储,文章中采用CSR(CompressedSparse Row)来进行存储,这一步可以实现9x~13x的压缩率。·      对于量化后的模型,每个权值都由其聚类中心表示(对于卷积层,聚类中心设为256个,对于全连接层,聚类中心设为32个),因此可以构造对应的码书和下标,大大减少了需要存储的数据量,此步能实现约3x的压缩率。·      最后对上述压缩后的模型进一步采用变长霍夫曼编码,实现约1x的压缩率。2.3 实验结果表4 不同网络采用Deep Compression后的压缩率[6]通过SqueezeNet+Deep Compression,可以将原始240M的AlexNet压缩至0.47M,实现约510x的压缩率。2.4 速度考量可以看出,Deep Compression的主要设计是针对网络存储尺寸的压缩,但在前向时,如果将存储模型读入展开后,并没有带来更大的速度提升。因此Song H.等人专门针对压缩后的模型设计了一套基于FPGA的硬件前向加速框架EIE[12],有兴趣的可以研究一下。三、XNorNet二值网络一直是模型压缩和加速领域经久不衰的研究课题之一。将原始32位浮点型的权值压缩到1比特,如何最大程度地减小性能损失就成为了研究的关键。此篇论文主要有以下几个贡献:·      提出了一个BWN(Binary-Weight-Network)和XNOR-Network,前者只对网络参数做二值化,带来约32x的存储压缩和2x的速度提升,而后者对网络输入和参数都做了二值化,在实现32x存储压缩的同时带了58x的速度提升;·      提出了一个新型二值化权值的算法;·      第一个在大规模数据集如ImageNet上提交二值化网络结果的工作;·      无需预训练,可实现trainingfrom scratch。3.1 BWN为了训练二值化权值网络,令,其中,即二值滤波器,是尺度因子。通过最小化目标函数,得到其最优解:即最优的二值化滤波器张量B即为原始参数的符号函数,最优的尺度因子为每个滤波器权值的绝对值的均值。训练算法如图5所示,值得注意的是,只有在前向计算和后向传播时使用二值化后的权值,在更新参数时依然使用原始参数,这是因为如果使用二值化后的参数会导致很小的梯度下降,从而使得训练无法收敛。转自:微信AI 完整内容请点击“阅读原文” via: http://mp.weixin.qq.com/s?__biz=MzA4NDEyMzc2Mw==&mid=2649678222&idx=2&sn=8b61354e007a0b80cedd671854f6ca5d&scene=0#wechat_redirect

 

回复