APP下载

结合剪枝与流合并的卷积神经网络加速压缩方法

2020-06-06谢斌红钟日新潘理虎张英俊

计算机应用 2020年3期
关键词:剪枝阈值卷积

谢斌红,钟日新,潘理虎,2,张英俊

(1. 太原科技大学计算机科学与技术学院,太原030024; 2. 中国科学院地理科学与资源研究所,北京100101)

(*通信作者电子邮箱997865222@qq.com)

0 引言

从计算机视觉到语音识别,再到自然语言处理,卷积神经网络(Convolutional Neural Network,CNN)的应用越来越广泛。然而随着深度卷积神经网络的快速发展,网络的层数和模型的体积也在不断扩大,庞大的规模和高昂计算复杂度使得这些模型很难部署和应用于自动驾驶等实时性要求较高的场景,以及车载设备、移动手机等在计算能力、存储容量等资源受限的环境中,制约了其在更广阔领域的应用和推广,因此优化卷积神经网络结构,压缩并加速网络模型已成为工业界和学术界亟待解决的难题之一。

为了解决这一难题,早在20世纪90年代,LeCun等[1]率先提出了最佳脑损失(Optimal Brian Damage)方法,然而由于当时神经网络大多属于浅层网络,对于结构优化的需求尚不强烈,因此未能引起广泛关注。如今卷积神经网络的规模日益庞大,大量应用场景都无法提供相应的必需资源,因此关于网络结构优化的研究逐渐深入,大量成果不断涌现。目前深度卷积神经网络模型压缩方法从参数数量、参数存储空间、卷积核大小以及网络模型结构等方面进行,主要包括参数剪枝、模型量化、低秩分解和新型网络模型的设计等4类。

参数剪枝的基本思想是设计一种评判机制,通过移除预训练好的深度网络模型中冗余的、信息量少的权值,从而减少网络模型的参数,达到压缩模型存储空间和提高模型训练速度的目的。Hassibi 等[2]提出的基于最优化脑手术(optimal brain surgeon)的剪枝策略,根据Hession 矩阵反向传播计算权值的二阶偏导,同时利用矩阵来构造每个权值的重要性分数,低于重要性分数的权值会被删掉。与这种方法不同,Srinivas等[3]提出不依靠对数据的训练和反向传播,直接构造Hassion矩阵,删除冗余的节点。Wen 等[4]通过把深度神经网络的卷积核、通道和网络层数的正则化限制加入到损失函数中,在模型进行剪枝的同时,对参数进行惩罚。Li 等[5]利用L1 正则化来对卷积核进行重要性评价,人为设定剪枝比例后,将该层不重要的卷积核直接剔除,同时进行微调(Fine-tune),虽然相比之前的方法有了明显的提高,但网络的整体结构仍有冗余。

参数量化作为参数共享的最直接的表现形式,得到了广泛的应用。参数共享是通过构造一种映射使多个参数共享同一个数据,从而降低模型的存储空间。Gupta 等[6]将全精度浮点型参数量化到16 位固定长度表示,随后Gysel 等[7]通过微调,将权值量化到了8 位。其主要原理是在模型训练过程中直接学习二值权值或激活。量化虽使模型存储代价减小,但模型的精度难以保证。

低秩分解是利用矩阵和张量分解技术估计并分解深度模型中的原始卷积核,降低了模型的计算复杂度,从而达到深度卷积神经网络压缩和加速的目的。早在2013年,Denil等[8]从理论上利用低秩分解的技术并分析了深度神经网络存在大量的冗余信息,开创了基于低秩分解的深度网络模型压缩与加速的新思路。Jaderberg 等[9]利用张量的低秩分解技术,将原始的网络参数分解成2 个小的卷积核。根据同样的思想,Denton 等[10]先对卷积层参数进行低秩近似,然后通过微调来恢复模型精度。然而低秩分解技术已经很成熟,目前的网络都开始采用像1×1、3×3 这样的卷积核,用矩阵分解的方法对像这样小的卷积核进行网络压缩和加速是一件困难的事情;另外,目前的分解方法都是逐层进行低秩近似,难以对全局参数进行压缩,并且由于移动应用和嵌入式处理器受到位宽和性能的限制,导致常规的计算需求很难在该环境实施。

