当前位置:   article > 正文

最新剪枝方法|CNN与ViT模型都适用!(已开源)

depgraph: towards any structural pruning

作者 | 小书童  编辑 | 集智书童

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心【模型部署】技术交流群

后台回复【模型部署工程】获取基于TensorRT的分类、检测任务的部署源码!

6a3f2e98a0c5667f6acd854094f1bfdf.png

结构化剪枝通过从神经网络中删除结构分组的参数来实现模型加速。然而,参数分组模式在不同的模型中差异很大,使得依赖于手动设计的分组方案的特定于体系结构的剪枝器无法推广到新的体系结构。

在这项工作中研究了一项极具挑战性但几乎没有探索的任务,即任意结构剪枝,以解决任意架构(如CN、RNN、GNN和Transformer)的一般结构修剪。实现这一目标的最突出障碍在于结构耦合,它不仅迫使不同的层同时被修剪,而且期望被删除组中的所有参数始终不重要,从而避免修剪后的性能显著下降。

为了解决这个问题,作者提出了一种通用的、全自动的方法,即Dependency Graph(DepGraph),以显式地建模层之间的相互依赖性,并对耦合参数进行全面分组。

在这项工作中在几个架构和任务上广泛评估了本文的方法,包括用于图像的ResNe(X)t、DenseNet、MobileNet和Vision transformer、用于图形的GAT、用于3D点云的DGCNN,以及用于语言的LSTM,并证明了即使使用简单的L1范数标准,所提出的方法也始终能产生令人满意的性能。

1、简介

最近出现的边缘计算应用程序要求压缩深度神经网络,其有利结果往往以繁琐的网络架构为代价。在众多网络压缩范例中,剪枝被证明是非常有效和实用的。网络修剪的目标是从给定网络中删除冗余参数,以减轻其大小,并可能加快推理速度。

主流的修剪方法大致可分为两种方案,结构化修剪和非结构化修剪。两者之间的核心区别在于,结构化修剪通过物理移除分组参数来改变神经网络的结构,而非结构化修剪在不修改网络结构的情况下对部分权重进行归零。

与非结构化修剪相比,结构化修剪不依赖特定的AI加速器或软件来减少内存消耗和计算成本,从而在实践中找到更广泛的应用领域。

bf6c131be79e04eb614d59545aca5141.png

然而,结构化修剪本身的性质使其成为一项具有挑战性的任务,特别是对于具有耦合和复杂内部结构的现代深度神经网络。其基本原理在于,深度神经网络建立在大量基本模块之上,如卷积、归一化或激活,但这些模块无论是否参数化,都通过复杂的连接进行内在耦合。因此,即使试图从CNN中删除一个通道(如图1(a)所示),也必须不可避免地同时考虑到它对所有层的依赖性,否则最终会得到一个破裂的网络。

准确地说,残差连接需要两个卷积层的输出共享相同数量的通道,因此迫使它们一起被修剪。如图1(b-d)所示,其他架构(如Transformer、RNN和GNN)中描绘的其他网络架构的结构修剪也是如此。

不幸的是,依赖性不仅出现在残差结构中,在现代模型中,残差结构可能会无限复杂。现有的结构方法在很大程度上依赖于个案分析来处理网络中的依赖性。尽管取得了很有希望的结果,但这种特定于网络的修剪方法非常耗时。此外,这些方法不能直接推广,这意味着手动设计的分组方案不能转移到其他网络家族,甚至不能转移到同一家族中的网络架构,这反过来极大地限制了它们在野外条件下的工业应用。

在本文中,作者努力为任何结构修剪提供一种通用方案,其中以自动方式执行任意网络架构上的结构化修剪。本文方法的核心是估计依赖关系图(DepGraph),该图显式地建模神经网络中成对层之间的相关性。如图1(a)所示,作者为结化构修剪引入DepGraph的动机源于这样的观察,即在一个层的结构化修剪有效地“触发”相邻层的修剪,这进一步导致连锁效应。因此,为了跟踪不同层之间的依赖关系,可以将依赖链分解为递归过程,这自然归结为在图中找到最大连通组件的过程,并且可以通过图遍历以O(N)复杂性来解决。

具体来说,对于网络中要修剪的层,可以将其作为根来触发相邻耦合层上的修剪,然后继续以被触发层为起点递归重复触发过程。通过这样做,可以全面收集所有耦合层以进行修剪。

值得注意的是,在结构化剪枝中,分组层同时被剪枝,这使得被删除组中的参数始终不重要,这给为单层设计的现有重要性标准带来了一定的困难。准确地说,由于与其他参数化层的纠缠,单个层中的参数重要性不再显示出正确的重要性。在不同的层上估计的重要性很可能是非加性的,有时甚至是相互矛盾的,这使得很难选择真正不重要的组来进行修剪。

