模型剪枝综述

目录

1 深度神经网络的稀疏性:

2 剪枝算法分类:

3 具体的剪枝方法包括:

4 剪枝算法流程:

5 几种常见的剪枝算法:

6 结构化剪枝和非结构化剪枝各有其优缺点:

7 剪枝算法对模型精度的影响

8 影响剪枝算法对模型精度的因素


模型压缩中的剪枝算法是一种应用广泛的模型压缩方法,其通过剔除模型中“不重要”的权重,来减少模型的参数量和计算量,同时尽量保证模型的精度不受影响。

模型剪枝的核心是模型中的权重、激活、梯度等是稀疏的,减少部分参数不会影响模型的性能和泛化能力。

1 深度神经网络的稀疏性

  • 权重稀疏:在大多数神经网络中,权重数值的分布接近正态分布,越接近0的权重越多。通常认为权重数值的绝对值大小可作为重要性的一种度量,数值越大对模型输出贡献越大,反之则不重要,删去后对模型精度影响较小,但仍需再训练模型以恢复精度。

  • 激活稀疏:ReLU 激活函数会使负半轴的输入产生0值的输出,此外,max_pooling 池化操作也会产生类似稀疏的效果,即无论网络接收到什么输入,大型网络中很大一部分神经元的输出大多为零。

2 剪枝算法分类

  • 结构化剪枝:改变网络中的滤波器组和特征通道数目,所获得的模型不需要专门的算法和硬件就能运行。可进一步细分,如 channel-wise、filter-wise 或 shape-wise 等。

  • 非结构化剪枝:对连接或者神经元进行剪枝,能实现更高的压缩率并保持较高的模型性能,但会带来网络模型稀疏化,其稀疏结构对于硬件加速计算并不友好,除非底层硬件和计算加速库对稀疏计算有较好的支持,否则剪枝后很难获得实质的性能提升。

3 具体的剪枝方法包括:

  • 细粒度剪枝(fine-grained):粒度最小的剪枝,如随机将一些神经元的输出置零的 dropout,以及随机将部分神经元间的连接置零的 dropconnect 都属于细粒度剪枝。

  • 向量剪枝(vector-level):对卷积核内部(intra-kernel)进行剪枝,粒度稍大于细粒度剪枝。

  • 核剪枝(kernel-level):去除某个卷积核,丢弃对输入通道中对应卷积核的计算。

  • 滤波器剪枝(filter-level):对整个卷积核组进行剪枝,推理过程中输出特征通道数会改变。

4 剪枝算法流程

目前剪枝算法的总体流程可归结为以下三种:

  • 标准剪枝算法流程:主要包含训练、剪枝以及微调三个部分。首先对网络模型进行预训练,获得在特定基础任务上训练好的原始模型;然后进行如细粒度剪枝、向量剪枝、核剪枝、滤波器剪枝等操作,并对网络模型结构进行评估,确定需要剪枝的层,设定裁剪阈值或比例,通过加入 mask 矩阵来实现剪枝;最后进行微调,以恢复被剪枝操作影响的模型表达能力。微调时参数在计算时先乘以 mask,mask 为 1 的参数值可继续训练通过 BP 调整梯度,而 mask 为 0 的部分则不对后续部分产生影响。之后还可进行再剪枝,将微调后的网络模型再次进行模型结构评估和执行剪枝算法,不断迭代优化,直到满足剪枝目标需求。

  • 基于子模型采样的剪枝流程:得到训练好的模型后,对可修剪的网络结构按照剪枝目标进行采样(采样过程可以是随机的,也可按照网络结构的重要性或通过 KL 散度计算进行概率采样),得到采样子模型。通常进行多次采样,得到多个子模型,之后对每个子模型进行性能评估,选取最优的子模型进行微调得到最后的剪枝模型。

  • 基于搜索的剪枝流程:主要依靠强化学习等无监督学习或半监督学习算法,或神经网络结构搜索相关理论。给定剪枝目标后,在网络结构中搜索较优的子结构,此搜索过程往往伴随着网络参数的学习过程,因此部分基于搜索的剪枝算法在剪枝结束后不需要再进行微调。

