社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

【深度学习】深度神经网络剪枝综述

机器学习初学者 • 1 年前 • 314 次点击  

模型压缩可以有效地减少模型的存储和计算资源需求,提高模型的推理速度和效率,从而实现在移动设备、边缘设备等资源受限的场景中进行高效的机器学习应用。常用的模型压缩方法有4种:知识蒸馏(Knowledge Distillation,KD)、 轻量化模型架构、 剪枝(Pruning)、 量化(Quantization)。

深度神经网络剪枝是其中一种神经网络压缩技术,深度学习模型中一般存在着大量冗余的参数,通过将权重矩阵中相对“不重要”的权值剔除,以减少神经网络中的冗余参数和结构,从而减小模型的大小和计算量,提高模型的推理速度和存储效率。本文主要围绕深度神经网络剪枝的三个关键问题展开叙述:

(1)通过神经网络剪枝可以得到普遍加速还是特定加速?

加速是否取决于特定的硬件/软件。它通常分为三类:非结构化,半结构化(也称为基于模式的)和结构化。只有结构化剪枝才能实现通用的神经网络加速和压缩,而无需特殊硬件或软件的支持。相反,非结构化和半结构化剪枝都需要特殊硬件或软件的支持。

非结构化剪枝

非结构化剪枝是一种特定的加速技术,可以用于减小神经网络的大小,也称为非结构化剪枝或权重剪枝,如图1所示。它涉及根据权重的大小或重要性来移除神经网络中的单个权重。这种方法可以实现高剪枝率,对精度影响较小,但可能会导致不规则的稀疏模式,这对硬件加速来说是挑战。总的来说,非结构化剪枝是一种精细的剪枝方法,可以用于神经网络中特定的加速。

图1 非结构化剪枝的可视化。浅橙色圆圈表示神经元。

结构化剪枝

结构化剪枝是一种从神经网络中删除整块滤波器、通道、神经元甚至整个层级如图2(b)所示的剪枝方法,也被称为组剪枝或块剪枝,它能对剪枝后的模型重新构造具有规律结构的紧凑模型,并不需要使用稀疏卷积库等专门的硬件和软件而且结构化剪枝可以间接的加速神经网络的运算,减少网络参数量。此外,滤波器和通道剪枝等效,因为在第i层剪枝滤波器等效于在第i+1层剪枝相应的通道(如图2(a)所示)

图2 结构化和半结构化剪枝的可视化图示,其中每个Conv由特定数量的小立方体组成,每个小立方体表示一个权重。浅橙色的立方体表示被剪枝的权重。

半结构化剪枝

半结构化剪枝是一种介于结构化剪枝和非结构化剪枝之间的剪枝方法,可以同时实现高精度和结构正则化,如图2(c)。半结构化剪枝通常基于特定的模式进行剪枝,这些模式可以是任意的,但需要经过精心设计以减轻性能下降并实现特定的加速效果。半结构化剪枝可以被视为一种细粒度的结构化剪枝方法,因为它仅仅移除了一部分的权重,而不是整个通道、滤波器或神经元。半结构化剪枝的一些例子包括基于模式的剪枝和条纹剪枝。半结构化剪枝可以与其他剪枝方法结合使用,以进一步减小神经网络的大小和复杂度。

(2)何时进行神经网络剪枝?具体来说,是在训练网络之前、期间还是之后进行静态剪枝还是动态(即运行时)剪枝?

这个问题涉及了神经网络中剪枝权重和训练权重的排列安排,以便进行静态剪枝。根据剪枝是在训练前、训练期间还是训练后进行,可以将静态剪枝安排分为三类:训练前剪枝(PBT)、训练中剪枝(PDT)和训练后剪枝(PAT),三种静态剪枝流程的示例如图3所示。在动态剪枝中,针对每个输入数据点在运行时生成子网络。

图3 PBT、PDT和PAT的典型稀疏性变化示意图(请以彩色和放大最佳查看)。PBT通常最便宜,PAT最昂贵。

训练前剪枝

在训练神经网络之前,可以通过对初始权重进行剪枝来减少网络的计算量和存储需求。这种方法称为训练前剪枝(Pruning Before Training,PBT),是一种静态剪枝方法,也称为预先剪枝或初始化剪枝可以在不影响网络性能的情况下减少训练时间和资源消耗。