关于轻量化网络结构的设计,Buciluǎ等[11]提出利用知识迁移(Knowledge Transfer,KT)来对模型进行压缩;Hinton 等[12]提出了知识蒸馏的框架,这种方法是通过软化父网络的学习能力和惩罚子网络,利用父网络的输出结果作为标签,对子网络进行压缩和训练。虽然知识蒸馏的结构能使深度神经网络在压缩和加速方面有提高,并且很大程度上节省了计算消耗,但模型的假设比较严格,只能用于具有Softmax损失函数的网络模型中,这使得在性能方面与其他的压缩方法缺乏竞争力。

本文在这些工作的基础上,结合最新进展和研究成果,提出一种从网络参数和模型结构两种角度对卷积神经网络(Convolutional Neural Network,CNN)进行压缩的方法。首先从模型的内部角度考虑出发,通过剪枝技术移除贡献度较低的参数,并对每一层的参数进行惩罚[13];其次从模型的结构进行优化[14],将非必要的层与重要的层进行流合并,并通过调整参数,使其可以替代合并之前的层,从而实现了对模型的整体压缩和加速。

1 混合压缩方法

本文提出的混合压缩方法框架如图1 所示:首先对预训练好的CNN 模型进行参数剪枝,然后对模型进行流合并处理,最后将得到的压缩模型进行多次迭代直至满足要求。

1.1 参数剪枝

1.1.1 建立初始CNN模型

首先建立一个CNN模型,对其进行微调至令人满意的结果。在预训练的模型中,使用了随机梯度下降(Stochastic Gradient Descent,SGD)算法对参数进行更新和迭代,如式(1):

通过梯度下降算法使模型的参数达到收敛,得到一个稳定的卷积神经网络模型。

图1 模型压缩框架Fig. 1 Framework of model compression

1.1.2 参数的重要性评价

CNN有很多参数,每一层的参数的数量和大小各不一样,参数的重要性是根据参数的值与阈值T比较后得出,若大于阈值则判定为重要的,否则为不重要,因此阈值的设置尤为关键。由中心极限定理可知,很多独立随机变量的和近似服从高斯分布,这意味着在很多复杂的实际情况中都可以被成功地建模为高斯分布的噪声。故利用这一思想,把各个层参数的和用高斯分布进行建模,把每一层参数的和经过高斯函数计算后的标准差设置为阈值,如式(3):

其中:N为当前层参数的个数,xi为参数的值,r为参数的平均值。参数的评价流程如图2所示。将初始化后的参数(W)与阈值(T)进行比较:若大于阈值将参数与标量值1相乘,输出参数值;否则,与标量值0相乘,输出参数值。最后得到评价后的参数。

图2 参数重要性评价流程Fig. 2 Process of parameter's importance evaluation

1.1.3 参数剪枝

经过重要性评价后,对模型中不重要的参数进行剪枝。这里设置了一个标量值mask来进行剪枝,首先初始化mask的值为零,设定阈值,将所输入的参数利用给定的公式进行运算到收敛为止(其中t表示循环的次数);然后将参数逐个与阈值相比较,如果大于阈值则将mask置为1,并与比较的参数进行点乘,使参数保留下来;而小于阈值的参数,将mask置为0,与比较参数进行点乘,使其不参与后面的运算,从而“剪掉”。具体参数剪枝流程如算法1所示。

其中输入包括初始化为零的标量值mask,阈值(threshold)和随机初始化的权重参数(w);输出为经过评价后的权重参数。

算法1 剪枝算法。

输入:mask=0,threshold,初始参数W(0)~N(0,μ);

1.1.4 Lasso惩罚

经过参数剪枝后,模型的稀疏度很高,导致难以优化网络模型并且容易出现过拟合的情况。因此通过对剪枝后的参数使用(Least absolute shrinkage and selection operator,Lasso)惩罚和Dropout技术有效地解决了这一问题。其中Lasso是指统计学习中的特征选择方法,如式(4):

其中:β是模型中卷积核的参数,y代表模型中的实际值,X表示模型输入的参数。Lasso惩罚就是在模型的基础上对其进行正则化。L2正则化是最常用的正则化方法,可表示为式(5):

