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

简介: 模型加速|CNN与ViT模型都适用的结构化剪枝方法(一)

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

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

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

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


1、简介


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

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

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

然而,结构化修剪本身的性质使其成为一项具有挑战性的任务,特别是对于具有耦合和复杂内部结构的现代深度神经网络。其基本原理在于,深度神经网络建立在大量基本模块之上,如卷积、归一化或激活,但这些模块无论是否参数化,都通过复杂的连接进行内在耦合。因此,即使试图从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个神经元,将修剪和。

image.png

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

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

3.2、依赖关系图

1、分组

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

image.png

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

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

2、依赖关系图

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

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

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

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

3、网络分解

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

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

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

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

4、依赖关系建模

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

image.png

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

  • 层间依赖性:依赖性⇔总是出现在具有↔的连接层中。
  • 层内依赖性:依赖性⇔存在,当且仅当和共享相同的剪枝方案,表示为=。

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

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

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

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

image.png

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

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

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

image.png

3.3、使用依赖关系图修剪

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

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

image.png

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

image.png

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

image.png

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

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

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

相关文章
|
2月前
|
机器学习/深度学习 数据可视化 计算机视觉
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
这篇文章详细介绍了如何通过可视化深度学习中每层特征层来理解网络的内部运作,并使用ResNet系列网络作为例子,展示了如何在训练过程中加入代码来绘制和保存特征图。
67 1
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
|
3月前
|
机器学习/深度学习 搜索推荐
CIKM 2024:LLM蒸馏到GNN,性能提升6.2%!Emory提出大模型蒸馏到文本图
【9月更文挑战第17天】在CIKM 2024会议上,Emory大学的研究人员提出了一种创新框架,将大型语言模型(LLM)的知识蒸馏到图神经网络(GNN)中,以克服文本图(TAGs)学习中的数据稀缺问题。该方法通过LLM生成文本推理,并训练解释器模型理解这些推理,再用学生模型模仿此过程。实验显示,在四个数据集上性能平均提升了6.2%,但依赖于LLM的质量和高性能。论文链接:https://arxiv.org/pdf/2402.12022
84 7
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
|
5月前
|
机器学习/深度学习 自然语言处理
预训练语义模型作为特征提取器的方法
预训练语义模型作为特征提取器的方法
|
7月前
|
机器学习/深度学习 人工智能 PyTorch
LLM 大模型学习必知必会系列(四):LLM训练理论篇以及Transformer结构模型详解
LLM 大模型学习必知必会系列(四):LLM训练理论篇以及Transformer结构模型详解
LLM 大模型学习必知必会系列(四):LLM训练理论篇以及Transformer结构模型详解
|
7月前
|
机器学习/深度学习 数据可视化 数据处理
【DeepViT】我们能否通过使用更深层来进一步提高vit的性能,就像cnn一样?
【DeepViT】我们能否通过使用更深层来进一步提高vit的性能,就像cnn一样?
109 0
【DeepViT】我们能否通过使用更深层来进一步提高vit的性能,就像cnn一样?
|
机器学习/深度学习
使用传统全连接神经网络训练minist数据集(一)
使用传统全连接神经网络训练minist数据集(一)
103 0
|
7月前
|
机器学习/深度学习 自然语言处理 算法
【Tensorflow深度学习】优化算法、损失计算、模型评估、向量嵌入、神经网络等模块的讲解(超详细必看)
【Tensorflow深度学习】优化算法、损失计算、模型评估、向量嵌入、神经网络等模块的讲解(超详细必看)
107 1
|
机器学习/深度学习 算法
模型加速|CNN与ViT模型都适用的结构化剪枝方法(二)
模型加速|CNN与ViT模型都适用的结构化剪枝方法(二)
237 0
|
机器学习/深度学习 人工智能 边缘计算
模型加速|CNN与ViT模型都适用的结构化剪枝方法(一)
模型加速|CNN与ViT模型都适用的结构化剪枝方法(一)
360 0