专栏名称: 机器学习研究会
机器学习研究会是北京大学大数据与机器学习创新中心旗下的学生组织,旨在构建一个机器学习从事者交流的平台。除了及时分享领域资讯外,协会还会举办各种业界巨头/学术神牛讲座、学术大牛沙龙分享会、real data 创新竞赛等活动。
目录
相关文章推荐
爱可可-爱生活  ·  本文提出了一种名为“约束即奖励” ... ·  5 天前  
宝玉xp  ·  吴恩达老师分享的用 AI ... ·  5 天前  
宝玉xp  ·  2025 ... ·  6 天前  
51好读  ›  专栏  ›  机器学习研究会

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

机器学习研究会  · 公众号  · AI  · 2017-10-12 22:56

主要观点总结

本文主要介绍了卷积神经网络(CNN)模型的小型化与加速技术,包括SqueezeNet、DeepCompression、XNorNet等方法的原理、实验和速度考量。文章指出,随着CNN模型在图像竞赛任务中精度的不断提升,模型尺寸和计算量也在成倍增长,给移动端和嵌入式芯片的部署带来挑战。因此,模型小型化与加速成为亟待解决的问题。

关键观点总结

关键观点1: SqueezeNet

SqueezeNet是一个小型化的网络模型结构,通过采用1x1卷积核、减小输入通道数和延迟降采样的策略,在保证精度的同时大幅减小模型尺寸。其网络结构由若干个fire module组成,并采用global average pooling去除全连接层。

关键观点2: Deep Compression

Deep Compression通过剪枝、权值量化和霍夫曼编码等技术,实现了深度神经网络的压缩。其中,权值量化基于权值聚类,将连续分布的权值离散化;霍夫曼编码进一步减小了模型尺寸。

关键观点3: XNorNet

XNorNet实现了网络参数和输入的二值化,带来存储压缩和速度提升。提出了新型二值化权值的算法,并在大规模数据集如ImageNet上进行了实验验证。


正文

前言


自从AlexNet一举夺得ILSVRC 2012 ImageNet图像分类竞赛的冠军后,卷积神经网络(CNN)的热潮便席卷了整个计算机视觉领域。CNN模型火速替代了传统人工设计(hand-crafted)特征和分类器,不仅提供了一种端到端的处理方法,还大幅度地刷新了各个图像竞赛任务的精度,更甚者超越了人眼的精度(LFW人脸识别任务)。CNN模型在不断逼近计算机视觉任务的精度极限的同时,其深度和尺寸也在成倍增长。


表1 几种经典模型的尺寸,计算量和参数数量对比

Model

Model Size(MB)

Million

Mult-Adds

Million

Parameters

AlexNet[1]

>200

720

60

VGG16[2]

>500

15300

138

GoogleNet[3]

~50

1550

6.8

Inception-v3[4]

90-100

5000

23.2


随之而来的是一个很尴尬的场景:如此巨大的模型只能在有限的平台下使用,根本无法移植到移动端和嵌入式芯片当中。就算想通过网络传输,但较高的带宽占用也让很多用户望而生畏。另一方面,大尺寸的模型也对设备功耗和运行速度带来了巨大的挑战。因此这样的模型距离实用还有一段距离。


在这样的情形下,模型小型化与加速成了亟待解决的问题。其实早期就有学者提出了一系列CNN模型压缩方法,包括权值剪值(prunning)和矩阵SVD分解等,但压缩率和效率还远不能令人满意。


近年来,关于模型小型化的算法从压缩角度上可以大致分为两类:从模型权重数值角度压缩和从网络架构角度压缩。另一方面,从兼顾计算速度方面,又可以划分为:仅压缩尺寸和压缩尺寸的同时提升速度。


本文主要讨论如下几篇代表性的文章和方法,包括SqueezeNet[5]DeepCompression[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


1.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.将3x3卷积核替换为1x1卷积核。


这一策略很好理解,因为1个1x1卷积核的参数是3x3卷积核参数的1/9,这一改动理论上可以将模型尺寸压缩9倍。


策略 2.减小输入到3x3卷积核的输入通道数。


我们知道,对于一个采用3x3卷积核的卷积层,该层所有卷积参数的数量(不考虑偏置)为:



式中,N是卷积核的数量,也即输出通道数,C是输入通道数。


因此,为了保证减小网络参数,不仅仅需要减少3x3卷积核的数量,还需减少输入到3x3卷积核的输入通道数量,即式中C的数量。


策略 3.尽可能的将降采样放在网络后面的层中。


在卷积神经网络中,每层输出的特征图(feature map)是否下采样是由卷积层的步长或者池化层决定的。而一个重要的观点是:分辨率越大的特征图(延迟降采样)可以带来更高的分类精度,而这一观点从直觉上也可以很好理解,因为分辨率越大的输入能够提供的信息就越多。


上述三个策略中,前两个策略都是针对如何降低参数数量而设计的,最后一个旨在最大化网络精度。


1.2 网络架构

基于以上三个策略,作者提出了一个类似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组成,另外文章还给出了一些架构设计上的细节:


·      为了保证1x1卷积核和3x3卷积核具有相同大小的输出,3x3卷积核采用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在网络结构中大量采用1x1和3x3卷积核是有利于速度的提升的,对于类似caffe这样的深度学习框架,在卷积层的前向计算中,采用1x1卷积核可避免额外的im2col操作,而直接利用gemm进行矩阵加速运算,因此对速度的优化是有一定的作用的。然而,这种提速的作用仍然是有限的,另外,SqueezeNet采用了9个fire module和两个卷积层,因此仍需要进行大量常规卷积操作,这也是影响速度进一步提升的瓶颈。


二、DeepCompression


Deep 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


完整内容请点击“阅读原文”