卷积网络模型压缩的若干总结

在这里插入图片描述

前言

本文翻译自[0],本人感觉这篇博文很好地总结了卷积网络模型压缩的若干要点,因此希望将此节选翻译,以飨国人。如有谬误,请联系指出,谢谢。
\nabla 联系方式:
e-mail: [email protected]
QQ: 973926198
github: https://github.com/FesianXu


为什么要用模型压缩

深度卷积神经网络CNN在一系列应用特别是计算机视觉领域取得了很多最为先进的成果。一个限制这个技术更为广泛发展的绊脚石就是巨大的数据储存需求。原始的AlexNet网络架构需要大概240MB的内存以储存训练参数,以用于对一张图片进行分类,当考虑到其更为深层的网络VGG时,其需要更多的内存(528MB)[1,2]。这种种(海量内存需求)的原因之一,特别是深度学习的发展早期,可能是受到了想要在ImageNet这个比赛中取得最好成绩的欲望驱使,才设计出了这样的网络。然而,除了让深度学习能够正常工作外,还有许多是需要额外考虑的。

在一些基于云计算部署的环境中,因为有着冗余的计算资源,包括有着大量的GPU支持,以上谈到的大量的内存需求可能不是一个大问题。但是,考虑到在一些移动设备或者边缘计算设备上时,情况可能就有所不同了,这些资源要求限制了深度神经网络不能真正地在应用场景部署。最近,随着深度学习应用在移动物联网设备上的蔓延(包括智能手机),人们发现已经到了解决这个重要问题的时候了。

因此,尝试使得深度神经网络的设计要求更少的内存储存和计算资源完成工作成为了一个新的研究方向。特别来说,这个研究方向指的就是,对大量笨重的模型(指的是参数量多)进行修改,以减少其内存需求的同时尽量取得更多的其原来未修改模型的性能。另一个研究方向就是尝试去从头设计一个内存使用更为紧凑的神经网络。接下来,我们会讨论这些方法的一些细节。

内存紧致的网络

让我们回顾CNN结构的设计,我们会发现其压缩模型的一个直接的方法就是考虑更为内存紧致的模型。首先,我们知道对于一个标准的 M M 输入通道, N N 输出通道的大小为 K × K K \times K 的卷积核而言,其参数量为 N × M × K × K N \times M \times K \times K ,对于全连接网络而言,则是 i i 个输入单元 j j 个输出单元的要求参数量为 i × j i \times j

举例来说,在VGG16中,其最后一个卷积块的一层的参数量为 512 × 512 × 3 × 3 = 2.4 M 512 \times 512 \times 3 \times 3 = 2.4M ,而且最后还需要将这个 7 × 7 7 \times 7 的特征图喂给最后的4096个节点的全连接层,因此,光是在最后的全连接这一层,就需要 512 × 7 × 7 × 4096 = 102.8 M 512 \times 7 \times 7 \times 4096=102.8M 的参数量。因此,将最后一层的全连接层抛弃并且替换成其他网络已经成为了实践中的常规操作,比如ResNet和Inception中都这样做过,这样可以使得内存需求的大幅度下降,同时可以让模型设计得更深。[3,4]

最近,有很多文章在尝试解决这个导致卷积层复杂的因素,以压缩模型大小。
2016年发表的SqueezeNet是第一篇文章考虑设计一个内存紧凑的架构去解决这个问题的[5]。在这里,应用了1x1卷积去压缩输入的通道数量以减少参数量。具体来说,就是在采用更加内存不经济的3x3卷积之前,通过减少输入特征图的通道数量来减少参数量。说的更精确些就是,这个结构包含了一系列连续的“Fire-Module”,这些模组包含了两层卷积层,第一层是1x1卷积,通过将原来输入特征图的通道数从 N N 转化到 M M (M < N),第二层是1x1卷积和3x3卷积的组合。通过这种手段,只需要4.8MB的参数量就可以达到AlexNet的精度水平。
在这里插入图片描述

Fig 1. SqueezeNet中的一个"Fire Module"。

