# [Pruning Filters for Efficient ConvNets](https://arxiv.org/abs/1608.08710), _ICLR_, 2017 <!-- [论文记录-Pruning Filters For Efficient ConvNets](http://lawlite.me/2017/09/10/%E8%AE%BA%E6%96%87%E8%AE%B0%E5%BD%95-PruningFiltersForEfficientConvNets/) --> ### Abstract convolution layer 解決 fully connected layer 參數量過多的問題,但是計算量來說,convolution later 所花的計算量成本較重。本篇論文在探討加速 CNN 以減少計算量的方法,利用刪減 Filter 的方法,可以大量減少計算成本(inference cost),至於如何選擇 filter 做刪減以及多個 filters 刪減的策略,最後討論 Pruning 和 retrain network 之間順序的實驗結果。 ### 3. Pruning Filters and Feature Maps Convolutional layer 的運算次數為 $n_{i+1}n_ik^2h_{i+1}w_{i+1}$ - kernel matrix $\mathcal{F}_i \in \mathbb{R}^{n_i\times n_{i+1}\ \times k \times k}$ - kernel matrix $\mathcal{F}_i$ 就是該層所有 filter - 圖左 kernel matrix 第 j 行就是第 i 層的第 j 個 filter - 圖右 kernel matrix 那一列就是 每個 filter 的該 channel - $n_i \times k \times k$ 是 filter size (3D) - $\mathcal{K}$ 是某個 filter 的某個 channel (2D) - 當第 i 層的一個 filter $F_{i,j}$ 被修剪掉,對應的 feature map $x_{i+1,j}$ 也會被移除,結果減少了 $n_ik^2h_{i+1}w_{i+1}$ 次的運算 - 此時少了一個 output feature map,即下一層的 input 少了一個 channel,結果減少了 $1 \times n_{i+2}k^2w_{i+2}h_{i+2}$ 次運算 ![](https://i.imgur.com/tebTIaF.png) - 若修剪了第 i 層的 m 個 filter,則會減少第i層和第i+1層 $m/n_{i+1}$ 比例的運算量 - $n_{i+1}$:第 i 層總 filter 數,即第 i+1 層的 input channel 數 - 即代表第 i 層 減少了 刪減filter數 (m)/ 總 filter 數( $n_{i+1}$ ) #### 3.1 決定某一層的哪些 filter 應該被修剪 計算 $\sum ||\mathcal F_{i,j}||_1$ 來測量每層的 filters 的 relative importance #### 3.2 決定某一層的 sensitivity ![](https://i.imgur.com/7TuLLuQ.png) Figure 2: (a) Sorting filters by absolute weights sum for each layer of VGG-16 on CIFAR-10. The x-axis is the filter index divided by the total number of filters. The y-axis is the filter weight sum divided by the max sum value among filters in that layer. - $s_j = \sum_{l=1}^{n_i}\sum |\mathcal K_l|$,即該 filter 的 weight 絕對值加總 - x軸:將 $s_j$ 從大 sort 到小的 filter id / #filters - y軸:該層某 filter 的 $s_j$ / 該層 $s_j$ 的最大值 - 曲線向上凸代表小的 weight 比較少;反之則代表小的 weight 比較多 ![](https://i.imgur.com/lS6QXuW.png) - 刪減某層 filter 對 accuracy 的影響 #### 3.3 Pruning Filters across Multiple Layers ![](https://i.imgur.com/yZPJbnu.png) 刪除多個 filters 後,計算某個 filter 的 weight sum 時, - _Independent_ pruning 會連同黃色格子一起算,不考慮前一層刪哪些 filter - _Greedy_ pruning 知道前一層刪了藍色那列 channel,因此不會計算黃色那格 - 兩種策略最後 kernel matrix 都是大小 $(n_{i+1}-m) \times(n_{i+2}-n)$,m 是前一層通道數,n 是filter數 **Pruning residual blocks** ![](https://i.imgur.com/WfBSxno.png) - $x_i$:第 i 層的 input feature map - 第 i 層 (residual block 第一層) 要刪的 filter(藍色) 可以隨便刪,因為不會影響 block 的 output - 第 i+1 層要刪的 filter(綠色),在修剪的時候,projected feature maps (上方 filter) 也必須被修剪 - identical feature maps $P(x_i)$ 比 added residual maps $x_{i+2}$ 更重要,因此會先決定 projection shortcut 要 prune 哪些 filter,這也連帶決定了如何 prune 第 i+1 層 (即 residual block 第二層) 的 filter - shortcut 上的 convolutional layer,是 [_Deep Residual Learning for Image Recognition_](https://arxiv.org/abs/1512.03385) 論文中的 $W_s$,用來讓 output 有相同 dimension #### 3.4 Retraining Pruned Networks to Regain Accuracy 兩種方法 1. Prune once and retrain - 可以用很短的時間將 accuracy 回復該有的水平。 - 然而若某些 sensitive layers 的 filters 被修剪,或者大部分的 network 都被修剪,很難回復原本的 accuracy 2. Prune and retrain iteratively - 可能得到較好的 result,但是需要更多更多的 epochs,尤其是非常 deep 的 network ###### tags: `model compression` `parameter pruning and sharing`