查看原文
其他

卷积神经网络如何才能“瘦下来”?

丁霄汉 探臻科技评论 2023-01-01

图片来源:简书


【导

读】

卷积神经网络(CNN)是机器学习等相关领域的重要工具,然而随着CNN越来越深、越来越宽,其内存占用空间,功耗和所需的浮点运算急剧增加。通过采取一种新的优化方法C-SGD,可以很好地解决结构复杂CNN上的受约束剪枝问题,有望实现卷积神经网络在计算资源受限平台上的应用。

本文将介绍一种新的CNN压缩方法,总字数2261,阅读约7分钟。


【作者简介】

学术新秀候选人丁霄汉,清华大学软件学院17级直博生,师从丁贵广教授,主要研究方向为:计算机视觉、机器学习,致力于解决在算力受限条件下卷积网络的设计和优化问题。


主要

问题

卷积神经网络(CNN)已成为机器学习和许多相关领域的重要工具。但是,随着CNN越来越深、越来越宽,其内存占用空间,功耗和所需的浮点运算(FLOP)急剧增加。因此,卷积神经网络难以部署在嵌入式系统等计算资源受限的平台上。在这种情况下,我们可以采取一种压缩方法,称为滤波器剪枝或通道剪枝(filter pruning / channel pruning),减小CNN中卷积层的宽度,即滤波器(filter)的数量,从而显著减小整个CNN的参数量和运算量。

我们提出了一种新的优化方法Centripetal SGD(C-SGD)将多个滤波器变得完全相同,也就是说,使其核张量在参数超空间中逐渐变成一个重合的点。在训练完成后移除这些完全相同的过滤器,不会造成性能的损失。通过这种方法,可以很好地解决结构复杂CNN上的受约束剪枝问题。


研究方法


1.滤波器剪枝

下面以一个简单的例子解释滤波器剪枝的概念。如图(左)所示,第一个卷积层(conv1)的输入是2个通道,它有4个滤波器,所以输出是4个通道;由于conv2以conv1的输出作为输入,所以它的每个滤波器有4个输入通道;conv2有6个滤波器,所以它的输出有6个通道。如果我们将conv1的第3个滤波器移除,自然地,其输出的第3个通道就被移除了,因此conv2的每个滤波器的第3个输入通道也被移除了。



2.通过Centripetal SGD进行滤波器剪枝

如上图(右)所示,如果能够将conv1的第3个和第4个滤波器参数变得完全相同,那么conv1输出的第3个和第4个通道就会变得完全相同,此时只要移除conv1的第4个滤波器,然后将conv2的每个滤波器的第4个输入通道分别加到第3个输入通道上去即可。由于卷积的线性,这一变换是等价的,不会造成任何精度损失。


3.方法简述

对于每个卷积层,首先将其所有滤波器分为若干个聚类。因为每个聚类只保留一个滤波器,所以聚类的数量应等于最终的滤波器数量。

通过我们提出的Centripetal SGD更新规则(详见论文),每一聚类中的若干个滤波器之间的差距被逐渐消除,(即,它们的核张量在参数空间中相互靠近,最终变为同一点),最终变得完全相同。

我们可以通过均匀聚类或者k均值聚类的方式生成聚类,实验表明它们之间差异很小(如表1所示)。



4.C-SGD的高效实现

现代CNN训练和部署平台的效率是基于大规模张量操作。C-SGD的巧妙之处在于,其更新规则可以通过非常高效的矩阵运算来实现。实验发现,C-SGD的速度跟普通SGD几乎相同。(详见论文)


5.C-SGD训练后的滤波器合并

经过C-SGD训练后,由于每个聚类中的过滤器都变得相同,只需要留下每个聚类中的第一个滤波器,然后对其下一层的输入通道做相加变换即可。


6.C-SGD用于受约束剪枝