Google的MobileNets在修改卷积操作的路上走得更远些[6]。MobileNets的主要特点就是所谓的深度可分离卷积(depthwise separable convolutions)。在标准卷积里,如果我们将卷积核看成是一个三维的物件(如Fig 2所示),那么将输入的 M M 个特征图转换成输出的 N N 个特征图,需要参数量为 N × ( K × K × M ) N \times (K \times K \times M) 。在深度可分离卷积中,这个标准的卷积将被取代成下列两步骤:

  1. 一个卷积,大小为 K × K × M K \times K \times M (也就是只考虑输入通道),应用在输入特征图上(深度方向卷积,Depthwise Convolution),得到输出特征图 O c O_c 译者注:注意此处只有一个卷积核,而不同与标准卷积中的需要N个
  2. 然后,在经过了BatchNorm层和ReLU激活层后,N个1x1的卷积被分别应用在第一步得到的输出特征图 O c O_c 上,从而得到 N N 个输出特征图。

通过这个手段我们发现我们的参数量缩减为 ( K × K × M ) + ( N ) (K \times K \times M)+(N) 而不是标准卷积的 N × ( K × K × M ) N \times (K \times K \times M) ,参数量几乎减少了 N N 倍,大量的内存和计算资源得到了节省。通过这个技术,MobileNets在ImageNet上达到了70.6%的Top-1准确率(对比AlexNet的约57%),而且其内存需求只要16MB(对比AlexNet的240MB)。整个过程如Fig 3所示。
在这里插入图片描述

Fig 2. 将卷积核看成三维的结构。(考虑到通道之间的变换)

在这里插入图片描述

Fig 3. 深度可分离卷积和标准卷积的区别示意图。

在MobileNets中的逐个深度的卷积(Depthwise Convolutions)的这个想法可以被更进一步演化成逐个组的卷积(Group-wise Convolutions),而这个就是SEP-Nets所做的[7]或者ShuffleNets[8]所做的。在MobileNets的逐深度卷积中,一个单独的 K × K × M K \times K \times M 的卷积核被应用于输入特征图。而逐组卷积考虑把这个输入特征图分为k个组,然后不同组之间共享不同的卷积核。通过这个手段可以达到常规卷积操作参数量的 k M \dfrac{k}{M} 。(即是当k=1时,逐组卷积=逐深度卷积,当k=M时,逐组卷积=常规卷积。)整个过程如Fig 4所示。
这个对组的分割可以通过设置参数,在PyTorch中简单实现。

在这里插入图片描述

Fig 4. 逐组卷积示意图。

从浮点数到更低位宽——通过量化实现压缩

另一个直接的方法去实现压缩参数储存需求的方法就是通过减少参数的位宽,被称之为量化(quantization)。我们可以把大型卷积网络的参数数据类型从32bit的浮点数下降到8bit的浮点数,而这个后处理步骤对性能影响不大。这个结论同样在那些被设计成节省内存的网络,如MobileNets和SqueezeNet中成立。事实上,这个叫做量化的功能已经在TensorFlow中得到了支持[9]。然而,如果把32bit下降到8bit位宽,那么不可避免的是,在这么低的位宽下训练还再需要训练这个网络。因为所有的优化算法,比如SGD或者Adam,都是依赖于高精度的参数数据和梯度数据的,如何训练这种经过量化的网络成为了一个紧急需要研究的方向。

另一个和这个量化的想法强相关的是不仅仅是把参数,而且把其激活值(既是输入在卷积操作过后的输出值)也进行量化。对于参数进行量化对于减少模型的内存需求有着很好的表现,如果附加地对激活值也进行量化,那么就可以对一些专用的硬件(如FPGAs)进行加速,这种硬件对于1或者2bits的参数或者激活值,其矩阵计算可以被逻辑运算完全代替,从而提高运算速度。部分因为这个原因,深度学习的硬件加速是一个独立的研究领域,并且可以独立写成另一个博客,因此这里只考虑软件角度上的量化。最为常见的想法就是首先在GPU上训练一个量化模型,然后在边缘设备上部署推理。

