1. 模型剪枝量化背景
最近几年DNN取得了惊人的进展,它被广泛用于图像、语音和其他行业领域。当前AI在准确性方面取得了很大的提高,有些已经超过人类的水平,但是这些是靠耗费大量计算资源和存储资源来实现的。而我们的端设备计算和存储能力相对较小,同时实时性要求又比较高,这就需要有方法来减少模型的大小和计算量。于是出现了大量解决资源瓶颈问题的方法,这些方法包括剪枝、量化压缩和层融合,以及一些针对DNN的专用加速硬件和针对特定硬件的优化。下面将根据论文对模型剪枝和量化进行简要介绍。
1.1 模型剪枝
剪枝包括结构性剪枝和非结构性剪枝(稀疏化),一般分为三个步骤,先训练一个大的过参数化(over-parameterized)模型,然后对模型进行剪枝,最后重新训练剪枝后模型以达到预期的效果。
《To prune, or not to prune: exploring the efficacy of pruning for model compression》
作者提供了一个添加mask层的方式来进行稀疏的方法。初始时mask值都是1,也就是所有的权值都不强制设置为0。当训练达到指定step 后,开始逐步从初始稀疏值()经过n个pruning step调整到目标稀疏值(),剪枝间隔为。作者定义了一个指数特征的目标稀疏值计算公式,如下:for 渐进式剪枝过程如下图所示:

从图中可以看出调整的幅度越来越小,呈指数特征。有了每次调整的目标稀疏值,如何去决定要把哪些权重值对应的mask置成0呢?作者采用的是把所有权重分成256个区间,计算每个区间的分布,从而得到可以达到目标稀疏值的权重值阈值,小于这个阈值的mask层位置置成0。在整个训练完成后,把权重和mask点积,合并两个层,从而得到最后的稀疏权重矩阵。整个论文的代码已经合入了tensorflow contrib,并且提供了一个cifar10剪枝例子。代码地址:https://github.com/tensorflow/tensorflow/tree/v1.12.0/tensorflow/contrib/model_pruning
《Learning both Weights and Connections for Efficient Neural Network》
整个训练过程包括三个步骤,其中剪枝和重新训练可以多次循坏执行,以尽可能到达所需精度和压缩比。第一步:通过正常的训练来学习连接。与传统的训练不同,我们不是在学习权重的最终值,而是在学习哪些连接是重要的;第二步:剪除低权重的连接,所有权值低于阈值的连接都从网络中移除,即将密集网络转换为稀疏网络;(通过mask矩阵来记录) 第三步:对网络进行重新训练,以学习剩余稀疏连接的最终权值。这一步至关重要,如果不进行再训练而使用修剪后的网络,准确率会受到很大影响。

按照正常方法训练初始模型。实验发现,采用L2做正则项较好。
Prune Connection
作者认为该模型中权重的大小表征了其重要程度,因此将初始模型中那些低于某个阈值(经验设定)的权重参数置成0;
Re-Train
重新训练,以期其他未被剪枝的权重能够补偿pruning带来的精度下降。在重新训练的过程中,由于此时的网络稀疏度逐渐下降,Dropout的参数需要随着剪枝次数的增加而减小。假设原始网络的连接数为,剪枝后网络的连接数为,原始网络的Dropout Rate为,作者定义retraining的Dropout Rate 为
《PRUNING FILTERS FOR EFFICIENT CONVNETS》

剪枝方法
对于每一个kernel matrix按列绝对值求和 对求和结果排序 裁剪掉m个filters(对应内核矩阵的列),以及对应的输出(层中),它又是下一层的输入,所以也得去掉对应的输入filters(对应内核矩阵的行), 剩余的kernel weights保留。在跨越多层裁剪的过程中,可能出现kernel matrix裁剪交叉的情况,两种处理方法:
Independent pruning 假设蓝色是确定要裁剪的,然后计算绿色的L1时,要考虑黄色的值,跟之前的裁剪无关。Greedy pruning 也就是计算绿色的L1时,不考虑已经被裁剪的黄色值

这两种方法测试结果,Greedy pruning的准确率会更高。
残差网络的处理

