面向深度神经网络(DNN)的模型压缩与轻量化方法研究综述

在17世纪,贝叶斯和拉普拉斯完成对最小二乘法的推导并提出马尔科夫链,这两个理论成为机器学习发展的基础理论。在1950年,艾伦∙图灵提议建立一个学习机器,之后机器学习进入飞速发展阶段。在1986年,深度学习被引入机器学习领域,为人工智能的发展提供了极大的动力支持。神经网络之父Hinton在该年提出的BP(Backpropagation)算法,采用的非线性映射函数应用于多层感知器解决了神经网络的非线性分类问题,又于2006年创新性地使用greedy layer-wise pretraining方法,采用堆叠自编码器的无监督训练获得局部最优初始化权值,然后与微调相结合使深层神经网络模型能够收敛,为推广神经网络做出重大贡献。

第一章 背景

在17世纪,贝叶斯和拉普拉斯完成对最小二乘法的推导并提出马尔科夫链,这两个理论成为机器学习发展的基础理论。在1950年,艾伦∙图灵提议建立一个学习机器,之后机器学习进入飞速发展阶段。在1986年,深度学习被引入机器学习领域,为人工智能的发展提供了极大的动力支持。神经网络之父Hinton在该年提出的BP(Backpropagation)算法,采用的非线性映射函数应用于多层感知器解决了神经网络的非线性分类问题,又于2006年创新性地使用greedy layer-wise pretraining方法,采用堆叠自编码器的无监督训练获得局部最优初始化权值,然后与微调相结合使深层神经网络模型能够收敛,为推广神经网络做出重大贡献。值得一提的是,Hinton的学生Yan Lecun在1989年提出LeNet网络,其作为第一个名副其实的神经网络,采用简单的7层网络结构高效地完成手写字符识别任务,是深度学习走向应用的开山之作。在2000年,深度学习通过组合多个隐藏层的神经元,并利用非线性函数学习多个具有抽象意义的数据特征,达到模拟神经网络的目的,且广泛适用于有监督和无监督特征学习、特征表示、模式识别等任务。随着AlexNet的出现,研究人员开始致力于提高分类模型的准确率。VGG探索网络深度和模型准确率之间的关系,发现更深的网络容易获得较好的性能,在权衡参数量和性能之后构筑了VGG11、VGG13、VGG16 和VGG19这四种不同深度的网络模型。GoogleNet采用稀疏连接代替全连接,在提升性能的前提下减少了参数数量。ResNet解决了网络过深时梯度弥散的问题,采用直接映射和残差映射并行的策略,深层网络可以提取出更为高级的语义特征。深度卷积神经网络(Convolutional Neural Networks,CNN)
在图像识别、目标检测、语义分割等计算机视觉的前沿领域展现出巨大的潜力,但是常规的卷积神经网络在达到较高分类精度的同时需要较快的运算速度和占用大量存储空间。目前,智能移动设备的发展趋向于边缘化和移动化发展,但却受限于设备本身的硬件条件,而深度卷积神经网络轻量化设计的目标就是在低硬件条件的设备上仍能保持良好的网络性能来适应智能设备的发展趋势。

轻量化的本质是在硬件不足的设备上解决存储空间和能耗对于传统神经网络性能的限制,在保持传统神经网络精度的基础上,通过人工设计、神经结构搜索或自动化机器学习等方法降低对存储空间的要求,提高运行速度。LECUN等人的《Optimal brain damage》在信息论的基础上,通过对网络中不重要的权重进行剪除,增强神经网络的泛化性,提高学习速率,最终实现模型压缩。HAN 等人发表了一篇关于模型压缩方法的综述型文章:《Deep compression:compressing deep neural networks with pruning,trained quantization and huffman coding》,该文作为ICLR 2016的最佳论文,受到了学术界的广泛关注。

目前,针对轻量化深度学习网络的研究主要集中于人工设计的轻量化网络和基于神经网络结构搜索的自动轻量化网络。在人工设计的轻量化网络方面,包括基于深度可分离卷积(Depthwise Separable Convolution,DSC)的SqueezeNet、MobileNet、MobileNet V2、ShuffleNet、ShuffleNet V2、基于Octave 卷积的改进基线网络、基于Ghost特征的GhostNet等轻量化网络。在神经网络结构搜索的自动轻量化网络设计方面有NasNet、MnasNet等轻量化网络。