最为极端一种情况就是二值量化,也就是在推理阶段把参数限制在-1和+1两个值,这个工作可以在Courbariaux et al. [10,11,12]中找到。在他们原始的BinaryConnect文章中,他们提出在训练过程中用完整精度的参数进行参数更新,但是在反向传播时是根据二值参数进行传递的。换句话说,这个loss是根据二值参数进行计算的,但是参数更新却用全精度的参数进行。这个二值操作在所有参数更新中都实施,其被简单的被sign二值函数计算出来。(其有个随机版本,就是将一个参数根据概率 max ( 0 , min ( 1 , w + 1 2 ) ) \max(0,\min(1,\frac{w+1}{2})) 设置为+1,以对训练进行正则化。)

在他们的BNN文章[11]中,这个二值激活的想法得到了扩展。在这个工作中,不仅仅是参数更新,而且反向传播也是用全精度的参数,因为梯度可能会因为使用了离散值而变得几乎所有地方都变成0(导致无法训练)。在他们称之为XNOR的文章中[13],Rastegari et al.将这个方法进行扩展,提出了二值卷积的尺度化因子,这个因子由每个卷积核的全精度参数的平均值所给定。

在他们的QNN文章[12]中,Courbariaux et al. 通过用signum函数将二值演化成线性量化,进一步扩展了严格的二值卷积到更高的位宽。

另一个方法由Ternary提出,其对模型参数可以取为0,+1和-1。Li et al. 提出了一个合适的尺度放缩因子和一个阈值 δ \delta (Threshold Delta)可以泛化这个BinaryConnect的方法到Ternary的那种情况,简单描述为:
在全精度参数的情况下,如果 w &lt; δ w &lt; -\delta ,w就设置为-1;如果 w &lt; δ w &lt; |\delta| 这个w设置为0,如果是 w &gt; δ w &gt; \delta 则设置为1 [14]。

一个非线性量化的方法由Zhou et al.提出,其参数被2的指数或者0的指数所量化 [15]。这个想法允许有效的位移操作去替代浮点数的乘法操作,甚至对于更高的位宽而言。此外,这个作者还介绍了一种和上述文献提到的不同的量化策略,与其同时量化所有的参数,不如将量化递增地进行实施。在每个迭代中,只有一些参数被量化,而其他的仍然保持浮点数形式的参数被重训练以补偿精度上的损失。量化部分的参数逐步递增直到100%。在ImageNet上用不同的架构进行的实验证实了在5bits上的量化有着比全精度模型更高的性能。采用位宽为2,ResNet-18可以被量化,然后其精度损失为2.3%。


最佳大脑损伤——通过剪枝移除冗余部分

即便有着强大的正则化技术如dropout或者参数衰减的应用,我们仍然可以知道,对比其他参数,神经网络中的一些参数总是可以对预测作出更大的贡献。移除更小贡献的参数以压缩神经网络的过程因而被称之为 剪枝 (Pruning)。在一些权值被剪枝掉之后,神经网络通常不得不经过微调以适应这个变化。

这个想法首先有Yann Le Cunn et. al 在1990提出,其著名的文献名为Optimal Brain Damage(OBD),这个想法被后续很多现代深度模型所沿用。[16]

在剪枝上的研究大部分考虑的是如何度量参数对性能的贡献。在OBD中,这个贡献用对训练误差的造成的影响进行度量,将特定的参数设置为0,然后观察其训练误差的变化。 显然,这个方法是在深度网络中不现实的,需要太大的计算量。在深度压缩中,Han et. al简单把最低绝对值的参数裁剪,在其全连接层上比原始尺寸减少了10%的参数量,在卷积层上减少了大概60%的参数量,而其预测性能没有减少[17]。

Tu et la.提出了一种方法,联合其参数,其可以精准地度量Fisher信息,并且可以把它作为对贡献的一种度量 [18]。最近,更为先进的逐个层的方法被提出 [19,20]。