从上古时代的AlexNet、VGG到现代高效CNN架构如ResNet、DenseNet,网络结构越来越复杂。在复杂的网络架构中,对卷积层进行剪枝往往会受到各种约束。例如,ResNet的每一个residual block的最后一层必须剪掉同样位置的同样数量的滤波器,不然相加的对应关系就全乱套了,整个网络就完全崩掉了。很多方法只对ResNet、DenseNet等网络中那些不受约束的、容易剪的层进行剪枝,尽管这些方法能够在一定程度上压缩网络,但从整体角度来看,网络并字面意义上“变瘦”(slimmed)了,而其实是某些位置被“雕琢”(clipped)的,如下图所示。

C-SGD解决这一问题的关键在于使得那些必须要按照相同模式来剪的层“学习同样的冗余模式”,即,如果a层和b层必须要剪相同的位置,那么我们就只对a进行聚类,然后直接将a的聚类结果用于a和b层的C-SGD训练。这样,我们保证了:如果a层的第i和j个滤波器变得相同了,那么b层的第i和j个滤波器也一定会变得相同。这样,a层和b层的这些滤波器就可以一起剪掉,对应关系就不会乱掉了。



实验结果

1.压缩非常深且复杂的CNN

我们在CIFAR-10和ImageNet-1K上进行实验以评估我们的方法。对于每个试验,我们都从训好的基本模型开始,并在所有目标层上同时应用C-SGD训练。表中列出了C-SGD与其他滤波器剪枝方法之间的比较,如表1和表2所示。



2.冗余训练与正常训练的比较

C-SGD与其他剪枝方法的比较表明,训练冗余网络并将其等效地转换为较窄的网络可能比先剪再训的思路更好。亦有相关研究表明,神经网络的冗余性对于高度非凸优化是有益的。给定相同的最终结构,用普通SGD训练一个模型,再用C-SGD训练一个大模型并等效转换为同一结构,对比其精度。结果如表3所示(详见论文):


3.“滤波器趋同”和“滤波器归零”

使滤波器变得相同(本方法)和将滤波器归零(众多已有方法)都可以用于滤波器剪枝。我们通过用ResNet-56开展对照实验以研究其性能差异。结果如图所示:



在上图中给出了修剪前后的(用于度量每一聚类中的滤波器参数有多么接近),(那些被归零的滤波器参数到底有多小)曲线以及测试精度。可以观察到:(1)Group Lasso(滤波器归零的代表方法)不能真正地将滤波器归零,但可以在一定程度上降低其值的大小。(2)通过C-SGD,单调且完美地呈指数减小,故收敛更快。(3)Group Lasso的训练比C-SGD要慢2倍,因为它需要平方根运算。


4.C-SGD与其他滤波器剪枝方法

通过DenseNet-40上的对照实验将C-SGD与其他方法进行了比较,将训好的DenseNet-40的每个增量层(incremental layer)分别压缩为3和6个过滤器,并重复实验3次,所有结果如图所示。



结果表明,C-SGD具有更高的准确性和更好的稳定性。


结语

与归零方式相比,CNN中产生相同的滤波器以进行滤波器剪枝(即网络瘦身)的精度更高、压缩率也更高。目前,非常深而复杂的CNN上的受约束滤波器剪枝问题已经得到部分解决。通过使用C-SGD训练带有冗余滤波器的网络,进一步证实了冗余可以帮助神经网络训练的收敛。除用于剪枝外,C-SGD有望用作正则化或一种训练手段。

通过C-SGD可以有效压缩CNN的参数量和运算量,使得CNN部署在嵌入式系统等计算资源受限的平台上成为可能。


参考文献:Ding, Xiaohan et al. “Centripetal SGD for Pruning Very Deep Convolutional Networks With Complicated Structure.” 2019 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) (2019): 4938-4948.




文稿|丁霄汉

编辑|于亿航 周圣钧 高松龄 邱雨浩

审核|赵 鑫 张可人


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存