PBT通常遵循两步阶段:先根据特定准则直接剪枝未训练的密集网络,再训练稀疏网络至收敛以实现高性能,如图4(a)所示;第二阶段涉及静态稀疏训练,旨在训练固定稀疏模式的稀疏网络。PBT 方法在训练和推理时间上带来了相同的收益。

训练中剪枝

在训练过程中,可以通过定期剪枝来减少网络的计算量和存储需求,可以在训练过程中逐步减少网络的大小,从而减少训练时间和资源消耗。这种方法称为训练中剪枝(Pruning During Training ,PDT),经典流程如图4(b)所示,其中虚线箭头表示的过程是可选的。

常见的PDT方法有(1)基于稀疏正则化;(2)基于动态稀疏训练;(3)基于得分。与(1)或(3)相关的方法采用从密集到稀疏的训练,而与(2)相关的方法则采用从稀疏到稀疏的训练。
基于稀疏正则化的方法:通常在训练期间对损失函数应用稀疏约束,并且通常涉及在训练期间将某些权重或其掩码设置为零。主要挑战是设计一个有效的目标损失函数 L,具有先进的惩罚方案和高效的优化算法。包括结构化稀疏学习(SSL)和MorphNet。
基于动态稀疏训练的方法:以随机初始化的稀疏网络而不是密集网络作为输入模型,并在训练过程中反复剪枝和重新增长权重以搜索更好的稀疏架构。包括 ThiNet、软过滤剪枝和动态网络手术。

基于评分的方法:这些方法利用评分标准在训练期间进行剪枝。包括软滤波器剪枝(SFP),使用每个滤波器的l2范数作为其重要性得分,并直接将剪枝后的滤波器权重设置为零。

训练后剪枝

训练后剪枝Pruning After Training,PAT)通过移除对模型性能影响较小的权重和神经元,以减小模型大小和计算复杂度,从而提高推理速度和降低内存占用。这种方法可以在保持模型性能的同时,显著降低模型部署和运行成本。这类剪枝方法通常遵循预剪枝过程,如图4(c)所示。在剪枝过程中,稀疏度逐渐增加,直至达到目标。

彩票假设(LTH):是神经网络剪枝领域中具有影响力的假设之一。它给定预训练神经网络,基于权重幅度,迭代移除一定比例的权重,剪枝后剩余权重用原始初始化参数重新训练,以保持原始网络准确性。该假设挑战预先训练的权重必须用于重新训练的观念,推测稠密网络中存在可独立训练的稀疏子网络。

其他基于分数的方法:选取剪枝候选的最直接方法是基于它们的范数进行评估。例如,权重绝对值的和被用于评估每个滤波器的重要性。除了基于范数的标准,评估有/无权重时的损失变化也很流行。歧视感知通道剪枝(DCP)通过联合损失来选择最具鉴别力的通道。许多作品在每个层内对权重的重要性进行局部评估,但局部排名难以决定整体最佳稀疏性。全局学习排名(LeGR)和组Fisher剪枝(GFP)是解决这个问题的两种方法。

基于稀疏正则化的方法:He等人提出了一种两阶段算法,通过LASSO回归选择冗余通道,用未剪枝通道的线性最小二乘法重构输出。ECC通过双线性回归函数建立能量消耗模型,NPPM训练性能预测网络以指导子网络搜索。Fang等人开发了一种名为DepGraph的方法,用于分析各种网络结构的依赖关系,并基于稀疏正则化提出结构化剪枝。其他方法结合基于范数的准则和稀疏正则化选择重要权重。

早期训练剪枝此类方法不是对整个网络进行完全训练,而是通过训练一个网络进行少量迭代或周期,即f(x; wt),其中t << T来探索网络架构。You等人提出早期鸟票(EB)概念,可以在早期训练阶段通过廉价的训练方案来识别获胜票据,并实现与密集网络类似的性能。Chen等人提出早期BERT,该方法在BERT训练的早期阶段确定结构化的获胜票据。Frankle等人发现,表现出对SGD噪声稳定的子网络能够在训练早期达到完全准确度

训练后剪枝最近提出的后训练剪枝方法简化了预训练-剪枝-再训练三步骤,仅需预训练-剪枝两步。该方法对预训练好的模型进行剪枝,无需重新训练,且精度损失几乎无。对于十亿参数模型,后训练剪枝方法更具吸引力,因为剪枝后重新训练成本高昂。Frantar和Alistarh提出了一种非结构化的后训练剪枝方法SparseGPT,可实现GPT系列模型剪枝至少50%的稀疏性。Kwon等提出一个针对Transformer的结构化后训练剪枝框架,包含三个步骤,可在3分钟内使用GPU对Transformer进行剪枝。