第二章 卷积神经网络与模型压缩基础理论

本文的研究针对的是深度学习模型在资源有限的嵌入式平台上实现的问题,模型压缩是实现模型落地的主要途径。本章首先介绍深度学习的CNN模型中常用的组成结构与其基本原理,对几种模型压缩的方法进行比较,着重对结构化剪
枝方法进行了分析。

2.1 卷积神经网络基础理论

2.1.1 神经元与前向传播

深度学习的本质是构建了具有自主学习能力的、由可以同时训练的组件组成的模型,如果细分到每一个计算单元,这个计算单元就是神经元,所以卷积神经网络的本质也是神经元的连接。

研究发现具有多个隐藏层的人工神经网络具有优于单层的神经元的特征提取和识别能力,其训练后能够充分提取对于数据的刻画更加本质的特征,在分类任务上表现优秀。网络在进行推理时,信息在网络中的流通是通过前向传播完成的,第k个样本穿过两个隐藏层,经过h结点到j结点经历以下计算过程。由公式可知,神经网络的本质是可以拟合任意函数,这个函数在一定程度上在某一维度可以将不同类型的数据进行区分,也就是所谓的提取特征和分类。深度学习采用的深层神经网络,其深层往往综合了浅层的信息,并且深层和浅层网络的关注点不同,它们分别偏重输入特征图的全局和局部信息,这样一种简洁并且普适的模型适用于非线性过程的自适应学习。

2.1.2 卷积与特征图

卷积是卷积神经网络中处理信号的基本操作,也是其区分于全连接网络的重要因素。在实际的图像处理过程中,图像在数据流通时是以像素矩阵的形式表示,所以卷积神经网络需要对输入特征图做离散卷积进行特征提取。在卷积神经网络中,卷积通过在不同的卷积层使用训练后的权重、采用滑动窗口的方式在特征图上移动实现。卷积分为二维卷积和三维卷积,其本质都是对信号加权求和,卷积神经网络中通常采用三维卷积。不同的卷积核通过网络训练得到,区别在于卷积核大小和权重值的不同,这也导致其提取特征能力存在差异。

三位卷积可以看作是二维卷积的拓展,如果只从宽和高两个相同维度来看,特征图和卷积核的卷积的过程和二维卷积是一致的,区别在于三维卷积中特征图还有深度这一维度,表示通道(channel)数量。三维卷积是特征图和卷积核在通道这一维度上按照二维卷积的方式做卷积后求和,所以卷积核的通道数应该和特征图的一致。为了减少卷积神经网络的参数量和计算量,分组卷积成为替代常规卷积的一种有效方法。分组卷积采用了输入特征图分组的方式,卷积核的通道数与等分的特征图通道数一致,所以卷积核参数量是分组数的倒数倍。

2.1.3 激活函数

由于卷积的乘加操作本质上只是线性变换,这导致单层卷积神经网络只能够模拟线性函数,然而实际上现实世界中大多数数据的分布都是非线性的,这就导致单一卷积堆积的卷积神经网络能够完成的学习任务是十分有限的。深度学习任务更加注重对非线性函数的模拟,非线性激活函数是解决线性问题的重要方法。

下面介绍三种激活函数,当输入通过这些激活函数后,都会进行非线性变换。

  1. ReLU 函数:ReLU函数是三者中最简单的激活函数,但是它和它的变体却是应用最多的激活函数。它采取单边抑制的方式,值为负的神经元被抑制为0,所以训练时网络可以动态调控稀疏的比例,同时没有最大值限制也使导数不存在饱和区,所以不会出现梯度消失的问题,并且计算方式十分简单,效率比较高,收敛速度快。
  2. Sigmoid 函数:Sigmoid函数将数值压缩到[0,1]区间,但是它存在梯度为0 的区域。如果初始化权重不合适,梯度落在靠近0 的区间,会出现梯度消失,进而导致训练停止,故初始化对梯度和训练的影响很大。
  3. Tanh 函数:Tanh函数和Sigmoid函数比较相似,相比于后者的优点在于其取值不是全为正,并且导数的取值范围是后者的4 倍,在训练时梯度消失时的概率比Sigmoid 函数要小。由于没有将一些区间的值置0,所以不存在稀疏网络的可能性。

