ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression

1. 架构

在给定预先训练的模型的情况下,将以预定义的压缩率逐层修剪该模型。框架总体如下:
ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression

  1. 滤波器选择。如果我们能用第(i+1)(i+1)层输入中的一个通道子集来近似第i+1i+1层的输出,可以将(i+1)(i+1)层的其它通道(补集)剔除。同时,第(i+1)(i+1)层的输入feature map的一个通道是由第ii层中的一个滤波器产生的,因此我们可以将第ii层对应i+1i+1层输入所要剔除的通道的滤波器剪裁。
  2. 裁枝。我们将第i+1i+1层输入的弱信道(可有可无,无关紧要的通道)及其在第ii中的相应滤波器修剪掉,从而导致产生小得多的模型。修剪后的网络具有完全相同的结构,但具有更少的过滤器和通道。
  3. 微调。微调是恢复滤波因修剪而破坏泛化能力的必要步骤。但对于大数据集和复杂模型来说,这将需要很长的时间。出于节省时间的考虑,我们在修剪一层之后微调一个或两个epoch。为了得到准确的模型,当所有图层都已修剪完毕后,将执行更多的epoch。
  4. 迭代到步骤1以修剪下一层。

分析

设置一个三元组Ii,Wi,\left\langle\mathcal{I}_{i}, \mathcal{W}_{i}, *\right\rangle其中Ii{I}_{i}为第ii输入的特征图,其中IiRC×H×W\mathcal{I}_{i} \in \mathbb{R}^{C \times H \times W}Wi\mathcal{W}_{i}\inRD×C×K×K\mathbb{R}^{D \times C \times K \times K}代表DD个滤波器。
ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression
如图2所示我们在输出的特征图上任选择一个位置,其数值记为yy,所以
y=c=1Ck1=1Kk2=1KW^c,k1,k2×xc,k1,k2+by=\sum_{c=1}^{C} \sum_{k_{1}=1}^{K} \sum_{k_{2}=1}^{K} \widehat{\mathcal{W}}_{c, k_{1}, k_{2}} \times x_{c, k_{1}, k_{2}}+b
令任意通道值为:
x^c=k1=1Kk2=1KW^c,k1,k2×xc,k1,k2\hat{x}_{c}=\sum_{k_{1}=1}^{K} \sum_{k_{2}=1}^{K} \widehat{\mathcal{W}}_{c, k_{1}, k_{2}} \times x_{c, k_{1}, k_{2}}
所以我们可以得
y^=c=1Cx^c\hat{y}=\sum_{c=1}^{C} \hat{x}_{c}
其中y^=yb\hat{y}=y-bx^=(x^1,x^2,,x^C)\hat{\mathbf{x}}=\left(\hat{x}_{1}, \hat{x}_{2}, \ldots, \hat{x}_{C}\right),如果我们选择子集通道数S{1,2,,C}S \subset\{1,2, \ldots, C\}总是可以实现:
y^=cSx^c\hat{y}=\sum_{c \in S} \hat{x}_{c}
我们就可以实现模型的压缩。具体的实现方法是采用贪心算法得出最优的集合SS,给定mm个训练实例{(x^i,y^i)}\left\{\left(\hat{\mathbf{x}}_{i}, \hat{y}_{i}\right)\right\},则最优问题为:
argminSi=1m(y^ijSx^i,j)2 s.t. S=C×r,S{1,2,,C}\begin{array}{c} \underset{S}{\arg \min } \sum_{i=1}^{m}\left(\hat{y}_{i}-\sum_{j \in S} \hat{\mathbf{x}}_{i, j}\right)^{2} \\ \text { s.t. } \quad|S|=C \times r, \quad S \subset\{1,2, \ldots, C\} \end{array}
这里面S|S|是选择通道的数量,rr表示压缩率,我们可以优化问题转化为:
argminTi=1m(jTx^i,j)2 s.t. T=C×(1r),T{1,2,,C}\begin{array}{c} \arg \min _{T} \sum_{i=1}^{m}\left(\sum_{j \in T} \hat{\mathbf{x}}_{i, j}\right)^{2} \\ \text { s.t. } \quad|T|=C \times(1-r), \quad T \subset\{1,2, \ldots, C\} \end{array}
其中TT表示未选取的通道集合。作者也采用了其它算法进行求解,但是简单的贪婪方法具有更好的性能和更快的速度。
前面介绍的都是关于算法的细节,那么如何应用到现有的网络结构中呢?这里作者主要介绍VGG-16和ResNet-50。对于VGG-16网络,由于前面10层卷积占据了90%的计算量,而全连接层又占据了86%的参数,因此作者采用对前面10层卷积层进行prune,达到加速目的,另外将所有全连接层用一个global average pooling层代替。对于残差网络,由于结构的特殊性,作者只是修剪了残差块的前两层。
ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression

实验结果

ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression

相关文章: