在许多现实应用中,深度神经网络的部署由于其高额的计算成本变得很困难。在这篇论文中,我们提出了一种新颖的CNNs学习方案,它同时满足:
利用通道稀疏化这样一个简单但却有效的方法,上面的条件很容易获得。不同于许多已经存在的方法,我们的方法可以直接应用到现代CNN网络架构中,在训练过程引入最小的花销,而且不需要其他特殊的软硬件加速器。我们将我们的方法称为“网络瘦身”,输入模型是一个宽大的网络,但是在训练期间不重要的通道可以被自动鉴别,随后删除,进而在几乎没有精度损失的情况下得到一个瘦且紧凑的网络。我们通过几个最先进的CNN模型,包括VGGNet、ResNet、DenseNet,在几种不同的图像分类数据集上展示了我们的方法的有效性。对于VGGNet,网络瘦身的Muti-pass方案(实质上就是将网络瘦身这个过程多重复几次)使得在模型大小上压缩了20x,在计算量上面压缩了5x。
论文链接:https://arxiv.org/abs/1708.06519
代码:https://github.com/liuzhuang13/slimming
CNN网络在现实应用中的部署主要面临三大挑战:
许多工作都已经被提出来压缩大的CNN模型,使其可以直接学习更高效的模型来做快速推理。这些方法包括低秩近似、网络量化、二值化、权重剪枝、动态推理等。然而,它们都只能解决上面提到的一到两个挑战,而且,这些技术需要特别设计专门的软硬件加速器来执行加速。
减少大的CNN资源消耗的另一个方向就是稀疏化网络,在不同结构层次上稀疏化,会产生可观的模型大小压缩和推理的加速。然而,这些方法通常需要特别的软硬件加速器来获得内存和时间上的节省,尽管这已经比非结构稀疏化权重矩阵容易的多。
在这篇论文中,我们提出了网络瘦身,它解决了前面提到的所有挑战。我们的方法是将L1正则化施加到BN层的缩放因子上,L1正则化推动BN层的缩放因子趋向于零,这使得我们能够鉴别出不重要的通道或者神经元,因为每一个缩放因子都和一个特定的CNN卷积通道(或者全连接层的一个神经元)相关联。这有助于后续的通道剪枝,另外正则化也很少损伤性能,甚至一些情况下它会导致更高的泛化准确率,剪掉不重要的通道有时候虽然会暂时降低性能,但是通过之后对剪枝网络的微调可以对精度补偿。在剪枝之后,更窄的网络会在模型大小、运行阶段的内存占用、计算量方面都会更显得紧凑。将上面的过程重复几次,就可以通过多阶段的网络瘦身获得更紧凑的模型。
在几个基准数据集和不同的网络架构上的实验表明我们可以将CNN模型大小压缩20倍、计算量压缩5倍,同时实现相同甚至更高的准确度。而且,我们的方法使用传统硬件和深度学习软件包实现模型压缩和推理加速。
在本文我们将从五个方面讨论相关工作:
我们提供了一种简单的方案来实现通道级稀疏化。在本节,我们首先讨论通道级稀疏化的优势和遇到的挑战,然后介绍我们利用BN的缩放层来高效鉴别和剪枝不重要的层。
channel-wise稀疏化的优势:正如之前讨论的,稀疏化可以在不同级别实现(weight-level,kernel-level,channel-level,layer-level)。细粒度的稀疏化(weight-level)由最高的灵活性和泛化性能,也能获得更高的压缩比率,但是它通常需要特殊的软硬件加速器才能在稀疏模型上快速推理。相反,粗粒度 layer-level稀疏化不需要特殊的包做推理加速,但是它灵活性上不如细粒度。事实上,只有深度足够深(超过50层),移除某些层才会很高效。相比之下,channel-wise稀疏化在灵活性和实现上做了一个平衡,它可以被应用到任何典型的CNN或者全连接层(将每个神经元看作一个通道),由此得到的网络本质上也是一个瘦的网络,可以在卷积CNN平台上快速推理。
挑战:实现通道稀疏化需要将和一个通道有关联的所有输入和输出的连接都剪掉,但是对于已经预训练好的一个模型来说,不太可能做大这点,因此这个对已经预训练好的模型做通道剪枝效率不高,比如对预训练好的ResNet做通道剪枝,在不损伤准确率的情况下,只能减少10%的参数量。"Learning structured sparsity in deep neural networks"这篇文章中通过将稀疏正则化强加到训练目标函数中,具体来讲,就是采用group Lasso来使得所有filters的同一个通道在训练时同时趋于0。然而,这个方法需要额外计算新引入的和所有filters有关的梯度项,这是一个问题。
缩放因子和稀疏性惩罚:我们的注意是对每一个通道都引入一个缩放因子γ\gammaγ,然后与通道的输出相乘。接着联合训练网络权重和这些缩放因子,最后将小缩放因子的通道直接剪除,微调剪枝后的网络。特别地,我们的方法的目标函数定义为:
(x,y)是训练输入和目标,W是网络中可训练参数,第一项是CNN网络的训练损失函数,g(.)是在缩放因子上的惩罚项,λ\lambdaλ是两项的平衡因子。在我们的实验中,我们选择g(s)=|s|,即L1-正则化,被广泛地用于稀疏化。次梯度下降法作为不平滑(不可导)的L1惩罚项的优化方法,另一个建议是使用平滑的L1正则项取代L1惩罚项,尽量避免在不平滑的点使用次梯度。
剪掉一个通道的本质是要剪掉所有与这个通道相关的输入和输出连接关系,我们可以直接获得一个窄的网络(Figure 1),而不需要借用任何特殊的稀疏计算包。缩放因子扮演的是通道选择的角色,因为我们缩放因子的正则项和权重损失函数联合优化,网络自动鉴别不重要的通道,然后移除掉,几乎不影响网络的泛化性能。
利用BN层的缩放因子:BN层已经被大多数现代CNN网络采用,作为一种标准的方法来使得网络快速收敛并获得更好的性能。BN归一化激活值的方法给了我们设计一种简单高效的方法的灵感,即与channel-wise缩放因子的结合。尤其是,BN层使用mini-batch的统计特性对内部激活值归一化。$z_{in}$和$z_{out}$分别是BN层的输入和输出,B指代现在的minibatch,BN层执行下面的转换:
通常的做法是在卷积层之后插入一个BN层,引入channel-wise的缩放/平移参数。因此,我们直接将BN层的γ\gammaγ参数作为我们网络瘦身的缩放因子,这样做的一个优势在于没有给网络带来额外的花销。事实上,这也可能是我们能够学习到的最有意义的做通道剪枝的缩放因子:
通道剪枝和微调:引入缩放因子正则项之后,我们得到的模型中许多缩放因子都会趋于0(如Figure 1所示)。然后我们剪掉接近零的缩放因子对应的通道,这里说的再清楚一点,假设经过卷积之后的feature map 的维度为 h x w x c,h和w分别为特征图的高和宽,c为通道数,将其送入BN层会得到归一化之后的特征图,c个feature map中的每一个都对应一组$\gamma$和$\lambda$,前面所说的剪掉小的$\gamma$对应的通道实质上就是直接剪掉这个feature map对应的卷积核。至于什么样的$\gamma$算小的呢?这个取决于我们为整个网络所有层设置的一个全局阈值,它被定义为所有缩放因子值的一个比例,比如我们将剪掉整个网络中70%的通道,那么我们先对缩放因子的绝对值排个序,然后取从小到大排序的缩放因子中70%的位置的缩放因子为阈值,通过这样做,我们就可以得到一个较少参数、运行时占内存小、低计算量的紧凑网络。
Muti-pass方案:我们可以将我们提出的方法从单阶段的学习方案扩展到多阶段,什么意思呢?通俗来讲,就是多次进行“网络瘦身”,这样可以得到一个更紧凑的模型。如Figure 2所示:
处理跨层的连接和预激活结构:上面介绍的网络瘦身过程可以直接用到大多数比较简单的CNN结构,如AlexNet、VGGNet等。但是对于有跨层连接和预激活设计的网络ResNet和DenseNet等,又应该如何使用这个方法呢?对于这些网络,每一层的输出会作为后续多个层的输入,且其BN层是在卷积层之前,在这种情况下,稀疏化是在层的输入末端得到的,一个层选择性的接受所有通道的子集去做下一步的卷积运算。为了在测试时节省参数和计算量,我们需要放置一个通道选择层鉴别出重要的通道。
分别在CIFAR、SVHN、ImageNet、MNIST数据上上做测试
使用SGD算法从头开始训练网络;
在CIFAR和SVHN数据集上,minibatch为64,epoches分别为160和20,初始的学习率为0.1,在训练迭代次数的50%和75%时均缩小10倍;
在ImageNet和MNIST数据集上,训练的迭代次数epoches分别为60和30,minibatch为256,初始学习率为0.1,在训练迭代次数的1/3和2/3时缩小10倍;
权重衰减率为$10{{-4}}$,所有的实验中,所有通道的缩放因子都初始化为0.5;
超参数$\lambda$的取值要靠网络搜索得到,常见的范围为$10{{-3}}$、$10{{-4}}$、$10{{-5}}$,对于VGGNet,我们选择$\lambda=10{{-4}}$;对于ResNet和DenseNet,我们选择$\lambda=10{{-5}}$;对于ImageNet上的VGG-A,我们选择$\lambda=10{{-5}}$;
我们对训练模型的通道做剪枝时,不像"Pruning filters for efficient
convnets"中对不同的层使用不同的阈值做剪枝,我们这里对所有的层设置了一个全局阈值,这是为了简单化。然后剪枝阈值是由所有比例因子中的百分比决定,例如修剪40%或60%的通道。
修剪过程是通过构建一个新的更窄的模型,并将原来训练好的稀疏化模型的相关权重复制到新模型中;
在剪枝过后,我们获得了一个更窄更紧凑的模型,接下来便是微调,在CIFAR、SVHN、MNIST数据集上,微调使用和训练相同的优化设置;在ImageNet数据集上,由于时间的限制,我们仅对剪枝后的VGG-A使用$10{{-3}}$的学习率学习5个epoches;
在网络瘦身中有两个关键的超参数,剪枝百分比$t$和 稀疏正则项系数$\gamma$,下面我们来具体分析它们的影响:
剪枝百分比的影响:$t$设置的过小,节省的资源会很有限,设置的过大,剪掉太多的通道会给准确率带来永久性损伤,无法通过后续的微调恢复;我们在CIFAR-10上训练了一个DenseNet-40模型,$\gamma=10{{-5}}$,Figure 5展示了结果:
通道稀疏正则化的影响:Figure 4展示的时不同的γ\gammaγ取值下,缩放因子值的分布情况。可以看到$\gamma=10{{-4}}$时,几乎所有的缩放因子值都掉到了一个接近零的区域,这个过程中可以看成是一种类似于网络中间层的选择过程,只有不可忽视的缩放因子对应的通道才会被选择。我们进一步通过热力图对这个过程可视化,Figure 6展示的是VGGNet的某一层缩放因子的幅值随迭代次数的变化情况,每个通道开始的初始权重相同,缩放因子值也相同,随着训练的进行,一些通道的缩放因子会逐渐变大(变亮),一些变小(变暗)。
模型压缩之Learning Efficient Convolutional Networks through Network Slimming
原文:https://www.cnblogs.com/ai-tuge/p/12960678.html