为了解决这个问题,作者充分利用了由DepGraph支持的依赖建模的全面能力来学习组内的一致性稀疏性,以便可以安全地删除归零的那些层,而性能不会降低太多。通过依赖建模,在实验中表明了一个简单的L1范数准则可以达到与现代方法相当的性能。

为了验证DepGraph的有效性,作者将所提出的方法应用于几种流行的架构,包括CN、Transformer、RNN和GNN,与最先进的方法相比,这些架构实现了具有竞争力的性能。对于CNN修剪,本文的方法在CIFAR上获得了2.57×加速的ResNet-56模型(准确率为93.64%),优于原始模型(准确度为93.53%)。

在ImageNet-1k上,本文的算法在ResNet-50上实现了2倍以上的加速,性能仅损失0.32%。更重要的是,本文的方法可以很容易地转移到各种流行的网络,包括ResNe(X)t、DenseNet、VGG、MobileNet、GoogleNet和Vision Transformer,并显示出令人满意的结果。

此外,作者还对非图像神经网络进行了进一步的实验,包括用于文本分类的LSTM、用于3D点云的DGCNN和用于图形数据的GAT,其中本文的方法实现了从8×到16×的加速,而没有显著的性能下降。

总之,本文的贡献是针对任何结构修剪的通用修剪方案,称为依赖图(DepGraph),它允许自动参数分组,并有效地提高了各种网络架构(包括CNN、RNN、GNN和Vision Transformer)上结构修剪的可推广性。

2、相关工作

2.1、结构和非结构的修剪

修剪在网络加速领域取得了巨大进展。基于修剪方案,主流的修剪方法可分为两种:结构修剪和非结构修剪。

结构修剪去除了结构分组的参数以降低神经网络的维数,而非结构修剪在不修改网络结构的情况下对部分权重进行归零。具体来说,非结构化修剪易于实现,并且自然可以推广到各种网络。但它通常依赖于特定的AI加速器或软件来实现模型加速。另一方面,结构修剪技术通过从网络中删除结构参数来减少模型大小和推理成本,但受到结构约束的限制。

在文献中,修剪算法的设计空间包括但不限于修剪方案、参数选择、层稀疏性和训练协议。其中,参数选择是最重要的主题之一。在过去几年中,提出了大量技术上合理的标准,如基于幅度的标准或基于梯度的标准。另一种类型的方法通过稀疏训练来区分不重要的参数,稀疏训练将一些参数推到零以进行修剪。与那些静态标准相比,稀疏训练更可能找到不重要的参数,但由于需要网络训练,因此需要更多的计算资源。

2.2、修剪分组参数

依赖性建模是任何结构修剪的关键和前提步骤,因为它涉及同时删除由于复杂的网络架构而在结构上彼此耦合的参数。剪枝分组参数的概念从结构剪枝的早期就已被研究。例如,当修剪两个连续卷积层时,修剪第一层内的滤波器会导致在后续层中去除与该滤波器相关的核。一旦呈现了网络架构,参数的分组是确定的,并且可以单独分析每个参数,正如在大多数先前的工作中所做的那样。

然而,这种手动设计的方案不可避免地不能转移到新的架构中,这限制了在野外条件下结构修剪的应用。最近,已经提出了一些试点工作来解决层之间的复杂关系,并利用分组属性来提高结构修剪性能。

不幸的是,现有技术仍然依赖于经验规则或强大的架构假设,这对于任何结构修剪都不够普遍。作为本研究的一部分,本文提出了解决这个问题的通用框架,并证明了解决参数分组可以为修剪带来显著的好处。

3、本文方法

3.1、神经网络的依赖性

这项工作中专注于在参数依赖性的约束下对任何神经网络进行结构修剪。在不丧失一般性的情况下,在FC层上开发本文的方法。从一个由三个连续层组成的线性神经网络开始,如图2(a)所示,分别由二维权重矩阵、和参数化。这种简单的神经网络可以通过去除神经元的结构修剪而变得苗条。在这种情况下,很容易发现参数之间存在一些依赖关系,表示为⇔, 这迫使和同时被修剪。

具体而言,为了修剪连接和的第k个神经元,将修剪和。

611d23987c788a0f83e736ebfa8c9114.png

在文献中,研究人员通过手动设计和模型特定的方案来处理层依赖性,并在深度神经网络上实现结构修剪。然而,如图2(b-d)所示,存在多种依赖关系。在某种程度上,以逐个案例的方式手动分析所有这些依赖关系是很难的,更不用说简单的依赖关系可以嵌套或组合成更任意复杂的模式。

为了解决结构修剪中的依赖问题,在这项工作中引入了依赖关系图,它为依赖关系建模提供了一种通用的、全自动的机制。

3.2、依赖关系图

