基于量化和模型剪枝的卷积神经网络压缩方法

2021-10-28 07:50吴卫贤黄晓丹
软件导刊 2021年10期
关键词:剪枝权值准确率

吴卫贤,赵 鸣,黄晓丹

(长江大学 计算机科学学院,湖北 荆州 434023)

0 引言

近年来,卷积神经网络已成为各种计算机视觉任务的主导方法,如图像分类、目标检测、语义分割。大规模数据集、高端现代GPU 和新的网络体系结构允许开发前所未有的大型CNN模型。例如,AlexNet[1]、VGGNet[2]、GoogleNet[3]和Resnet[4],目标检测任务中的Rcnn[5]、FastRcnn[6]、FasterRcnn[7],以及最近热门的YOLOv3[8]所使用的darknet 模型。图像网络分类的卷积神经网络模型已经从8 层发展到100 多层甚至更多层[9]。从一个大型的网络开始训练很重要,因为这种模型具有一定的高性能,可以安全地删除一组冗余参数而不会显著地损失准确率[10]。相比从头开始训练一个小的网络模型,这通常是一种更好的方法,因此目前常见的用于模式识别的卷积神经网络模型越来越大型化。在一个152 层卷积层的Resnet 模型中有6 000 万以上的参数,在输入一个224*224 的图像时,其计算量超过了20G FLOPs,这对于移动端和物联网设备应用是负担不起的[11]。因此,需要对这些大型卷积神经网络模型进行压缩,降低其体积和计算成本,并且在此基础上对其精度进行一定程度的提升。

卷积神经网络模型剪枝方法分为结构化和非结构化剪枝。结构化是修剪整个过滤器,非结构化剪枝则是直接对每层参数进行单独剪枝。为了解决卷积神经网络模型占用空间和计算量过大的问题,不少研究者想通过对神经网络进行剪枝以尽可能地压缩体积、提升速度。早期,Hassibi[12]利用二阶泰勒展开选择参数并进行剪枝,以改善训练和泛化能力;Han 等[13]通过权值大小确定修剪训练后网络中的不重要连接,以减少网络所需参数;CP 算法采用LASSO 回归方式选择剪枝通道并进行逐层剪枝[14];SFP 采用动态剪枝方法,主要依靠权重的范数,保留BN 层的偏置系数[15]。上述剪枝方法中都出现了剪枝后模型精度下降的问题,使得模型在剪枝后的识别效果不佳。

鉴于此,本文提出一种结合剪枝和数据量化的模型压缩方法。该方法首先通过对卷积神经网络中常见的卷积层和全连接层中训练后的权值进行重要性评价;然后,对权值及相应通道进行剪枝以达到降低卷积神经网络模型体积的目的;最后,对剩余权值进行量化处理,降低卷积神经网络计算成本,并对量化后的模型进行一定微调,以恢复精度。

1 现有优化方法

目前,针对卷积神经网络的剪枝方法主要分为两种:权值剪枝和滤波器剪枝。两个方法都是针对卷积层中的卷积通道进行剪枝,但判定方法不同,一个是通过权值判定,另一个是通过滤波器判定。网络模型优化通常是针对模型占用空间大小、模型识别准确率、模型识别速度3 个目标。在目前图形识别的CNN 网络剪枝方法中,最为典型的是将CNN 网络BN 层中的γ 参数作为网络剪枝的缩放因子[16]。由于BN 层具有加速训练和有效减少过拟合现象的作用,因此已经被大部分常用的图像识别卷积神经网络模型所使用。在引入缩放因子γ 之后,通过对每个卷积通道后特征图的特征值γ 进行排序,然后根据排序结果设定剪枝的阈值。即当前通道特征图的γ 参数小于该阈值,则对当前特征图对应的卷积核进行剪枝处理。缩放因子扮演的是通道选择的角色,缩放因子的正则项和权重损失函数联合优化,网络自动鉴别不重要的通道并将其移除掉,几乎不影响网络的泛化性能。这样可以人为设定对整个卷积神经网络模型的剪枝幅度。例如,设定的阈值在所有卷积核的所有阈值中排列第60%,则可以减掉60%卷积核,只保留γ 参数大于60%的特征图所对应的卷积核。对于不同的图像识别和不同的神经网络模型,阈值设定会有很大区别。然而,这种全局阈值设定方法有一定的局限性。当剪枝百分比数值设定过小,则节省资源非常有限,剪枝效果不佳;当剪枝百分比数值设定过大,则会出现准确率大幅度下降的现象,这种准确率的损失无法通过后期微调加以恢复。