2.1.4 BN 层

BatchNorm层主要针对卷积神经网络中的Internal Covariate Shift问题,该问题描述的是在训练网络时,隐含层的输入分布不固定导致网络规律难以学习。BN层通过将输入数据的分布变换成正态分布,来固定隐含层结点的激活值输入分布,解决输入分布不固定的问题,并且解决了反向传播时梯度消失的问题。

随着网络深度逐渐加深或者是在训练的过程中,输入数据的分布会发生偏移或者变动,如果数据的分布逐渐靠近非线性函数的极限取值的区间(例如Sigmoid函数靠近0或者1的位置),通常在这种情况下梯度趋近于0 且变化平缓,所以往往会出现梯度消失、训练变慢的现象。

加入BN 层之后,偏移的分布被强制约束为标准正态分布,所以非线性函数的输入值从原来的变化小(不敏感)的区域落入较为敏感的区域,同时梯度也相应地远离近0的区间,收敛速度相应变快。

2.1.5 Pooling 层

在处理特征图的过程中,涉及特征图尺寸的变化,随着卷积神经网络的深度不断增加,特征图的尺寸一般是不断减小的。实现特征图尺寸缩减的方式有两种:一种是步长大于1的卷积,步长与特征图的尺寸变化呈倒数关系,例如步长为2的卷积会使特征图的尺寸缩减一半;另一种方式是通过Pooling操作,可以实现特征图的尺寸变化。

Pooling层可以看作是卷积层的补充,因为在进行卷积时,卷积核的移动会出现大量的重叠区域,所以很有可能在其中会出现冗余。Pooling层作用在局部区域,对局部信息进行整合,常用的平均池化、最大池化分别将区域内平均值、最大值赋值给输出区域。Pooling层的整合特性使其具有去除冗余的功能,同时由于对象所具有的“静态性”的属性,Pooling层也表达了更高层的图像的抽象
特征。

2.1.6 反向传播

卷积神经网络的卷积核的特征提取能力由其参数决定,参数通过网络训练时的反向传播过程更新。反向传播通过计算输出与期望值的误差后得到梯度来更新前一层的权值,然后利用链式法则逐步更新前面层的权值。

反向传播算法的本质是对网络中的权重进行动态调整,核心是使误差逐渐减小的梯度下降算法,所以它也是一种监督学习算法。

2.1.7 卷积神经网络的特点

卷积神经网络之所以能够成为计算机视觉、自然语言处理、推荐算法、机器人等领域的热门研究方向,是与其自身所具有的特点密不可分的。

卷积神经网络的一个重要特点是权值共享的策略,这也是CNN区别并优于传统的神经网络的重要因素。权值共享就是使用同一个卷积核的相同权重对整幅输入特征图做特征提取,相比于全连接中每一个神经元都要通过一个权重和输入特征图的每一个像素单元连接,权值共享的卷积操作只需要一组卷积核参数就可以处理整幅特征图的信息。举例来讲,一个大小为200×200像素的特征图,对应的全连接网络中一个神经元需要40000个权重参数,若卷积神经网络中采用5×5大小的卷积核,一个卷积核仅仅只需要25个权重参数。

权值共享的策略不单单是减少网络的参数量、降低模型复杂度,它还充分考虑了局部信息的关联性,通过大小不同的卷积核实现对不同感受野的特征信息处理,由此网络实现自动学习提取需要的特征。由于权值共享后每个卷积核在训练后是固定的,所以只能提取同一种特征,并不足让网络具有区分目标的能力,因此卷积神经网络每层采用多个不同的卷积核来增强网络的表示能力,这也给网络增加了一个至关重要的超参数——卷积核数目。

卷积神经网络的另一个特点是其从本质上讲相当于一个具有一定程度的空间不变性的多层感知器。卷积核构成卷积神经网络的卷积层,每个卷积核可以看成是由多个二维的kernel组成,如果把kernel的权重看成是神经元的权值,那么卷积神经网络和多层感知器的计算方式是一致的。与全连接不同的是,卷积神经网络的卷积操作是通过模糊局部纹理得到图像特征,其作用的空间只是特征图的局部,得到的特征本就是局部特征。随着空间的移动,每个卷积核提取特征的能力是固定的,它只会在有对应特征的位置得到对应特征,也就是说,对象位置的移动会导致对应特征在得到的特征图上的移动,所以卷积神经网络具有空间平移不变性,此外由于pooling操作还具有有限的缩放不变性。