第一层随意裁剪(根据需求),因为它只会影响的输入,但是不会影响最后的输出。residual block里面的裁剪需要注意,因为裁剪需要和shortcut layer保持一致,才能累加。因为identical feature maps比added residual maps更重要,所以后者的裁剪结果应该由前者决定。为了确定要修剪哪些特征图,论文中使用与1 × 1 kernels shortcut与 convolutional layers采用相同的选择标准。residual block 中第二层修剪的 Filter index 与shortcut layer 所选择的 Filter index 相同。
Prune and Retrain 方法
1、裁剪所有层后再继续训练网络
2、裁剪一层,重新训练一下,一直循环到所有层裁剪完毕 测试结果,第二种方法效果更好。
《DMCP: Differentiable Markov Channel Pruning for Neural Networks》
将模型剪枝看作模型结构搜索的工作大多都采用强化学习算法或者遗传算法,而这些算法需要在原模型中大量的采样子结构来评估精度,甚至需要花大量时间来训练子结构,因此很难泛化到更大更复杂的网络。
剪枝过程
DMCP选择将剪枝的过程建模为一个马尔科夫模型。在一个卷积层中,定义为保留前个通道的情况下,保留第k个通道的概率。保留前k个通道的概率为, 则有
保留第k-1个通道后,保留前k-2个通道与保留第k个通道条件独立,且不保留第k-1个通道时,保留第k个通道的概率为0,则有下面的式子成立:
其中为马尔科夫模型中的转移概率。这样,通过在优化完毕后的马尔可夫模型上采样就可以得到相应的剪枝后的模型。

训练过程
DMCP训练程序可分为两个阶段,即权重更新阶段和网络结构参数的更新阶段。第一阶段和普通的训练相同,更新未剪枝的模型参数。第二则是将马尔科夫模型中的转移概率和原模型结合更新网络结构,学习得到满足FLOPs要求的模型。这两个阶段的损失函数计算方式不同,第一个阶段的损失函数为:
, 这里 是交叉熵函数。,第二个阶段的损失函数为:, 其中 其中是结构损失,是用于平衡两个损失的超参数。《Learning Efficient Convolutional Networks through Network Slimming》
该论文提出了 Network Slimming 技术来学习更紧凑的 CNN。该方法是将L1正则化施加到BN层的缩放因子 上,L1正则化推动BN层的缩放因子 趋向于零,这使得我们能够鉴别出不重要的通道或者神经元( 越小,说明该通道越不重要),因为每一个缩放因子都和一个特定的CNN卷积通道(或者全连接层的一个神经元)相关联。

缩放因子和稀疏性惩罚:
为每个通道引入一个缩放因子 ,乘以该通道的输出,然后联合训练网络权值和这些缩放因子,并对后者进行稀疏正则化。函数损失可定义为:
利用BN层的缩放因子 :
Network Slimming 过程的结果是一个紧凑的网络,可以多次应用整个训练过程学习一个更紧凑的模型。

1.2 模型量化
一般模型内部的计算都采用了浮点数计算,浮点数的计算会消耗较大的计算资源,如果在不影响模型准确率的情况下,模型内部可以采用其他简单数值类型进行计算,计算速度会提高很多,消耗的资源会大大减小,尤其对于资源受限设备来说,这点尤其重要。由此引入量化技术。从量化的bit数来区分,常用的量化技术有8 bit量化(int8 uint8)、二值化、三值化量化等。因为8 bit量化比较通用,易于实现,是我们重点研究的对象。下文描述的都是8bit量化。 从量化的过程来区分,量化大致可分为2种:存储数据为uint8(int8)格式,计算过程用float格式的量化,这种量化仅仅减少了存储的空间,并没有降低对算力的要求;有存储和计算过程都采用uint8(int8)的全量化,对存储空间和算力的要求都会在量化后大大减少。前一种方式利用价值不高,用的不多。后一种又分为三种方式:Post Training Quantization、Quantization Aware Training和Calibration Quantization(小批量数据量化)。Post Training Quantization 是直接量化训练好的模型。因为不能知道所有变量的范围,需要用户指定。因为不能区分各个layer的变量范围,量化精度较低。Quantization Aware Training 量化方式是在训练图上添加模拟量化算子(simulated quantization operations)来实现的,量化过程耗时长。Calibration Quantization 仅仅通过统计小批量数据的最大值、最小值等信息来进行推理时量化,量化过程迅速,精度和Quantization Aware Training量化方式相当。
2. Adlik做了什么
2.1 模型剪枝
模型优化器采用了filter剪枝的方法。所谓filter剪枝,是指在裁剪卷积层kernel时,剪去了整个filter,这样,对应的卷积层输出的feature map也就被相应的剪去了。如下图所示,原本有4个filter的卷积核,当剪去了一个filter后,该卷积层的输出,就从原来的4个feature map变成了3个。