其中:F表示正则化后的损失函数,F0是原始的损失函数,λ表示惩罚因子。而常用的交叉熵损失函数可以表示为式(6):其中:x代表样本,n代表样本的总数,y是实际值,a是输出值。由式(6)可知,交叉熵损失函数F是由原始的损失函数F0与L2正则化相加所得出;而Lasso惩罚(即L2正则化)是根据在损失函数中加入了对权重进行正则化的惩罚因子项(λ)来增加损失值达到减小权重的效果。利用函数的数学原理来对惩罚因子的大小进行调整,惩罚力度大小的不同,直接影响到损失函数的变化,即λ越大,减小权重的趋势越明显;反之,则减小原始的损失函数的趋势就越明显。在剪枝训练的过程中,Lasso惩罚的力度将影响权重的大小,从而影响网络中的哪些连接将被去除。

然而,与Lasso惩罚原理不同,Dropout是通过调整网络的连接比例来解决过拟合的问题。在训练过程中,Dropout以一定的概率将某些权重的连接划掉,而概率的值是由式(7)、(8)确定的:

其中:Ci表示第i层的连接数,Ni表示第i层的神经元数目,Ci0表示原来的连接数,D0表示原始的Dropout率。

1.1.5 敏感度分析

在剪枝时,每一层具有的敏感度不同,即每一层剪枝的比例大小会对精确度造成不同的影响。由文献[5]可知,处于相同阶段(具有相同的特征映射大小)的层对修剪具有类似的敏感性,对那些修剪很敏感的层,修剪一小部分这些层的比例。而那些不敏感的层,根据这层修剪后的权重再次设置一个阈值(即权重的平均值),把低于阈值的权重重置为零,大于阈值的权重不发生改变,然后继续训练并微调至模型精度恢复,最后重复上述过程。

1.2 流合并

在一般的深度学习模型中,数据集的概率分布可以用多层构造的非常稀疏的大型深度卷积神经网络来表示。通过分析当前层与前一层(或并行层)之间的相关性,可以将高度相关的层合并为一个新的层,并称之为再生层。

文献[14]研究表明,在CNN 网络模型中,占用模型运行时间最多的层并不是卷积层,而是模型在进行完卷积操作之后的几个层,如LRN(Local Response Normalization)层、BN(Batch Normalization)层等;另外,几个连续的层可以看作是非线性变换的黑箱,这个黑箱通过调整参数,可以被一个新的卷积层所取代,来近似原来的几个层的功能。如图3所示。

图3 流合并示意图Fig. 3 Schematic diagram of stream merging

从图3 中可以看出,LRN 层所花费的时间比它的前一层卷积层还要多,于是将它们合并,生成一个新的重生卷积层conv2/3×3,并调整新卷积层的步长和超参数,合并后的层与原始层相比,系统所花费的时间减少80%左右。

通过将非张量层(LRN 层、池化层)与张量层(卷积层)在前馈机构中合并,层之间的合并生成一个新的张量层(即再生层)。在分层重构后,对新生成的层的参数进行微调,对深度神经网络模型进行再训练。具体的操作如下:

合并池化层 池化层的作用是对前一层的特征图进行降维采样,因此,选择将池化层和它的前一层进行“合并”。如图4 所示:将原有的池化层(pooling)删除,把合并后的卷积层的步长(Stride)改为池化层的步长。随着新“合并”的卷积层的步长值的增大,它进一步减少了新模型所需的计算量。

图4 池化层合并Fig. 4 Merging of pooling layers

合并非池化层 对于像LRN和BN层,采取的操作是直接从原始的深层神经网络中将这些层去除,达到“合并”的目的。

最后,将合并后的层进行重新训练,来恢复模型的精度。

2 实验结果及分析

本文实验环境:本文实验设备是基于Windows 10 操作系统,采用Inter Core i5-3230M CPU 2.60 Hz 处理器、4 GB 内存、500 GB硬盘,在Pycharm环境下使用TensorFlow框架实现。

使用的数据集是MNIST[15]手写数字识别。采用的网络结构是CNN 中经典的LeNet-5。MNIST 数据集是由60 000 个训练集和10 000个测试集组成。将原始网络和经过混合压缩后的网络进行对比,检验混合压缩方法在模型压缩上的有效性。

2.1 LeNet-5压缩结果与分析

