深度神经网络推动了许多机器学习任务,包括语音识别、视觉识别和语言处理,是人工智能的有力工具。为了让深度神经网络得以更好地应用,就要让其有更高的准确率以及更快的速度,而剪枝技术可以满足这两点。
腾讯优图提出过两种剪枝方法。一种名为Stripe-Wise Pruning,通过裁剪滤波器的形状,对模型进行裁剪,能够兼容filter pruning,并实现更加精细的裁剪,便于模型加速。目前该方法刷新了滤波器剪枝的SOTA效果,相关论文还被NeurIPS 2020收录。另一种名为RM Operation,可以将准确率更高的MobileNetV2样式的模型等价变化为速度更快的MobileNetV1,能够对去除残差的ResNet进行剪枝,模型推理速度快于直接对ResNet进行剪枝。
近日,以「基于模型剪枝的高效模型设计方法」为主题,腾讯优图实验室围绕深度神经网络有什么优化目标,剪枝技术如何获得更快、更轻的网络,残缺连接的优缺点是什么,滤波器嫁接方法等问题进行了分享。
01
深度神经网络优化中
剪枝技术的必要性
VGG-16及Resnet-18是深度神经网络中用于建立分类模型的两种经典架构,它们由很多卷积组成的序列构成,并应用FC层即全连接层分类。在分类检测场景中,通过卷积层可提取图像特征形成特征图而后接入RPN网络等多重任务执行后,最终完成目标检测,在此过程中,卷积层大量堆叠,往往产生很多参数冗余,而剪枝技术就是针对卷积层进行合理裁剪。
剪枝流程分为三步,首先,正常训练一个网络;其次,对无效参数进行裁剪;最后,为恢复精度重新训练剪枝后的模型。在训练-剪枝-再训练这样循环往复的迭代剪裁中,会对原有模型收敛情况产生一定的破坏,同时,如果一次剪枝中的裁剪比例过大,也会让模型难以恢复,因此剪枝技术对于减小模型大小,加快推理速度以及提高模型精度影响深远,可以说是深度神经网络优化的关键一环。
02
如何衡量模型中的无效参数
输入图像的值称为Feature map,卷积层提取Feature map上通道之间以及结构上的信息,与自身结构中的filter通道值即卷积层的输出通道进行乘积来输出特征图,经过BN层的批归一化,并通过ReLU激活,将特征图的负轴的值过滤掉,输出最终特征图。
我们在做剪枝的时候主要关注卷积层,如果在卷积中一个输出通道的值是无效的,也就是产生了一个无效的滤波器,接下来BN层、ReLU的输出,以及紧接着的卷积层的输入输出过程全都跟着变得无效,如此就衍生出关于如何衡量模型哪些通道参数是无效的一个指标,通常可通过以下路径去进行判断。
01
衡量滤波器的好坏:用滤波器的绝对值的和、几何均值或矩阵的秩来衡量卷积的参数,矩阵是否有效。
02
衡量BN层是否有效:由于BN层的计算方式为,用Feature map值减去输入Feature map每个通道的均值,除以标准差,乘以BN层的权值Wi,然后加上偏置Bi。Network Slimming方法在训练时稀疏化BN层的权值,并用这一权值来衡量通道的好坏。
03
用Relu的输出的特征图判断:Relu中正数的部分直接通过,小于零的值会强行置零,如果输出通道结果产生了非常多的零,那么说明这个通道就不是被激活了。
03
无效参数的剪枝方法讨论
在找到无效参数后,以目前主流的裁剪方法,不一定就能将它裁剪掉。
Filter/Channel pruning
通道级别剪枝
以滤波器的一个输出通道为单位进行裁剪,称为滤波器剪枝;以输入通道为标准进行裁剪,就是通道级别的剪枝。通道级别的剪枝中,如果无效的参数集中在滤波器里面,能把滤波器全都裁剪掉,如果这里面有一些无效参数,但大多数是好的,就不能把那些无效的给裁剪掉,必须留下来。
Weight Pruning剪枝
Weight Pruning比filter/Channel pruning产生时间更早,没有限制必须都在一个滤波器进行裁剪,任何一个位置产生无效参数都可以裁剪掉,剪枝比例更大,但裁剪完的模型非常不规则,最后产生的稀疏矩阵在通用硬件上的加速效果不好,因此现在广泛使用的还是filter/Channel pruning。
Filter/Channel pruning滤波器里面所有的参数都比较无效才把它裁剪掉,Weight Pruning裁剪后在加速效果差,以上两种方法都具有一定的局限性,那么更精细的剪枝,同时又能够结构化的在通用硬件上实现的技术尤其引人关注。
Stripe/Group-wise pruning
更精细的剪枝技术
Stripe/Group-wise pruning兼容了原来的filter pruning和Channel pruning,但能够对每个滤波器都能裁剪掉其中的一条,形成不同的形状,因此对滤波器的裁剪更具有细粒度。而实现这种更精细化的剪枝,不得不提到腾讯优图实验室自研的pruning filter in filter方法。
04
pruning filter in filter
裁剪滤波器形状的剪枝方法
神经网络出了参数属性外,还存在形状属性,可视化训练好的VGG网络中的滤波器会自然而然存在着相应的形状,例如一个点,或者是一个条形的形状,竖着的条纹形状,及其他奇怪的形状,pruning infilter就把形状作为一个滤波器的属性显式地进行学习。
在pruning filter in filter方法中,卷积先跟滤波器的骨架相乘,学习滤波器的形状,并在前向传播中将滤波器形状进行系数化后对模型剪枝进行指导;在反向传播时,卷积参数更新,filter skeleton滤波器骨架形状也会同时更新;模型训练完后,骨架再乘回到原来的参数上,变成跟之前一样的正常的卷积。
每个滤波器的形状全都不一样,那么如何把一个奇形怪状的东西给结构化的进行剪枝呢?把正常的卷积进行strip-wise卷积等价变换,即N个输出通道和C个输入通道,3X3的卷积拉直成9倍的输出通道及跟原来一样的输入通道的卷积,变换后的卷积就可以像正常的filter pruning一样,把无效通道裁剪掉。通过这种方法,每个滤波器不同的形状结构拉直,然后对每个条进行精细裁剪,更有利于结构化实现。
05
RMNet pruning
去掉模型残差的直筒型网络剪枝方法
在输入输出通道中,往往存在着残差连接的结构,限制剪枝效果,我们发现把带残差的结构变成一个不带残差的结构进行剪枝更加灵活。如ResNet两层残差结构中,在残差连接部分引入一个辅助的特征图节点,把输入通道通过网络的卷积,BN层ReLU等模块进行不改变值的合并操作,通过变成一个直筒型的不带残差的结构,能够实现更灵活和更大比例的剪枝。
训练阶段RM操作使用正常的ResNet模型,推理阶段或剪枝之前,在卷积层增加部分通道,与输入特征图通道数量一致。通过对扩张通道的初始化,在特征图通过卷积层扩张的通道后,把所有输入通道保留下来,不改变值。由于输入特征图值为非负,通过ReLU后也不改变其值。残差部分的特征图操作与保留过来的特征图合并,最终的值与转化前的结果等价。
实验展示了在带残差的ResNet结构剪枝中引入RM操作,变成直筒型结构后,剪枝比例更大,剪枝准确率更高,剪枝后的模型速度显著快于原模型,而得到的机构也更加合理。
06
为什么引入RMnet优于RepVGG
RepVGG是在做一种直筒型网络,即没有残差的网络工作,那么为什么我们引入RMnet而非RepVGG呢?
01
首先,RepVGG是从头设计并训练一个特殊的带残差的网络,推理时再转化为一个没有残差的网络;RMNet无需额外训练,就可以将常用的带残差的网络,通过等价的方法把残差去除掉,从而能够做一些剪枝之类的工作。
02
其次,RepVGG不是ResNet的等价变换,其实用的重参数化做法可以在浅层网络上得到很好的效果,但在深层的时候准确率表现显著下降,而RMNet因与ResNet在训练的时候是完全等价的,在很深的情况下准确率还是能往上走的。
除了判断滤波器的好坏、突破裁剪残差这些限制外,要追求更好效果的准确率,腾讯优图实验室进行了新的探索——滤波器嫁接。
07
Filter Grafting滤波器嫁接
正常的卷积,出现无效滤波器的时候,一般的剪枝是把无效的滤波器去除掉,模型变得更小,速度更快。滤波器嫁接就是想能不能用一种信息把无效滤波器给激活,原来无效的滤波器被接进来一个新的有益的信息,保持结构不变的情况下,准确率能达到更好的效果。滤波器嫁接尝试了三种方法:
01
高斯噪声激活:训练模型到一定程度时,对模型信息量进行排序,在此过程中对无效滤波器加上高斯噪声进行重新激活,激活之后的滤波器由于值都是激活的,有机会重新提取输入特征,从而能达到提升效果的目的,最终实验也是可以提升嫁接后模型的准确率,但接入的信息的是无意义的噪声。
02
内部滤波器激活:对滤波器进行排序,排序后判断其中的无效滤波器,用好的滤波器接到坏的滤波器上,以这种方法激活,激活的滤波器有一定信息,但这种方法接进来的信息是冗余的。
03
外部滤波器激活:引入两个模型分别独立训练,训练到一定程度时,两个模型进行一次嫁接,用好的滤波器去把无效滤波器激活,两个模型互相激活。由于两个模型是独立训练的,信息不存在冗余,相当于把两个模型的信息结合,嫁接之后得到的模型效果会更好。
三种嫁接方法对比,发现用外部的模型效果更好,而且外部嫁接方法可以引入多个模型,把更多的模型信息融合在一起。实验也证明当参与嫁接模型数量越来越多,准确率也越来越高,信息熵也越来越多。
领取专属 10元无门槛券
私享最新 技术干货