2.2 模型压缩基础理论

2.2.1 模型压缩方法间的差异

卷积神经网络存在冗余是学术界的共识,精细结构设计、量化、低秩分解、知识蒸馏、剪枝等模型压缩方法为去除网络冗余提供了有效的解决方案。不同的模型压缩方法对不同的任务的压缩效果之间存在差异,同时方法之间的压缩流程也存在明显差异。

模型压缩可分为从头训练和预训练两大类,其中对于从头训练的模型压缩方法而言,是需要通过精细结构设计以达到目的;针对预训练的模型压缩方法而言,其主要分为不改变预训练模型(知识蒸馏)和改变预训练模型(剪枝、量化、低秩分解)两种。

精细结构设计的方式是在实验的过程中,或者在神经网络理论的研究过程中,发现某些结构具有减少网络参数和计算量、同时又保持原有性能的能力,网络结构改变后需要重新初始化权重、再训练至收敛。

量化、低秩分解、知识蒸馏、剪枝与精细结构设计有所区别,前四者都需要预训练的模型。知识蒸馏需要预训练的教师网络作为参照标准,指导自定义或生成的学生网络进行训练。知识蒸馏不需要对教师网络做改变,教师网络的作用是给学生网络提供适合学习的数据分布。量化、低秩分解和剪枝在针对预训练模型的问题上和知识蒸馏又有所区别,量化、低秩分解和剪枝都是对预训练网络的某一部分做出调整,量化是对网络存储和计算的数据格式进行调整,用低精度浮点数代替高精度浮点数;低秩分解是对网络中的卷积过程进行分解,使用更高效率的计算方式;剪枝则是对网络中不同粒度的单元做出重要性筛选,剪除不重要的单元以保持网络性能。量化、低秩分解和剪枝的最终结果都是从预训练的大模型得到轻量化的小模型,减少了网络参数和计算量。

2.2.2 剪枝与剪枝粒度

剪枝因其易于实现且效果极佳,成为学术界和工业界的研究热点。剪枝的本质和神经网络的稀疏性密不可分,由于网络存在冗余,所以必然存在一个更加稀疏的网络拥有和当前网络相当的能力,换句话说,现有网络中必然存在一个只需要更少的单元组成的新的网络可以代替它本身。剪枝就是希望通过算法找到适合当前任务的神经网络中的冗余单元,将其剪除后得到效率最大化的轻量化网络模型,达到减少参数和计算量的目的。

按照剪除神经网络中冗余单元的粒度的不同可以将剪枝分为非结构化剪枝和结构化剪枝两种。现在的神经网络的卷积层由多个提取不同特征的卷积核构成,使用开源框架中的conv2d函数计算多通道卷积,结构化与非结构化的区别在于剪枝的粒度与卷积核的大小关系,粒度小于卷积核的是非结构化剪枝,粒度大于卷积核的是结构化剪枝。

非结构化剪枝对应的小粒度可以是单一权重、向量、二维卷积核。权重剪枝时剪除的是卷积核中的一个最小组成单元,也就是卷积核的一个权重值;向量剪枝是对卷积核中相邻权重值组成的行向量或者列向量剪枝;二维卷积核剪枝剪除的是卷积核的一个通道,将一个通道的权重剪除,其余通道参数保留。

这三种剪枝方式由于粒度更细,所以在稀疏的效果上比较有优势,但是剪枝后卷积核的形状变得不规则,不再是标准立方体。在开源框架中,为了计算便捷,最大化利用硬件的计算能力,卷积计算的方法都是对规整的三维卷积核设计的,所以非结构化剪枝虽然可能得到更简洁的结构,但是这种不规则结构对于硬件和软件都有严苛的要求,在实际落地时的困难较多。

结构化剪枝是一种硬件友好型的剪枝方法。从粒度上讲,结构化剪枝的最小剪枝单元是输出通道,对应的是整个卷积核(也就是滤波器),网络冗余就是卷积核冗余,更粗的粒度也是以滤波器为最小单元,所以剪枝后的网络仍然是适用于现有的以滤波器为计算单元的开源框架中的卷积函数。