LeNet-5包含了两个卷积层与两个全连接层(FC),以及一个分类层。LeNet-5 在MNIST 上的错误率达到了0.8%。在MNIST数据集上进行混合压缩和训练CNN。

使用LeNet-5 网络在MNIST 数据集上验证混合压缩方法的有效性。如图5所示是模型在进行第20次压缩过程中准确率的变化:(横轴代表迭代的次数,纵轴表示模型的准确率)。由图5可以看出在模型迭代2 500 000次后,准确率逐渐趋于稳定。同时对模型中每个层进行分析来验证模型的有效性。如图6(损失函数的变化图)可得出:conv2(图6(a))和conv3(图6(b))中,损失函数迅速趋于0,说明卷积层的训练过程是有效的;在全连接层中的第一层fc_1(图6(c)),损失函数同样快速地趋于零,而在全连接层的第二层fc_2(图6(d))中没有加入损失函数,图形呈高斯分布,达到了预期的效果。

图5 准确率变化示意图Fig. 5 Schematic diagram of accuracy change

图6 损失函数的变化图Fig. 6 Diagrams of loss functions

在迭代的过程中模型的体积大小的变化如图7 所示:在迭代20次后模型的体积逐渐平稳,停止压缩。

图7 模型存储代价Fig. 7 Cost of model storage

通过对模型内部的分析,发现混合压缩后模型的卷积层的每层所占内存的消耗相比初始模型的消耗在每层上都有极大的减小。内存的消耗结果是由TensorBoard[16]可视化出来的,针对初始模型和最终模型显示结果进行的对比。各个层之间的对比如图8所示。

图8 各层内存消耗对比Fig. 8 Memory consumption comparison of layers

如图9 所示,经过流合并的处理后,对每一层所消耗的时间进行统计,与初始模型的时间消耗相比,每一层的运行速度都有不同程度的提升。同样在TensorBoard 中可视化出来的结果进行的对比。模型的总体运行速度相比初始模型提高了8 倍。结果是由初始模型每层消耗的时间之和与最终模型的时间之和的比得出,即最后的加速效果。

图9 时间消耗对比Fig. 9 Time consumption comparison of layers

2.2 与现有的实验方法的对比分析

使用LeNet-5 模型和MNIST 数据集与目前的几种主流的压缩方法分别从准确率、模型存储代价、加速效果以及压缩倍数等方面进行了对比,具体结果如表1所示。

从实验结果可以发现,单纯对CNN 模型进行权重剪枝,只能压缩模型的体积,没有加速效果;卷积核的剪枝方法在加速和压缩上的效果不理想;混合剪枝的方法相比权重剪枝和卷积核剪枝都有提升,而其压缩的效果仅比权重剪枝高出一倍;文献[19]提出的方法的压缩效果有了提升,但加速效果只是略微提升;本文从不同的角度去压缩模型,最后得到的结果优于其他方法。

表1 在LeNet-5上本文方法与现有的方法比较Tab. 1 Comparison of the proposed method with existing methods on LeNet-5

3 结语

针对深度卷积神经网络参数冗余和训练速度慢的问题,本文从不同角度对模型进行压缩和加速,提出了一种内外相结合的混合压缩方法。从模型的内部角度观察,利用参数剪枝的技术来实现内部压缩的最大化;从模型的整体结构考虑,把非张量层和张量层通过流合并生成新的层,实现模型运行速度的提升;最后通过重新训练来恢复模型精度。实验结果表明,这种内外相结合的压缩方法可以有效减少参数冗余的问题,并在运行的速度上有了明显的提高。接下来的工作将这种压缩方法应用不同的神经网络上(如循环神经网络、对抗网络等),以观察这种方法的综合性能。

猜你喜欢

剪枝阈值卷积
基于全卷积神经网络的猪背膘厚快速准确测定
人到晚年宜“剪枝”
改进的软硬阈值法及其在地震数据降噪中的研究
土石坝坝体失稳破坏降水阈值的确定方法
基于小波变换阈值去噪算法的改进
利用KL散度度量通道冗余度的深度神经网络剪枝方法
一种基于卷积神经网络的地磁基准图构建方法
基于3D-Winograd的快速卷积算法设计及FPGA实现
一种并行不对称空洞卷积模块①
基于YOLOv4-Tiny模型剪枝算法