ThiNet(轉載)
轉載自csdn
論文:ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression
論文鏈接:https://arxiv.org/abs/1707.06342
prune(剪枝)是深度學習模型壓縮和加速的重要方法。ThiNet是ICCV2017的文章,主要通過prune方式達到模型壓縮和加速,prune以filter(卷積核)為單位,根據該層filter的輸出來判斷該filter是否對結果有貢獻,如果沒有貢獻或貢獻很小,則直接把這個filter去掉,因此文章的核心就在于filter的選擇方式,依據則是如果可以用某一層的輸入的一個子集代替原來的輸入得到盡可能類似原來的輸出的話,那么子集以外的輸入就可以去掉,同時其對應的前面一層的filter也就可以去掉。以去掉冗余filter做prune的研究還有很多,關鍵在于選擇方式,比如計算filter的絕對值和,認為如果一個filter的絕對值和比較小,說明該filter并不重要,這種算法暫且叫Weight sum;還有計算激活層輸出的feature map的值的稀疏程度,如果feature map的值很稀疏,也就是大部分值是0,那么該feature map對應的filter也是冗余的,可以去掉,這種算法暫且叫APoZ(Average Percentage of Zeros)。這兩種壓縮算法在后面的實驗中都會提到。
具體ThiNet的壓縮和加速效果怎么樣?VGG-16可以達到減少3.31倍FLOPs和16.63倍的壓縮,top-5準確率只下降0.52%。ResNet50可以達到減少2.26倍FLOPs和2.06倍的壓縮,top-5準確率只下降了1%。
框架的流程圖如下Figure1,第一行是filter selection,選擇的依據是:如果我們可以用第i+1層的輸入channel的一個子集作為第i+1層的輸入且近似得到第i+1層的輸出,那么這個子集以外的channel就可以去掉了,因為第i+1層的一個輸入channel對應第i層的一個filter(卷積核),因此去掉第i+1層的channel同時也就可以去掉第i層的filter。第二行是prune,將第一步的weak channel和對應的前面一層的filter去掉,得到更窄(thin)的網絡,這也是ThiNet名稱的由來。第三行是Fine-tuning,這里為了節約時間,當對每一層做prune后,都fine-tune1到2個epoch,然后等所有層都prune后,再fine-tune多個epoch。因此整體上就是上面這三步迭代應用到每一層上,依次對每一層做prune。

從前面的介紹可以看出ThiNet的關鍵在于怎么選擇冗余的filter,接下來詳細介紹。首先一個卷積操作可以用下面這個式子表示。W是卷積核,x是輸入,b是偏置,c表示輸入channel。

如果我們定義:

那么式子1就可以寫成下面這個形式:

如果定義一個集合S:

那么式子3就可以寫成:

作者在文中采用的是貪心算法來求解最優的集合S。假設輸入是:

那么就能得到下面這個優化式子:

這里r表示壓縮率。也就是說我們需要找到能使得這個優化式子最小的channel集合S。作者采用貪心算法來求解這個S,由于S包含channel較多,因此求解速度會很慢,因此定義另一個集合T,集合T所包含的channel要少于S,滿足:

這樣就能將式子5轉換成如下的優化式子,這樣求解最優值的速度會更快。

綜上,求最優集合T的算法如下:

前面介紹的都是關于算法的細節,那么如何應用到現有的網絡結構中呢?這里作者主要介紹VGG-16和ResNet-50。在兩個網絡中應用ThiNet做prune有一些需要注意的地方,比如像ResNet這樣的網絡,在每一個stage的每一個block中一般有三層卷積,其中最后一層卷積的結果需要和skip connection的結果做element-wise product,這樣的話就得保證該block的最后一層卷積的輸出channel個數核skip connection的輸出channel個數一樣。因此在文中作者采用只對一個block的前兩層卷積做prune,而不動最后一個卷積層,如下圖Figure3。另外對于VGG-16網絡,由于前面10層卷積占據了90%的計算量,而全連接層又占據了86%的參數,因此作者采用對前面10層卷積層進行prune,達到加速目的,另外將所有全連接層用一個global average pooling層代替。

實驗結果:
本文的ThiNet在進行網絡壓縮的時候,關鍵在于怎么選擇冗余的filter,因此Figure4就是不同filter選擇方式的實驗結果對比。Random就是隨機選擇,Weight sum和APoZ在前面都介紹過了。

Table1是在VGG-16網絡上應用ThiNet壓縮。其中ThiNet-Conv表示只對前面10個卷積層進行壓縮,ThiNet-GAP表示在對卷積層壓縮的基礎上還將所有的全連接層用global average pooling代替。ThiNet-Tiny是壓縮率較高的網絡,主要是和SqueezeNet做對比。

Table2也是VGG-16,這是和其他基于filter做prune的算法的對比。APoZ-1和APoZ-2的差別在于后者prune的卷積層數量更少。Taylor算法對filter做prune的依據在于如果一個filter的存在對減少loss沒有幫助,則可以去掉。

Table3是在ResNet-50上應用ThiNet進行壓縮和加速的結果。ResNet-50在網絡結構設計上本身存在的冗余就比較少,所以可壓縮的空間比VGG-16要少很多。另外由于在對ResNet-50壓縮時候只是壓縮大部分卷積層,而沒有壓縮像BN,pooling層等,但是這些層在測試的時候會占用約40%的GPU計算資源,因此測試時候的加速不會太明顯。

浙公網安備 33010602011771號