一种基于动态量化编码的深度神经网络压缩方法
2019-11-01饶川陈靓影徐如意刘乐元
饶川 陈靓影 徐如意 刘乐元
近年来,深度神经网络在解决机器学习任务时取得了巨大的成功.2012 年,Krizhevsky等[1]首次使用深度神经网络,AlexNet 在ILSVRC(ImageNet large scale visual recognition competition)[2]分类任务上获得了冠军,他们的结果相比传统的机器学习算法在识别精度上提升了近10 个百分点,引起学术界和工业界巨大轰动.从那时起,各种不同结构的深度神经网络模型如雨后春笋般不断涌现.2014 年英国牛津大学的Visual Geometry Group 提出了VGG[3]模型,同时谷歌的研究人员提出了GoolgLeNet[4],2015 年He 等提出了ResNet[5−6].这些模型的网络结构越来越深,从而能学习到更好的特征以提升模型的性能.然而,由于内存和计算能力有限,随着网络变得越来越深,对包括移动设备在内的有严格时延要求的有限资源平台而言,随之增加的模型参数需要消耗更多的计算和存储资源,难以直接应用于手机等移动嵌入式设备.
虽然将深度神经网络部署到云服务器端,移动端将数据上传服务端处理,能很好解决上述问题,但服务器需要耗费昂贵的硬件成本,导致计算成本过高,其次移动端在使用的过程对网络要求高,需要将移动端本地的数据上传到云端服务器进行保存,在处理一些隐私数据时,还会存在信息的泄露.所以将深度学习算法部署到移动端本地非常有意义,但常用的深度模型具有大量的储存量,比如AlexNet 的模型大小量超过200 MB,VGG 的模型大小量超过500 MB,如果将这些网络结构直接运用到手机APP中,用户需要大量的流量下载APP 文件,还会占用用户手机的大量内存.同时,巨大的模型文件会带来另外一个问题,手机设备的能源消耗问题,手机在调用这些文件时会存在大量的能源消耗,会让手机设备产生大量的热量,因此深度模型压缩是非常有必要的.
为了解决这一问题,各种深度模型压缩方法被提出,这些方法主要有:模型剪枝、知识精炼(Knowledge distillation)、低秩分解、精细化的模型结构以及权重共享.本文主要关注基于权重共享的方法来压缩模型,权重共享是通过卷积滤波器中相近的权重共享同一量化值从而达到对深度神经网络压缩的目的.权重共享的方法大致可以分为三类:聚类编码法、二值/三值量化编码和指数量化编码.
聚类编码法,指使用聚类的方法,将权重聚类为若干类,取每类的聚类中心作为共享的权重.例如,Gong 等[7]通过对全连接层参数进行聚类,取聚类中心作为量化编码,可以将深度模型AlexNet 压缩20倍,而Top-5 准确率仅仅下降1%.类似的,Chen等[8]提出了HashedNets 对全连接层进行量化,利用哈希函数随机的将权重分到不同的哈希桶(Hash bucket),同一哈希桶的权重具有相同的量化值.Han等[9]提出了一种深度压缩(Deep compression)方法,通过对卷积层和全连接层的权重进行剪枝,然后通过K-Means 聚类进行量化,最后使用霍夫曼编码(Huffman coding)对模型进行保存,极大的压缩了模型的规模.但是,聚类编码法需要大量额外的计算开销用于聚类分析,算法的训练效率低.
二值/三值量化编码,将网络的权重、激活值量化为二值或者三值.例如,Courbariaux 等[10]提出了一种二值连接(Binary connect)方法,将权重进行二值量化(量化为−1,1),可以将一个深度模型直接压缩32 倍;他们随后提出了Binarized neural networks[11],将权重和激活值同时进行二值量化,在压缩网络的同时还可以提高运算效率.Rastegari 等[12]提出的二值权重网络(Binary weight networks)和XNOR-Net,在把权重量化为+1 和−1的基础上乘以一个尺度因子,在大数据集ImageNet上取得了不错的压缩效果.Li 等[13]提出的HORQ,相对于XNOR 只使用到一阶阈值,HORQ 还用到二阶阈值,让二阶阈值逼近一阶阈值的残差,HORQ在对准确率影响很小的情况下能将模型缩小32倍,同时加速30 倍左右.Li 等[14]提出的TWN(Ternary weight networks),在二值网络的基础中引入0 作为量化权重值.Zhu 等[15]提出的TTQ(Trained ternary quantization),将网络的权重量化为+1 和−1 的基础上,分别乘上两个不同的尺度因子.Cai 等[16]提出HWGQ-Net 通过改变网络的激活函数,将权重量化1 个比特网络的激活值量化为2 个比特,网络只有微小的性能损失.尽管这类方法将模型中的每一个权重、激活值压缩为一到两位来表示,但是模型的识别精度也有一定幅度的下降.
指数量化编码,将权重量化为2 的(为整数)次幂,以便于嵌入式系统进行二进制移位操作.该方法由Zhou 等[17]首次提出,利用预训练模型获取固定的指数量化的码本,然后通过增量量化过程来逐渐量化整个网络.在使用5-bit 量化时,压缩模型的识别率能够保持与原模型一致.这种方法在量化时,可以高效率对深度神经网络量化,但在网络重训练时,他们提出的增量网络量化方法需要分多个阶段训练,训练效率较低.
鉴于以上几点,本文提出一种基于动态量化的深度模型压缩方法,不同与从预训练模型获取固定码本,动态量化在训练的过程中也更新码本.这种量化方式在保证模型性能的同时,还加快了效率.同时为了方便嵌入式系统进行移位操作,本文对所有网络的权值采用指数量化编码,并通过理论证明得出,绝对值较大权值参数的量化对模型的精度影响越大.因此,本研究通过动态编码使得码本能自适应网络中绝对值较大的权值参数.本文的主要贡献有以下三点:
1)提出动态更新码本自适应网络中绝对值较大的权值参数,尽可能减小这些参数的量化对模型精度的影响;
2)提出交替迭代算法用于模型训练,使得权值参数和码本交替更新,加快训练过程的收敛速度;
3)大量的对比实验表明,本文所提的基于动态编码的模型压缩方法总体上优于静态编码的方法.
本文剩余部分的组织结构如下:第1 节介绍现有的深度神经网络压缩方法;第2 节介绍本文提出的方法,包括基于权重的动态编码过程以及压缩模型的训练过程;第3 节通过大量的对比实验验证本文方法的有效性;第4 节总结与展望.
1 相关的工作
本节主要介绍不同的深度神经网络压缩方法.除了上一节重点介绍的权重共享的方法,深度神经网络压缩的方法还包括:模型的剪枝、知识精炼(Knowledge distillation)、低秩分解以及精细化的模型结构.
模型的剪枝,通过评定预训练模型中参数的重要性,剔除网络中不重要的网络连接,主要有权重剪枝和滤波器剪枝两种方法.权重剪枝主要通过判断权重的大小来决定重要性,一般设定一个阈值进行剔除,或者根据设定剪切比例进行剔除,优先将那些权重较小的值剔除例如Song 等[18]采用此方法将AlexNet 模型的参数量减少了9 倍,VGG 模型的参数量减少13 倍,而并没有造成模型精度的下降;Anwar 等[19]按照一定的比例对每层中的权重随机裁剪,统计多种随机剪裁下局部最优的作为最终剪裁.滤波器剪枝则是剔除网络中那些对网络影响较小的卷积滤波器,Li 等[20]通过对卷积滤波器所有元素绝对值求和,剔除那些求和较小的滤波器,从而实现对模型的剪枝;Luo 等[21]对卷积滤波器剪切前和剪切后激活值的损失进行评定,剪切那些对损失影响不大的滤波器;Hu 等[22]通过判定卷积录波器中权重为0 的参数量来评定剪切标准;Luo 等[23]提出了一种基于熵值的裁剪方式,通过特征层的概率分布来评价卷积滤波器的重要性;Yang 等[24]通过每层需要消耗的能量来进行裁剪,优先修剪那些消耗大的层.相对而言,滤波器剪枝会产生规则的稀疏矩阵,而权重剪枝则会产生大量不规则的稀疏矩阵,因此,在加速方面滤波器剪枝更加有效.
知识精炼,利用大模型指导小模型,从而让小模型学到大模型相似的函数映射.Hinton 等[25]利用训练好的复杂模型指导小模型的训练,小模型通过优化复杂模型的输出交叉熵和自身的交叉熵,在模型性能和训练速度上均有所提高.Romero 等[26]提出的FitNets 通过添加网络模型中间层的特征作为监督信号,有效解决由于网络层数过深造成的学习困难.Zagoruyko 等[27]同样采用大模型的中间特征作对小模型进行监督学习,让小模型同时学到低、中、高层三个层次的特征输出.
低秩分解,将原来的矩阵分解成若干个小矩阵,对分解的小矩阵进行优化调整.Zhang 等[28]将卷积矩阵变换为二维的矩阵,结合SVD 分解,将VGG-16 模型加速4 倍而精度只有微小的下降.Lebedev等[29]使用CP 分解的方法,将每层网络分解成若干个低复杂度的网络层,将AlexNet 的第二个卷积层的速度提升了4 倍却只增加1% 的分类误差.
精细化的模型结构,通过使用小的卷积单元或者改变卷积方式对模型进行压缩和加速.Iandola等[30]提出的SqueezeNet 使用1×1 卷积核对上层特征进行卷积降维,然后使用1×1 和3×3 卷积进行特征堆叠,大大减小了卷积的参数数量.Howard等[31]提出的MobileNets 对每个通道的特征单独卷积,之后再使用1×1 卷积对不同通道特征进行拼接.Zhang 等[32]提出的ShuffleNet 则是对多通道特征先进行分组后再执行卷积,避免信息流不通畅的问题.这些轻量化的模型设计,极大了减小了模型的参数量和计算量.
这些方法在对深度神经网络的压缩,使得网络的性能在一定程度上有所下降,有些压缩算法实现步骤繁琐,甚至有些方法还对原始的网络结构进行了改变.而与这些方法相比,权重共享的方法只对深度神经网络中的权重进行量化,实现简单,不会改变模型的网络结构,本文对深度神经网络的压缩采用了权重共享的方式.
2 动态量化编码的深度神经网络
本文提出的方法由两部分组成:权重量化与动态编码,以及基于动态编码的量化模型训练,本节将详述这两部分内容.
2.1 权重量化与动态编码
为了方便嵌入式系统进行移位运算,本文采用类似文献[15]中的方法,采用2 的n次幂的形式对神经网络中的权值进行量化,即当权重量化为b比特时,码本最多有2b个取值.码本可以表示为:
式中,l代表深度神经网络的第l层,n1和n2是两个整数,满足n1 亦可引入0 作为量化值对权重进行编码,具体形式为: 由于0 无法表示成2 的n(n为整数)次幂,需要额外的一个比特来表示0 这个量化值.当n1和n2保持不变时,式(3)需要b+1 比特来量化权重.即: 虽然将0 作为量化值引入码本需要增加一个比特,但是会让网络中产生大量的稀疏矩阵,有利于网络的正则化,能在一定程度上抑制过拟合. 无论是否引入0 进行编码,当量化的位数确定时,只要确定n1或n2中任意一个的值,根据式(2)或式(4)求得另外一个参数,从而根据式(1)或式(3)得到码本.假设给定预训练的模型,并将此模型中的网络权值量化为2 的n次幂.可采用以下式(5)使量化误差最小化: 由于量化模型的权值调整大小是由反向传播的梯度和学习率的乘积来决定,而这两个量都非常的小,因此这一假设是容易满足的,从而可以根据式(6)得出当模型进行指数量化时,量化权值的绝对值越大,量化误差也越大. 基于这一结论,我们在量化的过程中优先量化那些权重绝对值较大的值,即根据|Wl|中的最大值确定上限n2的取值.具体的计算过程如下: 其中,floor(·)表示的是向下取整操作,max(·)表示的取最大值操作.确定了n2,就可以通过式(2)或式(4)得到下限n1的取值,从而确定码本Pl. 对于式(1)定义的码本,每个网络权值用码本中最近的量化值进行编码,具体量化规则如图1 所示. 图1 网络权值的量化规则Fig.1 Quantization rules for network weight s 可用如下的公式来计算: 对于式(3)定义的码本,只需要根据码本下限进行截断取0 值即可,对应的量化公式如下: 本节主要介绍量化模型的训练过程.对于初始的深度神经网络模型,首先基于式(7)根据网络中的最大权值确定码本,然后根据码本对网络权值采用式(8)或式(9)进行量化,量化的深度神经网络通过前向传播过程计算网络的损失.再根据网络损失通过反向传播过程,对网络权值进行更新.网络权值的更新会破坏原有的量化,因此有必要对码本进行更新,然后使用新的码本对网络权值进行再一次的量化.整个训练过程码本和权重交替迭代更新,直到网络损失收敛为止.在整个迭代过程中,码本根据网络权值的变化进行动态的更新,码本的更新和深度神经网络的训练交替进行,训练流程如图2 所示.以下介绍量化模型训练的具体实现细节. 图2 动态量化编码压缩方法的训练流程Fig.2 The process of dynamic quantization coding 对于普通的深度神经网络,其训练由两个基本过程构成,即前向传播过程和反向传播过程.在前向传播过程中,分层网络的前一层的输出作为后一层的输入,直到传入网络的最后一层得到整个深度神经网络的输出.根据输出和标签之间的差异计算损失函数,其中损失函数的定义如下: 其中,q是二项分布函数,p ∈[0,1]的概率.根据STE的处理方法,在反向求导的过程中,我们可以这样处理模型中的权重 因此在进行反向传播过程时,式(11)可以写成: 采用动态量化编码的方式对深度神经网络压缩,使得网络的权重在一个动态更新的范围量化.与静态量化的码表相比,动态量化后的权重与模型最新更新的权重之间误差更小.另外,由于动态更新的码本在训练过程会随着网络的训练误差而间接更新,所以动态更新码本的方法无需一个预训练的模型作为初始化也能最终使模型收敛. 为了验证本文方法的有效性,我们在标准数据集MNIST[34]、CIFAR-10[35]上进行了实验.其中,MNIST 数据集是一个手写字符数据集,大小为28×28 的单通道图像,包含训练集60 000 张,测试集为10 000 张;CIFAR-10 是一个图像分类数据集,所有的图像都是大小为32×32 的三通道彩色图像,包含60 000 张图片,其中训练集为50 000,验证集为10 000. 在MNIST 数据集上,先使用LeNet[35]在不同的损失函数下训练全精度32 位的模型.在压缩过程中,使用预训练的全精度模型作为压缩模型的初始化.使用的三种损失函数为Softmax-loss、Softmaxloss 加上L1 正则项、Softmax-loss 加上L2 正则项,分别对应码本中有无0 两种情况,实验过程中正则项系数为0.001,具体实验结果如下: 通过表1∼表3 可以看到,无论在码本中是否引入0,本文的方法均能有效地对网络进行压缩.同时还可以看到,在损失函数中引入L2 正则项有比较好的结果,因此在后续的实验中只使用Softmax-loss加上L2 正则项作为损失函数. 表1 LeNet 在Softmax-loss 下量化效果Table 1 Quantization performance of LeNet under Softmax-loss 表2 LeNet 在Softmax-loss+L1 下量化效果Table 2 Quantization performance of LeNet under Softmax-loss and L1 表3 LeNet 在Softmax-loss+L2 下量化效果Table 3 Quantization performance of LeNet under Softmax-loss and L2 为了清晰地看到压缩前和压缩后的变化,我们先使用不同深度的ResNet 训练了全精度32 位的模型.在压缩过程中,为了尽量避免初始化不同对最终实验结果的影响,以及加快量化模型的训练收敛速度,均使用预训练好的32 位模型作为量化模型的初始化.在预训练和量化压缩过程中,数据预处理都使用了数据增强的方法,在原32×32 的图像边界上填补0 扩充为36×36 的图像,再随机的裁剪为32×32 的图像,然后随机左右翻转.在训练过程中,都迭代了80 000 轮,每轮送进网络一个批次的数据是128,初始的学习率为0.1,当训练达到40 000 次学习率为0.01,达到60 000 次之后学习率为0.001,训练中使用正则项,其权值系数设置为0.001. 3.2.1 对比不同码本的性能 本文在第3.1 节引入了两种码本,在量化同样的位数下,一种在码本中引入了0 另外一种没有.将0 作为量化值引入码表,会使滤波器产生大量的稀疏矩阵,这会在一定程度抑制过拟合.但由于0 不能表示为2 的n(为整数)次幂这种形式,需要额外的一个比特来表示,会影响码表的丰富性.为了说明这两种量化的差别,我们做了如下实验: 表4 ResNet-20 在不同码本下量化效果Table 4 Quantization performance of ResNet-20 under different codebook 表5 ResNet-32 在不同码本下量化效果Table 5 Quantization performance of ResNet-32 under different codebook 表6 ResNet-44 在不同码本下量化效果Table 6 Quantization performance of ResNet-44 under different codebook 表7 ResNet-56 在不同码本下量化效果Table 7 Quantization performance of ResNet-56 under different codebook 从表4∼7 中可以看到,两种量化方式均能有效压缩深度神经网络.当量化位数一定时,网络越深量化效果越好:当网络深度一定时,量化位数越大量化效果越好.特别在量化位数较大且网络较深时,采用这种动态量化编码的方法,甚至可以提升网络的性能. 3.2.2 对比静态量化编码(SQC)方法 本文使用的是动态的码本(Static quantitative coding,DQC),每次迭代都会对码本进行更新.为了说明DQC 的有效性,我们比较了基于SQC 和DQC 的模型性能.其中,SQC 方法与DQC 方法不同的地方在于量化模型的训练过程中不对码本进行更新.基于SQC 方法的实验结果如表8,通过表8可以看到深度模型的网络结构越深,量化的位数越大,量化效果越好. 为了更加清楚地显示SQC 和DQC 两种方法训练得到模型性能的差异,我们将静态码表的结果减去动态码表的结果,具体结果如图3 和图4 所示. 图3 码本中无0,SQC 和DQC 的量化比较Fig.3 Quantization performance of SQC and DQC with 0 in codebook 图4 码本中有0,SQC 和DQC 的量化效果比较Fig.4 Quantization performance of SQC and DQC without 0 in codebook 从图3 和图4 中可以看到,除了个别情况,绝大数情况动态变化的码本比固定码本对深度神经网络的压缩效果更好,特别是在网络较浅时,动态量化编码的效果比静态量化的效果更加明显.在使用动态更新的码本方法时,码本随着权重的更新而更新,深度神经网络的权重在新的码本内量化,这会在一定程度上减小由于量化造成的误差;而固定的码本只与预训练的权重有关系,量化得到的模型权重与预训练模型中权重误差较小.显然,采用动态量化编码的方式,能更好的减小由于量化造成的影响. 本文与Deep compression[9]做了对比,由于文献[9]是对网络进行了剪枝之后再进行量化.为了对比的公平性,我们在此处做了和文献[9]同样的处理,使用的数据集是MNIST,将LeNet 第一个卷积层66% 的小权重置为0,第二个卷积层12% 较小权重置为0,第一个全连接层8% 的小权重置为0,第二个全连接层19% 的小权重置为0.对于这些置为0 的权重,在更新过程中不进行求导运算.此处本文的方法码本中没有引入0,具体实验结果如下: 表8 固定码本下量化效果Table 8 Quantization performance of SQC 从表9 可以看到,在相同条件下,我们的方法有一定的优势. 为了进一步说明我们的方法,本文与INQ[15]的结果做了比较.这里主为了实验的客观性,只与INQ 做了对比实验,由于本文的量化方法与INQ 相近,都是将权重量化为2 的n(n为整数)次幂这种形式,从而在对比实验时避免编码形式的影响.我们使用相同的数据、初始网络结构,压缩到同样的位数,INQ 使用4 个步骤进行量化,每次量化比例:0.50,0.75,0.85,1.00,两种方法均量化5 bits,结果如下: 表9 Deep compression 与DQC 的实验比较Table 9 Comparison of deep compression and DQC 表10 量化为5 bits 时INQ 和DQC 在CIFAR-10 上的准确率比较Table 10 Compare the accuracy of INQ and DQC on CIFAR-10 with 5 bits 从表10 可知,无论网络的层数多深,码本中是否引入0,使用动态量化编码的结果均优于INQ 的方法,进一步说明了我们方法的有效性. 本文提出了一种基于动态量化编码的深度神经网络压缩方法.为了方便在嵌入式系统采用移位操作,本文对网络中的权值采用指数量化编码,通过理论推导得出,将模型量化为指数形式时,绝对值较大权值参数的量化对模型引起的误差也越大.为此,本文采用动态量化编码,在反向传播更新网络权值后,对码本进行更新以自适应模型中的绝对值较大的权值参数,减小这些参数的量化对模型精度的影响.本文还讨论了静态和动态两种不同码本进行编码时压缩模型的性能.通过实验表明,深度神经网络越深,压缩位数越大,压缩效果越好;动态量化编码的方法优于静态量化的方法;本文方法在网络压缩10.67倍时准确率还有提升.虽然本文为了说明动态量化的优越性能,使用不同深度和量化位宽对深度神经网络压缩进行了大量实验,但目前只对小数据集进行实验,后续将在更大的数据集上进行实验.2.2 基于动态编码的量化模型训练
3 实验与分析
3.1 MNIST 实验设置
3.2 CIFAR-10 实验设置
3.3 对比现有方法
4 总结与展望