从大模型到小模型——通过知识蒸馏的方法进行知识迁移

一个更为通用的方法去压缩一个给定模型,是强制一个更小的模型去模拟它的表现。在深度学习的语境中,这个想法被描述为Teacher-Student Learning师生学习 或者 Knowledge Distillation知识蒸馏 [22]。我们首先可以训练一个最为先进的模型如ResNet或者inception(这个作为老师),然后想要利用这个老师网络的预测去训练一个更小的模型,也即是学生网络。(译者注:其实这个过程在尝试去用更小模型去拟合大模型的联合概率分布)为了达到这个目标,当在训练学生网络时,我们对两个网络都采取了前向传播,模型计算其老师输出和学生输出之间的的交叉熵。通过这个方法进行训练,学生网络不仅学习到了基于真实标签的信息,而且还额外学习到了老师网络的信息,这个信息被称之为模型的“dark knowledge”,即是一个类别在隐空间里面可以是靠近另一个类别的(有一定相关性)。

举例而言,我们的任务是对四个类别:猫,狗,马和斑马进行图像分类。一个强大的模型可以学习到猫比马和斑马更加相似于狗,这个可以通过其给出的softmax结果如 ( 0.7 , 0.25 , 0.035 , 0.015 ) (0.7, 0.25, 0.035, 0.015) 得出。在实际操作中,老师网络的softmax的输出通过一个因子进行分割,这个超参数被描述为温度(Temperature),这个可以使得将它们更大程度上的拉离硬的目标(也就是真实的标签)。因此,如果学生模型通过这个额外的信息进行训练,而不仅仅是真实标签,其可以比从头训练有着更好的表现性能。更抽象的说,我们可以说我们通过将其知识从迁移到了更小的模型,使得其有着相同的输出。

在这里插入图片描述

Fig 5. TS学习的示意图。

这个想法第一次由Ba and Caruana提出[21], 随后被Hinton [22]跟进。 自此之后一些对这些算法的改进被提出,其可以在一些特定的应用中提高性能[23]。知识蒸馏在物体识别中同样得到了成功应用,一些例子说明了其可以在大型数据集上使用,甚至对于更复杂的任务都可以胜任[24,25]。


Reference

[0]. https://medium.com/@nicolas_19145/state-of-the-art-in-compressing-deep-convolutional-neural-networks-cfd8c5404f22
[1]. Krizhevsky, A., Sutskever, I., & Hinton, G. E. (n.d.). ImageNet Classification with Deep Convolutional Neural Networks. Retrieved from https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf
[2]. Simonyan, K., & Zisserman, A. (2015). VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION. Retrieved from https://arxiv.org/pdf/1409.1556.pdf
[3]. He, K., Zhang, X., Ren, S., & Sun, J. (n.d.). Deep Residual Learning for Image Recognition. Retrieved from https://arxiv.org/pdf/1512.03385.pdf
[4]. Szegedy, C., Ioffe, S., Vanhoucke, V., & Alemi, A. (n.d.). Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning. Retrieved from https://arxiv.org/pdf/1602.07261.pdf
[5]. Iandola, F. N., Han, S., Moskewicz, M. W., Ashraf, K., Dally, W. J., & Keutzer, K. (n.d.). SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE
[6]. Howard, A. G., Zhu, M., Chen, B., Kalenichenko, D., Wang, W., Weyand, T., … Adam, H. (n.d.). MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications. Retrieved from https://arxiv.org/pdf/1704.04861.pdf
[7]. Li, Z., Wang, X., Lv, X., & Yang, T. (n.d.). SEP-Nets: Small and Effective Pattern Networks. Retrieved from https://arxiv.org/pdf/1706.03912.pdf
[8]. Zhang, X., Zhou, X., Lin, M., & Sun, J. (n.d.). ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices. Retrieved from https://arxiv.org/pdf/1707.01083v1.pdf
[9]. https://www.tensorflow.org/performance/quantization
[10]. Courbariaux, M., & David, J. (n.d.). BinaryConnect : Training Deep Neural Networks with binary weights during propagations https://arxiv.org/pdf/1511.00363.pdf
[11]. Courbariaux, M., Hubara, I., Soudry, D., El-Yaniv, R., Il, R. T. A., Bengio, Y., & Com, Y. U. (n.d.). Binarized Neural Networks: Training Neural Networks with Weights and Activations Constrained to +1 or −1. Retrieved from https://arxiv.org/pdf/1602.02830.pdf
[12]. Hubara, I., Courbariaux, M., Soudry, D., El-Yaniv, R., & Bengio, Y. (2016). Quantized Neural Networks Quantized Neural Networks: Training Neural Networks with Low Precision Weights and Activations. Retrieved from https://arxiv.org/pdf/1609.07061.pdf
[13]. Rastegari, M., Ordonez, V., Redmon, J., & Farhadi, A. (n.d.). XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks. Retrieved from https://arxiv.org/pdf/1603.05279.pdf
[14]. Li, F., Zhang, B., & Liu, B. (n.d.). Ternary weight networks. Retrieved from https://arxiv.org/pdf/1605.04711.pdf
[15]. Zhou, A., Yao, A., Guo, Y., Xu, L., & Chen, Y. (n.d.). INCREMENTAL NETWORK QUANTIZATION: TOWARDS LOSSLESS CNNS WITH LOW-PRECISION WEIGHTS.
[16]. Cun, L., Denker, S., Le Cun, Y., Denker, J. S., & Sol1a, S. A. (n.d.). Optimal Brain Damage. Retrieved from https://papers.nips.cc/paper/250-optimal-brain-damage.pdf
[17]. Han, S., Mao, H., & Dally, W. J. (n.d.). DEEP COMPRESSION: COMPRESSING DEEP NEURAL NETWORKS WITH PRUNING, TRAINED QUANTIZATION AND HUFFMAN CODING. Retrieved from https://arxiv.org/pdf/1510.00149.pdf
[18]. Tu, M., Berisha, V., Woolf, M., Seo, J.-S., & Cao, Y. (n.d.). RANKING THE PARAMETERS OF DEEP NEURAL NETWORKS USING THE FISHER INFORMATION. Retrieved from http://www.mirlab.org/conference_papers/International_Conference/ICASSP 2016/pdfs/0002647.pdf
[19]. Dong, X., Chen, S., & Pan, S. J. (n.d.). Learning to Prune Deep Neural Networks via Layer-wise Optimal Brain Surgeon. Retrieved from https://arxiv.org/pdf/1705.07565.pdf
[20]. Aghasi, A., Abdi, A., Nguyen, N., & Romberg, J. (n.d.). Net-Trim: Convex Pruning of Deep Neural Networks with Performance Guarantee. Retrieved from https://arxiv.org/pdf/1611.05162.pdf
[21]. Lei Jimmy Ba and Rich Caruana: Do Deep Nets Really Need to be Deep? https://arxiv.org/pdf/1312.6184.pdf
[22]. Hinton, G., Vinyals, O., & Dean, J. (2015). Distilling the Knowledge in a Neural Network. Retrieved from https://arxiv.org/pdf/1503.02531.pdf
[23]. Romero, A., Ballas, N., Kahou, S. E., Chassang, A., Gatta, C., & Bengio, Y. (2015). FITNETS: HINTS FOR THIN DEEP NETS. Retrieved from https://arxiv.org/pdf/1412.6550.pdf
[24]. Chen, G., Choi, W., Yu, X., Han, T., & Chandraker, M. (n.d.). Learning Efficient Object Detection Models with Knowledge Distillation. Retrieved from https://papers.nips.cc/paper/6676-learning-efficient-object-detection-models-with-knowledge-distillation.pdf
[25]. Wang, C., Lan, X., & Zhang, Y. (n.d.). Model Distillation with Knowledge Transfer from Face Classification to Alignment and Verification. Retrieved from https://arxiv.org/pdf/1709.02929.pdf

发布了111 篇原创文章 · 获赞 206 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/LoseInVain/article/details/96651171