剪枝算法的发展趋势包括打破固定假设、走向自动化以及与 NAS(神经网络架构搜索)融合等。例如挑战已有的固有假设,将部分工作自动化,以及 NAS 中有针对结构化剪枝进行搜索的方法等。

5 几种常见的剪枝算法:

以下是一些常见的剪枝算法:

  • α-β剪枝(alpha-beta pruning) :这是对极小化-极大化算法的改进,用于减少博弈树搜索的节点数量,从而提高搜索效率,适用于博弈树的最小最大搜索过程。它通过设定下限α和上限β,记录搜索过程中得到的最优解的取值范围。在搜索过程中,当某个节点的取值范围超出了α和β的范围时,就可以剪枝,停止对该节点的搜索;

  • 极小化-极大化算法(minimax algorithm) :一种博弈树搜索算法,用于决策博弈过程中的最佳走法。该算法假设两个对手在博弈中都会采取最优策略,因此在搜索博弈树时,它会交替地考虑最大化自己的利益和最小化对手的利益。在每一层,算法会选择最大化自己利益的节点或最小化对手利益的节点,直到达到叶子节点,然后根据叶子节点的估值来进行决策。该算法适用于零和博弈,即一方获利就意味着另一方损失;

  • 启发式剪枝(heuristic pruning) :利用启发性信息来判断节点是否值得继续搜索。根据启发性信息,评估某个节点的潜在价值,如果该节点的价值低于阈值,则可以进行剪枝,停止对该节点的搜索;

  • 约束剪枝(constraint pruning) :在满足某种预定约束的情况下,可以直接进行剪枝。例如,在搜索排列组合时,若剩余的元素数量已经无法满足目标要求,就可以直接剪掉该分支;

  • 子问题剪枝(subproblem pruning) :在动态规划等问题中,利用子问题的最优解来剪枝。如果当前子问题的最优解已经计算出来,并且该最优解无法改进,则可以直接剪枝,避免重复计算;

  • 双向剪枝(bidirectional pruning) :在某些问题中,可以从问题的两个方向同时进行搜索。在搜索过程中,利用对称性或问题的特殊性质,可以剪掉对称的或重复的分支,从而减少搜索空间;

  • 排序剪枝(sorting pruning) :在搜索过程中,对搜索的待选节点进行排序,优先搜索那些更有可能满足条件的节点。通过先搜索可能更优的节点,可以尽早地找到最优解,从而剪去无需再搜索的分支;

  • 动态剪枝(dynamic pruning) :在搜索过程中,根据当前搜索状态和之前搜索的结果,动态地调整剪枝策略。可以基于实时信息来决定是否继续搜索,从而提高搜索效率。

剪枝算法的核心思想是通过合理的判断条件来剪掉不必要的搜索分支,从而减少搜索时间和空间消耗。选择合适的剪枝技术需要针对具体问题进行分析和设计,以达到更高效的搜索效果,它常用于回溯法、深度优先搜索和博弈树等问题中。

6 结构化剪枝和非结构化剪枝各有其优缺点:

结构化剪枝的优点

  • 硬件友好性:由于是按照一定的结构模式进行剪枝,如对整个卷积核或特征通道进行剪枝,所得模型在现有硬件上易于部署和加速,无需特殊的算法支持。

  • 计算效率高:能显著减少模型的计算量和内存占用,且不会引入额外的计算开销。

  • 模型稳定性较好:保留了模型的整体结构,对模型的泛化能力影响相对较小。

结构化剪枝的缺点

  • 压缩率受限:相比于非结构化剪枝,其压缩率可能相对较低,难以实现极高的模型压缩。

  • 灵活性较差:只能按照预定的结构模式进行剪枝,可能无法精确地去除那些不太重要但仍有一定作用的参数。

非结构化剪枝的优点

  • 高压缩率:能够更精细地剪除权重参数,实现更高的压缩比例。

  • 灵活性强:可以根据模型的具体情况,更精准地选择剪除不重要的参数。