卷积核剪枝从本质上讲是希望以某种方式得到神经网络对卷积核的重要性排序,是现有的卷积核剪枝方法的主要研究方向,例如使用卷积核参数的绝对值大小作为判断准则、剪除卷积核对loss的影响、考虑卷积核的替代性(贪心算法最小化特征重建误差)等。从特征层面来讲,每个卷积核在神经网络中对应提取不同的特征,卷积核的重要性相当于体现了对应特征的重要性。在训练的过程中,网络会自动学习需要提取的特征种类,对卷积核参数进行调控使其与特征匹配,但是这个过程是没有进行人为控制的。因此,从特征的角度来看,剪除的是并不足以对后续的特征提取过程提供重要贡献的卷积核。

理想情况下,神经网络训练后对数据集的分布能够充分拟合,每个卷积层的卷积核的参数经过优化后只需一部分就足以提取所需的特征,所以只要选取合适的参数评价准则,就可以对卷积核做重要性排序然后进行剪枝。这种对训练后的模型直接进行剪枝的方法可以归类为基于度量标准的剪枝,这种方法的优点在于算法只需寻找合适的判断准则,剪枝的流程相对简单。在实际应用中,神经网络更加偏向于使每个卷积层的卷积核协同工作,极少数情况下会存在参数评价准则下对网络性能贡献趋近于0的卷积核,所以对参数阈值的选取十分重要,大的阈值可能导致网络性能损失严重不能恢复。

基于重建误差的剪枝选择了不同的道路,它从集合的思想出发,如果把所有的卷积核看作是一个集合,既然卷积核存在冗余,那么必然存在一个当前卷积全集的真子集可以代替全集在网络中的作用,所以可以采用贪心算法求取这个真子集中的那部分卷积核,把补集的卷积核剪除。

另外一种结构化剪枝的方式是在训练时对网络中的一些参数施加稀疏化约束,这些参数必须能够与卷积核一一对应,然后把参数的稀疏化程度加入到损失函数中。网络在训练时,一方面需要针对任务目标做优化,使得网络性能可以满足使用需求,另一方面,网络中卷积核或者其它组成单元的某些参数需要足够稀疏。训练完成后,根据稀疏参数对应的数值设定剪枝的阈值,与小于阈值的参数一一对应的卷积核可以剪除,余下的卷积核可以保留。

结构化剪枝的粒度不是只有卷积核级别,也可以针对卷积层做剪枝。神经网络的深度和宽度与网络性能呈负相关关系,卷积核剪枝是对网络的宽度做出调整,剪除一部分卷积核后网络变窄,因为这部分卷积核对性能贡献很小,几乎可以忽略不计,所以不会对网络性能有明显影响。卷积层剪枝是一个道理,如果某个卷积层剪除后,网络性能仍然可以保持原有的水平,说明网络只需要少于当前层数一层的结构就足以完成任务,这个卷积层是可以剪除的。

剪枝还可以有更大的粒度,这种大粒度可以是某些特定的网络模块,例如某些具有分支结构的神经网络中的一部分分支,或者是堆叠的网络模块,但是需要有特定的方法可以对其对网络性能的贡献进行度量化衡量。

2.2.3 结构化剪枝对相邻层的影响

结构化剪枝中,卷积核剪枝不会改变网络的整体结构,变化发生在卷积层内部,而卷积层剪枝或者模块剪枝都会对网络结构产生影响。从特征的角度分析,卷积核剪枝是对卷积层内的卷积核的特征提取能力进行优化,而卷积层和模块剪枝是对网络性能分布的重新优化。卷积核剪枝时可以保持层间特征提取能力的不变,只是对一些性能贡献过剩的卷积层做资源优化;在剪除卷积层或者网络组成模块时,由于对低级特征信息或高级语义信息的特征提取能力出现截断效应,所以网络会在训练时让每一个卷积层重新学习需要提取什么样的特征,相当于剪除层或者模块损失的性能稀释到相邻近的结构中。

2.2.4 结构化剪枝的基本流程

