深度神经网络加速和压缩

网络加速和压缩技术根据采用的方法不同大概可以分为:

  • Low-Rank
  • Pruning
  • Quantization
  • Knowledge Distillation

 

1、Low-Rank 低秩分解

深度网络加速和压缩的第一种方法是Low-Rank低秩分解。由于卷积神经网络中的主要计算量在于卷积计算,而卷积计算本质上是矩阵分析的问题,通过在大学对矩阵分析、高等数学的学习我们知道通过SVD奇异值分解等矩阵分析方法可以有效减少矩阵运算的计算量。

对于二维矩阵运算来说SVD是非常好的简化方法,所以在早期的时候,微软研究院就做过相关的工作来对网络实现加速。后面对于高维矩阵的运算往往会涉及到Tensor分解方法来做加速和压缩,主要是CP分解、Tucker分解、Tensor Train分解和Block Term分解这些在2015年和2016年所做的工作。

应该说矩阵分解方法经过过去的发展已经非常成熟了,所以在2017、2018年的工作就只有Tensor Ring和Block Term分解在RNN的应用两篇相关文章了。

那么为什么Low-Rank不再流行了呢?除了刚才提及的分解方法显而易见、比较容易实现之外,另外一个比较重要的原因是现在越来越多网络中采用1×1的卷积,而这种小的卷积使用矩阵分解的方法很难实现网络加速和压缩。

深度神经网络加速和压缩_第1张图片

 

2、Pruning 剪枝

深度网络加速和压缩的第二种方法是Pruning,简单来说就是把神经网络中的连接剪掉,剪掉以后整个网络复杂度特别是网络模型大小要减小很多。最早在ICLR2016上斯坦福大学提出了一种称为Deep Compression的随机剪枝方法

由于随机剪枝方法对硬件非常不友好,往往在硬件实现的过程中不一定能够很好地对网络起到加速和压缩的效果。后来大家就想到使用成块出现的结构化Pruning,Filter Pruning,梯度Pruning等方法。

深度神经网络加速和压缩_第2张图片

对于结构化Pruning,在ICML2017中有一篇对于权重进行分析剪枝的文章。具体方法是:首先使用Group Sparsity组稀疏的方法对分组特征添加稀疏正则来修剪掉权重矩阵的一些列,然后通过Exclusive Sparsity增强不同权重之间特征的竞争力来学习更有效的filters,两者共同作用取得了很好的Pruning结果。

深度神经网络加速和压缩_第3张图片

从另一方面考虑,我们能否对feature map和activation也做一些pruning的工作呢?在ICCV2017的工作中有人通过给每个通道channel添加一个尺度因子scaling factor,然后对这些尺度因子scaling factor添加sparsity regularization,最后根据尺度因子大小对相应的通道channels进行修剪,将一些尺度因子比较小的通道剪掉,实现对整个网络的瘦身效果。

刚才所讲的都是在网络前向传播过程中所做的Pruning,那么我们能否在网络训练的过程中也加入Pruning来加快网络训练的过程呢?ICML2017有一篇文章对网络训练过程中的梯度信息做了分析,通过去掉幅值比较小的梯度来简化网络的反向传播过程,从而加快网络的训练过程。从结果来看,这种方法可以通过仅仅更新1%-4%的权重来实现和原有网络相当的效果。

 

3、Quantization量化

一般而言,神经网络模型的参数都是用的32bit长度的浮点型数表示,实际上不需要保留那么高的精度,可以通过量化,比如用0~255表示原来32个bit所表示的精度,通过牺牲精度来降低每一个权值所需要占用的空间。此外,SGD(Stochastic Gradient Descent)所需要的精度仅为6~8bit,因此合理的量化网络也可保证精度的情况下减小模型的存储体积。

根据量化方法不同,大致可以分为二值量化,三值量化,多值量化
对网络网络进行量化要解决三个基本问题

  1. 如何对权重进行量化
  2. 如何计算二值权重的梯度
  3. 如何确保准确率

量化可以分为Low-Bit Quantization(低比特量化)、Quantization for General Training Acceleration(总体训练加速量化)和Gradient Quantization for Distributed Training(分布式训练梯度量化)。

我们实验室从另一个角度思考这个问题,使用哈希把二值权重量化,再通过哈希求解。

