将深度学习模型应用于自动驾驶的感知任务上,模型预测结果的准确性和实时性是两个重要指标。一方面,为了确保准确可靠的感知结果,咱们会但愿选择多个准确性尽量高的模型并行执行,从而在完成多种感知任务的同时,提供必定的冗余度,但这不可避免的意味着更高的计算量和资源消耗。另外一方面,为了确保车辆在各类突发状况下都能及时响应,咱们会要求感知模块的执行速度必须与自动驾驶场景的车速相匹配,这就对深度学习模型的实时性提出了很高的要求。另外,在保证高准确性和高实时性的前提下,咱们还但愿下降模型对计算平台的算力、内存带宽、功耗等方面的要求,从而提升自动驾驶系统总体的效能。为了应对上述挑战,咱们须要从各类角度对深度学习模型进行压缩和加速。实际上,模型压缩和加速是一个至关庞大且活跃的研究领域,包含众多的研究方向。本文接下来会简要介绍目前模型压缩和加速领域的主要技术方向,并聚焦于模型裁剪算法这一方向进行详细探讨。在讨论具体的算法以前,首先让咱们简要回顾一下深度学习模型的理论复杂度评价指标,以及影响模型实际运行性能的各类因素。html
深度学习模型的复杂度主要体如今计算量、访存量和参数量上。算法
图1:Roofline Model(图中左侧红色区域为带宽受限,右侧绿色区域为算力受限)安全
深度学习模型压缩和加速算法是一个至关庞大且活跃的研究领域,涵盖软件和硬件,包括众多的技术方向,简要归纳以下:网络
除此以外,在更广义的视角下,使用多任务学习、多传感器融合、利用多帧之间的相关性等方法经过减小模型数量和数据处理量,也能间接的下降计算资源消耗,提升实时性。整体而言,上面介绍的各类技术路线分别从不一样的角度提高模型的运行速度、减小模型的资源消耗,可谓条条大路通罗马。在实际应用中,这些方法相互之间一般并不矛盾,能够相互弥补,所以咱们一般会叠加使用,使总体达到更好的效果。架构
下面让咱们聚焦在模型裁剪算法这个研究方向上。ide
广义上的模型裁剪算法,其本质是在各类粒度下寻找更为稀疏的模型表征。对于模型的权重,咱们既能够在神经元的粒度上进行裁剪(Fine Grained Pruning),也能够在每一个卷积核的通道粒度上进行裁剪(Channel Pruning),甚至能够直接拿掉那些咱们认为对于模型表征没有太多贡献的卷积核(Filter Pruning)。按照裁剪的粒度,咱们能够将裁剪算法划分为非结构化裁剪和结构化裁剪这两大类方式。函数
模型的非结构化裁剪是在神经元级别对网络的权重进行裁剪 [12],算法的具体流程分为三步,第一步是正常训练网络,第二步是人为设定一个阈值并对全部权值低于该阈值的神经元进行裁剪,第三步是经过微调网络来恢复损失的精度。这种裁剪方式的灵活性最高,可是会致使权重矩阵稀疏化,须要额外的稀疏矩阵运算库或者专门设计的硬件支持 [20] 才能真正达到加速效果,在实际应用中存在必定限制。所以下面咱们主要介绍对于实现较为友好的各类结构化裁剪算法。性能
论文 [13] 提出了一种在 Filter 粒度上简单高效的模型裁剪算法。该算法的裁剪依据是卷积核的 L1Norm。对于每一个卷积层,咱们会统计每一个卷积核权重矩阵的 L1Norm,并按照 L1Norm 的取值从小到大排序,如图2所示。而后人为设定一个保留的比例(例如 80%),将最小的 20% 卷积核移除。做者认为,对于一样的输入特征图,一个卷积核相比其余卷积核是否更重要、是否有必要继续存在于模型中,很大程度上取决于它的总体权值大小,L1Norm越大的卷积核更有可能产生响应值较大的输出特征图,进而更有可能对网络最后的输出结果产生更大贡献。反过来,若是一个卷积核的全部权值都很是接近于 0,那么不管给它输入什么样的特征图,其输出也将都是 0,这说明该卷积核对于整个模型的表征能力贡献较小,颇有多是冗余的,所以能够直接裁剪去除。算法的具体执行流程与上面介绍的非结构化裁剪相似,逐层执行 Filter Pruning 并搭配进行 Finetune 恢复精度,直到全部层都完成裁剪。学习
从计算量优化角度来分析,若是咱们对第 i 个卷积层进行 Filter Pruning,保留其中 r% 的卷积核,因为卷积层的计算量与输出通道数呈正比,所以该层的计算量将降为裁剪前的 r%;同时,因为第 (i+1) 个卷积层的输入通道数降为原来的 r%,所以该层的总体计算量也降为原来的 r%,并且每一个卷积核也都得以精简相应的输入通道。简而言之,对第 i 个卷积层按保留比例 r% 进行裁剪,会致使第 i 层和第 (i+1) 层的计算量都降为以前的 r%。优化
图2:对 VGG16 模型每一个卷积层的全部卷积核按照 L1Norm 进行排序后的取值分布状况。横轴为归一化后的卷积核索引,纵轴为归一化后的卷积核权重的 L1Norm 取值。
论文 [14] 提出了一种在 Channel 粒度上的模型裁剪算法。该算法没有依据卷积核的取值进行裁剪,而是将注意力聚焦在特征图的不一样通道上,其核心思想在于分析输入特征图的各个通道对输出特征图的贡献大小,并使用 LASSO 回归将这一问题转变为对输入通道的选择问题。做者指出,若是咱们能够去掉输入特征图的某个或多个通道,而且还可以确保该卷积层的输出特征图基本不变,那么这就意味着那些去掉的输入通道自己对于输出特征图的贡献很小,能够安全去除而不影响网络的精度。
图3:Channel Pruning 示意图,左侧为输入特征图,中间为卷积核,右侧为输出特征图,虚线表示裁剪。
整个裁剪算法主要分为两步,能够参考图3所示。
第一步:通道选择。如上图所示,假设该卷积层的输入特征图具备 4 个通道,3 个卷积核,每一个输入通道定义一个权重系数 beta_i。为了获取输入特征图与输出特征图的原始对应关系,咱们须要对输入特征图按照卷积核的感觉野进行屡次随机采样,得到矩阵 X,并根据权重矩阵 W 得到相应的输出特征点集合 Y,构造优化方程,这里咱们对 beta 进行优化,目标是最小化原输出特征点与通过 beta 权重系数获得的输出特征点之间的偏差,添加 L1 正则项,经过调整 lambda 能够调整 beta 中置零项的个数,lambda 越大,意味着咱们裁剪的输入通道数越多。
LaTeX
第二步:最小化重建偏差。在完成 beta 权重系数的选择后(如上图所示,输入特征图中的红色通道被移除,与此同时,全部卷积核的红色输入通道也被移除),咱们能够进一步对卷积核的权重矩阵 W' 进行优化,目的是经过调整 W',让裁剪后的输入特征图通过卷积后与输出特征图的偏差尽量小。这步操做可以有效的恢复裁剪后模型的精度,减少后期微调训练的工做量。
代码块LaTeX
咱们评价模型裁剪算法一般会关注两个指标,一个是裁剪后模型的准确率损失是多少,一个是裁剪先后模型在相同计算平台上的实际运行速度提高是多少,前者反映了算法所使用裁剪依据的合理性,后者反映了算法的实际有效性。
针对第一个指标,表1给出了多种模型加速算法针对同一个模型(VGG16)分别将计算量进行 50% 裁剪(2x)、75% 裁剪(4x)、80% 裁剪(5x)状况下在 ImageNet 数据集上的 Top5 准确率损失数据。能够看到,Filter Pruning 在裁剪 75% / 80% 计算量的状况下,致使模型的精度分别降低 7.9% 和 22%,而一样裁剪比的 Channel Pruning 对模型的精度损失仅有 1% 和 1.7%,裁剪质量提高十分明显。
图4:不一样裁剪算法在一样减小 VGG16 模型 2倍、4倍、5倍计算量的条件下,在 ImageNet 数据集上 Top5 Accuracy 的降低状况,数值越小越好。
针对第二个指标,表2给出了Channel Pruning与其余基于矩阵低秩近似算法在相同裁剪比的实际加速效果对比。能够看到,一样是裁剪掉 75% 的计算量,通过各类矩阵低秩近似算法变换后的模型因为并行度降低,几乎没有加速效果,甚至有些运行速度比以前更慢;相比之下,采用结构化裁剪的 Channel Pruning 算法可以达到 2.5 倍的加速,同时精度损失只有 1%。
图5:不一样裁剪算法在一样减小 VGG16 模型 4 倍计算量的条件下,在 Titan X 上实测的准确率损失和每张图片预测耗时状况,数值越小越好。
在两种粒度上进行裁剪的异同点
上面介绍的 Channel Pruning 方法主要适用于已经完成训练的模型,那么咱们是否可以在模型的最初训练阶段就为 Channel Pruning 作好准备呢?答案是确定的。论文 [15, 16] 提出对模型每一个卷积层的各个输入通道分配权重系数 gamma,而后将这些权重系数做为 L1 正则项加入损失函数,从而实如今模型训练阶段同时对常规模型权重和各通道权重进行优化,如图6所示。这种裁剪机制的好处在于,当完成模型训练后,咱们不只获得了可用的模型,还同时获得了模型各层权重在通道尺度上的重要性分布,所以咱们就能够经过设置阈值来快速完成全部卷积层的通道裁剪操做,最后 Finetune 恢复精度。
图6:对卷积层的每一个通道设置缩放系数,在训练过程当中对各个通道进行稀疏约束。
在具体实现上,卷积层各个通道重要性系数的学习,并非经过在每一个卷积层以后添加 Scaling layer 来进行的,由于卷积与缩放操做都属于线性变换,连在一块儿总体依然是一个线性变换,若是仅对Scaling层进行L1正则,可能会致使卷积层权重出现负补偿,并不能有效的对卷积层的各个通道进行稀疏约束。所以论文中使用的方法是,在每一个卷积层以后添加 BN 层,而后对 BN 层的 Scaling Factor gamma 施加 L1 正则。咱们知道 Batch Norm 会首先对输入特征图的每一个通道按照当前batch的均值和方差进行归一化,再经过缩放与平移输出。为了强制使 BN 的 gamma 取值尽量稀疏,咱们能够在 Loss 中添加 gamma 的 L1 Norm 做为惩罚项,修改 BN 层的反向传播过程,其余部分正常训练便可。实际上,不少网络中(例如 ResNet)已经默认将卷积与BN搭配使用,所以对于这些网络而言,甚至网络结构都不须要改变,就能够直接使用这种裁剪算法边训练、边学习通道裁剪系数,十分方便。
上面介绍的裁剪算法,不论裁剪粒度是通道仍是卷积核,不论裁剪依据是来自于权重仍是特征图,都有一个共性,就是须要基于经验选择各层的裁剪阈值比例和迭代轮数,整个模型裁剪过程当中不可避免的须要大量人工干预。这带来两个方面的问题,一个是效率,一个是质量。一方面咱们但愿模型裁剪的过程可以像模型训练同样全自动高效完成,另外一方面,基于人工经验的裁剪方案每每在实际中很难达到最优解,咱们但愿可以让模型裁剪算法生成更高质量的方案。所以,论文 [17] 提出了一种基于强化学习的自动化模型裁剪算法 AMC。该方法不只能够自动化执行,并且与使用相同裁剪算法的人工裁剪方案相比,这种方法最后生成的总体模型裁剪方案的精度损失更低。
图7:Overview of AutoML for Model Compression (AMC) Engine.
该算法采用基于 DDPG 的 Agent,对模型的各个卷积层进行逐层裁剪。对于每一层,Agent 首先会得到描述该层以及相邻层计算特性的状态空间向量(包括卷积的尺寸、计算量等信息),Actor 根据该状态和本身的策略网络生成相应的裁剪比(即行为),而后调用裁剪算法完成相应的裁剪操做。当整个网络都完成一次裁剪后,就能够计算出裁剪先后引入的精度损失,而后经过预约义的奖励函数将奖励值返回给 Agent, Critic 会根据状态和奖励更新本身的价值网络,通过屡次迭代不断更新策略网络和价值网络,完成 Exploration-Exploitation 的过程,得到最后的裁剪模型,而后对这个模型进行 Finetune,得到最终的模型。论文提出了奖励函数的两种设计方案,一种是经过限定搜索空间,搜索在指定裁剪范围内精度损失最小的模型裁剪方案。另外一种则是将模型计算量、参数量、预测耗时等指标直接引入到奖励函数,在保持精度不变的前提下,搜索让这些指标尽量小的裁剪方案。针对 VGG16 的裁剪实验结果显示,在一样精简 80% 计算量的状况下,采用 AMC 裁剪方法不只能够自动完成,并且最终模型的精度损失比其余人工裁剪方案的精度损失更低,在 ImageNet 上的 Top1 准确率降低仅有 1.4%。
图8:AMC 与其余裁剪算法在计算量减小量和准确率损失上的对比。
本文回顾了模型加速领域中模型裁剪方向上的几种比较成功的裁剪算法。经过上面的介绍,咱们能够看到,模型裁剪算法的核心思想是在各类粒度下寻找更为稀疏的模型表征,去除模型的冗余部分。须要注意的是,模型中的“冗余部分”始终是一个相对的概念,它与模型自己的结构以及模型所处理的任务难度有密切关系。模型体积越大、层数越深、所面对的任务越简单,也就意味着模型的相对冗余度越高,可使用更大比例进行裁剪而不明显影响精度。但同时咱们也须要认识到,从目前的模型裁剪算法来看,在保持精度损失较小的前提下,全部裁剪算法都存在必定的裁剪上限,一旦超过上限,再进一步裁剪都会不可避免的损伤模型的精度,即使 finetune 也没法恢复。所以,如何可以更为精准的对模型进行裁剪而不损失精度,而且同时保证明际运行的加速比,是模型裁剪方向的将来研究重点,让咱们拭目以待。
1. Karen Simonyan and Andrew Zisserman. "Very deep convolutional networks for large-scale image recognition". The International Conference on Learning Representations (ICLR). 2015.
2. Samuel Williams, Andrew Waterman, and David Patterson. "Roofline: An insightful visual performance model for multicore architectures". Communications of The ACM, Vol.52. 2009.
3. Andrew G. Howard, et al. "MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications". arXiv preprint arXiv:1704.04861. 2017.
4. Mark Sandler, et al. "MobileNetV2: Inverted Residuals and Linear Bottlenecks". arXiv preprint arXiv:1801.04381. 2018.
5. Xiangyu Zhang, et al. "ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices". IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2018.
6. Ningning Ma, et al. "ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design". European Conference on Computer Vision (ECCV). 2018.
7. S. Ioffe and C. Szegedy. "Batch normalization: Accelerating deep network training by reducing internal covariate shift". arXiv preprint arXiv:1502.03167. 2015.
8. Kaiming He, et al. "Deep residual learning for image recognition". IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2016.
9. Geoffrey Hinton, Oriol Vinyals, and Jeff Dean. "Distilling the Knowledge in a Neural Network". Conference and Workshop on Neural Information Processing Systems (NIPS) Workshop. 2014.
10. Adriana Romero, et al. "FitNets: Hints for thin deep nets". The International Conference on Learning Representations (ICLR). 2015.
11. Sergey Zagoruyko, Nikos Komodakis. "Paying More Attention to Attention: Improving the Performance of Convolutional Neural Networks via Attention Transfer". The International Conference on Learning Representations (ICLR). 2017.
12. Han Song, et al. "Learning both weights and connections for efficient neural network". Advances in Neural Information Processing Systems (NIPS). 2015.
13. Hao Li, et al. "Pruning filters for efficient convnets". The International Conference on Learning Representations (ICLR). 2017.
14. He Yihui, Zhang Xiangyu, and Sun Jian. "Channel pruning for accelerating very deep neural networks". Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2017.
15. Zhuang Liu, et al. "Learning efficient convolutional networks through network slimming". IEEE International Conference on Computer Vision (ICCV). 2017.
16. Jianbo Ye, et al. "Rethinking the Smaller-Norm-Less-Informative Assumption in Channel Pruning of Convolution Layers". The International Conference on Learning Representations (ICLR). 2018.
17. He Yihui, et al. "AMC: AutoML for Model Compression and Acceleration on Mobile Devices". European Conference on Computer Vision (ECCV). 2018.
18. Max Jaderberg, Andrea Vedaldi and Andrew Zisserman. "Speeding up convolutional neural networks with low rank expansions". arXiv preprint arXiv:1405.3866. 2014.
19. Zhang Xiangyu, et al. "Accelerating very deep convolutional networks for classification and detection". IEEE transactions on pattern analysis and machine intelligence, 38(10):1943–1955. 2016.
20. Han Song, et al. "EIE: Efficient Inference Engine on Compressed Deep Neural Network". arXiv preprint arXiv:1602.01528. 2016.
21. Matthieu Courbariaux, Yoshua Bengio, and Jean-Pierre David. "BinaryConnect: Training Deep Neural Networks with binary weights during propagations". arXiv preprint arXiv:1511.00363. 2015.
22. Mohammad Rastegari, et al. "XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks". European Conference on Computer Vision (ECCV). 2016.
23. Itay Hubara, et al. "Quantized Neural Networks: Training Neural Networks with Low Precision Weights and Activations". arXiv preprint arXiv:1609.07061. 2016.
24. 模型加速概述与模型裁剪算法技术解析(美团无人配送算法团队)
25. https://www.zhihu.com/search?type=content&q=%E6%A8%A1%E5%9E%8B%E5%8E%8B%E7%BC%A9
26. 《解析卷积神经网络》关于第四章卷积神经网络的压缩
27. 深度学习模型压缩与加速综述