在神经网络模型压缩加速方法中,通过对参数的量化压缩参数量,并达到加速神经网络、减少计算成本的目的[17]。然而在量化过程中参数的压缩会导致准确率下降。为了减少参数量化带来的准确率损失,Han 等[13]提出了一种共享权重和通过权重进行索引编码以减小权重数量和存储空间的方法。该方法是指定一系列权值,然后将这些权值进行数值共享,最后所有的权值都只能从指定的权值中进行选择,而这些指定的权值则通过K-means 聚类初始化质心。K-means 质心的初值对最终结果影响较大,通过实验对比最终选择均匀量化方法完成质心初始化。均匀量化的结果输出是通过所有权值的最大值和最小值之间的均匀间隔实现。确定质心之后再确定量化阈值,一个权值簇里的所有权值都由这个质心代替,最后对质心进行微调以恢复精度。参数量化之后对于神经网络的压缩有一定效果,但是在量化质心的确定方法上仍有不适用的网络。一些神经网络模型可能更适合按密度量化,比如识别目标单一的神经网络[18]。该方法只对卷积神经网络中的参数量化方法进行了优化,因此在选择最优阈值的方法中还有一定的优化空间。

2 剪枝与量化算法

通过分析网络模型中权值参数值的分布可以得知权值参数的重要程度。本文使用的评价方法是对权值参数的部分和值和标准差值进行评估。将参数值为0 的权值对应的卷积层和通道层视为对最终结果影响不大的层,再将这些层作剪枝处理。目前用于图像识别的卷积神经网络模型中都加入BN 层以加速训练进程[19],BN 层于2015 年被提出,具有防止梯度爆炸和加速网络收敛的作用。它一般位于卷积层之后,可以对卷积层之后的特征图进行归一化操作。如果BN 层只是单单在卷积层之后作归一化,然后直接将数据送入下一层,网络将无法学习特征分布。因为BN 层之后还有激活层,如果BN 层之后的数据大部分小于0,则经过RELU 激活层之后将失去大部分特征值。因此,BN 层通过优化缩放系数γ和偏移系数β对数据进行归一化处理,使得网络能够学习输出的特征分布。BN 层的实现方式是让Zin和Zout作为BN 层的输入和输出,β表示当前最小块,BN 层执行以下转换:

其中,μβ和σ2分别为当前层中输入值的均值和方差,即:

最后可以得到一组均值为β的新数据。因为BN 层中的γ 缩放因子对应每个卷积层中的特征图都有一个不同的值,因此BN 层中的γ缩放因子可以当作当前层对于整个模型准确率贡献的评价系数。γ值越大,说明当前层对于模型的准确率贡献越大,反之贡献越小。实际上,γ可以视为BN 层每个通道的权重。如果当前输入通道对应的权重γ出现γ=0 或γ≈0 的情况,特征图对应的输出通道即全为常数0,不会再对接下来的运算产生影响。因此,可以通过对BN 层中的缩放因子γ的数值评估,进而衡量特征图中每个通道对于模型整体精准度的贡献,当γ=0 或者γ≈0 时,可以认为当前通道对模型的影响可以忽略,即可剪去γ对应特征图的通道,最终剪去γ=0 对应的上下卷积层的卷积核,同时压缩模型体积,减少计算量。

上述方式获得的γ值可能会因为准确率的要求高而导致剪枝率较低,因此对于剩余的权值参数需作进一步压缩处理。目前用于图像识别的卷积神经网络模型使用的参数一般为32 位浮点数型。而高精度浮点数型的计算成本大于整型数据,因此可以选用对剩余参数进行量化的方法,大幅度压缩剩余权值参数量,减少计算成本。神经网络对量化的实现需要将卷积、矩阵乘法、激活函数、池化、拼接等操作转换为等价的8 位整数操作,然后在操作的前后分别加上量化和反量化操作,将input 从浮点数转换成8位整数,反量化操作将output 从8 位整数转回浮点数。

将剩余的网络权值由高精度的32 位浮点float32 转化成低精度的8 位定点数int8,使得模型大小有效变小,但是精度影响不大,运行速度加快。具体做法是将传入的float32 型数据转换为int8 传入卷积层,对应卷积层中的权值也转换成int8 类型。并且,在此过程中还可以同时将BN层融入卷积层,一起作量化处理。量化操作需要将一组float 输入转换成uint8(0~255),先求出这组输入的最小值min 和最大值max,然后对每个输入数据,可根据如下公式求出其量化值与反量化值。

量化后引入的量化误差为(max -min)/255。本文将float32 数据类型量化成定点数据类型的公式如下:

其中,s是量化间隔,n是量化的bit 数,φx是=0 时对应的量化值,即零点。rfmax和rfmin是float 型数据的最大值和最小值。在tensorflow 的框架中,[]表示取整函数:

