摘要
我们提出了一种新的无损通道修剪方法ResRep(又称滤波器修剪),它旨在通过减少卷积层的宽度(输出通道的数量)来精简卷积神经网络(CNN)。受关于记忆和遗忘独立性的神经生物学研究的启发,我们提出将CNN重新参数化为记忆部分和遗忘部分,前者学习保持性能,后者学习效率。通过在前者上使用常规的SGD训练重新参数化的模型,而在后者上使用新的带有惩罚梯度的更新规则,我们实现了结构化稀疏性,使我们能够等效地将重新参数化的模型转换为具有更窄层的原始体系结构。这种方法将ResRep与传统的基于学习的剪枝范式区别开来。传统的剪枝范式通过对参数进行惩罚来产生结构化稀疏性,而结构化稀疏性可能会抑制对记忆至关重要的参数。我们的方法将标准的ResNet-50在ImageNet上的准确率为76.15%,缩小到更窄的一个,只有45%的FLOPs,而且精度没有下降,这是我们所知的第一个在如此高的压缩比下实现无损修剪。
图1:传统的基于惩罚的修剪 vs. ResRep。为了说明,我们用一个输入通道和四个输出通道修剪了一个3 × 3的卷积层。为了便于可视化,我们解开了内核成。A)为了修剪K的一些通道(即W的行),我们在原来的损失的基础上在核上增加一个惩罚损失,这样梯度会使一些行的大小变小,但又不会小到可以实现完美修剪。B) ResRep构造了一个核矩阵的压实器。在惩罚梯度的驱动下,压缩器选择它的一些通道并生成一个二进制掩码,将Q的一些原始梯度重置为零。最后,将 conv-BN-compactor序列等价地转换成具有两个通道的正则卷积层。空白矩形表示零值。
3. ResRep for Lossless Channel Pruning
3.1 ResRep for Lossless Channel Pruning
我们首先介绍卷积和通道修剪的公式。对于输出通道为,输入通道为,核的尺寸为,表示参数张量,为可选择的偏执项。和分别为特征图的输入和输出。为卷积运算符。是将复制到的广播函数,我们有
对于没有偏置项但后接批归一化(BN)[25]层的卷积层,其中批归一化的均值为,标准方差为,此外表示缩放因子,为平移参数。
令表示卷积层的索引。为了剪枝卷积层,根据一些规则我们得到了我们得到了剪枝通道的指标集。则补集。修剪操作保留了卷积层中个输出通道,也要丢弃下一层输入通道相应的的项。如果有的话,也应该丢弃偏置或后面的BN中的相应条目。所获得的核是
3.2 卷积重参数化
受神经生物学关于遗忘和记忆独立性的研究[11,15,50,53]的启发,我们提议将原始模型明确地重参数化为“记忆部分”和“遗忘部分”。具体来说,对于每个我们修剪的每个卷积层和接下来的BN层,它们被称为目标图层。我们使用额外的逐点(1×1)卷积和核重新参数化,称为compactor。给定一个训练良好的模型,我们通过将conv-BN初始化为的原始权值,初始化为单位矩阵来构造一个重新参数化的模型,使重新参数化的模型产生与原始模型相同的输出。在进行梯度重置训练(将在3.3节详细描述)后,我们对compactor中接近于零的通道进行修剪,并将模型转换为,它具有与相同的架构,但具有更窄的层。具体地说,对于具有核的特定compactor,我们对范数小于阈值的通道进行剪枝。形式上,我们通过以下方式得到待剪枝集,幸存集。与公式3类似,我们剪枝通过,在我们的实验中,我们使用了,它被发现足够小,可以实现完美的剪枝。现在,compactor的行数少于列数,即。为了将转换为,我们寻求将每个conv-BN-compactor序列转换成具有和偏置的Conv层。
首先,我们将一个conv-BN序列等价地转换成一个卷积层进行推理,得到与原始序列相同的输出。利用卷积层的及其后面的BN,我们可以用内核和偏置构造一个新的卷积层,如下所示。对于,
根据式1、式2和卷积的齐次性,很容易验证。
然后我们求出构造和的公式
利用卷积的可加性,我们得出
直观地说,的每个通道都是一个常数矩阵,因此,的结果的每个通道也是常数矩阵。并且由于在的结果上与的卷积仅执行跨通道复合,通过重新组合中的条目将合并到是可行的。设T是转置函数(例如是张量),我们给出了构造和的公式,这些公式易于验证。
在实际应用中,我们对训练好的重新参数化模型的权值进行了转换和保存,构建了一个没有BN的结构更窄、层次更窄的模型,并将保存的权值用于测试和部署。
3.3 Gradient Resetting
然后,我们描述了如何在保持压缩器性能的同时产生结构化稀疏性。我们从在特定核上使用传统的基于惩罚损失的范例开始,以使一些通道的量值更小以获得高剪枝能力,即。假设是通用参数集,,是数据示例和对应标签,是与性能相关的目标函数(例如,分类任务的交叉熵)。传统范式通过预先定义的强度因子,在原始损失的基础上增加惩罚性损失项,
其中的常见形式包括L1[28]、L2[9]和Lasso[33,57]。具体地说,LASSO在产生基于通道的结构化稀疏性方面是有效的(与L1/L2产生的零星零点形成对比)。在下面的讨论中,我们用来表示中的特定通道。
其中是欧几里得范数,
设是SGD更新的梯度,我们有
特定通道的训练动态是非常直接的:从一个训练良好的模型开始,位于局部最优值附近,因此式13的第一项接近于0,而第二项不接近,所以F会被推近于0。如果对性能很重要,那么目标函数将打算维持它的大小,也就是说,第一个梯度项将与第二个梯度项竞争,因此最终将比以前小,这取决于。否则,以极端情况为例,如果完全不影响,则第一项将为0,因此F将在第二项继续向0增长。也就是说,与绩效相关的损失和惩罚性损失相互竞争,使得的结果值将反映其重要性,为方便起见,我们将其称为基于能力的重要性评估。然而,我们面临着一个进退两难的境地。问题A:惩罚使每个通道的参数偏离目标函数的最优值。值得注意的是,轻微的偏离可能不会带来负面影响。例如,L2正则化也可以被视为轻微偏差。然而,有了很大的惩罚,虽然一些通道被清零以进行修剪,但剩余的通道也变得太小,无法保持表示能力,这是一个不受欢迎的副作用。问题B:如果对高阻力有轻微的惩罚,我们就不能实现高修剪能力,因为大多数通道只是比过去更接近0,而不是足够近,不足以进行完美的修剪。我们建议通过重置从目标函数派生的梯度来实现高剪枝能力和较轻的惩罚。我们引入一个二进制掩码,它表明我们是否希望将置零。为便于实现,我们不向目标函数添加任何项, i.e., ,只需计算梯度,然后手动应用掩码,添加惩罚梯度,并将得到的梯度用于SGD更新。那是,
在实践中,为了决定哪些通道归零(即,为多个通道设置掩码值),我们可以简单地遵循较小范数不太重要的规则[28]或其他试探法[24,46]。这样,我们就解决了上述两个问题。A)虽然我们将套索梯度添加到每个通道的与客观相关的梯度中,这相当于通过将套索损失添加到原始损失来偏离最优值,但这种偏差是温和的(在我们的实验中,),因此对性能是无害的。B)当时,第一项不再与第二项竞争,因此即使是一个温和的也能使稳定地趋向于0。
3.4 The Remembering Parts Remember Always,the Forgetting Parts Forget Progressively
虽然与传统(图4)相比,通过梯度重置简单地将原始通道归零具有较小的范数,但我们注意到一个问题:归零的客观相关梯度编码了维持性能所需的信息,应该保留这些信息以提高电阻。直观地说,参数被迫“忘记”一些有用的信息(渐变)。幸运的是,解决方案正是卷积重新参数化,这需要我们只修剪压缩器,而不是原始的卷积层。在这种情况下,我们只强制压实器“忘记”,所有其他层仍然专注于“记住”,所以我们不会丢失任何在原始内核的梯度中编码的信息。
首先,我们需要决定调零的哪些通道。在训练重新参数化的模型时,我们只向compactors添加Lasso梯度。经过几个训练周期后,将反映通道的重要性,因此我们开始基于的值进行通道选择。设是压缩器的数目,(一个维二进制向量)是第个压缩器的掩码,我们将定义为度量向量。
对于每次通道选择,我们计算每个压缩器中每个通道道的度量值,并将它们组织为映射,然后我们按升序对的值进行排序,从最小的开始一次挑选一个,并将相应的掩码设置为0。当减少的FLOPs(即原始FLOPs减去没有当前掩码0通道的FLOPs)达到我们的目标时,我们停止选择,或者我们已经选择了(称为通道选择限制)通道。未选择通道的掩码值设置为1。其动机很简单:在讨论了基于能力的重要性评价之后,就像传统上使用惩罚损失来与原有损失竞争,选择规范较小的通道一样,我们使用惩罚梯度来与原有梯度竞争。更好的是,所有的度量值在开始时都是1(因为每个压缩器内核都被初始化为一个单位矩阵),这使得它们在不同的层之间进行比较是公平的。我们将初始化为一个较小的数字,每隔几次迭代增加,并重新选择通道,以避免一次将太多的通道归零。如图4(右)所示,在Lasso梯度的作用下,那些mask-0通道会变得非常接近于0,从而在压实器中出现结构化稀疏。
4. 实验