神经网络进行剪枝需要输入预训练的原始模型,然后根据剪枝方法的不同对模型中的卷积核进行筛选,挑选出需要剪除的卷积核,接下来对网络进行剪枝操作后保存新模型并进行微调以恢复损失的精度,如果剪枝后的模型不符合期望,返回到卷积核筛选步骤重复上述操作,反之则直接输出轻量化模型。

在进行剪枝具体操作时,分为两种形式:一种是顺着反向传播的方向,逐层剪枝,在过程中每剪完一层的卷积核,就让网络训练一次再进行上一个卷积层的
剪枝,这种方式得到的轻量化模型的精度恢复效果一般较好,但是非常耗费时间;另一种方式是对所有可剪枝的卷积层同步进行剪枝操作,为了避免剪除太多的卷积核,对网络造成不可恢复的损伤,从而导致精度恢复达不到期望,所以一般设置比较小的剪枝比例,剪枝、训练网络迭代进行。这种方式的操作比较简单,阈值选取得当既节省时间又能保持精度。

2.2.5 结构化剪枝的常用评价标准

结构化剪枝算法的常用的衡量算法优劣的评价标准有以下几种:

  1. 模型的精度差(或者准确率差):剪枝后的模型精度与原始模型精度的差值是最直观也是最重要的评价标准,通常来讲,剪枝后模型的精度会有些许下降,但是有时候剪枝反而会去除网络的过拟合现象,导致剪枝后模型精度提升。精度差等于原始模型的精度剪去剪枝后的模型精度。
  2. 剪除的参数数量:结构化剪枝的最小剪枝单元是卷积核,所以剪除的
    参数数量与卷积核数目有关。剪枝的程度可以用剪除的卷积核数目或者剪去的卷积核数目与原始模型卷积核数目的和的比例来描述。剪除的卷积核的宽、高和通道数的乘积是它本身的参数量,剪除的参数量等于所有的剪除卷积核的参数量的和加上偏置项的个数。
  3. 计算量(FLOPs):模型的计算量与实际应用时的推理速度息息相关,在计算时通常只考虑卷积层计算量。

2.3 本章小结

本章主要介绍了卷积神经网络与模型压缩的基础理论,第一部分按照卷积神经网络的前向传播过程,分别介绍卷积、BN、激活、Pooling等结构,然后对参数优化的反向传播过程进行介绍,最后根据上述结构的原理总结了卷积神经网络的特点,这些内容为下文剪枝方法的研究提供了基础。第二部分主要介绍模型压缩的基础理论,首先对常用的模型压缩方法间的差异进行简单分析,然后根据本文的侧重点在于结构化剪枝,分析结构化剪枝与非结构化剪枝以及不同粒度剪枝的区别与结构化剪枝原理,接下来对结构化剪枝实际应用时对临近层的影响、基本流程、常用评价方法进行分析。剪枝是对网络的空间和时间复杂度的削减,对深度学习落地意义重大。

第三章 压缩方法

3.1 模型剪枝

模型剪枝是目前一项非常主流的神经网络模型压缩技术,它对已训练好的DNN 模型进行剪枝,通过剪除网络中冗余的部分来压缩网络,并且提升了模型的泛化能力。模型剪枝一般有非结构化剪枝、结构化剪枝和自动化剪枝三种。其中,非结化剪枝和结构化剪枝为人工剪枝方法。非结构化剪枝使用随机方式进行网络修剪,裁剪对象常为单个神经元;而结构化剪枝往往根据已经给定的裁剪条件剪除相应的卷积核或通道。

3.1.1 非结构化剪枝

早期的剪枝方法大多基于非结构化剪枝。尽管非结构化剪枝能够使模型得到压缩,但是在实际应用中往往起不到很好的效果。主要是因为非结构化剪枝通常会构成非结构化的稀疏矩阵,造成额外的内存开销,加上目前对稀疏操作加速支持的库非常有限,影响硬件工作的效率,降低计算速度。

3.1.2 结构化剪枝

结构化剪枝可以按照粒度大小从粗到细分为:层剪枝(Layer)、通道(Channel/filter)剪枝、核(Kernel)剪枝和核内(Intra-kernel)剪枝。因为层剪枝会剪除网络中的整个层,这样对网络的结构往往会造成严重破坏且无法恢复,因此主要研究后面三种结构化剪枝方法。

3.1.3 自动化剪枝