非结构化剪枝的缺点

  • 硬件不友好:由于剪枝后的模型具有不规则的稀疏结构,需要特定的硬件支持或者专门的算法来处理,否则难以有效提升计算效率。

  • 模型微调难度大:剪枝后的模型结构不规则,可能会对模型的稳定性和泛化能力产生较大影响,需要更复杂的微调策略来恢复模型性能。

  • 计算复杂度增加:在实际计算过程中,由于稀疏结构的存在,可能会导致计算效率的降低。

7 剪枝算法对模型精度的影响

剪枝算法对模型精度的积极影响

  • 合理应用剪枝算法可能对模型精度影响小甚至无影响。因为会去除对模型输出贡献小的权重或神经元。在适当剪枝比例和策略下,模型能减少参数和计算量并保持原有精度。

  • 对于过参数化模型,存在大量冗余权重连接,精心设计的剪枝算法能去除冗余部分,实现压缩且不损失精度。

剪枝算法对模型精度的消极影响

  • 剪枝过度或策略不当会对模型精度有显著负面影响。过度剪枝可能导致模型丢失关键特征表示能力,降低对输入数据的拟合和泛化能力。

  • 例如,剪枝掉对特定类别或复杂模式识别重要的权重,模型处理相关情况时可能出错致精度下降。

剪枝后模型精度的恢复相关

  • 剪枝后的模型通常需微调恢复精度,微调不充分或不合适可能无法完全弥补精度损失。

总结

  • 剪枝算法对模型精度的影响取决于多种因素,包括模型结构和复杂度、剪枝比例和策略、微调方法和程度等。实际应用中要权衡压缩率和精度关系,不断试验优化,找到适合特定模型和任务的剪枝方案,保证精度下实现有效模型压缩。

8 影响剪枝算法对模型精度的因素

  • 剪枝比例:

剪枝比例过高,即剪除过多的参数,可能会导致模型丢失重要的特征信息,从而显著降低精度。相反,剪枝比例过低可能无法达到有效的压缩效果。

  • 剪枝策略:

不同的剪枝策略会产生不同的结果。例如,基于权重绝对值大小的剪枝、基于神经元激活值的剪枝、基于梯度的剪枝等。策略的选择不当可能会误剪重要的参数。

  • 模型结构和复杂度:

简单的模型可能对剪枝的容忍度较低,因为其本身参数较少,可冗余的部分有限。而复杂的大型模型可能具有更多的冗余,但也需要更精细的剪枝策略以避免破坏关键结构。

  • 数据集特性:

数据集的大小、数据分布的多样性、数据的复杂度等都会影响。如果数据集较小或数据分布较单一,模型对剪枝可能更敏感,精度更容易受到影响。

  • 模型的训练程度:

未充分训练的模型进行剪枝可能更容易导致精度下降。而经过充分训练、已经达到较好性能的模型,在适当剪枝后可能更能保持精度。

  • 微调的效果:

剪枝后是否进行有效的微调以及微调的方法和程度对精度恢复至关重要。合适的微调可以帮助模型重新适应剪枝后的结构。

  • 任务的性质:

不同的任务对模型的要求不同。例如图像识别任务可能对某些特征的依赖较强,剪枝时需更谨慎;而某些简单的分类任务可能对剪枝的容忍度稍高。

  • 模型的层敏感度:

不同的层对模型的贡献不同,有些层对精度影响较大,对这些关键层的剪枝需要格外小心。

  • 硬件和计算环境:

在某些硬件平台上,特定的剪枝模式可能更有利于计算效率,但可能对精度产生间接影响。

综上所述,在应用剪枝算法时,需要综合考虑这些因素,通过试验和优化来找到最优的剪枝方案,以平衡模型压缩和精度保持之间的关系。

有兴趣可以关注我的专栏《高性能开发基础教程》

该文章首发于 subscriptions极空AI,后续我会在上面整理完整的AI+HPC资料,并提供相关书籍推荐,至于视频要不要录制,看大家需要不需要。

有兴趣的可以关注。

你可能感兴趣的:(人工智能,#,模型部署,深度学习,人工智能,模型部署,模型剪枝,性能优化)