发布于: Oct 30, 2022

过去十年以来,深度学习模型已经在众多领域取得长足进展,特别是计算机视觉与自然语言处理。如今,最先进的模型已经在图像分类等任务当中实现了与人类水平相当的性能表现。深度神经网络之所以能够实现这样的壮举,是因为它们包含数百万个由人类利用大型训练数据集训练得出的参数。以 BERTLarge)模型为例,其中包含 3.4 亿个参数;Resnet-152 则包含 6000 万个参数。可以想见,从零开始训练此类模型需要巨大的计算量,而且往往耗时数小时、数天甚至数周。

一般来说,数据科学家会尽可能使用迁移学习技术,即将某一个问题转化为另一个相关但又有所不同的问题,并借此使得模型获取新知识的过程。通过迁移学习,您可以在相对较小的数据集上对经过预训练的模型进行微调,进而提高其准确性。在这种情况下,模型可能不再需要规模惊人的参数储备——换言之,较小的模型也可以带来良好的学习效果。

在边缘机器学习场景下,这种为模型瘦身的做法至关重要。对于边缘设备来说,硬件限制(包括延迟、内存占用量以及计算时间等)的意义与模型准确性同样重要。例如,无人驾驶汽车就需要一套准确性高且延迟低的模型。在这种情况下,模型不可能为了将准确性提升 1% 而把预测处理时长增加 1 倍。

模型剪枝能够在不牺牲准确性的前提下,显著降低模型的大小。其基本思路非常简单:在模型当中找出对训练过程几乎没有帮助的冗余参数。
模型剪枝的根本目的,在于消除对于训练过程没有太大贡献的权重。权重是一项可学习参数,它们会在训练过程中被随机初始化及优化。在正向传播过程中,数据会贯穿整个模型。其中损失函数负责根据特定标签评估模型输出;而在反向传播期间,系统则通过更新权重以最大程度降低损失。通过这种方式,即可计算出损失与权重之间的相对梯度,并保证每项权重得到不同程度的更新。经过几次迭代之后,某些权重会表现出比其他权重更强的影响力。剪枝的目标正是在不对模型准确性造成显著影响的前提下,删除其中的无用项。具体工作流程如下图所示。

您可以使用以下几种试探方法衡量不同权重的重要性:

  • 权重幅值如果权重的绝对值小于阈值,则将其删除;较小的权重对输出的影响也相对较小。
  • 平均激活如果在整个训练过程中,大部分神经元都不活跃,则可推断出进入激活函数的权重不太重要。

剪枝可以分为非结构化与结构化权重剪枝:

  • 非结构化剪枝用于删除任意权重(如上图所示)。
  • 结构化剪枝可删除整个卷积过滤器及其相关通道。

结构化剪枝往往用于由大量卷积层组成的计算机视觉模型当中。过滤器是一个卷积核的集合(每个输入通道对应一个卷积核)。过滤器会输出一个特征图(feature map),也称为输出通道。如下图所示为输出三个特征图的三个卷积核。模型需要学习的参数数量(权重)为 3 x 输入通道 x 内核宽度 x 内核高度,在本示例中输入通道数为 1。为了简单起见,大家可以设定此图中不存在偏差张量。您可以对过滤器进行排名,以找到最不重要的过滤器(例如图中的黄色过滤器)。只要将它删除,您的参数数量就将减少至 1 x 输入通道 x 内核宽度 x 内核高度

为了对各个过滤器进行重要性排名,大家可以参考《通过卷积神经网络剪枝实现资源有效推理(“Pruning Convolutional Neural Networks for Resource Efficient Inference”)》论文中提出的排名方法:估计剪枝后过滤器对于损失函数的影响。其核心目标是消除那些不会影响损失函数的因素。如果过滤器的激活输出以及相应的梯度较小,则排名将相对较低。通过在整个训练中累积激活输出和梯度的乘积,可以估算过滤器的重要性。

在此之后,您可以删除排名最低的过滤器,对模型进行微调,以便从剪枝中恢复并重新获得准确性。整个过程可以重复多次以获取最佳效果。

相关文章