Channel Pruning for Accelerating Very Deep Neural Networks
論文地址:https://arxiv.org/abs/1707.06168
代碼地址:https://github.com/yihui-he/channel-pruning
作者將目前的CNN加速研究分為三類:
Optimized implementation :比如FFT?
Quantization :?代表為BinaryNet
Structured simplification: 作者又分為三類:
tensor factorization :mobilenet 為代表,作者提出這種方法無法分解1*1的卷積,而1*1的卷積普遍用在GoogleNet ,ResNet 和Xception 上?
sparse connection:以deep compression 為代表,這種方法缺點是被pruning 后的連接和神經(jīng)元會形成不規(guī)則的結構,不容易在硬件上進行配置實現(xiàn)?
channel pruning:本文采用的方法,優(yōu)點是直接減少不重要的通道數(shù),缺點是會對下游層產(chǎn)生影響,因此要reconstruction
文章的核心內(nèi)容是對訓練好的模型進行通道剪枝(channel pruning),而通道減枝是通過迭代兩步操作進行的:第一步是channel selection,這一步是采用LASSO regression來做的,其實就是添加了一個L1范數(shù)來約束權重,因為L1范數(shù)可以使得權重中大部分值為0,所以能使權重更加稀疏,這樣就可以把那些稀疏的channel剪掉;第二步是reconstruction,這一步是基于linear least squares(也就是最小二乘,或者叫最小平方)來約束剪枝后輸出的feature map要盡可能和減枝前的輸出feature map相等,也就是最小二乘值越小越好??梢钥闯霰疚牡耐ǖ兰糁κ菍τ柧毢玫哪P瓦M行的,也就是文章說的inference time,當然作者在最后的conclusion中也提到以后會在train time中也引進通道剪枝,希望能減少訓練的時間。
原文中作者列舉的加速效果:Our pruned VGG-16 achieves the state-of-the-art results by 5 speed-up along with only 0.3% increase of error. More importantly, our method is able to accelerate modern networks like ResNet, Xception and suffers only 1.4%, 1.0% accuracy loss under 2 speedup respectively, which is significant.
本文采用的通道剪枝(channel pruning)是模型壓縮和加速領域中一種簡化網(wǎng)絡結構的操作,文中作者還列舉了其他兩種常見的簡化網(wǎng)絡結構的操作:sparse connection和tensor factorization,可以看Figure1的對比。(a)表示傳統(tǒng)的3層卷積操作。(b)表示sparse connection,這是通過去掉一些參數(shù)很小的連接得到的,理論上是有明顯的加速效果的,但是在實現(xiàn)過程中并不容易,主要因為稀疏連接層的形狀不規(guī)則。(c)表示tensor factorization,比如SVD分解,但是這種操作其實并不會減少channel數(shù)量,因此很難帶來明顯加速。(d)就是通道剪枝(channel pruning),也就是直接對channel做剪枝,移除掉一些冗余的channel,相當于給網(wǎng)絡結構瘦身,而且各個卷積層的形狀還比較統(tǒng)一。?
Figure2是本文對卷積層做通道剪枝的一個示意圖。先看左邊大的虛線框,其中字母B表示輸入feature map,同時c表示B的通道數(shù)量;字母W表示卷積核,卷積核的數(shù)量是n,每個卷積核的維度是c*kh*kw,kh和kw表示卷積核的size;字母C表示輸出feature map,通道數(shù)是n。因此通道剪枝的目的是要把B中的某些通道剪掉,使得剪掉后的B和W的卷積結果能盡可能和C接近。當要剪掉B中的一些feature map的通道時,相當于剪掉了W中與這些通道對應的卷積核(對應W中3個最小的立方體塊),這也是后面要介紹的公式中β的含義和之所以用L1范數(shù)來約束β的原因,因為L1范數(shù)會使得W更加稀疏。另外生成這些被剪掉通道的feature map的卷積核也可以刪掉(對應Figure2中第二列的6個長條矩形塊中的2個黑色虛線框的矩形塊)。?
因此最重要的就是如何判斷B中的哪些通道要剪掉,具體是分兩步來迭代進行的:In one step, we figure out the most representative channels, and prune redundant ones, based on LASSO regression. In the other step, we reconstruct the outputs with remaining channels with linear least squares. We alternatively take two steps. Further, we approximate the network layer-by-layer, with accumulated error accounted.?
公式1就是優(yōu)化方程。首先字母c表示待剪枝的feature map的通道數(shù),待剪枝的feature map也就是該卷積層的輸入feature map;W表示卷積核,維度是n*c*kh*kw,因此n就是輸出feature map的通道數(shù);X表示從輸入feature map中取出的N個維度為c*kh*kw的samples。因此當卷積核W去卷積X時,得到的就是N*n大小的輸出Y,這里要解釋下N*n的含義,其實是輸出n個feature map,每個feature map的長*寬等于N,因此這里相當于把二維的feature map拉直成一個向量,這樣Y就是二維的,方便公式1中計算平方。β是一個向量,里面的值只有0或者1,當要丟掉某個channel的時候,β的對應位置就是0. || ||F是F范數(shù)。c’表示剪枝后feature map的通道數(shù),因此最終要達到的目的是將通道數(shù)從c剪到c‘。?
所以公式1的意思是:首先β的0范數(shù)要小于等于c‘,也就是說β向量中非零值的數(shù)量要小于c’。然后最小二乘部分的Y表示未剪枝時的輸出feature map;求和部分表示按照β來剪枝后的輸出feature map,因此這個優(yōu)化式子是希望二者之間的差異越小越好,所以采取最小二乘(也就是最小平方)的方法來求β和權重W。?
當然,上面的式子是沒有辦法直接優(yōu)化求解的,因此有了下面的公式2。公式2是將公式1中對β的約束加到公式中,同時使用L1范數(shù)代替原來β的L0范數(shù),因為L0難以優(yōu)化,而且有數(shù)學證明L1范數(shù)可以替換L0范數(shù)。參數(shù)λ用來控制β中非零值的數(shù)量,λ越大,β中的非零值越少,這樣加速比也越大。另外||Wi||F=1是用來約束W的唯一解。?
從前面的介紹可以看出最終這個優(yōu)化式子要求的是最優(yōu)的β和W,因此具體優(yōu)化的時候是迭代進行的:先固定W,求解β,然后固定β,求解W。比如公式3就是固定W(XW用Z表示),求解β的公式。?
公式4就是固定β,求解W的公式。?
優(yōu)化中的一個細節(jié)是前面公式中的λ是在迭代過程中不斷增大的,直到||β||0穩(wěn)定以后就不增大了。?
一旦滿足β的約束:?
就得到了所需的β和W。當然作者在實驗中發(fā)現(xiàn)這樣迭代操作比較耗時間,因此采取的策略是先不斷優(yōu)化公式3,直到達到上面這個β的約束時再優(yōu)化公式4一次。
前面介紹的都是對于網(wǎng)絡沒有分支情況下的通道剪枝,但是現(xiàn)在的ResNet、GoogleNet網(wǎng)絡都有多分枝,對于這種網(wǎng)絡,文中以ResNet為例也做了分析,如圖Figure3。首先,在這個residual block中,除了第一層和最后一層外的其他層都可以采用前面介紹的通道剪枝方式進行剪枝。針對第一層,因為原來其輸入feature map的通道數(shù)是輸出的4倍,因此在剪枝之前先對輸入feature map做sample。針對最后一層的通道剪枝,由原來對Y2來優(yōu)化,改成對Y1-Y1‘+Y2來優(yōu)化(Y1和Y2表示剪枝之前的輸出),Y1’表示前面層剪枝后得到的結果(也就是該residual block的輸入,只不過和Y1不同的是該輸入是前面層剪枝后得到的結果),否者shortcut部分帶來的誤差會對結果影響較大。?
實驗結果:?
Figure4是在VGG16網(wǎng)絡上對單層做不同的channel selection方式的實驗結果對比,用來證明本文的這種channel selection算法的有效性。圖例中fist k表示抽取前k個channel作為剪枝后的channel,max response表示選取卷積核權重的絕對值最大的一些channel作為剪枝后的channel??梢钥闯鲭S著層數(shù)的增加,channel pruning的難度也增加,這表明在淺層中存在更多的冗余channel,這也是后面對模型做channel pruning時候?qū)\層和高層采取不同程度剪枝的依據(jù)(淺層剪枝得更加厲害,比如從conv1_x到conv3_x剪枝后剩余的通道數(shù)與conv4_x剪枝后剩余的通道數(shù)的比例是1:1.5,而conv5_x是不剪枝的,一方面因為conv5_x計算量少,另一方面從實驗結果看其冗余率已經(jīng)很低了)。?
Table1是對整個VGG-16網(wǎng)絡做通道剪枝的結果,可以看出在2倍加速的時候甚至沒有影響到準確率。?
Table2是作者在VGG-16網(wǎng)絡上將本文的通道剪枝和spatial factorization、channel factorization結合在一起(對應表中的Our 3C)做加速的實驗結果對比,可以看出結合不同的加速算法的效果都要優(yōu)于某一種加速算法。?
Table5是作者將加速算法用在object detection算法上的表現(xiàn),這里是以Faster RCNN為例子。?
比如對于ResNet和Xception的通道剪枝的實驗結果、train from scratch等。
(1)LASSO regression based channel selection. (2)least square reconstruction.
first?k selects the first k channels. 這種方法太簡單粗暴了。
max response 也就是選擇權值和最大的信道,認為擁有的信息最多。
個人覺得這篇文章的主要貢獻在于:相較于原來那種暴力的pruning,利用數(shù)學方法優(yōu)化目標函數(shù),使得pruning前后的輸出差異最小,取得了一定效果。
缺點在于:我還是覺得人工加入的限定太多,而且這種方法引入了很多調(diào)節(jié)參數(shù),調(diào)整和優(yōu)化都麻煩,實用性不強。而且文章開頭說不需要retrain,其實還是pruning之后再來finetune一下效果比較好。