卷积神经网络设计卷积计算,卷积神经网络经过量化之后,卷积操作计算原理如下:

其中,xq、ωq、ɑq分别是量化之后的输入、权重、卷积输出;sx、sω、sɑ分别是输入、权重、卷积输出的尺度因子;φx、φω、φɑ分别是输入、权重、卷积输出的零点。

对于真实值0 的量化误差问题,其解决方式是直接量化成一个整数qzero表示,如果量化值qzero所表示的值和真实值0 之间有一定误差,则对一些操作有较大影响。在卷积或者池化层进行padding 时需要在边缘补0,Relu 激活层需要截断小于0 的输入,对于不同的库,所使用的量化策略会不同。Tensorflow 库中量化方法分为有符号输入和无符号输入两种情况。有符号输入则调整min 和max,max=MAX(-min,max),min=-max,这样范围就会成为对称的形式,[min,max]被量化至[-127,127]。无符号则min=0,将[0,max]量化至[0,255]。在nnlib 中因为不区分是否为有符号,因此统一量化到0~255。

本文提出的结合剪枝和参数量化的模型压缩剪枝方法为:先通过训练集将模型训练至收敛,然后通过BN 层参数和整个网络结构中的卷积层和全连接层中的权值对整个网络结构进行剪枝,再对剪枝之后剩余参数进行量化操作。具体流程为:①设置网络模型训练集;②将对应的网络模型训练至收敛;③将收敛的网络模型进行基于BN 层参数和基于整个网络结构中卷积层和全连接层的权值参数剪枝;④对剪枝之后剩余参数进行量化操作;⑤微调训练,以恢复精度;⑥对最后得到的模型输出相关数据并检测精度。

为了最大程度地降低网络模型的准确率损失,需要对模型中的所有γ 参数进行排序并设定一个阈值。对低于阈值的γ 参数对应的特征图和卷积核进行剪枝处理。而这里需要一个对阈值进行设定的最佳值,使得该阈值能够对整个网络模型在剪枝程度最大化的同时还能保留网络模型的精确度。针对这一问题,在进行不同阈值设定后,得到不同阈值所对应的网络模型大小和准确率,设定全部γ 值的3%为步长。对网络模型精确度与网络模型剪枝程度取一个中间值,使得该阈值既能够满足剪枝目标还保留有一定的准确率。该阈值的获取方式是通过设定一个目标准确率,舍弃低于目标准确率的阈值,然后在符合目标准确率结果的阈值中取最大值为设定阈值。具体流程如图1 所示。

Fig.1 Pruning process图1 剪枝流程

剩余参数的量化过程为:首先输入float 型的参数,然后获得参数的最大最小值,根据其最大最小值对参数进行量化,然后使用量化后的参数对整个卷积层、全连接层、池化层,以及批量归一化层中的数据进行计算操作,对最终获得的输出值进行反量化操作,最后将其输出。量化训练流程如图2 所示。

Fig.2 Quantitative training process图2 量化训练流程

构建的卷积神经网络是以Lenet 为基准,有3 个卷积层,2 个全连接层。其中,每个卷积层之间由一个池化层相连,第3 个池化层和第1 个全连接层之间通过Flatten 相连。Flatten 函数的作用是将池化层输入过来的多维数据转化成一维数据并输入到全连接层,使用最大池化的方式建立池化层。全连接层所有节点都与上层节点连接,然后综合其提取的特征图。由于全连接的特性需要,全连接层也含有最大参数量。全连接层主要负责逻辑推断,参数经过训练后进行调整以达到最后收敛效果。全连接层会链接卷积层的输出,然后通过将三维矩阵转变成向量的方法去除空间信息,是一种全卷积操作。其中,全连接层和卷积层中的Kernel 都使用L1 正则化方法,以防止过拟合。卷积层将输入数据加权后进行卷积计算,加上偏置参数biases,经过Relu 激活函数转化成输出值输入到下一层。卷积层推理如图3 所示。

Fig.3 Convolutional inference process图3 卷积推理过程

此外,在每个全连接层和全连接层的激活函数之间,加入一个BN 层,对数据进行批量标准化,防止数据收敛过快导致神经元出现大规模死亡现象。经过卷积层和全连接层计算后的数据会经过Dropout 层,防止模型参数与训练数据出现过拟合现象。输出的数据经过Logits 层调整输入Softmax 函数进行分类输出处理后,得到最终分类结果和最后的卷积神经网络模型。整体卷积神经网络结构如图4 所示。

Fig.4 Lenet structure图4 Lenet 结构

3 实验过程与结果

