- 深度卷积神经网络(CNN)在许多现实世界应用中的部署在很大程度上受到其高计算成本的阻碍。 在本文中,我们提出了一种新颖的 CNN 学习方案,以同时 1)减小模型大小; 2)减少运行时内存占用; 3)在不影响精度的情况下减少计算操作的数量。 这是通过以简单但有效的方式在网络中强制执行通道级稀疏性来实现的。
- 我们称我们的方法为网络瘦身,它将广泛和大型网络作为输入模型,但在训练过程中,不重要的通道会被自动识别并在随后进行剪枝,从而产生具有相当精度的精简模型。
相关工作
- 低秩分解使用奇异值分解 (SVD) [7] 等
用低秩矩阵近似神经网络中的权重矩阵。 该方法在全连接层上尤其有效,可产生约 3 倍的模型大小压缩,但速度没有显着加快,因为 CNN 中的计算操作主要来自卷积层。 - 权重量化。
在模型训练和存储,还有进行前向的过程中,权重一般的都是默认为fp32的浮点值存储。但是有研究表明,CNN模型是一类过参数化的模型,参数的具体值对于结果来说不是很重要。所以有些库就把模型默认的浮点值用离散的整型值来量化,这样起到了减小模型体积(例如FP16比FP32节约一半的模型体积)和加速的作用(很多平台上整数值的计算比浮点值快)。但是这种权值量化的方法,会对模型的性能产生一定的伤害,就要看能不能接收了。 - 权重修剪/稀疏。
对模型训练后出现的绝对值较小的接近于0的权值和连接,把他们强制置零。这样整个模型的权重大多数都是0了,用稀疏矩阵的特殊存储方式存储,可以减小模型文件的体积,节约不少存储空间。然而,如果要获得运行时速度的加速,需要配合专门针对稀疏矩阵运算做优化的库或者硬件;而且,运行时内存的消耗主要不是在权重参数的存储上,而是在中间生成的特征图的存储上(这些特征图还是稠密的),所以对运行时内存的压缩也不是很多。 - 结构化剪枝和稀疏化
结构化剪枝指的是整个卷积filter,整个feature map的channel或者整个网络的layer整个去掉的加速压缩方法。一般都是按照某些猜想,在网络训练的时候改造目标函数,然后在训练的结果中按照一定的规则进行剪枝达到加速和压缩的目的。Network Slimming方法就是属于结构化剪枝的思路。
整体思想
- 作者整体思想可以用文中的一张图直观感受
我们将缩放因子(从批量归一化层重用)与卷积层中的每个通道相关联。 在训练过程中对这些缩放因子进行稀疏正则化,以自动识别不重要的通道。
缩放因子值较小的通道(橙色)将被修剪(左侧)。
修剪后,我们获得紧凑的模型(右侧),然后对其进行微调以达到与正常训练的完整网络相当(甚至更高)的精度。
稀疏性
稀疏性可以在不同的级别上实现,例如权重级别、内核级别、通道级别或层级别。 细粒度级别(例如权重级别)稀疏性提供了最高的灵活性和通用性,从而带来更高的压缩率,但通常需要特殊的软件或硬件加速器来对稀疏模型进行快速推理[11]。相反,最粗的层级稀疏性不需要特殊的包来获得推理加速,但它的灵活性较差,因为需要修剪一些整个层。
缩放因子和稀疏引起的惩罚
作者想法是为每个通道分配一个可训练的权重因子 γ,每个通道的输出乘以这个权重因子当做这个通道的最终输出。然后在训练的时候,对这些权重因子做L1惩罚,强迫学习到稀疏的γ,最后认为这些γ的绝对值大小就代表了相应通道是不是重要,做一个全局排序,按比例给定一个阈值,把不重要的通道剪枝。
- 其中 (x, y) 表示训练输入和目标,W 表示可训练权重,第一个和项对应于 CNN 的正常训练损失,g(·) 是稀疏性引起的缩放因子惩罚,并且 λ 平衡了这两项。 在我们的实验中,我们选择 g(s) = |s|,即L1-范数广泛用于实现稀疏性
用BN层的缩放因子(Scale Factor)剪枝
- 设zin和zout为BN层的输入和输出,B表示当前的minibatch,BN层执行以下变换
- 其中 µB 和 σB 是 B 上输入激活的平均值和标准偏差值,γ 和 β 是可训练的仿射变换参数(尺度和位移),它提供了将归一化激活线性变换回任何尺度的可能性。
- 通常的做法是在卷积层之后插入 BN 层,并具有通道级缩放/移位参数。 因此,我们可以直接利用 BN 层中的 γ 参数作为网络瘦身所需的缩放因子。这里比较好奇为什么使用BN,其原理是什么,如果没有使用BN其他层可不可呢?
- 1)如果我们在没有BN层的CNN中添加缩放层,缩放因子的值对于评估通道的重要性没有意义,因为卷积层和缩放层都是线性变换。通过减小缩放因子值同时放大卷积层中的权重可以获得相同的结果。
- 2)如果我们在BN层之前插入一个缩放层,则缩放层的缩放效果将被BN中的归一化过程完全抵消。
- 3)如果我们在BN层之后插入缩放层,则每个通道有两个连续的缩放因子。
- 基本解释了为什么要在bn层γ参数作为网络瘦身所需的缩放因子
通道修剪和微调
- 在通道级稀疏引起的正则化下进行训练后,我们获得了一个模型,其中许多缩放因子接近于零(见图 1)。
- 然后,我们可以通过删除所有传入和传出连接以及相应的权重来修剪缩放因子接近于零的通道。
- 我们在所有层上使用全局阈值来修剪通道,该阈值被定义为所有缩放因子值的某个百分位。 例如,我们通过将百分位阈值选择为 70% 来修剪具有较低缩放因子的 70% 通道。获得了一个更紧凑的网络,具有更少的参数和运行时内存以及更少的计算操作。
- 作者提出这套操作可以通过多次迭代,即不断剪枝、微调直到速度满足我们要求同时精度在我们接受的范围内
Experiments
- "基线"表示没有稀疏正则化的正常训练。 在第 1 列中,"60% 剪枝"表示从经过稀疏性等训练的模型中剪枝了 60% 通道的微调模型。参数和 FLOP 的剪枝率也显示在第 4 和第 6 列中。 修剪适量(40%)的通道可以很大程度上降低测试误差。 通常可以在修剪 ≥ 60% 的通道的情况下保持精度。
网络瘦身中有两个关键的超参数
剪枝百分比 t 和稀疏正则化项的系数 λ(参见公式 1)
- 剪枝百分比
- 图中可以看到稀疏训练后剪枝微调效果更好
- 剪枝百分比最好是低于70%
- 当阈值超过 80% 时,微调模型的测试误差才会落后于基线模型。当进行稀疏训练时,即使没有微调,模型的性能也比原始模型更好。 这可能是由于 L1 稀疏性对通道缩放因子的正则化影响。
- 通道稀疏正则化
L1 稀疏项的目的是迫使许多缩放因子接近于零。 等式1中的参数λ控制其与正常训练损失相比的显着性。 在图 4 中,我们绘制了具有不同 λ 值的整个网络中缩放因子的分布。 在本实验中,我们使用在 CIFAR-10 数据集上训练的 VGGNet。
- 这里体现了看论文的必要性,之前本人yolov8剪枝学习发现剪枝后BN层消失了当时参考网上使用的1e-2可能产生了分布全部集中在0的问题。(有待验证)