极市导读
作者提出了一种新颖的高效模型按深度剪枝方法。作者的方法提出了一种新颖的块剪枝策略和渐进训练方法UPDP用于子网。此外,作者将他的剪枝方法扩展到视觉转换模型。作者的方法在视觉Transformer模型上也达到了最先进的剪枝性能。 >>加入极市CV技术交流群,走在计算机视觉的最前沿
论文链接:https://arxiv.org/pdf/2401.06426
引言
深度神经网络(DNNs)在各种任务上取得了显著进展,在工业应用中取得了令人瞩目的成功。在这些应用中,模型优化的追求凸显出作为一个普遍需求的需求,提供了提高模型推理速度的潜力,同时最大限度地减少准确性的权衡。这个追求涵盖了一系列技术,尤其是模型修剪,量化和高效模型设计。
传统的按通道剪枝方法,通过减少网络通道的数量,在剪枝深度卷积层和某些高效模块(例如流行的倒置残差块)的卷积神经网络模型中往往无法有效剪枝。之前的按深度剪枝方法,通过减少网络的深度,对某些高效模型的剪枝不适用,因为这些模型存在一些归一化层。此外,通过直接移除激活层来微调子网会破坏原始模型的权重,从而阻碍剪枝模型达到高性能。
简介
为解决这些问题,我们提出了一种新颖的高效模型按深度剪枝方法。我们的方法提出了一种新颖的块剪枝策略和渐进训练方法UPDP用于子网。此外,我们将我们的剪枝方法扩展到视觉转换模型。实验结果表明,在不同的剪枝配置下,我们的方法始终优于现有的按深度剪枝方法。我们使用我们的方法在ConvNeXtV1上得到了三个剪枝后的ConvNeXtV1模型,超过了大多数具有可比较推理性能的SOTA高效模型。我们的方法在视觉Transformer模型上也达到了最先进的剪枝性能。
方法与模型
在本文中,我们提出了一种统一的深度修剪方法,适用于高效的CNN和视觉Transformer模型,采用渐进式训练策略、新颖的块修剪方法和重新参数化技术。与DepthShrinker和Layer-Folding通过直接激活层删除微子网进行微调不同,我们的方法在微子网训练过程中逐步删除修剪块中的激活层。此外,我们的方法解决了DepthShrinker和Layer-Folding无法修剪具有LayerNorm或GroupNorm层的模型的归一化层问题。此外,它们也无法修剪视觉Transformer模型。尽管我们的工作与VanillaNet具有类似的训练过程,但VanillaNet是用来设计全新的网络结构,而我们的方法是一个通用的深度修剪框架,适用于CNN和视觉Transformer模型。
我们的块剪枝策略将复杂而缓慢的块转化为块合并中简单而快速的块。对于一个块,我们将激活层替换为恒等层,并将LayerNorm(LN)或GroupNorm(GN)层替换为 BatchNorm(BN)层,并在块末尾插入一个带有BatchNorm层的激活层,以便为参数重组创建条件。然后,参数重组技术可以合并BatchNorm 层、相邻的卷积层或全连接层以及跳跃连接。
我们的方法主要包括四个主要步骤,分别是超网络训练、子网络搜索、子网络训练和子网络合并。首先,我们基于基线模型构建一个超网络,在此超网络中进行块修改。超网络训练后,使用搜索算法来搜索最优的子网络。然后,我们采用一种提出的渐进式训练策略来优化最优子网络,以减少准确度损失。最后,通过参数重组技术,将子网络合并为一个较小的模型。
1 超网络训练
高效的CNN和视觉变换器模型通常由几个基本块组成,如图2所示的一些高效模型结构。首先,我们基于基线模型构建一个超网络,然后采用三明治规则的方法训练一个强大的超网络模型,以确保每个子网络具有有意义的准确性。我们将基线块和相应的剪枝块组合成一个超网络块,该块同时具有基线块和剪枝块的流。对于超网络块,选择基线块流表示不进行剪枝,选择剪枝块流表示对该块进行剪枝。然后,子网络选择是一系列选择,选择的次数等于基线模型的块数。选择更多剪枝块的子网络将更快。
2 子网络搜索
我们的深度修剪器的主要目标是基于指定的修剪准则(如要修剪的块数)来识别一个最佳子网络。如方程1所示,我们将这个问题公式化为一个最优化问题。对于所有样本X及其标签Y,子网络搜索的目标是找到准确率最高的子网络Sp。p∈RNblock是一个二进制向量,表示子网络的修剪设置。如果第i个块被修剪,pi被设置为1。我们使用遗传算法来解决这个问题。
在搜索过程中,我们获得了一个具有指定数量剪枝块的子网络,而其他块则与基线模型保持相同。
3 子网络训练
我们需要训练前一步中获得的最佳子网络以恢复其准确性。与直接训练子网络不同,我们的方法采用渐进训练策略,通过微调子网络平滑地从基线模型权重进行转移。子网络训练分为两个阶段。在第一阶段的训练过程中,我们采用渐进训练策略,通过一个控制因子λ逐渐从基线模型结构转移到剪枝子网络结构。在第二阶段,我们继续对剪枝子网络进行微调以获得更高的准确性。
4 子网合并
在子网训练完成后,我们得到一个部分激活层被替换为Identity层,一些LayerNorm层被替换为BatchNorm层和一些激活层,并且在修剪块末尾插入了BatchNorm层的子网。在这个阶段,我们采用重新参数化技术使子网变得更浅。
5 Depth Pruner on CNN
将我们的方法应用于CNN模型,首先我们应该找到基本块,并根据剪枝块设计相应的剪枝块。对于块中的激活层,我们将其替换为一个恒等层。对于归一化层,在块中不是BatchNorm层的情况下,我们将其替换为一个BatchNorm层,否则不需要进行任何操作。最后,我们在块的末尾插入一个带有BatchNorm层的激活层。如果在像ResNet34块这样的位置已经存在一个激活层,则只需要在块的末尾的激活层之后插入一个BatchNorm层。完成剪枝块后,进行超网训练、子网搜索、子网训练和子网合并过程的审查。我们将得到剪枝后的CNN模型。对于普通的CNN模型,我们可以定义一个包含两个或更多顺序卷积层的块。
6 Depth Pruner on Vision Transformer
我们还将我们提出的深度修剪器应用于Vision Transformer模型。Vision Transformer块通常具有多头自注意(MHSA)模块和包含两个全连接层的MLP模块。具体来说,我们以DeiT作为案例展示修剪流程。为了构建超网络,我们在原始模型的LN和激活(GELU)层旁添加了BN旁路,并在残差相加操作后插入了一个GELU&BN块。在子网络搜索和子网络训练之后,我们获得了子网络,其中修剪块的原始LN和GELU操作都被BN替代。在残差相加之后附加了一个GELU&BN块。然后,我们合并子网络以获得快速修剪模型。
实验与结果
我们展示了我们的深度修剪器的效果。首先,我们阐明了实验配置,并概述了将深度修剪器应用于CNN模型和视觉Transformer的过程。随后,我们将我们的结果与最先进的修剪方法进行了比较,以凸显我们方法的优越性。最后,我们进行消融研究,阐述了子网搜索和渐进训练策略对我们方法的影响。
我们对一系列CNN模型应用了深度修剪器,包括ResNet34 , MobileNetV2,ConvNeXtV1和Vision Transformer,以验证我们的方法的效率。我们使用四个GPU来训练我们的模型,总批量大小为256。在训练过程中,我们花费10个epochs来训练supernet,除了MobileNetV2和搜索最佳子网络。然后我们使用提出的渐进训练策略来训练这些子网络,并完成子网络合并以获得更高效的浅层模型。
我们在AMD平台上测试了所有网络的加速比,以表中最慢的网络EfficientFormerV2-S2作为基准。我们将模型按准确度划分为不同的级别,并且我们的深度修剪方法在不同级别上实现了更高的准确度和相当的速度。
我们的方法在准确度和加速比方面均优于其他最先进的方法。我们提出的深度修剪器在只有1.9%的top-1准确度下降情况下,实现了1.26×的加速比。通过替换可合并模块并应用重新参数化技术,我们的方法可以缩小网络并带来真正的推理加速。

公众号后台回复“数据集”获取100+深度学习各方向资源整理
极市干货

点击阅读原文进入CV社区
收获更多技术干货

