AI学习者 · 2023年02月02日

模型加速|CNN与ViT模型都适用的结构化剪枝方法

image.png

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

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

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

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

1、简介

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

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

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

image.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、神经网络的依赖性

image.png

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

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

3.2、依赖关系图

1、分组

image.png

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

2、依赖关系图

image.png

3、网络分解

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

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

具体来说,首先将网络分解为基本层,记为,其中每个指参数化层,如卷积,或非image.png

4、依赖关系建模

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

image.png
image.png

image.png

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

image.png

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

image.png
image.png

3.3、使用依赖关系图修剪

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

image.png

image.png

4、实验

4.1、消融实验

image.png

1、分组策略

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

  1. 不分组:稀疏学习和重要性评估在单个卷积层上独立进行;
  2. 仅卷积分组:组内的所有卷积层都以一致的方式稀疏化。
  3. 完全分组:一个组内的所有可训练层,如卷积、批处理归一化和全连接层,都是一致稀疏的。

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

2、层稀疏性

image.png

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

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

3、DepGraph的通用性

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

4.2、SOTA实验

image.png

5、参考

[1].DepGraph: Towards Any Structural Pruning.

作者:小书童
文章来源:集智书童

推荐阅读

更多嵌入式AI干货请关注嵌入式AI专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
18838
内容数
1371
嵌入式端AI,包括AI算法在推理框架Tengine,MNN,NCNN,PaddlePaddle及相关芯片上的实现。欢迎加入微信交流群,微信号:aijishu20(备注:嵌入式)
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息