代码地址:
1. 概述
导读:卷积网络的剪裁对于模型部署到终端机上具有很强的实际意义,但是现有的一些剪裁算法存在训练并不高效,人工设计剪裁方案耗时费力,其原因就是缺少对于网络中非重要成分的指引。这篇文章中在特征图中搜寻具有High Rank(HRank)特性的filter(参考矩阵分解的内容),之后将那些具有low-rank对应的filter剪除掉,从而达到网络瘦身的目的。文章的方法的原理是:由一个filter产生的特征图他们的rank均值是是一致的,CNN网络中batch参数对其无影响,文中使用数学证明的形式表明那些具有low-rank属性的filter具有较少的信息,而那些hight-rank属性的filter具有更加丰富的信息。基于这样的思路文章的方法在ResNet-110上实现了58.2%的FLOPs减少,精度损失0.14%(CIFAR-10数据集top-1),ResNet-50减少43.8%的FLOPs,精度损失1.17%(ImageNet数据集top-1)
一般来讲对于网络的剪裁分为种类型:weight pruning(非结构化剪枝)和filter pruning(结构化剪枝)。由于第一种剪枝策略产生的是稀疏的权重矩阵,因而限制了一些主流矩阵运算库和硬件的使用,因而需要对其单独设计。而第二种剪枝方式则是对现有的硬件和运算库比较优化,也是现有的比较常用的一种剪枝压缩方法。对于这种剪枝压缩方法核心就是对于非重要filter的判断上,对此文章将其对于filter重要性的度量划分为两个类型:
- 1)Property Importance:这种类型的方法是建立在网络的固有属性上的,并不需要修改网络的损失训练损失函数,在完成剪枝之后需要finetune用以恢复精度。一些典型的方法有L1或L2范数/一阶梯度度量/特征图反向映射filter重要性/网络层的几何中值。这些方法会存在精度和压缩比例的局限;
- 2)Adaptive Importance:这种类型的方法是将剪裁的方法嵌入到网络的训练过程(给损失函数添加额外的正则项并使其稀疏)中,这样通过在网络训练过程中通过数据流的形式选择更加的裁剪方案。一些方法有:在BN中scaling稀疏/引入结构稀疏参数。这些直接在网络中加入的稀疏约束的方式一般比第一种方法中获得结果要好,但是由于网络的损失函数已经被改变,这就使得整个网络都需要重新训练而不仅仅是重新fintune了;
而这篇文章的方法是属于上面说到的第一种剪裁方法的,文章使用rank的属性对特征图进行筛选,从而将对应的filter剪除掉,其流程见下图所示:
此外,文章还发现网络的特征图rank均值其并不会根据训练batch的变化而变化(也就是对输入数据分布不敏感),见下图所示:
这就使得文章的算法可以在小批量的数据集上进行,从而不需要将整个数据集载入,因而效率就很高了。
2. 方法设计
2.1 变量定义
这里假设CNN网络拥有 K K K层卷积网络, C i C^i Ci代表第 i i i个卷积层,则该层的卷积参数可以表示为 W C i = { w 1 i , w 2 i , … , w n i i } ∈ R n i ∗ n i − 1 ∗ k i ∗ k i W_{C^i}=\{w_1^i,w_2^i,\dots,w_{n_i}^i\}\in R^{n_i*n_{i-1}*k_i*k_i} WCi={ w1i,w2i,…,wnii}∈Rni∗ni−1∗ki∗ki,每个filter的参数维度为 w j i ∈ R n i − 1 ∗ k i ∗ k i w_j^i\in R^{n_{i-1}*k_i*k_i} wji∈Rni−1∗ki∗ki。则前一层的特征经过卷积之后生成的特征图表示为 O i = { o i i , o 2 i , … , o n i i } ∈ R n i ∗ g ∗ h i ∗ w i O^i=\{o_i^i,o_2^i,\dots,o_{n_i}^i\}\in R^{n_i*g*h_i*w_i} Oi={ oii,o2i,…,onii}∈Rni∗g∗hi∗wi,这里对生成特征的batch和C维度进行了调换,用于后面数据驱动的filter权值选择。则经过选择之后可以分为两个子集: I C i = { w I 1 i i , w I 2 i i , … , w I n i 1 i } I_{C^i}=\{w_{I_1^i}^i,w_{I_2^i}^i,\dots,w_{I_{n_{i1}}^i}\} ICi={ wI1ii,wI2