神经网络剪枝论文精读(一)《Pruning Filters for Efficient ConvNets》(结构化剪枝//l1范数//层内评估//权重依赖)

前请提要

本系列旨在记录在学习神经网络压缩加速过程中读到的论文,本文适合有一定深度学习基础的同学阅读,如果有看不懂的地方请随时留言告诉我,只要我看到一定会及时解答。 

题目

        剪枝卷积核实现高效卷积神经网络 (对卷积核的裁剪能看出来是在做结构化剪枝),发表于ICLR2017,结构化剪枝的经典之作。

结构化剪枝和非结构化剪枝差别以及原理可以自行了解,我这里给出我理解的性质:

结构化剪枝:直接移除神经元或者卷积核,减少了参数量以及运算量,可以大幅度缩小模型大小以及推理速度。

非结构化剪枝:移除某些神经元之间的连接(一般通过权重置零来实现),来达到减少参数的目的,优点是可以移除绝大部分连接,但是移除后的稀疏矩阵需要特别的计算库支持,否则无法实现加速。

两种剪枝方法都基于一个想法:将减少模型参数量与浮点运算数,达到模型压缩以及加速的目的。

摘要

        主要提出该文章使用结构化剪枝方法,在之前研究中基于权重的剪枝方法(非结构化)虽然大幅减少了全连接层中的参数量,但是由于在剪枝后形成了不规则的稀疏化网络,没办法减少卷积层的计算量。而该文中提到的卷积核剪枝(结构化),将某些卷积核整个的从卷积层中移除,可以在不添加额外的线性运算库的条件下,有效的减少模型推理计算量。VGG-16以及ResNet-110在CIFAR-10上都看到显著效果:

        VGG-16:推理加速34% ResNet-110:推理加速38% 在微调后都达到接近原模型的正确率

正文部分

剪枝为什么有用?

        上文不断提到通过剪枝可以加速网络推理速度,那到底是怎么推理的呢,卷积层里面的计算量是什么算出来的呢,我们先看看卷积层的输入和输出都长什么样子

        卷积核的输入尺寸为 \mathbf{x}_i \in \mathbb{R}^{n_i \times h_i \times w_i} 输出尺寸为\mathbf{x}_{i+1} \in \mathbb{R}^{n_{i+1} \times h_{i+1} \times w_{i+1}},卷积层输入通道为ni,输出通道为ni+1,于是在这其中,卷积层所做的计算操作数为n_{i+1} n_i k^2 h_{i+1} w_{i+1},由此推出,当减少一个卷积核后(ni+1减少一个)该层卷积核的计算量会减少n_i k^2 h_{i+1} w_{i+1},同时由于下一层的卷积层减少了一个输入通道,他的计算量也会相应减少n_{i+2} k^2 h_{i+2} w_{i+2}。可以看到,对某一卷积层做剪枝,会影响该层与下一层的计算操作数。

        在上图中,kernel matrix表示卷积层矩阵,其中前一个卷积核中蓝色的表示需要剪去的卷积核,后一次中的蓝色表示该剪枝对后续卷积层的影响,会使每个卷积核减少一个通道数。

该怎么剪?

        理论层面得知,越少的卷积核带来越少的计算量,从而提高模型的推理速度,下面就讨论剪枝的具体方法。

        首先是评价指标,该论文中给出一个简单粗暴的卷积核评估方法,在单一层中对卷积核的l1范数进行评估,也就是把卷积核中的每个参数的绝对值相加,得到该卷积核的l1范数,最后在同一卷积层中按照l1范数进行排序,将l1范数较小的卷积核视为其对推理结构不重要,将其对应卷积核移除。

        其次是评价策略,由上文分析可以知道,对某一层的剪枝,其实会影响该层和后一层的卷积核结构,这时就需要在评估的时候选择要不要考虑上一层的剪枝对后一层卷积核带来的影响。文中给出两种解决方法:

        1. 独立的评估各层卷积核,忽略其他层对该层的影响。该方法实施简单,但是会引入上一层卷积核对后层影响带来的误差。

        2. 贪心剪枝,考虑上层对该层卷积核的影响,在计算l1范数时不考虑之前剪枝掉的通道内容。

        第三是剪枝策略,既然已经确定指标,知道怎么评估卷积核,那现在则需要选择对哪个卷积层进行剪枝,不同的卷积层对剪枝的敏感度怎么样(剪枝后推理掉点是否严重)?文中使用对每一层都进行不同比例来进行剪枝的实验,来确定不同卷积层对剪枝的敏感度。

        如图所示,不同的层对剪枝的敏感度不同,低敏感度卷积层更适合使用提到的剪枝方法,同时也发现,以l1范数为指标的剪枝效果会大于随机选择卷积核进行剪枝。在模型部分卷积层剪枝retrain后甚至能超过原模型精度。

        最后是retrain策略,面对剪枝后不可避免的掉点,需要对剪枝后模型继续训练,以提高其acc,得到进一步的模型,这其中有两种策略供选择:

1. 一次性剪枝训练:顾名思义,训练--剪枝--重新训练

2. 迭代剪枝训练:训练--剪枝--训练--剪枝...... 不断循环,每次剪枝一定百分比,最后得到所需要模型

ResNet怎么剪?

        ResNet在CV领域的重要性无可置疑,但是其残差连接方式让对ResNet的剪枝不像对普通卷积层剪枝那么简单,具体示意图如下

        卷积层Xi-1的剪枝结果会影响Xi的通道数,Xi的通道数会影响Xi与残差块之间的卷积层以及shortcut中的卷积核(图中橙色部分),同时卷积层Xi的剪枝结果又会影响Xi+1层卷积层的结构(图中蓝色部分),Xi+1卷积层的卷积核和shortcut的卷积核又需要保持一致(因为残差连接需要通道数保持一致),这就有一个很麻烦的问题,shortcut和残差块中的卷积核是各剪各的还是只要对一个做剪枝,另一个保持剪枝卷积核索引一致就可以?文中给出的方法是后者,即二者保持相同的卷积核剪枝索引,共享掩码,而掩码的计算则是根据shortcut部分所计算出来的l1范数(图中绿色)

实验结果

        文中使用VGG-16(CIFAR10,添加BN层),ResNet-56(CIFAR10),ResNet-110(CIFAR10),ResNet-34(CIFAR10)进行剪枝,其结果如下

        尤其注意,里面scrath-train表示剪枝后将权重再次随机初始化后训练得到的结果。证明该剪枝方法在这些网络中得到很好地效果,部分网络甚至超过原网络精度。

有意思的现象(个人认为)

        1. ResNet中会有不同的阶段,在每个阶段中特征图的尺寸是不一样的,实验发现在阶段开始和阶段结束的时候,也就是特征图尺寸发生变化时,卷积层对剪枝很敏感,而在阶段中间的一些卷积核则相对不敏感。

        2. ResNet中,对残差块中的第一个卷积层进行剪枝效果最好。

        3. 网络中深层次的相比于之前的阶段对剪枝更为敏感。

        

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值