本次实验中,CPU 是i5-4210H,无显卡加速。使用MNIST 手写数字集进行训练,构建成的卷积神经网络以Lenet 为基准,增加了卷积层和池化层的结构,有3 个卷积层,2 个全连接层。

对每个卷积层和全连接层中的权值参数进行剪枝,需先对训练完成后模型中的各卷积层和全连接层的权值进行重要性评估。因此,分别获取covn1、covn2、covn3、fc1、fc2 中权值的各系数值分布图,以便对各层中的权值进行评估。在进行权值重要性评估后,一部分低于阈值的权重会在模型中删除,这些权重对应的卷积通道也会在训练过程中被忽略掉。方法是将其中的数据直接置0 处理,得到各卷积层和全连接层中的权值在训练完成后的分布图,如图5—图9 所示。

Fig.5 Weight distribution of convolution layer 1图5 卷积层1 权值分布

Fig.6 Weight distribution of convolution layer 2图6 卷积层2 权值分布

Fig.7 Weight distribution of convolution layer 3图7 卷积层3 权值分布

Fig.8 Weight distribution of fully connected layer 1图8 全连接层1 权值分布

Fig.9 Weight distribution of fully connected layer 2图9 全连接层2 权值分布

根据各卷积层和全连接层中的权值分布情况分别进行不同的通道剪枝处理。可以得知,Conv1 中有10 个Kernel 的权重和为0,可以认定这部分对整个模型无贡献,可以将这部分Kernel 删除,为了保证Kernel 数为4 的倍数,删除8 个Kernel。同理,在Conv2 中删除16 个Kernel。在Conv3中由于权重和都很小,故做剪枝的依据是Conv3 中的权重标准差,根据Conv3 中标准差的分布,删除8 个低于阈值的Kernel。后面的全连接层fc1 和fc2 层进行同样操作,再根据BN 层的γ 值进行剪枝,最后对所有剪枝结果进行求和,并将所有需要剪枝的通道进行剪枝。权值标准偏差分布如图10—图12 所示。

Fig.10 Standard deviation distribution of weights(1)图10 权值标准偏差分布(1)

Fig.11 Weight standard deviation distribution(2)图11 权值标准偏差分布(2)

Fig.12 Weight standard deviation distribution(3)图12 权值标准偏差分布(3)

完成剪枝后对权值数据进行量化操作,将原数据类型为float32 的权值量化为int8 类型,进行模型计算后再还原成float32 类型数据。得到的网络模型精确度和原模型相当,但速度上相对原模型提升了。对比方法中,CP 算法采用LASSO 回归方式进行逐层剪枝,精度下降很多。SFP 采用的是动态剪枝方法,主要依靠权重范数,保留了BN 层的偏置系数,也会引起精度下降[20-21]。各剪枝方法结果如表1 所示。

Table 1 Results of each pruning method表1 各剪枝方法结果

4 结语

本文主要针对卷积神经网络提出了一种剪枝和权值量化的方法。该方法主要对卷积神经网络中常见的卷积层和全连接层中训练后的权值大小进行判别,然后通过对权值及相应通道的剪枝以达到降低卷积神经网络模型体积的目的。在进行权值剪枝和通道修剪后对剩余权值进行量化处理,降低卷积神经网络计算成本,并对量化后的模型进行一定微调,以恢复精度,使得模型精度不变但计算速度提升,从而实现了模型计算成本低于原模型并且计算效率高于原模型。剪枝方法基于模型卷积层和全连接层中的权重分布以及BN 层的缩放因子进行,而量化则是在剪枝过程后对所有参数和数据进行数据量化,将数据类型简化,从而降低计算成本。这样双层压缩后的模型能更加适用于移动端和嵌入式设备,相对于其他传统方法,其在模型大小压缩、准确率及推理时间上均有一定提升。但此方法依然存在一些不足:在卷积层和全连接层中对需要剪枝的Kernel 进行筛选的方法依然存在改善空间,例如可以使用滤波器排序或者滤波器聚类,对相似度高的滤波器卷积层进行剪枝,使用权值共享方法减少模型计算量。量化方法中如何在尽量压缩数据大小的情况下依然使得模型识别精度保持不变尚有优化空间,有待进一步研究。

猜你喜欢
剪枝权值准确率
一种融合时间权值和用户行为序列的电影推荐模型
人到晚年宜“剪枝”
不同序列磁共振成像诊断脊柱损伤的临床准确率比较探讨
基于YOLOv4-Tiny模型剪枝算法
CONTENTS
高速公路车牌识别标识站准确率验证法
基于权值动量的RBM加速学习算法研究
剪枝
一种面向不平衡数据分类的组合剪枝方法