本发明涉及机器学习技术领域,尤其涉及基于改进聚类的深度神经网络的压缩方法。
背景技术:
在一系列的语音识别和计算机视觉等任务中,深度神经网络都表现出非常明显的优势。除了强大的计算平台和多种多样的训练框架,深度神经网络的强大性能主要归功于其大量的可学习参数。随着网络深度的增加,网络的学习能力也会变强。但是这种学习能力的增强是以内存和其它计算资源的增加为代价的,大量的权重会消耗相当大的内存和存储器带宽。现在手机、车载等移动端应用对深度神经网络的需求越来越多,就目前深度模型的尺寸来说,大多数模型根本无法移植到手机端app或者嵌入式芯片当中。
深度神经网络通常是过参数化的,并且深度学习模型存在严重冗余,这导致了计算和存储的浪费。目前已经提出了很多方法来对深度学习模型进行压缩。主要的技术涉及网络剪枝、量化和低秩分解以及迁移学习等,而且压缩的对象是针对深度卷积神经网络。但是基本都是主要针对全连接层进行压缩,压缩率不高而且精度有一定的损失,这些问题都亟待解决。
基于改进聚类的深度神经网络的压缩方法,通过剪枝、权值共享和权值量化三步,深度神经网络在不损失精度(甚至提升)的条件下实现了有效压缩。压缩方法简单有效,这使得深度网络在移动端的部署成为了可能。因此对基于改进聚类的深度神经网络的压缩实现研究,对于深度神经网络的实际应用及更深一步的理论研究均具有重要意义。
技术实现要素:
本发明的目的在于提供基于改进聚类的深度神经网络的压缩方法,在不损失精度(甚至提升)的条件下对深度神经网络实现有效的压缩,使得深度神经网络在移动端的部署成为可能。
为实现上述目的本发明采用以下技术方案:
基于改进聚类的深度神经网络的压缩方法,包括如下步骤:
1)、剪枝策略;
剪枝过程主要分为三步,首先对网络进行常规训练,并保存训练后的模型;然后对权值较小的连接进行剪枝,原始网络变为稀疏网络,保存剪枝后的稀疏网络模型;最后对稀疏网络再训练来保证cnn的有效性,再训练之后保存最终的模型;每一次剪枝再训练的过程都是一次迭代,随着迭代训练次数的增加,精确度会逐渐增加,多次迭代之后,找到最好的连接;
剪枝完成之后,原始网络就变为稀疏网络,结合实际情况,最终对稀疏网络结构是选用spicy的csc格式来存储;
2)、基于k-means++算法的权值共享;
选用k-means++算法来进行聚类,将原始n个权值w={w1,w2,......wn}划分成k个类c={c1,c2,...,ck},其中n>>k,||wi-wj||表示wi和wj之间的欧几里得距离,定义w关于c的代价函数如下:
k-means的目标就是选择c来最小化代价函数φw(c),k-means++与其优化目标相同,在初始聚类中心的选择上进行了改进,k-means++选择初始聚类中心的基本思想是:初始的聚类中心之间的相互距离要尽可能的远;
3)、权值量化;
通过各层聚类来进行各层权重的量化,最后进行再训练更新聚类中心,对权值进行量化减少表示权值所用的位数,权值量化对深度神经网络实现了进一步的压缩;
对于每个权值,存储它所属的聚类中心的索引号,对网络进行训练时,前向传播时需要将每个权值用其对应的聚类中心代替,反向传播时计算每个类内的权值梯度,然后将其梯度和反传,用来更新聚类中心;
权值共享量化后,所有的聚类中心都被存在码书里,权值不是由原来的32位浮点数表示,而是由其对应的聚类中心的索引号表示,这一步让存储的数据量大大减少,最终存储的结果就是一个码书和索引表,假设聚成k类,则需要log2(k)位来编码索引,对于具有n个连接的网络,每个连接用b位表示,有k个共享权值,则压缩率r可以表示如下:
作为本发明进一步的方案,在k-means++算法中,初始的聚类中心之间的相互距离要尽可能的远,其算法步骤如下:
步骤1:从输入的w={w1,w2,......wn}中随机选择一个作为第一个聚类中心c1;
步骤2:对于数据集中的每一个w,计算它与最近的聚类中心(指已选择的聚类中心)的距离d(w)并保存在一个数组里,然后将这些距离加起来得到sum(d(w));
步骤3:选择一个新的ci作为聚类中心,以概率
步骤4:重复步骤2和步骤3直到k个聚类中心被选出来;
步骤5:利用这k个初始的聚类中心来运行标准的k-means算法。
作为本发明进一步的方案,在k-means++算法中,步骤3的算法实现如下:先取一个能落在sum(d(w))中的随机值random,然后用random-=d(w),直到其值小于等于0,此时的点就是下一个聚类中心,实验中取值random=sum(d(w))*λ,λ∈(0,1);当算法取值random=sum(d(w))*λ时,该值会以较大的概率落入d(w)较大的区间内,所以对应的点w3会以较大的概率被选中作为新的聚类中心;
在通过k-means++算法对每层权重聚类之后,通过聚类中心值来表示原始权重值实现权值共享,同一层的多个连接共享同一权值,跨层的权值不共享,这样减少权值的数量,再次实现深度神经网络的压缩。
与现有技术相比,本发明具有以下优点:本发明的基于改进聚类的深度神经网络的压缩实现方法,通过剪枝、权值共享和权值量化三步,最终将深度神经网络整体压缩了30到40倍,并且精度有所提升。基于改进聚类的压缩方法简单有效,深度神经网络在不损失精度(甚至提升)的条件下实现了有效压缩,这使得深度网络在移动端的部署成为了可能。
附图说明
图1是本发明的基于改进聚类的深度神经网络压缩方法整体框图。
图2是本发明的剪枝之后的稀疏网络示意图。
图3是本发明的k-means++选择初始聚类中心示意图。
图4是本发明的权值共享量化过程示意图。
图5是lenet-300-100网络剪枝后精度损失变化图。
图6是深度神经网络在不同压缩方案下的top-1误差图。
具体实施方式
下面结合附图和具体实施例对本发明作进一步详细阐述。
本发明提出了一种基于改进聚类的深度神经网络压缩方法,首先通过剪枝策略将正常训练后的网络变为稀疏网络,实现初步的压缩。然后通过k-means++聚类得到每层权重的聚类中心,用聚类中心值来表示原始权重值实现权值共享。最后通过各层聚类来进行各层权重的量化,进行再训练更新聚类中心,实现最终的压缩。算法整体基本框图如图1所示。整个基于改进聚类的深度神经网络压缩实现过程分为如下三个阶段:
1、剪枝策略;
传统的卷积神经网络(cnn)训练完之后,模型十分庞大,全连接层的权值矩阵有几十万、几百万个参数值;但是很多参数的绝对值都很小,对cnn的训练或者测试结果作用很小,因此我们就可以尝试通过剪枝策略将这些小值参数去掉,既可以减小模型的规模又可以减少计算量。剪枝过程主要分为三步,其过程如图1中step1所示。
首先对网络进行常规训练,并保存训练后的模型。然后对权值较小的连接进行剪枝,原始网络变为稀疏网络,保存剪枝后的稀疏网络模型。剪枝连接之后会影响网络的准确性,因此需要对稀疏网络再训练这个过程来保证cnn的有效性,再训练之后保存最终的模型。每一次剪枝再训练的过程都是一次迭代,随着迭代训练次数的增加,精确度会逐渐增加,多次迭代之后,可以找到最好的连接。
剪枝完成之后,原始网络就变为稀疏网络(如图2所示);我们需要高效的稀疏矩阵存储格式。典型的稀疏矩阵存储格式有coordinate(coo),compressedsparserow/column(csr/csc)等。结合实际情况,我们最终对稀疏网络结构是选用spicy的csc格式来存储的。
2、基于k-means++算法的权值共享;
本发明通过聚类来得到每层权重的聚类中心,本发明选用k-means++算法来进行聚类,这是因为k-means方法随机选择初始聚类中心可能会造成聚类的结果和数据的实际分布相差很大,即使线性初始化聚类中心得到的结果也并不理想,而k-means++算法可以用来解决这个问题,其可以有效地选择初始点。而且根据文献给出的证明,k-means++在速度和精度上都是优于k-means的。我们将原始n个权值w={w1,w2,......wn}划分成k个类c={c1,c2,...,ck},其中n>>k。||wi-wj||表示wi和wj之间的欧几里得距离;定义w关于c的代价函数如下:
k-means的目标就是选择c来最小化代价函数φw(c),k-means++与其优化目标相同,但是在初始聚类中心的选择上进行了改进。k-means++选择初始聚类中心的基本思想是:初始的聚类中心之间的相互距离要尽可能的远,其算法步骤如下:
步骤1:从输入的w={w1,w2,......wn}中随机选择一个作为第一个聚类中心c1;
步骤2:对于数据集中的每一个w,计算它与最近的聚类中心(指已选择的聚类中心)的距离d(w)并保存在一个数组里,然后将这些距离加起来得到sum(d(w));
步骤3:选择一个新的ci作为聚类中心,以概率
步骤4:重复步骤2和步骤3直到k个聚类中心被选出来;
步骤5:利用这k个初始的聚类中心来运行标准的k-means算法。
在k-means++算法中,步骤3的算法实现如下:先取一个能落在sum(d(w))中的随机值random,然后用random-=d(w),直到其值小于等于0,此时的点就是下一个聚类中心。实验中取值random=sum(d(w))*λ,λ∈(0,1),为了方便理解,本发明用图3来表示。
当算法取值random=sum(d(w))*λ时,该值会以较大的概率落入d(w)较大的区间内(此图中该值落入d(w3)的概率大),所以对应的点w3会以较大的概率被选中作为新的聚类中心。
在通过k-means++算法对每层权重聚类之后,通过聚类中心值来表示原始权重值实现权值共享,同一层的多个连接共享同一权值(跨层的权值不共享),这样可以减少权值的数量,再次实现深度神经网络的压缩。
3、权值量化;
本发明通过各层聚类来进行各层权重的量化,最后进行再训练更新聚类中心。对权值进行量化可以减少表示权值所用的位数,权值量化对深度神经网络实现了进一步的压缩。
对于每个权值,我们只需存储它所属的聚类中心的索引号。对网络进行训练时,前向传播时需要将每个权值用其对应的聚类中心代替,反向传播时计算每个类内的权值梯度,然后将其梯度和反传,用来更新聚类中心,具体过程如图4所示(颜色相同的权值表示聚为一类)。
权值共享量化后,所有的聚类中心都被存在码书里。权值不是由原来的32位浮点数表示,而是由其对应的聚类中心的索引号表示。这一步让存储的数据量大大减少,最终存储的结果就是一个码书和索引表。假设聚成k类,则需要log2(k)位来编码索引。对于具有n个连接的网络,每个连接用b位表示,有k个共享权值,则压缩率r可以表示如下:
本发明在linux操作系统下基于caffe框架对深度神经网络进行实验,在cuda8.0基础架构上进行并行运算,使用了cublas函数库实现blas,对于稀疏矩阵使用cusparse进行稀疏计算。经过剪枝和权值共享量化后,在不损失(甚至提升)精度的条件下将网络实现了可观的压缩。以下介绍我们在各个网络上的实验效果。
1、lenet网络;
本发明用lenet-300-100网络和lenet-5网络在mnist数据集上进行实验。首先对正常训练后的网络进行剪枝,通过试错实验确定深度网络每层的修剪率。剪枝完成之后,我们对lenet-300-100进行再训练,图5表示对网络再训练50次后网络的精度和损失变化图。可以看出,在不损失精度的情况下,剪枝实现了较好的结果,并且具有良好的泛化性能。在此之后,我们进行基于k-means++的权值共享和权值量化过程,将网络的权值都量化为6-bit,表1给出了lenet-300-100网络各个过程的压缩参数及压缩效果(weights%(p)表示经过剪枝后每层参数占的比重,以下的表格也是如此)。
表1
可以看出,剪枝过程将模型压缩了13倍,与共享量化结合网络最终得到了34倍的压缩率,精度达到了98.5%。
本发明对lenet-5用同样方法的进行实验,压缩后的参数如表2所示,
表2
可以看出,剪枝过程将模型压缩了12倍,最终网络得到了36倍的压缩率,精度达到了99.3%,并且实现了较好的压缩效果。
2、alexnet网络
本发明用alexnet网络在imagenetilsvrc-2012数据集上进行实验。同lenet-300-100网络实验过程一样,在此不再赘述。网络具体压缩情况见表3;
表3
可以看出剪枝过程将网络压缩了10倍,最终网络得到了30倍的压缩率,top-1精度达到57.3%,top-5精度达到了80.4%,在压缩网络的同时精度也有所提升。
3、vgg-16网络
本发明用vgg-16网络在imagenetilsvrc-2012数据集上进行实验。用同样的方法,对卷积层和全连接层都进行剪枝和进一步压缩。如表4所示;
表4
可以看出剪枝过程将网络压缩了15倍,网络最终达到了40倍的压缩率,top-1精度达到了68.9%,top-5精度达到了89.2%,将网络实现了有效的压缩。
4、小结;
各个网络压缩前后的具体参数及性能如表5所示。
表5
从表5可以看出,经过本发明的基于改进聚类的深度神经网络压缩方法,深度神经网络整体压缩了30到40倍,实现了可观的压缩。虽然压缩率方面还有待提高,但是压缩之后的模型已经足够小,这使得深度神经网络在移动端上的部署变为可能。需要指出的是,一方面,用本发明的方法将网络压缩之后,精度并没有损失,而是有了一定程度的提升(如图6所示),这得益于本发明中聚类方法的改进。另一方面,本发明将卷积层和全连接层都量化为6bit,这避免了编码长度不一带来的冗余问题,省去了霍夫曼编码这一阶段,因此本发明的压缩方法更加简单有效。
综上所述,本发明的基于改进聚类的深度神经网络的压缩方法简单有效,解决了传统压缩方法中压缩率不高、有精度损失等问题,将深度神经网络在不损失精度(甚至提升)的条件下实现了有效压缩,使得深度神经网络在移动端的部署成为了可能。
以上所述为本发明较佳实施例,对于本领域的普通技术人员而言,根据本发明的教导,在不脱离本发明的原理与精神的情况下,对实施方式所进行的改变、修改、替换和变型仍落入本发明的保护范围之内。