图4 静态剪枝的典型剪枝流程。虚线框表示模型,实线框表示操作。

(3)是基于特定标准进行剪枝还是学习剪枝?

标准依赖于启发式公式来衡量每个权重的(或滤波器、通道等)重要性。常用的剪枝标准包括幅度、范数、损失变化等。此外,还可以通过学习对神经网络进行剪枝,例如通过稀疏性正则化训练或动态稀疏训练等进行剪枝等等。无论是通过标准还是学习,剪枝的目标都是确定应该剪枝的网络权重。

剪枝标准

基于幅度的剪枝,基于幅度剪枝是最早且最流行的用于减少神经网络隐藏单元数量的剪枝方法之一。它的核心思想是去除具有最小绝对值的权重,这些权重对网络输出的影响最小。该标准可以应用于非结构化剪枝或结构化剪枝,并且可以与全局/局部、一次/迭代计划相结合。

lp范数,是根据lp范数评估权重的重要性,lp范数是权重在p维空间中大小的度量。它的核心思想是删除具有最小 lp 范数的权重,假设这些权重对网络输出的影响较小。该标准可用于评估神经网络的滤波器、通道和其他组件的重要性。

敏感性和/或显着性,是根据权重对网络输入或输出的敏感性或显着性来评估权重的重要性。它的核心思想是删除不太敏感或不显着的权重,这些权重被认为对网络输出的影响较小。该标准比幅度和范数标准更复杂,但对于某些类型的网络可能更有效。

损失变化,是通过测量移除权重时网络损失函数的变化来评估权重的重要性。的核心思想是删除对损失函数影响最小的权重,假设这些权重对网络输出的影响较小。该标准可用于评估神经网络的滤波器、通道和其他组件的重要性。

学习剪枝网络的方法

基于稀疏性正则化的剪枝,是一种通过为权重(或通道、滤波器等)引入缩放因子向量来学习剪枝神经网络的方法,并且将稀疏性正则化施加于后者,同时训练网络权重和缩放因子。缩放因子的幅度被视为重要分数,通过解决最小化问题来学习权重及其掩码。这种方法常用于神经网络剪枝,已被应用于各种剪枝技术中。

基于元学习的剪枝,是一种利用元学习技术学习剪枝神经网络的方法。该方法包括训练一个元网络(例如PruningNet)来预测不同剪枝网络的权重。PruningNet接受一个网络编码向量作为输入,并输出剪枝网络的权重。通过将网络编码输入到完全训练的PruningNet中,获得每个剪枝网络的权重和相应的精度。在约束条件下,通过进化搜索找到剪枝网络。这种方法已应用于各种剪枝技术中,可以将所学的剪枝策略应用于更大的网络。

基于图神经网络的剪枝,是一种首次将图卷积应用于模型压缩的方法。任何网络都可以视为图,GraphPruning设计了一个带有权重的图聚合器,并结合全连接(FC)层来生成权重。该方法在模型压缩方面已经达到了最先进的结果,并且可以将所学的剪枝策略转移到更大的网络上。

基于强化学习的剪枝,是一种利用强化学习(RL)自动压缩模型的方法。一些AutoML的剪枝方法采用RL来搜索剪枝网络的最佳配置。例如,He等人提出的用于模型压缩的AutoML方法(AMC)是基于Q-learning,一种RL,来确定智能体如何采取行动以最大化累积奖励。该方法使用深度确定性策略梯度(DDPG)智能体从环境中接收层的嵌入状态,并输出稀疏性比率作为动作。然后,使用特定的压缩方法,例如通道剪枝方法,对层进行压缩。之后,智能体移动到下一层并重复该过程,直到最后一层。这种方法在模型压缩方面已经达到了最先进的结果。

参考文献:《A Survey on Deep Neural Network Pruning : Taxonomy, Comparison, Analysis, and Recommendations

往期精彩回顾




  • 交流群

欢迎加入机器学习爱好者微信群一起和同行交流,目前有机器学习交流群、博士群、博士申报交流、CV、NLP等微信群,请扫描下面的微信号加群,备注:”昵称-学校/公司-研究方向“,例如:”张小明-浙大-CV“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~(也可以加入机器学习交流qq群772479961


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/165307
 
314 次点击