前面两篇文章都是对权重进行量化,那么feature map能否也可以进行量化呢?以前有人考虑过这个问题,将权重和feature map一起进行量化,但在实际过程中非常难以收敛。我们实验室在CVPR2018上提出一个方法,受到两步哈希法的启发,将量化分为两步,第一步先对feature map进行量化,第二步再对权重量化,从而能够将两个同时进行很好的量化。

深度神经网络加速和压缩_第4张图片

在很多深度学习训练过程中,为了让训练更快往往会用到分布式计算。在分布式计算过程中有一个很大问题,每一个分布式服务器都和中心服务器节点有大量的梯度信息传输过程,从而造成带宽限制。这篇文章采取把要传输的梯度信息量化为三值的方法来有效加速分布式计算。

深度神经网络加速和压缩_第5张图片

 

4、Knowledge Distillation 知识蒸馏

蒸馏模型采用的是迁移学习,通过采用预先训练好的复杂模型(Teacher model)的输出作为监督信号去训练另外一个简单的网络。这个简单的网络称之为student model。

基于教师——学生网络的方法,属于迁移学习的一种。迁移学习也就是将一个模型的性能迁移到另一个模型上,而对于教师——学生网络,教师网络往往是一个更加复杂的网络,具有非常好的性能和泛化能力,可以用这个网络来作为一个soft target来指导另外一个更加简单的学生网络来学习,使得更加简单、参数运算量更少的学生模型也能够具有和教师网络相近的性能,也算是一种模型压缩的方式。

教师学生网络的方法,利用一个性能较好的教师网络,在神经元的级别上,来监督学生网络的训练,相当于提高了模型参数的利用率。其实可以这么来理解,我们一般训练一个神经网络就像是要爬一座山,你的target就是山顶的终点线,给了你一个目标,但是需要你自己去摸索如何找到通往终点的路,你就需要不断学习不断尝试,假如你的体力有效,可能就难以达到目标;但是如果这个时候有一个经验丰富的老司机,他以及达到过终点,那么他就可以为你指明一条上山的路,或者在路上给你立很多路标,你就只要沿着路标上山就好了,这样你也能够很容易的到达山顶,这就是教师——学生网络的意义。

 

 

5、紧致网络设计

我们刚才讲到的几种网络加速和压缩方法都是在原有非常复杂的网络基础上,对它进行量化、剪枝,让网络规模变小、计算变快。我们可以考虑直接设计又小又快又好的网络,这就是紧致网络设计的方法。我们主要讲三个相关的工作。

先介绍谷歌在2017年和2018年连续推出的MobileNets V1和MobileNets V2,其中使用了depthwise的1x1卷积。MobileNets V1是一个在网络非常精简情况下比较高性能的网络,MobileNets V2开始于通道比较少的1×1的网络,然后映射到通道比较多的层,随后做一个depthwise,最后再通过1x1卷积将它映射回去,这样可以大幅减少1×1卷积计算量。

 

6、深度神经网络加速和压缩的发展趋势

第一,我们发现实际上现在绝大部分加速和压缩的方法,都需要有一个fine-tuning的过程,这个过程需要有一定量的含有标签的原始训练样本,这在实际应用过程中可能会有一定的限制。会有一些Non-fine-tuning或者Unsupervised Compression方法的出现。实际上现在已经有人在研究这方面的东西。

第二,在加速和压缩过程中会涉及到很多参数,甚至还包含很多经验性东西,将来能不能做到尽可能少需要、不需要经验或者参数越少越好的self-adaptive方法

第三,现在很多加速压缩方法往往都是针对分类问题,未来在目标检测、语义分割方面也会出现类似的工作

第四,现在很多方法与硬件的结合越来越紧密,对于加速和压缩方面来说也是如此,未来肯定是之间的结合越来越多。最后是二值网络越来越成熟,未来研究的人会越来越多。由于时间的关系只能简单介绍,可以参考我们最近刚发表在FITEE 2018上的综述论文了解更多详细的信息。

 

文中提到参考文献的下载链接为:

https://pan.baidu.com/s/1mpXsDzMZXRNO9tVB8pVkHw

密码:k1T5

 

参考文章:

https://www.jianshu.com/p/e73851f32c9f

http://www.sohu.com/a/232047203_473283

 

 

你可能感兴趣的:(深度学习)