NISP: Pruning Networks using Neuron Importance Score Propagation
利用神经元重要性分数传播对网络进行剪枝
这是CVPR2018的一篇文章,在在这里整理一下我的理解思路
论文链接:https://arxiv.org/abs/1711.05908
为了减少深层卷积神经网络(CNNs)中的显着冗余,现有的方法只考虑单个层或两个连续层的统计量(比如说,剪枝一层以最小化下一层的重建误差),而忽略了深层网络中误差传播的影响。在作者看来,这种剪枝的方法只看局部,不看整体。所以作者认为,必须根据一个统一的目标,联合修剪整个神经元网络中的神经元:
在分类前的倒数第二层中,最大限度地减小重要响应的重构误差,对经过修剪的网络进行再训练。
具体步骤:我们应用特征排序技术来度量FRL中每个神经元的重要性,并将网络剪枝描述为一个二进制整数优化问题,并给出了该问题的一种封闭的解决方案,用于对早期层中的神经元进行剪枝。作者提出的神经网络重要性分数传播(NISP)算法,将最终响应的重要分数传播到网络中的每个神经元指导剪枝。
这张图是作者提出的剪枝方法。最上面的一行是我们平时所见的网络结构,图像送入卷积网络进行处理,再将结果送入一个特征选择器。在网络结构中,作者把分类前的最后一层命名为“最终响应层”(绿色部分),最终响应层再接一个特征选择器,特征选择器部分使用的是Inf-FS的滤波方法。Inf-FS是利用矩阵幂级数的性质有效地计算了一个特征相对于所有其他特征的重要性,从而得到了最终响应层的神经元重要性,就如图中NISP框中的绿色部分,接下来利用作者提出的传播算法,将重要性分数逐层反推回去,得到整个网络所有层的重要性分数,再根据所得到的分数以及预先设定的每一层的剪枝率对原有的模型进行剪枝,得到剪枝后的模型,再送入数据对于模型进行微调。
神经元的定义如公式(1)。
3.2.2 Objective Function
作者的目标是,原始网络产生的响应,与剪枝网络产生的响应之间的差异应最小化
作者定义了一个子网络G,他是原来的网络f之中的一部分,定义如公式(2),它以一个嵌套函数的形式表达出来:
我们的目标是计算第l层的神经元剪枝指示,使得地l层剪枝对最终反应的重要性神经元的影响降到最低。
作者定义了一个关于l层神经元修剪指示器的优化目标,如公式(3):
公式(3)是对于所有样本的,公式(4)是对于单独一个样本。
F(x)是原来的层的权重参数,F()中的是二进制的数,如果该神经元重要则对应的位置为1,不重要则为0,通过和x进行元素积,进行剪枝,把不重要的权重值置为0,再和原先的权重值做差取绝对值,再和该层剪枝前的重要性分数做点乘求得
3.2.3 Solution
网络剪枝问题可以用二进制整数规划问题,我们要在方程中找到最优的神经元剪枝指示符。然而,直接优化方程很难得到有效的解析解。给出了该目标的一个上界,并证明了通过最小化上界可以得到一个次优解。有趣的是,基于这个次优解,我们找到了一个可行且有效的计算所有神经元重要性分数的公式。
神经元的函数中,作者假设激活函数是利普希茨连续条件(Lipschitz continuity),
这个假设很重要,他是后面作者求目标上边界的一个重要假设,后面的推导都是基于这个不等式的。
对于任意的x,y,存在一个常数项C,使得以下不等式成立,我们根据这个不等式可以得到公式5,结合前面我们所提到的嵌套函数G的表达形式,我们可以得到公式6
重复使用公式6进行迭代,我们可以可以得到公式7,公式7里面的大W代表的是几个层的权重矩阵的绝对值连乘,常数项C部分也是同理,用连乘表示并使用新的符号进行表示,
接下来使用,对公式7中的x,y进行替代,得到公式8:
接下来我们结合前面我们设立的当个样本的目标函数,利用公式8的不等式对其进行缩放,我们可以得到公式(9),考虑到多个样本,我们可以把公式(9)变换为公式(12)
公式13中对相加的顺序进行调整,可以得到公式14,在14中构造出了项,我们知道是有界的那么一定寻在一个常数Cx使得不等式成立:
我们定义,将常数项做一个合并,得到公式15:
根据公式15我们可以看出我们的目标函数是有上界的,我们再将其转换一下,等价为公式16中的最小化公式:
公式16中的解是原先我们定义的公式3目标函数的次优解,它仍然可以抓住神经元的重要性。
从公式16我们可以看出,如果在剪枝后的第l层的神经元还保留有个,当且仅当为是中最高的值之一,。
前面我们定义了
它是第l层的神经元重要性分数的一个可行解,作者定义了网络的神经元重要性如下:
神经元重要性的一个重要特性是它可以沿着网络递归地计算(或传播)。这也是这篇论文中所提出的神经元重要性算法的最重要的一个特性
公式18给出了相邻2层的递归关系,在算法中相邻层可以根据该公式来计算:
我们从公式19中得出结论:神经元的重要性是与其直接相连的所有后续神经元的加权和:
3.3. Pruning Networks Using NISP
给定每一层的目标剪枝率,我们传播重要性分数,根据其重要性分数计算剪枝指标,删除剪枝指示值为0的神经元。
重要的传播和分层剪枝在一个单一的后向传递中可以同时进行,修剪的神经元的重要性不会传播到任何低一层的层次。对于完全连接的层,我们修剪每个单神经元。对于卷积层,我们将全部通道的神经元一起剪枝。通道的重要性分数计算为本Channel 2中所有神经元的重要分数之和。通道的重要性分数计算为该通道内所有神经元的重要分数之和。
- Experiments
作者在目前各种流行的CNN网络上做比较实验,首先比较随机剪枝和从零开始训练基线,以证明该方法的有效性。然后,我们比较了另外两个基线,基于量值的剪枝和逐层剪枝,以突出特征排序和神经元重要性分数传播的贡献。