A Survey of Model Compression and Acceleration for Deep Neural Networks算法
在神经网络方面,早在上个世纪末,Yann LeCun等人已经使用神经网络成功识别了邮件上的手写邮编。至于深度学习的概念是由Geoffrey Hinton等人首次提出,而在2012年,Krizhevsky等人采用深度学习算法,以超过第二名以传统人工设计特征方法准确率10%的巨大领先取得了ImageNet图像分类比赛冠军。网络
此后的计算机视觉比赛已经被各类深度学习模型所承包。这些模型依赖于具备数百甚至数十亿参数的深度网络,传统CPU对如此庞大的网络束手无策,只有具备高计算能力的GPU才能让网络得以相对快速训练。如上文中比赛用模型使用了1个包含5个卷积层和3个彻底链接层的6000万参数的网络。一般状况下,即便使用当时性能顶级的GPU NVIDIA K40来训练整个模型仍须要花费两到三天时间。对于使用全链接的大规模网络,其参数规模甚至能够达到数十亿量级。固然,为了解决全链接层参数规模的问题,人们转而考虑增长卷积层,使全链接参数下降。随之带来的负面影响即是大大增加了计算时间与能耗。数据结构
对于具备更多层和节点的更大的神经网络,减小其存储和计算成本变得相当重要,特别是对于一些实时应用,如在线学习、增量学习以及自动驾驶。在深度学习的另外一端,即更贴近人们生活的移动端,如何让深度模型在移动设备上运行,也是模型压缩加速的一大重要目标。Krizhevsky在2014年的文章中,提出了两点观察结论:卷积层占据了大约90-95%的计算时间和参数规模,有较大的值;全链接层占据了大约5-10%的计算时间,95%的参数规模,而且值较小。这为后来的研究深度模型的压缩与加速提供了统计依据。一个典型的例子是具备50个卷积层的ResNet-50须要超过95MB的存储器以及38亿次浮点运算。在丢弃了一些冗余的权重后,网络仍照常工做,但节省了超过75%的参数和50%的计算时间。固然,网络模型的压缩和加速的最终实现须要多学科的联合解决方案,除了压缩算法,数据结构、计算机体系结构和硬件设计等也起到了很大做用。本文将着重介绍不一样的深度模型压缩方法,并进行对比。框架
综合现有的深度模型压缩方法,它们主要分为四类:函数
基于参数修剪和共享的方法针对模型参数的冗余性,试图去除冗余和不重要的项。基于低秩因子分解的技术使用矩阵/张量分解来估计深度学习模型的信息参数。基于传输/紧凑卷积滤波器的方法设计了特殊的结构卷积滤波器来下降存储和计算复杂度。知识蒸馏方法经过学习一个蒸馏模型,训练一个更紧凑的神经网络来重现一个更大的网络的输出。性能
通常来讲,参数修剪和共享,低秩分解和知识蒸馏方法能够用于全链接层和卷积层的CNN,但另外一方面,使用转移/紧凑型卷积核的方法仅支持卷积层。低秩因子分解和基于转换/紧凑型卷积核的方法提供了一个端到端的流水线,能够很容易地在CPU/GPU环境中实现。相反参数修剪和共享使用不一样的方法,如矢量量化,二进制编码和稀疏约束来执行任务,这致使常须要几个步骤才能达到目标。学习
方法名称 | 描述 | 应用场景 | 方法细节 |
---|---|---|---|
剪枝和共享 | 删除对准确率影响不大的参数 | 卷积层和全链接层 | 对不一样设置具备鲁棒性,能够达到较好效果,支持从零训练和预训练 |
低秩分解 | 使用矩阵对参数进行分解估计 | 卷积层和全链接层 | 标准化的途径,很容易实施,支持从零训练和预训练 |
转移、紧凑卷积核 | 设计特别的卷积核来保存参数 | 只有卷积层 | 算法依赖于应用程序,一般能够取得好的表现,只能从零开始训练 |
知识蒸馏 | 训练一个更紧凑的神经网络来从大的模型蒸馏知识 | 卷积层和全链接层 | 模型表现对应用程序和网络结构较为敏感,只能从零开始训练 |
关于训练协议,基于参数修剪/共享、低秩分解的模型能够从预训练模型或者从头开始训练,所以灵活而有效。然而转移/紧凑的卷积核和知识蒸馏模型只能支持从零开始训练。这些方法是独立设计和相辅相成的。例如,转移层和参数修剪和共享能够一块儿使用,而且模型量化和二值化能够与低秩近似一块儿使用以实现进一步的加速。不一样模型的简要对比,如表1所示。下文针对这些方法作一简单介绍与讨论。优化
根据减小冗余(信息冗余或参数空间冗余)的方式,这些参数修剪和共享能够进一步分为三类:模型量化和二进制化、参数共享和结构化矩阵(structural matrix)。ui
网络量化经过减小表示每一个权重所需的比特数来压缩原始网络。Gong et al. 对参数值使用K-Means量化。Vanhoucke et al. 使用了 8 比特参数量化能够在准确率损失极小的同时实现大幅加速。Han S提出一套完整的深度网络的压缩流程:首先修剪不重要的链接,从新训练稀疏链接的网络。而后使用权重共享量化链接的权重,再对量化后的权重和码本进行霍夫曼编码,以进一步下降压缩率。如图2所示,包含了三阶段的压缩方法:修剪、量化(quantization)和霍夫曼编码。修剪减小了须要编码的权重数量,量化和霍夫曼编码减小了用于对每一个权重编码的比特数。对于大部分元素为0的矩阵可使用稀疏表示,进一步下降空间冗余,且这种压缩机制不会带来任何准确率损失。这篇论文得到了ICLR2016 的Best Paper。编码
在量化级较多的状况下准确率可以较好保持,但对于二值量化网络的准确率在处理大型CNN网络,如GoogleNet时会大大下降。另外一个缺陷是现有的二进制化方法都基于简单的矩阵近似,忽视了二进制化对准确率损失的影响。
网络剪枝和共享起初是解决过拟合问题的,如今更多得被用于下降网络复杂度。早期所应用的剪枝方法称为误差权重衰减(Biased Weight Decay),其中最优脑损伤(Optimal Brain Damage)和最优脑手术(Optimal Brain Surgeon)方法,是基于损失函数的Hessian矩阵来减小链接的数量。他们的研究代表这种剪枝方法的精确度比基于重要性的剪枝方法(好比Weight Decay方法)更高。这个方向最近的一个趋势是在预先训练的CNN模型中修剪冗余的、非信息量的权重。 在稀疏性限制的状况下培训紧凑的CNN也愈来愈流行,这些稀疏约束一般做为l_0或l_1范数调节器在优化问题中引入。
剪枝和共享方法存在一些潜在的问题。首先,若使用了l_0或l_1正则化,则剪枝方法须要更多的迭代次数才能收敛,此外,全部的剪枝方法都须要手动设置层的超参数,在某些应用中会显得很复杂。
该方法的原理很简单:若是一个m×n阶矩阵只须要少于m×n个参数来描述,就是一个结构化矩阵(structured matrix)。一般这样的结构不只能减小内存消耗,还能经过快速的矩阵-向量乘法和梯度计算显著加快推理和训练的速度。
这种方法的一个潜在的问题是结构约束会致使精确度的损失,由于约束可能会给模型带来误差。另外一方面,如何找到一个合适的结构矩阵是困难的。没有理论的方法来推导出来。于是该方法没有普遍推广。
一个典型的 CNN 卷积核是一个 4D 张量,而全链接层也能够当成一个 2D 矩阵,低秩分解一样可行。这些张量中可能存在大量的冗余。全部近似过程都是逐层进行的,在一个层通过低秩滤波器近似以后,该层的参数就被固定了,而以前的层已经用一种重构偏差标准(reconstruction error criterion)微调过。这是压缩2D卷积层的典型低秩方法,如图4所示。
使用低阶滤波器加速卷积的时间已经很长了,例如,高维DCT(离散余弦变换)和使用张量积的小波系统分别由1D DCT变换和1D小波构成。学习可分离的1D滤波器由Rigamonti等人提出,遵循字典学习的想法。Jaderberg的工做提出了使用不一样的张量分解方案,在文本识别准确率降低1%的状况下实现了4.5倍加速。一种flatten结构将原始三维卷积转换为3个一维卷积,参数复杂度由$O(XYC)O(XYC)$下降到$O(X+Y+C)O(X+Y+C)$,运算复杂度由$O(mnCXY)O(mnCXY)$下降到$O(mn(X+Y+C))O(mn(X+Y+C))$。
低阶逼近是逐层完成的。完成一层的参数肯定后,根据重建偏差准则对上述层进行微调。这些是压缩二维卷积层的典型低秩方法,如图2所示。按照这个方向,Lebedev提出了核张量的典型多项式(CP)分解,使用非线性最小二乘法来计算。Tai提出了一种新的从头开始训练低秩约束CNN的低秩张量分解算法。它使用批量标准化(BN)来转换内部隐藏单元的激活。通常来讲, CP和BN分解方案均可以用来从头开始训练CNN。
低秩方法很适合模型压缩和加速,可是低秩方法的实现并不容易,由于它涉及计算成本高昂的分解操做。另外一个问题是目前的方法都是逐层执行低秩近似,没法执行全局参数压缩,由于不一样的层具有不一样的信息。最后,分解须要大量的从新训练来达到收敛。
虽然目前缺少强有力的理论,但大量的实证证据支持平移不变性和卷积权重共享对于良好预测性能的重要性。使用迁移卷积层对CNN模型进行压缩受到Cohen的等变群论(equivariant group theory)的启发。使$x$做为输入,$\Phi ( \cdot )$做为网络或层,$T(\cdot)$做为变换矩阵。则等变概念能够定义为:
$$ T’\Phi (x)=\Phi (Tx) $$
即便用变换矩阵$T(\cdot)$转换输入$x$,而后将其传送至网络或层$\Phi(\cdot)$,其结果和先将$x$映射到网络再变换映射后的表征结果一致。注意$T$和$T’$在做用到不一样对象时可能会有不一样的操做。根据这个理论,将变换应用到层次或滤波器$\Phi(\cdot)$来压缩整个网络模型是合理的。使用紧凑的卷积滤波器能够直接下降计算成本。在Inception结构中使用了将3×3卷积分解成两个1×1的卷积;SqueezeNet提出用1×1卷积来代替3×3卷积,与AlexNet相比,SqueezeNet建立了一个紧凑的神经网络,参数少了50倍,准确度至关。
这种方法仍有一些小问题解决。首先,这些方法擅长处理普遍/平坦的体系结构(如VGGNet)网络,而不是狭窄的/特殊的(如GoogleNet,ResidualNet)。其次,转移的假设有时过于强大,不足以指导算法,致使某些数据集的结果不稳定。
利用知识转移(knowledge transfer)来压缩模型最先是由Caruana等人提出的。他们训练了带有伪数据标记的强分类器的压缩/集成模型,并复制了原始大型网络的输出,可是,这项工做仅限于浅模型。后来改进为知识蒸馏,将深度和宽度的网络压缩成较浅的网络,其中压缩模型模拟复杂模型所学习的功能,主要思想是经过学习经过softmax得到的类分布输出,将知识从一个大的模型转移到一个小的模型。
Hinton的工做引入了知识蒸馏压缩框架,即经过遵循“学生-教师”的范式减小深度网络的训练量,这种“学生-教师”的范式,即经过软化“教师”的输出而惩罚“学生”。为了完成这一点,学生学要训练以预测教师的输出,即真实的分类标签。这种方法十分简单,但它一样在各类图像分类任务中表现出较好的结果。
基于知识蒸馏的方法能令更深的模型变得更加浅而显著地下降计算成本。可是也有一些缺点,例如只能用于具备Softmax损失函数分类任务,这阻碍了其应用。另外一个缺点是模型的假设有时太严格,其性能有时比不上其它方法。
深度模型的压缩和加速技术还处在早期阶段,目前还存在如下挑战:
转自博文:http://yanjoy.win/2017/11/30/net-compression-survey/