Channel Pruning for Accelerating Very Deep Neural Networks
1.abstract:
本篇論文作者提供一個壓縮網路的演算法,藉由使用Lasso regression來找出filter中所存在的冗員,套用此方法來壓縮模型可以使得VGG16加速五倍但錯誤率僅僅上升0.3%,在Resnet上錯誤率上升1.4%但速度可以提升兩倍,在Xception上錯誤率上升1%但速度也提升兩倍。
code 作者也開源放在github上了:https://github.com/yihui-he/channel-pruning
2.main idea:
整篇想法的最主要公式表示如(1)所示,找到最適當的beta以及W使得卷積出來feature map與原始feature map差距最小。beta的參數可以經由lasso regression算出來,若參數裡面包含越多0則代表壓縮率越高,意思就是可以經由矩陣轉換將一些filter清除掉,之後再稍為改變下還沒清除fiter的權重,若input channel由原本的32化簡成8(beta vector裡面有24個0),且稍為改變剩下的channel(8)中的權重發現卷積出來feature map與原始的output feature map差距不大,如此即可單單用input channel為8的卷積核做運算以提升效率。
Y
- Optimal:
但式子(1)在數學上是屬於NP-hard問題,因此可以加入regression term來解決,具體概念可以參考下面連結
因此本篇論文分為兩個步驟來壓縮網路
Step1: 使用lasso regression來決定哪些filter為冗員
Step2: 決定冗員的filter之後重新計算weights使得重構的feature maps越小越好
重複疊代上述兩個步驟直到收斂即是本篇論文的最主要壓縮網路的想法,但作者在實驗時發現這樣疊代非常的花時間,因此在實際應用上作者選擇在第一個步驟時就一直疊代到beta < 指定的值C’,之後再執行步驟2以爭取最大效率
Lasso regression是一個統計學上提出的算法,具體可以參考
https://zh.wikipedia.org/wiki/Lasso算法
而實際運用上可以使用sklean所寫好的package調用
3.result
- VGG16:
作者以VGG16的網路來做比較,分別做了三種實驗- 1.first k:選擇前面K個channel消除掉
- 2.max response: 將每個channel的權重做加總的動作並由大排到小,刪除channel時由小權重的開始刪除
- 3.本篇論文演算法
作者把每一層的網路皆提取出來做比較,下圖是比較結果,橫軸代表壓縮比例,縱軸代表error的增加率,可以由圖上很明顯的發顯紅色的線斜率最小,也就是說在固定壓縮比例後,方法3的錯誤增加率相對得會比其他兩個方法還要來得少,證明此方法比其他兩種方法有效率
論文上與許多方法相互比較,可以看到本論文所提供的方法經過fine-tune後速度可以提升四倍但錯誤率僅僅上升1%,針對沒有fine-tune的版本效率也不遜色,在提升速率兩倍後錯誤率僅僅上升2.7%
作者不只使用本篇論文的pruning 還使用了spatial factorization以及channel factorization,將這些方法整合統稱3C,比較效果如下,在提升了五倍的速度之後錯誤率僅僅只有上升0.3%
上述論文的提升效率是指flops的提升倍數,作者實際運行在電腦上的inference速度比較如下:
-
Xception
作者不只針對VGG16網路做優化實驗,也對Xception網路做優化,得到的效果也很不錯
-
Resnet
作者也不只針對Imagenet做優化,在此實驗中作者將演算法套用在Resnet56-Cifar10數據上,同樣的也得到不錯的壓縮效果
4.reference
https://blog.csdn.net/qq_23225921/article/details/78807652
https://blog.csdn.net/u014380165/article/details/79811779
https://blog.csdn.net/SA14023053/article/details/51817249
https://scikit-learn.org/stable/modules/classes.html#module-sklearn.linear_model
123