非结构化剪枝和结构化剪枝都属于人工设计的剪枝方案,需要考虑模型的复杂度、大小等因素,这样的设计往往会耗费很长的时间,因此近年来出现了自动化剪枝的方案。神经网络模型剪枝的出发点实质上就是给模型寻找一种高效的剪枝方法,降低模型冗余的参数信息,提升模型的性能。而剪枝的策略有很多,有人工设计剪枝的方法,也有自动剪枝的方法。相较于非结构化剪枝的策略,现在的研究者更加青睐于结构化剪枝和自动剪枝的策略。主要由于非结构化剪枝往往使得模型的参数过于稀疏化,没有专门的硬件计算库支持。但是模型剪枝优化的核心问题还是设计优秀的剪枝方法。通常而言,剪枝和量化是放在一起使用的。

3.2 模型量化

模型量化主要通过减少表示网络参数所需的数值位数来压缩神经网络, 网络参数包括权重、激活值、梯度和误差等。通常而言,神经网络采用32位浮点数来存储网络所有参数和计算出来的结果,在允许牺牲少量网络性能的条件下,合理地将数据量化到较低的数值位,可以很大程度上减少存储参数和计算结果所占用的内存空间。我们总结了近年来神经网络压缩中的量化方法, 主要分为INT8量化、极低精度量化、混合精度量化和其他量化方法。

3.2.1 INT8 量化

实际中对较为复杂模型进行部署时,往往采用的是16位浮点数量化和8位定点数量化。但是由于16位浮点数占用的内存远远大于8位定点数,对于硬件的要求以及消耗大得多,所以在模型优化时优先考虑8 位定点数量化。

3.2.2 极低精度量化

极低精度量化的目的是使网络的参数存储和计算结果得到极限压缩,以便网络模型可以在硬件资源较为有限的设备上进行部署。本文中将低于8-bit 以下的方法称之为极低精度量化, 主要包括二值化、三值化。

3.2.3 混合精度量化

可以看出, 当我们使用较低精度的量化时,硬件性能确实会有所提高。但是,将网络模型量化到极低精度往往并不能达到预测的效果,反而会导致精度显著降低。可以通过混合精度量化来解决这个问题,对于深度学习神经网络来说,由于不同的层对量化的敏感度是不一样的,所以需要对网络的每一层进行不同的比特精度量化。

3.2.4 其他量化

当模型参数数量过于庞大时,可以使用聚类量化的方法来解决,即将权重分为不同的组,然后在推断期间使用每组的质心作为量化值。

模型量化是目前工业界最有效的模型优化方法之一,对于图像处理任务(如ImageNet数据集分类)来说,目前很多的量化技术压缩效果非常显著。但是对于图像分割、目标追踪等问题,使用量化往往会降低模型的精度。尤其是进行极端的二值量化时,虽然理论上甚至可以实现32倍的压缩,但是过度的压缩会导致模型的精度快速下降。

3.3 轻量化网络设计

考虑到卷积神经网络(Convolutional NeuralNetwork,CNN)模型过于庞大,研究人员设计出了轻量化网络。目的是为了能更好地将神经网络普及应用到移动终端,可以说是专为嵌入式移动设备视觉终端设计的模型。与原有网络模型相比,轻量化模型具有结构轻便、计算简单、可移植性强的优点。轻量化网络的设计主要围绕卷积核和卷积方式来改变网络需求的计算量和参数大小,从调整卷积核大小、分解卷积运算这两个方面进行轻量化。

3.3.1 调整卷积核大小

我们之前的认知都是卷积核越大, 感受野越大,能够获取的信息也就越多。但是卷积核过大往往会造成计算量的暴增和存储空间的极大消耗,不利于模型深度的增加, 模型的性能也会随之降低, 所以现在的神经网络中很少使用较大尺寸的卷积核。

3.3.2 分解卷积运算

除了调整卷积核大小的方法以外,我们还可以考虑改变卷积运算方式。来看这样一个问题,输入特征大小为H×W×C,卷积核大小为K×K(个数为M),输出特征大小为H×W×M,则标准卷积计算量和参数量分别为HWCK2M 和MCK2。可以看出模型的参数量和计算量较大,由于标准卷积是先对每个通道卷积运算再进行求和, 因此计算量和参数量与每个通道的特征相关, 通道的卷积运算存在很大的冗余。

