模型加速(二)通道剪枝


   


        核心思想

通道裁剪的效果

細節補充

"看圖說話"

目標函數解讀


 

論文題目: Channel Pruning for Accelerating Very Deep Neural Networks

文獻地址:https://arxiv.org/pdf/1707.06168.pdf

源碼地址:https://github.com/yihui-he/channel-pruning

  

  最近,在進行YOLOv3,v4的模型壓縮,淺層壓縮中的裁剪和知識蒸餾是壓縮現有模型常用的方法(關於模型加速的概述猛戳這里),通過概述可以了解到淺層壓縮的裁剪(剪枝)主要包括權重剪枝,通道剪枝,核剪枝和神經元剪枝幾個分支。通道裁剪(channel pruning)相對於權重裁剪是一種粗粒度的裁剪方式,其直接刪除feature map的一些通道這些通道是怎么選取的,刪除通道的數量又是如何控制的?這些將由本篇來揭曉,該論文是ICCV2017的文章。

核心思想

  作者提出的通道剪枝是對訓練好的模型進行通道剪枝,也就是基於基礎模型訓練之后。針對刪除通道的選擇以及刪除通道數量的控制,作者主要通過以下兩步操作進行:

  step 1:channel selection,通道的選擇是通過LASSO regression來做的,也就是在損失函數中添加L1范數對權重進行約束,以目標函數優化的角度考慮,L1范數可以使得權重中大部分值為0,使得通道內權重具有稀疏性,從而可以將系數的channel剪掉

  step 2:feature map reconstruction,刪除通道的數量是不太容易優化的,可以通過建立某種目標更直接的達到通道剪枝力度的控制,就是希望剪枝后輸出的feature map和剪枝前輸出的feature map差異越小越好,很容易想的到,這一目標可以建立基於linear least squares(最小二乘or最小平方)實現

加速效果


   For VGG-16, we achieve 4× acceleration, with only 1.0% increase of top-5 error. Combined with tensor factorization, we reach 5× acceleration but merely suffer 0.3% increase of error, which outperforms previous state-of-thearts. We further speed up ResNet-50 and Xception-50 by 2× with only 1.4%, 1.0% accuracy loss respectively.


   從加速效果來看,通道裁剪在VGG、ResNet-50、Xception-50等現有backbone上具有明顯的加速效果,且不會帶來嚴重的精度損失。

通道裁剪的效果

  下圖是以VGG16為backbone,對channel selection的方式的實驗對比結果。其中first k 表示抽取前k個channel作為剪枝后的channel。(...有點任性)max response表示選取卷積核權重絕對值最大的一些channel作為剪枝后的channel。可以看出,隨着層數的加深,剪枝的難度是逐漸上升的。這表明在淺層中存在更多的冗余channel,這在一定程度上也表明對模型做channel pruning時,淺層和深層剪枝的力度應該是不同的。

  下表是對整個VGG-16網絡做通道剪枝的結果,可以看出在2×加速的時候甚至沒有影響到准確率。

  下表是將加速算法用在object detection算法上的表現,這里是以Faster RCNN為例。

細節補充

"看圖說話"

  首先,作者列舉了其他兩種常見的簡化網絡結構的操作:sparse connection(圖b)和tensor factorization(圖c),如下圖所示。

  (a)傳統的3層卷積操作;

  (b)sparse connection,這是通過去掉一些參數很小的連接得到的,理論上是有明顯的加速效果的,但是在實現過程中並不容易,主要因為稀疏連接層的形狀不規則。

  (c)tensor factorization,比如SVD分解,但是這種操作其實並不會減少channel數量,因此很難帶來明顯加速。

  (d)本文的通道剪枝(channel pruning),剪掉一些冗余的channel,相當於給網絡結構瘦身,不會影響網絡結構的整體性,沒有牽一發而動全身的影響。

  下圖是對卷積層進行通道剪枝的示意圖。先看右圖虛線框內的內容。其中,字母B表示輸入的feature map,c表示B的通道數量,可以看出B是經過通道裁剪后的feature map。W表示卷積核,kh和kw表示卷積核的尺寸,因此,每個卷積核的維度為c*kh*kw。由於feature map的部分通道裁剪,因此,相對應的卷積核的通道也沒有存在的價值,也要被裁剪掉。 C表示輸出的feature map,n為輸出feature map的通道數量,也是W卷積核的個數,從C的形態可以看出,C的維度只和卷積核的個數有關,並且輸出是完整的,也就是說,通道裁剪的過程並不會對下一層卷積造成影響,只是影響卷積內部的運算,說白了也就是參數量和計算量

  因此,剪枝需要解決的問題就是剪掉誰,如何保證剪掉后對精度沒有影響。(怎么突然想到了公司裁員...)

目標函數解讀

  這種問題解決都離不開優化,也就需要建立目標函數,神經網絡中通常通過損失函數來刻畫,即給予機器學習的指引。

  出於優化的角度,對於feature map通道需要剪掉誰,保留誰的問題,可以通過優化一個二值決策變量(0,1,其中,0表示裁剪,1表示保留)解決,即如下式中的βi。其中,c表示通道數量,i為通道數量的索引,Xi和Wi分別對應輸入feature map和卷積核的每個通道。因此,很容易理解,βi為0時,相當於該通道無作用,即裁減掉;βi為1時,表示保留。

  對於保證裁剪掉后對精度沒有影響的問題,可以通過最小二乘的方式解決。即下式中的F范數。c'表示剪枝后feature map的通道數量,通過對β的零范數限制裁剪力度下限,零范數表示β中非零值的數量  

  由於零范數的存在,上式是無法直接優化求解的,需要將L0范數轉化為L1范數。並將約束項以懲罰項的形式添加到目標函數中,懲罰項λ可以控制β中非零值的數量λ越大,懲罰越嚴重,β中非零值越少,模型加速力度比較大;同理,λ越小,懲罰相對較弱,β中的非零值就會多一些。另外||Wi||F=1是用來約束W的唯一解。

  因此,需要優化的變量包含兩個,一個是β,另一個是W。對於這樣的優化問題,通常會采用兩步走的方式,即固定W,優化β;再固定β,優化W。

  • 固定W,優化β可以通過LASSO regression

  • 固定β,求解W,可以通過最小二乘:

  優化中的一個細節是前面公式中的λ是在迭代過程中不斷增大的,直到||β||0穩定以后就不增大了。

  前面介紹的都是對於網絡沒有分支情況下的通道剪枝,但是現在的ResNet、GoogleNet網絡都有多分枝,對於這種網絡,文中以ResNet為例也做了分析。首先,在這個residual block中,除了第一層和最后一層外的其他層都可以采用前面介紹的通道剪枝方式進行剪枝。針對第一層,因為原來其輸入feature map的通道數是輸出的4倍,因此在剪枝之前先對輸入feature map做sample。針對最后一層的通道剪枝,由原來對Y2來優化,改成對Y1-Y1'+Y2來優化(Y1和Y2表示剪枝之前的輸出),Y1'表示前面層剪枝后得到的結果(也就是該residual block的輸入,只不過和Y1不同的是該輸入是前面層剪枝后得到的結果),否者shortcut部分帶來的誤差會對結果影響較大。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM