今天要跟大家分享的是关于深度学习模型压缩算法的综述,我们将以2020年的一篇名为《A Survey of Model Compression and Acceleration for Deep Neural Networks》的综述文章为基础,结合另一篇2020年发表的名为《A Comprehensive Survey on Model Compression and Acceleration》的文章,并加入一定的分析和补充。
背景介绍
近年来,深度神经网络(deep neural networks,DNN)逐渐受到各行各业的关注。它是指具有更深层(不止一个隐藏层)的神经网络,是深度学习的基础。很多实际的工作通常依赖于数百万甚至数十亿个参数的深度网络,这样复杂的大规模模型通常对计算机的CPU和GPU有着极高的要求,并且会消耗大量内存,产生巨大的计算成本。随着一些便携式设备(如移动电话)的快速发展,如何将这些复杂的计算系统部署到资源有限的设备上就成为了需要应对的全新挑战。这些设备通常内存有限,而且计算能力较低,不支持大模型的在线计算。因此需要对模型进行压缩和加速,以求在基本不损失模型精度的条件下,节约参数并降低其计算时间。目前,在模型压缩和加速方面常用的方法大致可以分为四类:剪枝与量化(parameter pruning and quantization)、低秩因子分解(low-rank factorization)、迁移/压缩卷积滤波器(transferred/compact convolutional filters)、蒸馏学习(knowledge distillation)。作者在文中给出的图1展示了这些方法的定义及其之间的对比:
早期的研究表明,对构建的网络进行剪枝和量化在降低网络复杂性以及解决过拟合问题方面是有效的(Gong et al. 2014)。同剪枝与量化有关的方法可以进一步分为三个子类:量化与二值化(quantization and binarization)、网络剪枝(network pruning)、结构矩阵(structural matrix)。
1.量化与二值化(quantization and binarization)
在DNN中,权重通常是以32位浮点数的形式(即32-bit)进行存储,量化法则是通过减少表示每个权重需要的比特数(the number of bits)来压缩原始网络。此时权重可以量化为16-bit、8-bit、4-bit甚至是1-bit(这是量化的一种特殊情况,权重仅用二进制表示,称为权重二值化)。8-bit的参数量化已经可以在损失小部分准确率的同时实现大幅度加速(Vanhoucke et al. 2011)。图2展示了基于修剪、量化和编码三个过程的压缩法:首先修剪小权重的连接,然后使用权重共享来量化权重,最后将哈夫曼编码应用于量化后的权重和码本上。
受到早期剪枝方法和神经网络过度参数化问题的启发,Han et al.(2015)提出了三步法来进行剪枝。其思想是,首先修剪激活小于某个预定义阈值的所有连接权重(不重要的连接),随后再识别那些重要的连接权重。最后,为了补偿由于修剪连接权重而导致的精度损失,再次微调/重新训练剪枝模型。这样的剪枝和再训练过程将重复数次,以减小模型的大小,将密集网络转换为稀疏网络。这种方法能够对全连接层和卷积层进行修剪,而且卷积层比全连接层对修剪更加敏感。从卷积层修剪一些不重要的卷积核能够直接减少计算成本并且加速模型。但是,使用网络剪枝方法同样存在着一些问题。首先,使用或正则化进行剪枝比常规方法需要更多的迭代次数才能收敛。其次,所有的剪枝都需要手动设置神经网络层的灵敏度,这需要对参数进行微调,在某些应用中可能会十分复杂。最后,网络剪枝虽然通常能够使大模型变小,但是却不能够提高训练的效率。
3.结构矩阵(structural matrix)
神经网络各层之间使用的是非线性变换,这里的是对每个元素特异的非线性算子,是输入向量,代表维的参数矩阵,此时的运算复杂度为
(V. Sindhwani et al. 2015)。一个直观的剪枝方法就是使用参数化的结构矩阵。一个大小为,但是参数量却小于的矩阵就叫做结构矩阵。Cheng et al.(2015)提出了一种基于循环预测的简单方法,对于一个向量,其对应的维循环矩阵定义如下:
给定一个维数为,且有个卷积核的卷积层,其权重矩阵可以表示为一个维的张量(Granés and Santamaria 2017)。对于全连接层而言,可以用矩阵(2阶张量)来表示。因此对权重矩阵进行分解就是对张量进行分解。张量分解指的是,用标量(0阶张量)、向量(1阶张量)、矩阵(2阶张量)和一些其他高阶的张量来表示原始张量的方法。对矩阵可以应用满秩分解(full-rank decomposition)和奇异值分解(singular value decomposition, SVD),对三维及三维以上张量可以应用Tucker分解和CP分解(Canonical Polyadic)(Deng et al. 2020)。
CP分解。该分解是Tucker分解的一种特殊形式。如果Tucker分解中的每个等于正整数,并且核张量满足,除了之外的所有元素都是0,此时Tucker分解就成为了CP分解。与Tucker分解相比,CP分解常用于解释数据的组成成分,而前者主要用于数据压缩。图7展示了三阶张量被R个组成部分分解的过程,这个过程也可以用如下的公式来表示,其中,,,(Marcella Astrid and Seung- and Ik Lee 2018)。
Cohen and Welling(2016)提出了使用卷积滤波器压缩CNN模型的想法,并在研究中引入了等变群理论(the equivariant group theory)。让作为输入,作为一个神经网络或者网络层,作为迁移矩阵,则等价的概念定义如下:
这样的定义指的是,迁移矩阵先对输入x进行变换,再将其传输到所得到的结果应该跟先将输入映射到神经网络上再做变换得到的结果相同。值得注意的是,和不一定相同,因为它们作用在不同的对象上。根据这样的理论,通过将变换应用于层或者滤波器来压缩整个网络模型就十分合理。从经验来看,使用一组大的卷积滤波器也对深层CNN有益,具体方法是将一些变换应用于一组充当模型正则化器的小型基滤波器上。沿着这一研究方向,近期的许多研究提出了从一组基滤波器出发构建卷积层的思想。它们的共同点是,迁移矩阵是只在卷积滤波器的空间域中操作的一类函数。例如,Shang et al. (2016)发现,CNN的较低卷积层通过学习冗余的滤波器来提取输入信号的正负相位信息,并将定义为简单的否定函数:
其中,是基础的卷积滤波器,是由激活与相反的移位(shift)构成的滤波器,并且这些移位是在最大池(max-pooling)操作后选择的。通过这样操作,就可以很容易的实现在所有卷积层上的二倍压缩率。它还表明,否定变换作为一个强大的正则化方法,能够用以提高分类精度。一种直观的理解是,具有成对正负约束的学习算法可以产生实用而不是冗余的的卷积滤波器。此外,Zhai et al.(2016)将定义为应用于2维滤波器的平移函数集:
在现有的KD方法中,学生模型的学习依赖于教师模型,是一个两阶段的过程。Lan et al.(2018)提出了实时本地集成(On-the-fly Native Ensemble,ONE),这是一种高效的单阶段在线蒸馏学习方法。在训练期间,ONE添加辅助分支以创建目标网络的多分支变体,然后从所有分支中创建本地集成教师模型。对于相同的目标标签约束,可以同时学习学生和每个分支。每个分支使用两个损失项进行训练,其中最常用的就是最大交叉熵损失(softmax cross-entropy loss)和蒸馏损失(distillation loss)。
在网络压缩这一步,可以使用深度神经网络方法来解决这个问题。Romero et al.(2015)提出了一种训练薄而深的网络的方法,称为FitNets,用以压缩宽且相对较浅(但实际上仍然很深)的网络。该方法扩展了原来的思想,允许得到更薄、更深的学生模型。为了学习教师网络的中间表示,FitNet让学生模仿老师的完全特征图。然而,这样的假设太过于严格,因为教师和学生的能力可能会有很大的差别。
[1] Gong Y, Liu L, Ming Y, et al. Compressing Deep Convolutional Networks using Vector Quantization[J]. Computer Science, 2014.
[2] Vanhoucke V, Senior A, Mao M Z. Improving the speed of neural networks on CPUs[C]// Deep Learning and Unsupervised Feature Learning Workshop, NIPS 2011. 2011.
[3] Han S, Pool J, Tran J, et al. Learning both Weights and Connections for Efficient Neural Networks[J]. MIT Press, 2015.
[4] Srinivas S, Babu R V. Data-free parameter pruning for Deep Neural Networks[J]. Computer Science, 2015:2830-2838.
[5] Li H, Kadav A, Durdanovic I, et al. Pruning Filters for Efficient ConvNets[J]. 2016.
[6] Chen S, Zhao Q. Shallowing Deep Networks: Layer-wise Pruning based on Feature Representations[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2018, pp. 1-1.
[7] Sindhwani V, Sainath T N, Kumar S. Structured Transforms for Small-Footprint Deep Learning[J]. MIT Press, 2015, pp. 3088–3096.
[8] Cheng Y, Yu F X, Feris R S, et al. An exploration of parameter redundancy in deep networks with circulant projections[J]. IEEE, 2015.
[9] Cheng Y, Yu F X, Feris R S, et al. Fast Neural Networks with Circulant Projections[J]. IEEE, 2015.
[10] C Granés Santamaria. Compression of convolutional neural networks using Tucker Decomposition. 2017.
[11] Deng L, Li G, Han S, et al. Model Compression and Hardware Acceleration for Neural Networks: A Comprehensive Survey[J]. Proceedings of the IEEE, 2020, 108(4):485-532.
[12] Marcella Astrid and Seung‐ and Ik Lee. Deep compression of convolutional neural networks with low‐rank approximation[J]. ETRI Journal, 2018, 40.0(4.0).
[13] Cohen T S, Welling M. Group Equivariant Convolutional Networks[C]// International Conference on Machine Learning (ICML). 2016.
[14] Shang W, Sohn K, Almeida D, et al. Understanding and Improving Convolutional Neural Networks via Concatenated Rectified Linear Units[J]. JMLR.org, 2016.
[15] Zhai S, Cheng Y, Lu W, et al. Doubly Convolutional Neural Networks[J]. 2016.
[16] Lan X, Zhu X, Gong S. Knowledge Distillation by On-the-Fly Native Ensemble[J]. 2018, pp. 7528–7538.
[17] Romero A, Ballas N, Kahou S E, et al. FitNets: Hints for Thin Deep Nets[J]. Computer ence, 2015.