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的参数需要随着剪枝次数的增加而减小。假设原始网络的连接数为