深度学习模型压缩方法—剪枝

剪枝简介

1. 过参数化和冗余

深度学习模型通常具有大量的参数,这些参数在训练过程中表现出冗余特性。这意味着即使删除一部分参数,模型仍然可以保持相近的性能。研究表明,深度神经网络通常是过参数化的,即它们拥有比实际所需更多的参数 。剪枝算法的核心思想就是减少网络模型中参数量和计算量,同时尽量保证模型的性能不受影响。Dropout和DropConnect就代表着非常经典的模型剪枝技术。

2. 权重重要性评估

剪枝方法通常通过评估权重的重要性来决定哪些权重可以被移除。重要性评估方法可以是基于权重的大小(例如,小于某个阈值的权重被视为不重要)或基于梯度信息(例如,通过评估权重对损失函数的贡献度来判断其重要性)。

剪枝步骤

常见有三种方法:

  1. 训练、剪枝、微调
  2. 训练过程中剪枝、微调
  3. 剪枝、训练
    在剪枝流程中,训练一般指预训练,训练的目的是为剪枝算法做准备。
    剪枝,一般可以进行如细粒度剪枝、向量剪枝、核剪枝、滤波器剪枝等各种不同的剪枝算法。在剪枝后,要对网络模型进行评估,看是否符合要求。剪枝前,则需要确定需要剪枝的层,确定阈值,通过修改代码加入一个与参数矩阵尺寸一致的mask矩阵,mask矩阵中只有0和1。
    微调是指恢复被剪枝操作影响的模型表达能力的必要步骤。

结构化剪枝与非结构化剪枝

最左边的非结构化剪枝粒度最小,右边结构化剪枝中的向量剪枝、核剪枝、滤波器剪枝粒度依次增大。
在这里插入图片描述

  • 细粒度剪枝(fine-grained):即对连接或者神经元进行剪枝,它是粒度最小的剪枝。
  • 向量剪枝(vector-level):它相对于细粒度剪枝粒度更大,属于对卷积核内部(intra-kernel)的剪枝。
  • 核剪枝(kernel-level):即去除某个卷积核,它将丢弃对输入通道中对应计算通道的响应。
  • 滤波器剪枝(Filter-level):对整个卷积核组进行剪枝,会造成推理过程中输出特征通道数的改变。

细粒度剪枝(fine-grained),向量剪枝(vector-level),核剪枝(kernel-level)方法在参数量与模型性能之间取得了一定的平衡,但是网络的拓扑结构本身发生了变化,需要专门的算法设计来支持这种稀疏的运算,被称之为非结构化剪枝。

非结构化剪枝主要是对一些独立的权重或者神经元再或者一些神经元的连接进行剪枝,是随机的,粒度最小的剪枝。
最简单的方法是预定义一个阈值,低于这个阈值的权重被剪去,高于的被保留。但也存在缺点:

  1. 阈值与稀疏性并没有直接联系
  2. 不同的层应该具有不同的灵敏度
  3. 会减掉太多信息,导致性能恢复不到原本的精度
    第二种方法是使用一个拼接函数来屏蔽权重。
    在这里插入图片描述

对layer进行剪枝,对channel进行剪枝以及滤波器剪枝(Filter-level)只改变了网络中的滤波器组和特征通道数目,所获得的模型不需要专门的算法设计就能够运行,被称为结构化剪枝,结构化的剪枝是有规律、有顺序的。除此之外还有对整个网络层的剪枝,它可以被看作是滤波器剪枝(Filter-level)的变种,即所有的滤波器都丢弃。

在滤波器剪枝中,有一种方法是使用滤波器的Lp范数来评估每个滤波器的重要性(p为1则使用L1范数,p为2则使用L2范数)。通常,L范数较小的滤波器的卷积结果导致相对较低的激活值,因此对模型的最终预测具有较小的数值影响。根据这种理解,这种小Lp范数的滤波器将比那些大Lp范数滤波器更容易被剪掉。
结构化剪枝的优点是:大部分算法保留原始卷积结构,不需要专用硬件就可以实现;缺点是:剪枝算法相对复杂。

静态剪枝与动态剪枝

静态剪枝(Static Pruning)

  • 静态剪枝是在训练完成后进行的。模型在训练过程中不会发生任何剪枝操作,剪枝过程是训练后的一个独立步骤。
  • 剪枝完成后,模型通常需要进行微调(fine-tuning),以恢复或接近剪枝前的性能。
  • 静态剪枝后的模型在部署时计算和存储资源消耗较少,因为模型已经被简化。
  • 适用于资源受限的部署环境,如移动设备或嵌入式系统,以及需要快速推理的应用场景。

动态剪枝(Dynamic Pruning)

  • 动态剪枝是在训练过程中进行的。模型在训练的不同阶段不断进行剪枝和恢复操作,实时调整模型结构。
  • 动态剪枝在训练过程中不断进行剪枝和恢复,因此通常不需要额外的微调步骤,模型在训练结束时已经达到优化状态。
  • 动态剪枝可以更灵活地适应训练过程中的变化,提高模型的泛化能力和训练效率,但在训练过程中可能需要更多的计算资源。
  • 适用于需要在训练过程中进行模型优化的场景,如自适应模型结构优化和持续学习。

硬剪枝与软剪枝

硬剪枝与软剪枝都是对Filter进行剪枝,是结构化剪枝中粒度最大的剪枝。

  • 硬剪枝是指直接移除模型中的部分权重或神经元,使其不再参与后续的计算。这种方式是不可逆的,一旦权重被移除,就无法恢复。这类的剪枝算法通常从模型本身的参数出发,寻找或者设计出合适的统计量来表明连接的重要性。通过对重要性的排序等算法,永久删除部分不重要的连接,保留下来的模型即为剪枝模型。硬剪枝后的模型性能可能会下降,需要通过微调(fine-tuning)来恢复性能。

  • 软剪枝是指通过将不重要的权重值设置为零或接近零,使其在计算过程中不再起作用,但这些权重仍然保留在模型中。这种方式是可逆的,权重可以在后续训练过程中重新激活。在每轮训练中,根据不同的数据对完整模型进行优化和训练。在每轮之后,为每个加权层计算所有滤波器的L2范数,并将其作为滤波器选择的标准。然后,通过将相应的滤波器权重设置为零来修剪所选择的滤波器,随后是下一轮训练。最后,原始的深度神经网络模型被修剪成一个紧凑而有效的模型。软剪枝的剪枝效果不如硬剪枝明显,模型的实际大小和计算需求可能不会显著减少。

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ANIMZLS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值