1、分组

为了实现结构剪枝,首先需要根据不同层的相互依赖性对它们进行分组。形式上,目标是找到一个分组矩阵,其中L是一个待修剪网络的深度,表示第层和第层之间存在依赖关系。让来实现自依赖。使用分组矩阵,很容易找到与第层相互依赖的耦合层,即找到组:

082563b22f78b079b642af39434eb325.png

然而,它通常是平凡的估计组从神经网络由于现代深度网络可能由成千上万的层与复杂的连接,导致一个大和密集的分组矩阵在这个矩阵,不仅由和层,但也受到这些中间层的桥梁。

这种非局部关系不是显式的,在大多数情况下也不能用简单的规则来处理。作者在这方面,不直接估计分组矩阵G,而是开发了一种等价但易于估计的方法,即依赖图,从中可以有效地推导出G。

2、依赖关系图

首先,考虑一个组,依赖⇔,⇔和⇔。在这种依赖项建模中很容易找到一些冗余,即依赖项⇔可以从⇔和⇔中派生出来。

具体来说,可以将这个推导建模为一个递归过程:可以以为起点,并检查它对其他层的依赖性,例如,⇔。此外,提供了一个递归扩展依赖关系的新起点,从而进一步“触发”⇔。这个递归过程最终以一个传递关系结束,⇔⇔。在这种情况下,只需要两个依赖关系来描述组中的关系。

类似地,第3.2节中讨论的分组矩阵也包含大量冗余,可以压缩成更紧凑的矩阵,边缘更少,但关于层依赖性的信息相同。在这项工作中证明了测量相邻层之间的局部相互依赖性的图D(称为依赖图)可以是分组矩阵G的有效约简。

实际上,依赖图可以被视为G的传递归约,它包含相同的顶点,但G的边尽可能少,因此对于所有,在D中到之间有一条路径。因此,可以通过检查D中顶点和之间的路径的存在来导出。

3、网络分解

然而,作者发现在层级构建依赖图是有问题的,因为一些基本层,如全连接层,有两种修剪方案,正如在第3.1节中提到的。

除了这些参数化的层外,神经网络还包含非参数化的操作,如跳过连接,这也会影响层之间的依赖关系。作者认为这些问题可以通过开发一种新的描述网络的符号来解决。

具体来说,首先将网络分解为基本层,记为,其中每个指参数化层,如卷积,或非参数化层,如ReLU。这里不是建模层级关系,而是关注层输入和输出之间的细粒度关系。

具体来说,将的输入和输出分别称为和。对于任何网络都可以得到该网络的精细大分解,即。依赖建模将使这个符号变得更容易,因为它允许用不同的方案修剪输入和输出。

4、依赖关系建模

利用这种符号,将神经网络重新定义为公式2,从中可以找到两种一般的依赖关系,即层间依赖关系和层内依赖关系,如下所示:

0d2597a299b199c28b00bdb9c75b0cd8.png

其中,↔表示相邻两层之间的连通性。作者证明了这些依赖关系可以用非常简单的规则来检测到:

  • 层间依赖性:依赖性⇔总是出现在具有↔的连接层中。

  • 层内依赖性:依赖性⇔存在,当且仅当和共享相同的剪枝方案,表示为=。

如果网络的拓扑结构已知,则层间的依赖性很容易估计。对于那些具有↔的连接层,依赖性始终存在,因为和,在这种情况下,对应于网络相同的中间特征。

下一步是阐明一些层内的依赖关系。层内依赖关系需要同时修剪单个层的输入和输出。在网络中有许多层满足这种条件,例如批处理规范化或元素级操作,它们的输入和输出被修剪在一起。这种现象主要是由于输入和输出之间的共享剪枝方案,即=。

3f762abb6722b1baffd596f76e1c5904.png

如图3所示,批处理规范化是一个元素级操作,对其输出和输入具有相同的剪枝方案。当涉及到卷积等层时,它们的输入和输出以不同的方式被修剪,即和,如图3所示,导致≠。在这种情况下,像卷积这样的层的输入和输出之间没有依赖性。

根据上述规则,可以将依赖关系建模形式化如下:

88db7f005452d0aad9c91eb65cb3c6c5.png

其中∨和∧是逻辑“OR”和“and”操作,是返回“True”的指示函数,“∨”表示条件成立。第一项检查由网络连接引起的层间依赖,而第二项检查由层输入和输出之间的共享剪枝方案引入的层内依赖。

值得注意的是,DepGraph是一个具有=的对称矩阵。因此,可以检查所有的输入和输出对来估计依赖性图。最后,在图3中可视化了一个DepGraph的例子。

Alg.1和2总结了图的构造和参数分组的算法。

128cc5de9d9d3a6f21cd7ccaf6c072d3.png