3.3.3 其他方法

Tan 等人在NAS (Neural Architecture Search)神经架构搜索的基础上提出了EfficientNet,利用混合缩放方法可以更好地选择宽度、深度和分辨率的维度缩放比例,仅用很少量的参数就获得较高的准确率,提升了模型的性能。Han 等人提出了GhostNet 模块,先使用原始卷积操作(非卷积层操作)减少输出,接着使用一系列线性操作来生成更多的特征。

3.4 知识蒸馏

与前面几种压缩方法不同的是,知识蒸馏通常包含教师模型(Teacher model)和学生模型(StudentModel)两部分。一般而言,教师模型是使用复杂的网络训练得到的模型,而学生模型则是使用轻量级网络训练得到的模型。知识蒸馏的主要思想是利用教师模型在训练中学习到的知识进而去指导学生模型的训练,使得学生模型的性能尽可能接近于教师模型,从而达到大网络压缩成小网络的目的。

2015 年,Hinton 等人首次提出知识蒸馏(Knowledge Distillation,KD)的压缩技术。在前面的工作的基础上,Hinton 等人引入与教师网络相关的软目标(soft -target), 代替了传统的真值(ground truth) 作为总损失函数的一部分指导学生网络的训练。在这里,soft-target指的输入图片属于某一类的概率, 使用带有温度T的softmax函数qi来表示。

知识蒸馏可以使得模型的深度大大变浅,从而降低网络的参数量和计算量。但是目前知识蒸馏主要应用在分类任务上面,对目标检测、追踪等应用还有很大的局限性。另外,学生模型没有好的指导很难达到教师模型的精度,所以知识蒸馏在模型压缩上还有很长的路要走。

第四章 总结

DNN 模型压缩的目的是为了减少模型参数、减少计算带来的开销和降低存储空间,使其能够更好部署在实际应用场景中。本文首先介绍了DNN模型压缩的研究背景, 接着介绍了DNN 模型压缩的四种方法:模型剪枝、模型量化、轻量化网络设计和知识蒸馏。如下表所示,我们基于上面的论述对这些压缩方法进行了总结。

压缩方法 描述 应用层 优缺点 适用场景
剪枝 剪除已训练的深度网络模型中的冗余部分 卷积层、全连接层 能够有效降低网络复杂度,提升模型的泛化能力,但需要专门的计算库,难以设置最优与之 已知预训练模型,且模型深度和宽度较大
量化 减少权重需要的位数 卷积层、全连接层 能够在硬件平台上部署,提高了推理速度,但实现难度大,精度下降明显 推理速度要求较高、能容忍一定精度下降的场景
轻量化网络设计 设计更加高效的“网给计算方式” 卷积层 网络训练简单,计算简化,但设计困难,且性能欠佳 针对存储容量较小、并行计算速度较慢的嵌入式设备,从头设计模型
知识蒸馏 教师网络指导学生网络,训练出较小的模型 卷积层、全连接层 大大降低计算量和存储量,不引入新参数就可提升精度,但适用任务范围窄 数据集较小的分类任务

目前,深度神经网络压缩主要还是集中在卷积神经网络上, 未来有可能会出现有关循环神经网络(Recurrent Neural Network,RNN) 等其他深度神经网络压缩的成果。目前很多主流的压缩方法如量化、知识蒸馏等应用移植到硬件时往往不能够达到理想的效果, 所以今后还需要结合硬件来针对性地设计压缩方法。再者就是当下的深度神经网络压缩方法需要探索在更多任务场景下的应用, 而不是仅仅局限于图像分类等简单任务。综上所述,关于DNN模型压缩的研究依然具有巨大的潜力和研究空间。

参考文献

基于目标识别深度网络的模型压缩算法研究_张江永

面向轻量化神经网络的模型压缩与结构搜索_梁峰

面向深度神经网络的模型压缩与加速研究_孙依然

目标检测网络的模型轻量化和剪枝算法研究_郭毅

深度神经网络模型压缩方法综述_唐武海

深度学习的轻量化神经网络结构研究综述_王军

图像识别中小样本学习方法与模型轻量化研究_李文静

深度学习模型压缩,轻量化模型方法总结 https://zhuanlan.zhihu.com/p/413148348