filter剪枝示意图
如果在这个卷积层后面,还有一个卷积层,这层输出的feature map就是下一层的输入,即下一层输入的channel数也会相应的减少,对应的,下一层filter的channel数也要相应的变少。如下图所示,当卷积层的filter从4个裁剪成3个后,下一层卷积层的输入channel从4变成3,卷积核的filter也从4个channel对应的收缩为3个。

filter剪枝示意图:卷积层剪枝及剪枝后对后续卷积层的影响
范数剪枝是对训练好的模型逐层进行剪枝,减去那些最没有用的filter,使得在提升计算效率的同时,正确率下降的最少。每一层中,相对不重要的filter是通过计算权重的绝对值之和,即其L1范数来决定的。剪枝完成后进行微调,微调过程没有引入额外的正则项。对第i个卷积层剪除m个filter的过程如下:
input channels为,对每一个filter,计算kernel权重的绝对值再求和
对filter按照进行排序
减去m个最小的对应的filter和他们对应的feature map。减去的feature map对应的下一个卷积层的kernel
生成了第i层和第i+1层的新的kernel矩阵,模型余下层的kernel权重拷贝到新模型中
上述方法可以方便的对像VGGNet或AlexNet这样简单的CNN模型进行剪枝,但是不能直接用于像ResNet这样有shortcut的复杂网络。ResNet-50的bottleneck如图 4所示,是1个有着3层卷积的结构。对ResNet-50这类有shortcut的复杂网络剪枝时,考虑到剪枝后shortcut的feature map的个数要与bottleneck中最后一层卷积的feature map个数一致,故不能对每一层进行随意剪枝。在模型优化器中,采取了只对bottleneck的中间层进行剪枝的方式,这样不会影响到最后一层与shortcut进行相加。

ResNet-50的bottleneck结构
2.2 模型量化
Adlik重点关注8bit量化,因为更易于在具体硬件上实现加速。经过测试发现,运行小批量数据集就能能得到精度损失很小的量化模型,可以得到相当高的量化精度。如下表所示,只采用100个图片数据,1分钟的时间,就可以量化完成ResNet-50模型,且精度几乎没有损失。
| Model | baseline | Calibration Quantization |
|---|---|---|
| ResNet-50 | 76.174% | 75.914% |
| LeNet-5 | 98.78% | 99.56% |
3. 未来展望
Adlik模型优化后续将致力于对剪枝算法的优化,希望用户能用更少的配置来实现对模型的剪枝。陆续增加对于蒸馏和自动化剪枝方法的支持。
参考资料
[1] https://github.com/Adlik
[2] Michael Zhu and Suyog Gupta. To prune, or not to prune: exploring the efficacy of pruning for model compression. arXiv preprint arXiv:1710.01878, 2017.
[3] Pool Jeff Tran John Han, Song and William J Dally. Learning both weights and connections for efficient neural networks. In Advances in Neural Information Processing Systems, 2015.
[4] Shaopeng Guo, Yujie Wang, Quanquan Li, Junjie Yan. DMCP: Differentiable Markov Channel Pruning for Neural Networks. arXiv:2005.03354v2.
[5] Liu Z, Li J, Shen Z, et al. Learning efficient convolutional networks through network slimming[C]//Proceedings of the IEEE International Conference on Computer Vision. 2017: 2736-2744.
本文介绍了模型剪枝和量化的背景及其重要性,特别是针对深度学习模型。Adlik在实践中采用了滤波器剪枝方法,通过对卷积层权重的L1范数排序进行剪枝,以及8位量化技术,有效减少了模型大小和计算量。未来,Adlik将继续优化剪枝算法并增加更多自动化支持。

1415

被折叠的 条评论
为什么被折叠?