3.3、使用依赖关系图修剪

在前面的章节中建立了一种分析神经网络依赖关系的一般方法,产生了几个不同组大小的组。估计分组参数的重要性是一项具有挑战性的任务。给定一个预先定义的准则,如Norm,一个自然的解是取聚合分数,忽略不同层之间的分布差异。不幸的是,在单个层上独立估计的重要性分数可能是不可靠的,有时还会相互冲突,因为修剪后的组可能同时包含重要和不重要的权重。

为了解决这个问题,作者引入了一种简单但足够通用的方法,它利用DepGraph的分组能力来全面稀疏每个组内的所有参数化层,包括但不限于卷积、批处理归一化和全连接层。

1d24e4b947a4fcae04a3bc3ec3d8df40.png

如图4 (c)所示,目标是学习所有分组层之间的一致稀疏性,同时将某些维度归零为零。作者将分组参数扁平化并合并为一个大的参数矩阵,其中检索所有属于第k个可调维数的参数,就像CNN块的第k个通道一样。现在,一致的稀疏性可以通过一个简单的加权收缩来促进:

a74c7ea0d339f832b03ae7639fbb5782.png

其中,γ为不同的尺寸分配了不同的收缩强度。使用一个简单而可控的指数策略来确定γ如下:

cbadc224b2da89ca8c1d574644fb951c.png

其中,为k维的综合得分,为所有组的重要得分向量。超参数α控制收缩强度,范围为α。

在这项工作中,在所有的实验中都使用了α。值得注意的是,强收缩将被分配到那些不重要的维度,以迫使一致的稀疏性。在稀疏训练后,使用标准化评分来去除参数,这揭示了这些重要维度的相对分数。

在这项工作中展示了这种简单的修剪方法,当与依赖建模相结合时,可以达到与现代方法相当的性能。

4、实验

4.1、消融实验

b6bb6b13969bfad5fcf8635882942d0f.png
1、分组策略

为了进一步验证分组的有效性,作者在不同的卷积网络上评估了不同的分组策略。策略主要包括:

  1. 不分组:稀疏学习和重要性评估在单个卷积层上独立进行;

  2. 仅卷积分组:组内的所有卷积层都以一致的方式稀疏化。

  3. 完全分组:一个组内的所有可训练层,如卷积、批处理归一化和全连接层,都是一致稀疏的。

如表2所示,当忽略神经网络中的分组信息并孤立地稀疏每一层时,本文的方法的性能将显著下降,在某些情况下,甚至由于过度剪枝而崩溃。根据仅conv分组的结果,在组中包含更多的参数有利于最终的性能,但在组中仍然省略了一些有用的信息。通过实现全分组策略,可以进一步提高剪枝的精度。

2、层稀疏性
0f0ea125165f6c25e63774afd1dc57fc.png

在剪枝方面,层的稀疏性被认为是一个重要的设计空间,它决定了剪枝神经网络的结构。表2还提供了一些关于图层稀疏性的有用结果。

这项工作主要关注两种类型的稀疏性:均匀稀疏性和学习稀疏性。利用均匀稀疏性,神经网络被均匀缩放,假设冗余是均匀分布的。然而,图5中之前的实验表明,不同的层并不是相同的。在大多数情况下,学习到的稀疏性优于均匀稀疏性,如表2所示。因此,允许稀疏性学习算法自己来确定层的稀疏性。

3、DepGraph的通用性

表2中的结果也证明了框架的通用性,它能够处理各种卷积神经网络。此外,作者强调,本文的方法与DenseNet和GoogleNet是兼容的,这是一种包含密集连接和并行结构的网络。

4.2、SOTA实验

421fa5dea7543edd2e6eae440c6a220f.png

5、参考

[1].DepGraph: Towards Any Structural Pruning.

视频课程来了!

自动驾驶之心为大家汇集了毫米波雷达视觉融合、高精地图、BEV感知、传感器标定、自动驾驶协同感知、语义分割、自动驾驶仿真、L4感知等多个方向学习视频,欢迎大家自取(扫码进入学习)

422a3519c344c9df0a6f1e195a50e49e.png

(扫码学习最新视频)

国内首个自动驾驶学习社区

近1000人的交流社区,和20+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(分类、检测、分割、关键点、车道线、3D目标检测、多传感器融合、目标跟踪、光流估计、轨迹预测)、自动驾驶定位建图(SLAM、高精地图)、自动驾驶规划控制、领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

359a111b746ddeb4004e9b99e1328990.jpeg

自动驾驶之心】全栈技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多传感器融合、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向;

99c36269dfbe56202d8acd0e8ba671a9.jpeg

添加汽车人助理微信邀请入群

备注:学校/公司+方向+昵称

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/745363
推荐阅读
相关标签
  

闽ICP备14008679号