卷積網絡的稀疏與量化

論文: Sparse, Quantized, Full Frame CNN for Low Power Embedded Devices

github: https://github.com/tidsp/caffe-jacinto

AI爆發的三個條件,算法,算力和數據。深度學習對算力要求極高,如果沒有一塊性能良好的GPU,那麼模型訓練和調參將是一件耗時的工作,嚴重拖慢工作進度。CNN因爲其高效的特徵提取和參數共享機制使得其在圖像處理方面表現優異,下面介紹了經典的的CNN網絡架構處理1280x720@30FPS的視頻流所需的計算量。

一個 GMACS等於每秒10億 (=10^9) 次的定點乘累加運算

將CNN模型運行在DSPs上所需的計算複雜度需要低於50GMACS,由上表所知,CNN模型所需的計算複雜度遠遠高於DSP的要求,那麼要如何才能降低CNN模型的複雜度,使其運行在DSPs上呢?

存在多種方法能夠降低CNN的複雜度,早先的方法有用可分的卷積代替不可分的卷積,這種方法提速4.5x,精度降低1%,這種方法的缺點是需要更改網絡架構,將一層拆分成水平和垂直的過濾器;還有一種能夠不更改網絡架構也能稀疏卷積的算法,這種算法在訓練過程中定義高的權重衰減,當權重的絕對值低於預先定義的閾值時,二值化爲0。固定爲0的參數,fine-tune非0的參數,以此來恢復因稀疏降低的準確率;將浮點精度的係數量化爲Dynamic 8比特的頂點也是一種有效的方法。

在這篇論文中,爲了降低CNN的計算複雜度,作者提出瞭如下四步操作:

  • a quick sparsification method 
  • fine-tuning without loss of sparsity
  • low complexity dynamic 8-bit quantization
  • Sparse convolution method to speedup inference

快速稀疏

在網絡訓練中,添加L1正則化有助於稀疏的稀疏化,所以第一步就是在網絡訓練中增加一個高權重衰減值的L1正則化。

接下來,假設T_{s}爲某一層的稀疏目標值,T_{s}是這一層中爲0的權重個數佔總權重個數的比率,每一層的稀疏目標值可以設置不同;設W_{am}爲這一層權重的絕對值最大值;T_{m}設爲最大閾值,T_{m}=\alpha \cdot T_{am}, \; \; \alpha =0.2;設W爲這一層的權重張量,那麼

                                                                 \\ t=0; \\ s = Sparsity(W,t);\\ while \; s< T_{s} \; and \; t <T_{m}: \\ \cdots t = t + \beta ;\\ \cdots s = Sparsity(W,t);

從一個很小的稀疏閾值t開始,計算在當前閾值下的稀疏率s,如果s小於設定的稀疏目標值T_{s}並且t小於設定的最大閾值,爲當前的稀疏閾值t增添一個很小的增量\beta(一般取1e-7),然後計算新稀疏閾值下的稀疏率s,以此循壞,直至while循環裏面的條件不被滿足。

Sparsity()函數計算給定稀疏閾值t,參數向量W中稀疏的絕對值小於t的稀疏的比率。

微調

上述步驟中的閾值計算會降低CNN模型的準確率,進過微調之後可以恢復降低的準確率。在量化初期,構造由非0稀疏組成的map,然後在整個微調期間,僅僅更新這些非0係數值,爲0的稀疏值保持不變。

量化

研究表明,將浮點精度的稀疏量化到動態的8比特定點(Dynamic 8-bit fixed point)能夠保持圖像分類問題的準確率,"Dynamic"在這裏指的是CNN層與層之間的量化乘積因子(quantization multiplication factor),量化邊界是不同的,框架之間也是不同的。

在訓練期間,Exponential moving averages被用於計算每批訓練數據在各層中的不同張量(權重,輸入和輸出)的最大值和最小值。Flags被插入CNN模型中用來表示哪些張量是有符號的,哪些是無符號的。對於有符號的張量,被量化到-128到127之間;對於無符號的張量,被量化至0至255之間。在論文中,作者限制了量化乘積因子必須是2的倍數。

假如張量的邊界值爲R_{min}R_{max}, 無符號張量的整型長度(Integer length)爲I_{l}=log_{2}\left(\left | R_{max} \right | \right ); 有符號張量的整型長度爲

I_{l}=log_{2}\left(max\left(\left|R_{min} \right| , \left| R_{max}\right| \right )\right ) \right ) + 1, 那麼fractional length 被計算爲 F_{l}=8 - I_{l}; 張量的量化乘積因子爲M_{q} = 2^{F_{l}}

張量通過乘以量化乘積因子被量化,然而一些值可能處在邊界值之外,所以就不得不被裁剪clip。對於無符號張量,

W_{q} = clip\left ( round\left ( W*M_{q}\right ) ,0,255\right )

對於有符號張量

W_{q} = clip\left ( round\left ( W*M_{q}\right ) ,-128,127\right )

卷積稀疏計算

假設X爲輸入張量,Y爲輸出張量,W爲權重張量,Wx和Hx爲輸入張量的寬和高,那麼關於一個3x3的卷積運算僞代碼如下所示:

將上述代碼裏面的循環可以被調換順序,將內循環調到外面,這樣每一次整個block都乘以一個單獨的權重值,一次計算整個block,好處在於權重爲0的時候,整個block就能夠被跳過,這樣的卷積計算方式被稱爲Block Multiply Accumulation(BMA)。

                                                           \\ for \left ( int\; m=-1; \; m<=1; \; m++ \right ) \\ \cdots for \left ( int ; n=-1; \; n<=1; \; n++ \right ) \\ \cdots \cdots wt = W[m][n] \\ \cdots \cdots \cdots if \left ( wt \neq 0 \right ) \\ \cdots \cdots \cdots \cdots for \left ( int\; i=0; \; i<W_{x}; \; i++ \right ) \\ \cdots \cdots \cdots \cdots \cdots for \left ( int \; j=0; \; j<H_{x}; \; j++ \right ) \\ \cdots \cdots \cdots \cdots \cdots \cdots Y[i][j] \; += X[i+m][j+n] * wt 

如果應用BMA計算整個卷積層,首先需要收集非零權重所對應的block指針,然後將非零權重和相應的輸入和輸出指針收集在單獨的列表中。BMAlist()函數從xList函數中取出一個塊指針,從wList中取出一個權重值,相乘,然後累積整個塊到yList的指針。僞代碼如下(本人認爲以下的僞代碼僅僅計算了輸出p個通道的第[0][0]值).

使用BMA的卷積計算如下圖所示:

Implementation on device

稀疏的卷積網絡被應用在Texas instruments的TDA2x SoC,它有四個EVE。以下表格比較了了JSegNet21 CNN網絡的稠密格式和它相應稀疏格式在處理1024x512圖像分割的複雜度。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章