本文由云+社区发表导语:卷积神经网络日益增加的深度和尺寸为深度学习在移动端的部署带来了巨大的挑战,CNN模型压缩与加速成为了学术界和工业界都重点关注的研究领域之一。算法
自从AlexNet一举夺得ILSVRC 2012 ImageNet图像分类竞赛的冠军后,卷积神经网络(CNN)的热潮便席卷了整个计算机视觉领域。CNN模型火速替代了传统人工设计(hand-crafted)特征和分类器,不只提供了一种端到端的处理方法,还大幅度地刷新了各个图像竞赛任务的精度,更甚者超越了人眼的精度(LFW人脸识别任务)。CNN模型在不断逼近计算机视觉任务的精度极限的同时,其深度和尺寸也在成倍增加。网络
自从AlexNet一举夺得ILSVRC 2012 ImageNet图像分类竞赛的冠军后,卷积神经网络(CNN)的热潮便席卷了整个计算机视觉领域。CNN模型火速替代了传统人工设计(hand-crafted)特征和分类器,不只提供了一种端到端的处理方法,还大幅度地刷新了各个图像竞赛任务的精度,更甚者超越了人眼的精度(LFW人脸识别任务)。CNN模型在不断逼近计算机视觉任务的精度极限的同时,其深度和尺寸也在成倍增加。架构
表1 几种经典模型的尺寸,计算量和参数数量对比框架
Model | Model Size(MB) | MillionMult-Adds | MillionParameters |
---|---|---|---|
AlexNet[1] | >200 | 720 | 60 |
VGG16[2] | >500 | 15300 | 138 |
GoogleNet[3] | ~50 | 1550 | 6.8 |
Inception-v3[4] | 90-100 | 5000 | 23.2 |
随之而来的是一个很尴尬的场景:如此巨大的模型只能在有限的平台下使用,根本没法移植到移动端和嵌入式芯片当中。就算想经过网络传输,但较高的带宽占用也让不少用户望而生畏。另外一方面,大尺寸的模型也对设备功耗和运行速度带来了巨大的挑战。所以这样的模型距离实用还有一段距离。ide
在这样的情形下,模型小型化与加速成了亟待解决的问题。其实早期就有学者提出了一系列CNN模型压缩方法,包括权值剪值(prunning)和矩阵SVD分解等,但压缩率和效率还远不能使人满意。函数
近年来,关于模型小型化的算法从压缩角度上能够大体分为两类:从模型权重数值角度压缩和从网络架构角度压缩。另外一方面,从兼顾计算速度方面,又能够划分为:仅压缩尺寸和压缩尺寸的同时提高速度。性能
本文主要讨论以下几篇表明性的文章和方法,包括SqueezeNet[5]、Deep Compression[6]、XNorNet[7]、Distilling[8]、MobileNet[9]和ShuffleNet[10],也可按照上述方法进行大体分类:学习
表2 几种经典压缩方法及对比优化
Method | Compression Approach | Speed Consideration |
---|---|---|
SqueezeNet | architecture | No |
Deep Compression | weights | No |
XNorNet | weights | Yes |
Distilling | architecture | No |
MobileNet | architecture | Yes |
ShuffleNet | architecture | Yes |
SqueezeNet是F. N. Iandola,S.Han等人于2016年的论文《SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and < 0.5MB model size》中提出的一个小型化的网络模型结构,该网络能在保证不损失精度的同时,将原始AlexNet压缩至原来的510倍左右(< 0.5MB)。编码
SqueezeNet的核心指导思想是——在保证精度的同时使用最少的参数。
而这也是全部模型压缩方法的一个终极目标。
基于这个思想,SqueezeNet提出了3点网络结构设计策略:
策略 1.将3x3卷积核替换为1x1卷积核。
这一策略很好理解,由于1个1x1卷积核的参数是3x3卷积核参数的1/9,这一改动理论上能够将模型尺寸压缩9倍。
策略 2.减少输入到3x3卷积核的输入通道数。
咱们知道,对于一个采用3x3卷积核的卷积层,该层全部卷积参数的数量(不考虑偏置)为:
式中,N是卷积核的数量,也即输出通道数,C是输入通道数。
所以,为了保证减少网络参数,不只仅须要减小3x3卷积核的数量,还需减小输入到3x3卷积核的输入通道数量,即式中C的数量。
策略 3.尽量的将降采样放在网络后面的层中。
在卷积神经网络中,每层输出的特征图(feature map)是否下采样是由卷积层的步长或者池化层决定的。而一个重要的观点是:分辨率越大的特征图(延迟降采样)能够带来更高的分类精度,而这一观点从直觉上也能够很好理解,由于分辨率越大的输入可以提供的信息就越多。
上述三个策略中,前两个策略都是针对如何下降参数数量而设计的,最后一个旨在最大化网络精度。
基于以上三个策略,做者提出了一个相似inception的网络单元结构,取名为fire module。一个fire module 包含一个squeeze 卷积层(只包含1x1卷积核)和一个expand卷积层(包含1x1和3x3卷积核)。其中,squeeze层借鉴了inception的思想,利用1x1卷积核来下降输入到expand层中3x3卷积核的输入通道数。如图1所示。
图1 Fire module结构示意图[5]
其中,定义squeeze层中1x1卷积核的数量是s1x1,相似的,expand层中1x1卷积核的数量是e1x1, 3x3卷积核的数量是e3x3。令s1x1 < e1x1+ e3x3从而保证输入到3x3的输入通道数减少。SqueezeNet的网络结构由若干个 fire module 组成,另外文章还给出了一些架构设计上的细节:
表3 不一样压缩方法在ImageNet上的对比实验结果[5]
上表显示,相比传统的压缩方法,SqueezeNet能在保证精度不损(甚至略有提高)的状况下,达到最大的压缩率,将原始AlexNet从240MB压缩至4.8MB,而结合Deep Compression后更能达到0.47MB,彻底知足了移动端的部署和低带宽网络的传输。
此外,做者还借鉴ResNet思想,对原始网络结构作了修改,增长了旁路分支,将分类精度提高了约3%。
尽管文章主要以压缩模型尺寸为目标,但毋庸置疑的一点是,SqueezeNet在网络结构中大量采用1x1和3x3卷积核是有利于速度的提高的,对于相似caffe这样的深度学习框架,在卷积层的前向计算中,采用1x1卷积核可避免额外的im2col操做,而直接利用gemm进行矩阵加速运算,所以对速度的优化是有必定的做用的。然而,这种提速的做用仍然是有限的,另外,SqueezeNet采用了9个fire module和两个卷积层,所以仍须要进行大量常规卷积操做,这也是影响速度进一步提高的瓶颈。
Deep Compression出自S.Han 2016 ICLR的一篇论文《Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding》。该文章得到了ICLR 2016的最佳论文奖,同时也具备里程碑式的意义,引领了CNN模型小型化与加速研究方向的新狂潮,使得这一领域近两年来涌现出了大量的优秀工做与文章。
与前面的“架构压缩派”的SqueezeNet不一样,Deep Compression是属于“权值压缩派”的。而两篇文章均出自S.Han团队,所以两种方法结合,双剑合璧,更是能达到登峰造极的压缩效果。这一实验结果也在上表中获得验证。
Deep Compression的算法流程包含三步,如图2所示:
图2 Deep Compression Pipeline[6]
一、Pruning(权值剪枝)
剪枝的思想其实早已在早期论文中能够窥见,LeCun等人曾经就利用剪枝来稀疏网络,减少过拟合的风险,提高网络泛化性。
图3是MNIST上训练获得的LeNet conv1卷积层中的参数分布,能够看出,大部分权值集中在0处附近,对网络的贡献较小,在剪值中,将0值附近的较小的权值置0,使这些权值不被激活,从而着重训练剩下的非零权值,最终在保证网络精度不变的状况下达到压缩尺寸的目的。
实验发现模型对剪枝更敏感,所以在剪值时建议逐层迭代修剪,另外每层的剪枝比例如何自动选取仍然是一个值得深刻研究的课题。
图3 LeNet conv1层权值分布图
二、Quantization (权值量化)
此处的权值量化基于权值聚类,将连续分布的权值离散化,从而减少须要存储的权值数量。
图4 权值量化前向和后向计算过程[6]
三、Huffman encoding(霍夫曼编码)
霍夫曼编码采用变长编码将平均编码长度减少,进一步压缩模型尺寸。
前述的剪枝和量化都是为了实现模型的更紧致的压缩,以实现减少模型尺寸的目的。
表4 不一样网络采用Deep Compression后的压缩率[6]
经过SqueezeNet+Deep Compression,能够将原始240M的AlexNet压缩至0.47M,实现约510x的压缩率。
能够看出,Deep Compression的主要设计是针对网络存储尺寸的压缩,但在前向时,若是将存储模型读入展开后,并无带来更大的速度提高。所以Song H.等人专门针对压缩后的模型设计了一套基于FPGA的硬件前向加速框架EIE[12],有兴趣的能够研究一下。
二值网络一直是模型压缩和加速领域经久不衰的研究课题之一。将原始32位浮点型的权值压缩到1比特,如何最大程度地减少性能损失就成为了研究的关键。
此篇论文主要有如下几个贡献:
为了训练二值化权值网络,令
,其中
,即二值滤波器,
是是尺度因子。经过最小化目标函数,获得其最优解:
即最优的二值化滤波器张量B即为原始参数的符号函数,最优的尺度因子为每一个滤波器权值的绝对值的均值。
训练算法如图5所示,值得注意的是,只有在前向计算和后向传播时使用二值化后的权值,在更新参数时依然使用原始参数,这是由于若是使用二值化后的参数会致使很小的梯度降低,从而使得训练没法收敛。
在XNOR网络中,优化的目标是将两个实数向量的点乘近似到两个二值向量的点乘,即
式中,
,
相似的,有最优解以下式
在卷积计算中,输入和权值均量化成了二值,所以传统的乘法计算变成了异或操做,而非二值化数据的计算只占了很小一部分。
XNOR-Net中一个典型的卷积单元如图6所示,与传统单元不一样,各模块的顺序有了调整。为了减小二值化带来的精度损失,对输入数据首先进行BN归一化处理,BinActiv层用于对输入作二值化,接着进行二值化的卷积操做,最后进行pooling。
图5 BWN训练过程[7]
图6 传统卷积单元与XNOR-Net卷积单元对比[7]
表5 ImageNet上二值网络与AlexNet结果对比[7]
与ALexNet相比,BWN网络可以达到精度基本不变甚至略好,XNOR-Net因为对输入也作了二值化,性能稍降。
Distilling算法是Hinton等人在论文Distilling the Knowledge in a Neural Network中提出的一种相似网络迁移的学习算法。
Distilling直译过来即蒸馏,其基本思想是经过一个性能好的大网络来教小网络学习,从而使得小网络可以具有跟大网络同样的性能,但蒸馏后的小网络参数规模远远小于原始大网络,从而达到压缩网络的目的。
其中,训练小模型(distilled model)的目标函数由两部分组成
1) 与大模型(cumbersome model)的softmax输出的交叉熵(cross entropy),称为软目标(soft target)。其中,softmax的计算加入了超参数温度T,用以控制输出,计算公式变为
温度T越大,输出的分布越缓和,几率zi/T越小,熵越大,但若T过大,会致使较大熵引发的不肯定性增长,增长了不可区分性。
至于为什么要以soft target来计算损失,做者认为,在分类问题中,真值(groundtruth)是一个肯定性的,即one-hot vector。以手写数字分类来讲,对于一个数字3,它的label是3的几率是1,而是其余数值的几率是0,而对于soft target,它能表征label是3的几率,假如这个数字写的像5,还能够给出label是5的必定几率,从而提供更多信息,如
数字 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
真值 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
软目标 | 0 | 0 | 0 | 0.95 | 0 | 0.048 | 0.002 | 0 | 0 | 0 |
2)与真值(groundtruth)的交叉熵(T=1)
训练的损失为上述两项损失的加权和,一般第二项要小不少。
做者给出了在语音识别上的实验结果对比,以下表
表6 蒸馏模型与原始模型精度对比[8]
上表显示,蒸馏后的模型的精确度和单字错误率和用于产生软目标的10个模型的性能至关,小模型成功地学到了大模型的识别能力。
Distilling的提出原先并不是针对网络加速,而最终计算的效率仍然取决于蒸馏模型的计算规模,但理论上蒸馏后的小模型相对原始大模型的计算速度在必定程度上会有提高,但速度提高的比例和性能维持的权衡是一个值得研究的方向。
MobileNet是由Google提出的针对移动端部署的轻量级网络架构。考虑到移动端计算资源受限以及速度要求严苛,MobileNet引入了传统网络中原先采用的group思想,即限制滤波器的卷积计算只针对特定的group中的输入,从而大大下降了卷积计算量,提高了移动端前向计算的速度。
MobileNet借鉴factorized convolution的思想,将普通卷积操做分红两部分:
图7 Depthwise Convolution[9]
Depthwise convolution的计算复杂度为 DKDKMDFDF,其中DF是卷积层输出的特征图的大小。
采用1x1大小的卷积核将depthwise convolution层的多通道输出进行结合,以下图,其中N是输出通道数:
图8 Pointwise Convolution[9]
Pointwise Convolution的计算复杂度为 MNDFDF
上面两步合称depthwise separable convolution
标准卷积操做的计算复杂度为DKDKMNDFDF
所以,经过将标准卷积分解成两层卷积操做,能够计算出理论上的计算效率提高比例:
对于3x3尺寸的卷积核来讲,depthwise separable convolution在理论上能带来约8~9倍的效率提高。
图9 普通卷积单元与MobileNet 卷积单元对比[9]
MobileNet的卷积单元如上图所示,每一个卷积操做后都接着一个BN操做和ReLU操做。在MobileNet中,因为3x3卷积核只应用在depthwise convolution中,所以95%的计算量都集中在pointwise convolution 中的1x1卷积中。而对于caffe等采用矩阵运算GEMM实现卷积的深度学习框架,1x1卷积无需进行im2col操做,所以能够直接利用矩阵运算加速库进行快速计算,从而提高了计算效率。
表7 MobileNet与主流大模型在ImageNet上精度对比[9]
上表显示,MobileNet在保证精度不变的同时,可以有效地减小计算操做次数和参数量,使得在移动端实时前向计算成为可能。
ShuffleNet是Face++今年提出了一篇用于移动端前向部署的网络架构。ShuffleNet基于MobileNet的group思想,将卷积操做限制到特定的输入通道。而与之不一样的是,ShuffleNet将输入的group进行打散,从而保证每一个卷积核的感觉野可以分散到不一样group的输入中,增长了模型的学习能力。
咱们知道,卷积中的group操做可以大大减小卷积操做的计算次数,而这一改动带来了速度增益和性能维持在MobileNet等文章中也获得了验证。然而group操做所带来的另外一个问题是:特定的滤波器仅对特定通道的输入进行做用,这就阻碍了通道之间的信息流传递,group数量越多,能够编码的信息就越丰富,但每一个group的输入通道数量减小,所以可能形成单个卷积滤波器的退化,在必定程度上削弱了网络了表达能力。
在此篇工做中,网络架构的设计主要有如下几个创新点:
借鉴ResNet的旁路分支思想,ShuffleNet也引入了相似的网络单元。不一样的是,在stride=2的单元中,用concat操做代替了add操做,用average pooling代替了1x1stride=2的卷积操做,有效地减小了计算量和参数。单元结构如图10所示。
在MobileNet中提过,1x1卷积的操做占据了约95%的计算量,因此做者将1x1也更改成group卷积,使得相比MobileNet的计算量大大减小。
ShuffleNet的shuffle操做如图11所示。
图10 ShuffleNet网络单元[10]
图11 不一样group间的shuffle操做[10]
表8 ShuffleNet与MobileNet在ImageNet上精度对比 [10]
上表显示,相对于MobileNet,ShuffleNet的前向计算量不只有效地获得了减小,并且分类错误率也有明显提高,验证了网络的可行性。
做者在ARM平台上对网络效率进行了验证,鉴于内存读取和线程调度等因素,做者发现理论上4x的速度提高对应实际部署中约2.6x。做者给出了与原始AlexNet的速度对比,以下表。
表9 ShuffleNet与AlexNet在ARM平台上速度对比 [10]
近几年来,除了学术界涌现的诸多CNN模型加速工做,工业界各大公司也推出了本身的移动端前向计算框架,如Google的Tensorflow、Facebook的caffe2以及苹果今年刚推出的CoreML。相信结合不断迭代优化的网络架构和不断发展的硬件计算加速技术,将来深度学习在移动端的部署将不会是一个难题。
[1] ImageNet Classification with Deep Convolutional Neural Networks
[2] Very Deep Convolutional Networks for Large-Scale Image Recognition
[3] Going Deeper with Convolutions
[4] Rethinking the Inception Architecture for Computer Vision
[5] SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and < 0.5MB model size
[6] Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding
[7] Distilling the Knowledge in a Neural Network
[8] XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks
[9] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
[10] ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
[11] Network in Network
[12] EIE: Efficient Inference Engine on Compressed Deep Neural Network
此文已由做者受权腾讯云+社区在各渠道发布
获取更多新鲜技术干货,能够关注咱们腾讯云技术社区-云加社区官方号