鑑別力感知的通道剪枝——Discrimination-aware Channel Pruning論文解讀
文章目錄
一、論文背景
深度學習發展之後,為了讓計算機視覺任務的效能,大趨勢就是不斷的加深加重網路的深度。但複雜模型的同時,帶來了高額的儲存空間、計算資源消耗,使其很難落實到各個硬體平臺。而在在深度卷積網路中,存在著大量冗餘地節點,僅僅訓練小部分引數就可以達到和原來網路相近的效能(本文的理論依據)。因此壓縮模型以最大限度地減小模型對於計算空間和時間的消耗。該方法就是為了有效地裁剪模型且最小化精度的損失。
二、演算法優勢分析
現有兩種通道剪枝策略:
1、基於從頭訓練的通道剪枝策略:新增稀疏正則化,訓練困難
因此,本文提出鑑別力感知的通道剪枝策略,考慮到特徵對映的附加損耗和重構誤差,分別在fine-tune與剪枝階段引入鑑別力感知的輔助loss,能夠增強剪枝後所保留特徵的鑑別能力。
三、演算法思路
該演算法均勻地插入P個識別感知損失層(p的大小由神經網路的深度決定),因此整個演算法共分為p+1個階段(因為插入的p層將整個網路分割成立p+1個段):
- 在每個階段中,首先計算該層Lp的輔助誤差,然後結合前一層剪枝的模型與預處理模型之間的重構誤差計算聯合誤差(構建識別感知損失),以最小化該誤差為目標,來更新前一層Lp-1層的剪枝後的網路和輔助層的引數,以起到微調前一階段的模型的作用(補償了剪枝帶來的精度損失,提升了特徵鑑別力)。
- 然後在對該Li層和Li-1層之間的層,逐層進行通道選擇,從而完成該階段的剪枝。
- 在進行通道選擇時,本文采用貪心策略,首先設定一個空集A,再按迭代方式選擇最重要的通道索引加入到集合A中。在每次迭代時,首先計算上面計算出的聯合誤差L對Wj的梯度(第j 輸入通道的卷積核引數),然後選擇對梯度響應最大的通道加入到集合A中。由於聯合loss中包含了鑑別力感知的輔助loss,因此所選擇的輸入特徵通道具有較強的鑑別力。每往A中加入一個通道索引,便更新一次集合A中的引數,並驅使A補集中的引數為零。
四、識別感知損失的構建
對於第p階段,每一個損失使用Lp的輸出特徵Op作為輸入特徵,為了使損失的計算更容易,本文在特徵圖上使用平均池化,為了加速收斂,在平均池化前使用batchnorm和ReLU,最終計算對於在Lp層輸入特徵圖的損失 。則Lp層的識別感知損失為:
五、最小化結合誤差
計算剪枝後模型輸出特徵與baseline特徵之間的均方根誤差(重構誤差):
最小化重建誤差與輔助誤差L相結合的聯合loss:
六、終止條件
由於L是凸函式,L(Wt)將隨著演算法2中的迭代索引t單調下降。因此可以採取如下停止條件:
七、實驗結果
在實驗部分,對比了ThiNet、Channel Pruning(CP)、Network Slimming、WM、WM+,對於提出的方法其他幾個變體也做了比較,包括DCP(使用裁剪率n的識別感知通道裁減),DCP-Adapt(使用停止條件的DCP),Random DCP(隨機選擇通道代替基於梯度測策略)。評估資料集為Cifar10、ILSVRC-12以及LFW。
相關設定:
- 在ResNet-50中插入3個損失,在VGG和ResNet-18中插入2個損失。
- 使用新增nesterov的SGD作為優化器,momentum和權重衰減設定為0.9和0.0001。
- 在CIFAR-10,使用大小為128的mini-batch微調400個epochs。學習率初始化為0.1,在epoch160和240處除以10。
- 在ILSVRC-12,微調60個epochs,mini-batch為256,學習率從0.01開始,在epoch36,48,54處除以10。
-
在CIFAR-10上的比較:
本文提出的方法在相同加速率上有最好的表現,DCP-Adapt裁剪的VGG網路比原與訓練模型降低了0.58%的測試誤差,並獲得了15.58倍的尺寸減少。 -
在ILSVRC-12上的比較:
本文使用該方法在ILSVRC-12資料集ResNet-50網路中實現2倍加速。本文方法比ThiNet在top-1中低0.81%誤差,在top-5中低0.51%誤差。對比channel pruning,降低了0.79%的top-5誤差。 -
在LFW上的比較:
在修剪率為50%的情況下,該方法將SphereNet-4提高了0.1%。與FaceNet[37]、DeepFace[44]和VGG[31]等大型網路相比,精度沒有明顯的優勢,但是其引數量較小。
八、程式碼測試
1、安裝環境:anaconda、python3.5、tensorflow1.0、pytorch0.4、prettytable、pyhocon
2、測試resnet_56_pruned0.5.pth在CIFAR-10資料集上的準確率以及FLOPs。
要下載完整的程式碼,我一開始就是下載了不完整的程式碼,導致我一直執行不了,設定配置檔案test.hocon:
要注意這裡面的depth還有nettype不是隨便設定的:
nettype和資料集要匹配,可以看main.py裡的程式碼:
depth決定了插入的感知層,原始碼在"\DCP-master\DCP-master\dcp\models\pruned_resnet.py"中有預先的設定(當然是在哪個檔案取決於你選擇的網路型別):
修改train.py裡面的forward函式計算計算複雜度:
執行結果:
九、個人理解
對於通道裁剪,最簡單的思路就是將所有通道按重要性進行排序,然後留下重要的,裁剪掉不重要的。目前已知的幾種方法都是體現在衡量其重要性上。可見本篇論文提出的方法其實本質並沒有改變,只是將通道選擇問題歸結為稀疏優化問題,並引入了額外的loss進一步提高精度。
本文的方法是基於考慮對特徵輸出的可重建性的影響這一思想提出的變體。最小化裁剪後網路對於特徵輸出的重建誤差就是如果對當前層進行裁剪,如果它對後面輸出還沒啥影響,那說明裁掉的是不太重要的資訊,反之就是重要的通道。
而本文的方法是通過求得一個損耗,然後計算該損耗對引數梯度的響應。響應越大就證明這個引數對模型影響越大,所以越應該保留下來。
然後就是要計算這個損耗函式,如果只使用重構誤差,可能結果會比較依賴於預訓練的模型,這樣會出現很多冗餘的無用的通道沒被裁剪,而且也沒有解決通道裁剪帶來的精度下降的問題。因此本文在中間層新增額外的discrimination-aware loss,另一方面也考慮特徵重建誤差的loss,綜合這兩方面進行計算損失函式,從而在某些訓練集上達到了不錯的效果。
對於該方法,我覺得還是屬於非結構化剪枝的一種方法,它沒有在本質上解決稀疏化後帶來的與軟硬體相關的一系列問題;其次,該方法是基於貪心演算法進行剪枝,因為它忽略了引數之間的關係,所以可能知道的只是區域性最優解;最後,該類方法都是基於“存在通道冗餘”這一基本假設,所以對於某些稀疏網路,可能冗餘的通道沒有那麼多,所以該類方法作用可能就不大,還有就是從這個角度想,能不能從一開始就著手於構建簡單的或者易於計算的網路,真正的實現簡單有效。
論文地址:https://papers.nips.cc/paper/7367-discrimination-aware-channel-pruning-for-deep-neural-networks.pdf
程式碼地址:https://github.com/SCUT-AILab/DCP
預訓練模型:https://github.com/SCUT-AILab/DCP/releases
參考部落格:
深度學習網路模型壓縮剪枝詳細分析https://blog.csdn.net/nature553863/article/details/83822895
鑑別力感知的通道剪枝https://www.cnblogs.com/wujianming-110117/p/12702802.html
深度學習模型壓縮演算法綜述https://blog.csdn.net/wspba/article/details/75671573