目录
1.背景介绍
深度学习模型的压缩和加速是指利用神经网络参数的冗余性和网络结构的冗余性精简模型,在不影响任务完成度的情况下,得到参数量更少、结构更精简的模型.被压缩后的模型计算资源需求和内存需求更小,相比 原始模型能够满足更加广泛的应用需求. 接下来系统介绍模型压缩与加速方面的进展,通过从参数剪枝、参数量化、紧凑网络、知识蒸馏、低秩分解、参数共享、混合方式这 7 个方面探究相关技术的发展历程, 并分析其特点。
上图是不同深度模型的推理平均时间统计,通过这个可以看出整体的时间成本还是比较严重的:在深度学习技术日益火爆的背景下,对深度学习模型强烈的应用需求使得人们对内存占用少、计算资源要求低、同时依旧保证相当高的正确率的“小模型”格外关注。利用神经网络的冗余性进行深度学习的模型压缩和加速引起了学术界和工业界的广泛兴趣,各种工作层出不穷!
2.压缩方法概述
当前的经典物体检测结构大都依赖使用卷积网络进行特征提取,即Backbone,在前面的章节中我们也详细介绍过如VGGNet、ResNet等优秀的基础网络。但很遗憾,这些网络往往计算量巨大,当前依靠这些基础网络的检测算法很难达到实时运行的要求,尤其是在ARM、FPGA及ASIC等计算力有限的移动端硬件平台。因此如何将物体检测算法加速到满足工业应用的要求,是一个亟待解决的问题。 当前,实现模型加速的方法很多,如轻量化设计、BN层合并、剪枝与量化、张量分解、蒸馏与迁移学习等,这些方法相互之间并不独立,可以灵活地结合使用,如图所示:
-
轻量化设计:从模型设计时就采用一些轻量化的思想,例如采用深度可分离卷积、分组卷积等轻量卷积方式,减少卷积过程的计算量。此外,利用全局池化来取代全连接层,利用1×1卷积实现特征的通道降维,也可以降低模型的计算量,这两点在众多网络中已经得到了应用。
-
BN层合并:在训练检测模型时,BN层可以有效加速收敛,并在一定程度上防止模型的过拟合,但在前向测试时,BN层的存在也增加了多余的计算量。由于测试时BN层的参数已经固定,因此可以在测试时将BN层的计算合并到卷积层,从而减少计算量,实现模型加速。
-
网络剪枝:在卷积网络成千上万的权重中,存在着大量接近于0的参数,这些属于冗余参数,去掉后模型也可以基本达到相同的表达能力,因此有众多学者以此为出发点,搜索网络中的冗余卷积核,将网络稀疏化,称之为网络剪枝。具体来讲,网络剪枝有训练中稀疏与训练后剪枝两种方法。
-
权重量化:是指将网络中高精度的参数量化为低精度的参数,从而加速计算的方法。高精度的模型参数拥有更大的动态变化范围,能够表达更丰富的参数空间,因此在训练中通常使用32位浮点数(单精度)作为网络参数的模型。训练完成后为了减小模型大小,通常可以将32位浮点数量化为16位浮点数的半精度,甚至是int8的整型、0与1的二值类型。典型方法如DeepCompression。
-
张量分解(低秩分解):由于原始网络参数中存在大量的冗余,除了剪枝的方法以外,我们还可以利用SVD分解和PQ分解等方法,将原始张量分解为低秩的若干张量,以减少卷积的计算量,提升前向速度。
-
知识蒸馏:通常来讲,大的模型拥有更强的拟合与泛化能力,而小模型的拟合能力较弱,并且容易出现过拟合。因此,我们可以使用大的模型指导小模型的训练,保留大模型的有效信息,实现知识的蒸馏。
对于轻量化的网络设计,目前较为流行的有SqueezeNet、MobileNet及ShuffleNet等结构,如上图所示。其中,SqueezeNet采用了精心设计的压缩再扩展的结构,MobileNet使用了效率更高的深度可分离卷积,而ShuffleNet提出了通道混洗的操作,进一步降低了模型的计算量。
3.压缩方法详述
3.1参数剪枝
参数剪枝是指在预训练好的大型模型的基础上,设计对网络参数的评价准则,以此为根据删除“冗余”参数。根据剪枝粒度粗细,参数剪枝可分为非结构化剪枝和结构化剪枝、自动化剪枝,非结构化剪枝的粒度比较细,可以无限制地去掉网络中期望比例的任何“冗余”参数,但这样会带来裁剪后网络结构不规整、难以有效加速的问题。结构化剪枝的粒度比较粗,剪枝的最小单位是 filter 内参数的组合,通过对 filter 或者 feature map 设置评价因子,甚至可以删 除整个 filter 或者某几个 channel,使网络“变窄”,从而可以直接在现有软/硬件上获得有效加速,但可能会带来预测精度(accuracy)的下降,需要通过对模型微调(fine-tuning)以恢复性能。
实例:
3.2参数量化
参数量化是指用较低位宽表示典型的 32 位浮点网络参数,网络参数包括权重、激活值、梯度和误差等等,可以使用统一的位宽(如 16-bit、8-bit、2-bit 和 1-bit 等),也可以根据经验或一定策略自由组合不同的位宽。
参数量化的优点是:
-
能够显著减少参数存储空间与内存占用空间,将参数从 32 位浮点型量化到 8 位整型,从而缩 小 75%的存储空间,这对于计算资源有限的边缘设备和嵌入式设备进行深度学习模型的部署和使用都有很大的帮助;
-
能够加快运算速度,设备能耗,读取 32 位浮点数所需的带宽可以同时读入 4 个 8 位整数,并且整 型运算相比浮点型运算更快,自然能够降低设备功耗。
但其仍存在一定的局限性:
-
网络参数的位宽减少损失了一 部分信息量,会造成推理精度的下降,虽然能够通过微调恢复部分精确度,但也带来时间成本的增加;
-
量化到特 殊位宽时,很多现有的训练方法和硬件平台不再适用,需要设计专用的系统架构,灵活性不高。
分类:二值化、三值化、聚类量化、混合位宽
3.3低秩分解(张量分解)
神经网络的 filter 可以看作是四维张量:宽度 w高度 h通道数 c卷积核数 n,由于 c 和 n 对网络结构的整 体影响较大,所以基于卷积核(w*h)矩阵信息冗余的特点及其低秩特性,可以利用低秩分解方法进行网络压缩。低秩分解是指通过合并维数和施加低秩约束的方式稀疏化卷积核矩阵,由于权值向量大多分布在低秩子空间,所以可以用少数的基向量来重构卷积核矩阵,达到缩小存储空间的目的。
低秩分解方法在大卷积核和中小型网络上有不错的压缩和加速效果,过去的研究已经比较成熟,但近两年已不再流行。原因在于:除了矩阵分解操作成本高、逐层分解不利于全局参数压缩,需要大量的重新训练才能达到收敛等问题之外,近两年提出的新网络越来越多地采用 1*1 卷积,这种小卷积核不利于低秩分解方法的使用,很难实现网络压缩与加速!
分类:二元分解、多元分解
3.4参数共享
参数共享是指利用结构化矩阵或聚类等方法映射网络参数,减少参数数量。参数共享方法的原理与参数剪枝类似,都是利用参数存在大量冗余的特点,目的都是为了减少参数数量。但与参数剪枝直接裁剪不重要的参数不同,参数共享设计一种映射形式,将全部参数映射到少量数据上,减少对存储空间的需求。由于全连接层参数数量较多,参数存储占据整个网络模型的大部分,所以参数共享对于去除全连接层冗余性能够发挥较好的效果; 也由于其操作简便,适合与其他方法组合使用。但其缺点在于不易泛化,如何应用于去除卷积层的冗余性仍是一个挑战。同时,对于结构化矩阵这一常用映射形式,很难为权值矩阵找到合适的结构化矩阵,并且其理论依据不 够充足。
分类:循环矩阵、聚类共享
3.5紧凑网络
以上 4 种利用参数冗余性减少参数数量或者降低参数精度的方法虽然能够精简网络结构,但往往需要庞大的预训练模型,在此基础上进行参数压缩,并且这些方法大都存在精确度下降的问题,需要微调来提升网络性能。设计更紧凑的新型网络结构,是一种新兴的网络压缩与加速理念,构造特殊结构的 filter、网络层甚至网络, 从头训练,获得适宜部署到移动平台等资源有限设备的网络性能,不再需要像参数压缩类方法那样专门存储预训练模型,也不需要通过微调来提升性能,降低了时间成本,具有存储量小、计算量低和网络性能好的特点。但其缺点在于:由于其特殊结构很难与其他的压缩与加速方法组合使用,并且泛化性较差,不适合作为预训练模型帮助其他模型训练。
3.6知识蒸馏
知识蒸馏最早由 Buciluǎ 等人提出,用以训练带有伪数据标记的强分类器的压缩模型和复制原始分类器的输出。与其他压缩与加速方法只使用需要被压缩的目标网络不同,知识蒸馏法需要两种类型的网络:教师模型和学生模型。
预先训练好的教师模型通常是一个大型的神经网络模型,具有很好的性能。如上图所示,将教师模 型的 softmax 层输出作为 soft target 与学生模型的 softmax 层输出作为 hard target 一同送入 total loss 计算,指导学生模型训练,将教师模型的知识迁移到学生模型中,使学生模型达到与教师模型相当的性能.学生模型更加紧 凑高效,起到模型压缩的目的.知识蒸馏法可使深层网络变浅,极大地降低了计算成本,但也存在其局限性.由于 使用 softmax 层输出作为知识,所以一般多用于具有 softmax 损失函数的分类任务,在其他任务的泛化性不好; 并且就目前来看,其压缩比与蒸馏后的模型性能还存在较大的进步空间.
3.7混合模型
以上这些压缩与加速方法单独使用时能够获得很好的效果,但也都存在各自的局限性,组合使用可使它们 互为补充。研究人员通过组合使用不同的压缩与加速方法或者针对不同网络层选取不同的压缩与加速方法,设计了一体化的压缩与加速框架,能够获得更好的压缩比与加速效果。参数剪枝、参数量化、低秩分解和参数共享经常组合使用,极大地降低了模型的内存需求和存储需求,方便模型部署到计算资源有限的移动平台。知识蒸馏可以与紧凑网络组合使用,为学生模型选择紧凑的网络结构,在保证压缩比的同时,可提升学生模型的性能。混合方式能够综合各类压缩与加速方法的优势,进一步加强了压缩与加速效果,将会是未来在深度学习模型压缩与加速领域的重要研究方向。
3.8不同压缩模型比较
图展示了参数剪枝、紧凑网络、参数共享和混合方式这 4 类压缩技术的一些代表性方法使用 CIFAR-10 数据集在 VGG-16 上的压缩效果,可以看出,这 4 类方法的压缩效果差别比较大。整体来看,结构化剪枝效果更好, 同时起到了网络压缩和加速的效果,accuracy 甚至有些提升。 权值随机编码方法能够实现高达 159x 的参数压缩比,accuracy 略有下降!
-----------------------------------------------------------------------------------------------------
张量网络论文汇总
用张量分解的方法压缩神经网络模型这一方向还有哪些坑可以挖呢?大体可以分为两条line:
(一)基于低秩近似的张量分解方法。也就是对原有的模型参数做低秩张量分解,用分解后得到的因子替换原有的大张量。这一过程后通常还需要一个fine-tune的过程。其中的难点就是怎么从大的张量中保留最有价值的参数留下来,作为一个很好的初始参数值。 (二)用张量分解得到的因子重新定义新的网络结构,新的张量计算方法代替原来的卷积操作或全连接层的矩阵运算。
下面是该方向的论文汇总,按时间顺序排列。
- 《Tensorizing Neural Networks》(NIPS2015)
- 《Ultimate tensorization compressing convolutional and FC layers alike》(NIPS2016 workshop)
- 《Compressing recurrent neural network with tensor train 》(IJCNN2017)
- 《Tensor-Train Recurrent Neural Networks for Video Classification》(ICML2017)
- 《Learning Compact Recurrent Neural Networks with Block-Term Tensor Decomposition》(CVPR2018)
- 《Sharing Residual Units Through Collective Tensor Factorization》(IJCAI2018)
- 《Tensor Regression Networks》(2018)
- 《Tensor Regression Networks with various Low-RankTensor Approximations》(2018)
- 《Wide Compression,Tensor Ring Nets 》(CVPR2018)
- 《Compressing Recurrent Neural Networks with Tensor Ring for Action Recognition》(AAAI2019)
- 《Bayesian Tensorized Neural Networks with Automatic Rank Selection》(2019)
- 《Robust deep networks with randomized tensor regression layers》(2019)
- 《Compressing Deep Neural Networks via AdaptiveDimension Adjustment Tucker Decomposition》(2019)
- 《Compression and Interpretability of Deep NeuralNetworks via Tucker Tensor Layer》(2020)
从时间顺序上来看这条line的发展脉络还蛮清晰的
1,2是这个方向的开篇之作,用tensor train分解方法分别重新定义了全连接层和卷积层,都是先将它们reshape成更高维的张量
3,4都是基于1 做的,方法基本相同,只不过扩展到了RNN网络中。
5同样是对RNN网络做压缩,只不过换了一种分解方法block-term分解。
6和之前的思想不是十分相同,它利用了block-term分解后的参数形式对各种resnet残差网络用一个框架表示。tucker分解后的参数可以转化为1*1,3*3,1*1的卷积层,早在2016年就有。而block-term分解是tucker分解的一种泛化形式,可以看做多个tucker的集成。
7,8是一组,它们针对的神经网络中的最后一层分类层。
9用了一种新提出的tensor ring分解方法,对卷积和全连接层都进行了重新的表示。
10和9的方法一样,只不过任务不一样,不过10这篇论文写的真好,一读就懂。
11用了贝叶斯推理法
12是7,8的后续工作,将随机的思想添加了进来。
13主要研究的是分解前将参数reshape成哪种维度比较好,并且core tensor的维度怎么取比较好。
14试图通过张量对神经网络模型的可解释性进行探索,主要通过对tucker分解后的因子求偏导,比较大小。
总结下来,其实并没有很大的飞跃,基本就是有了新的更好的张量分解方法就将其应用在网络的参数上;或是应用在不同的神经网络模型上;或是研究一下分解之前把全连接层的矩阵和卷积层的四维张量reshape成多大维度的张量。难点主要是秩的选择。因为张量分解中的秩决定分解后因子的维度,也就是决定了张量化后的网络模型的结构。而目前几乎所有的工作都是凭经验指定的或者通过实验挑选最优的。
转自:https://blog.csdn.net/sinat_38856440/article/details/104450094