1. 程式人生 > >【論文閱讀】Clustering Convolutional Kernels to Compress Deep Neural Networks

【論文閱讀】Clustering Convolutional Kernels to Compress Deep Neural Networks

文章:Clustering Convolutional Kernels to Compress Deep Neural Networks

連結:http://openaccess.thecvf.com/content_ECCV_2018/papers/Sanghyun_Son_Clustering_Kernels_for_ECCV_2018_paper.pdf

這篇文章主要是研究模型的壓縮和加速。其他的文章大多數都只研究網路結構中的冗餘引數或影響不大的結構,用剪枝的方法來壓縮模型。作者從另一個方面研究,將相似的卷積統一表示,極大程度壓縮了所需儲存記憶體,並與剪枝的方法不衝突(可同時使用)。

 

貢獻:

1.提出了一種新的方法,將k-means聚類應用於2d核上,以壓縮和加速cnn。這是第一個考慮核心冗餘空間模式的網路壓縮方法。

2.提出的變換不變聚類方法擴充套件了具有幾何變換的核心點的有效數目。

3.實驗表明,提出的的方法普遍適用於各種cnn架構和資料集。特別是,我們的壓縮後的resnet在lsvrc12影象分類上比原始模型在10倍以上的壓縮比上達到了更高的精確度。

 

一、用兩個引數表示一個卷積核(壓縮)

 

文中選擇聚類的卷積核為3*3;這在大多數現有模型中出現的最多。VGG16有1,634,496 多個3×3 kernels 佔了所有引數量的99.9%。ResNet-56 和DenseNet-12-40 分別有94,256 和101,160 kernels,也佔了引數量的絕大部分。

聚類的為2維卷積核,。Cout為卷積輸出通道,Cin為卷積輸入通道,h,w為卷積影象大小。每個卷積核的計算可以寫為。其中i為輸入通道,j為輸出通道。用k-means將wij聚為k類,表示式為,其中un為正常的求均值,,與傳統的k-means沒有任何區別。

由於核心權重的分佈可以在不同的卷積層之間變化,我們利用卷積的基本概念,對所有的核進行歸一化處理。具體地說,我們把形狀相似但規範不同的核心放在一起處理,因為它們在過濾中表現出相似的行為。因此,我們使用歸一化的核心,而不是直接計算核心與其原值之間的距離。K-means 聚類表達寫為:,其中為歸一化的卷積核。為放縮的比例引數。為3*3卷積核的中心元素。

舉個例子,對於一個卷積核wij,可以近似的用sij*ulij表示。其中s表示放縮比例,u表示其所屬的聚類中心,l為所屬的中心在所有聚類中心中的編號。這個時候,一個3*3的卷積核,我們可以用sij和lij兩個引數近似表示。

 

二、一些基於共享引數的計算小技巧(加速)

正常計算卷積的式子為,對於一個卷積層而言,需要計算2*w*h*Cin*Cout個乘法。

先說(a)先加再卷積,,對於同一個輸出而言,我們的聚類中心設為k個,即這裡用到的卷積核不會超過k個,不妨即為v個。則對於不同的輸入,如果乘以的卷積核相同,我們可以先將這些輸入相加,最後再算卷積乘法。即對一個輸出計算v個乘法,當然,每個輸出的用到的聚類中心v可能不同,這一層卷積的乘法總數為所有輸出對應的v相加。

再說(b)先卷積再相加,。因為是同一個輸入,它的正則化係數(放縮比例)一定相同,即可以將s提出來最後乘,假設這個輸入總共用到λ個聚類中心。這時對於這個輸入,只需要算λ乘法。

 

作者使用下面三個模型在CIFAR10上進行了實驗,僅對3*3的卷積核進行聚類近似表示,C128代表聚類中心數目為128.分類效果沒有明顯下降。注:網路進行了一些小修改,例如VGG16的三個全連線變為一個。

 

然後分析了壓縮比例和提升速度

,N為網路中3*3核的數目,bw為一個權重佔記憶體大小(32b),h*w為圖大小,k為聚類中心數目,bs為正則化引數(放縮比例)佔記憶體大小。所以說,上式分子為傳統需要記憶體,儲存每個權重的引數。而分母則為文中優化後的佔記憶體,前半部分為這N個核的所屬聚類中心編號和放縮引數的記憶體,後半部分為聚類中心的記憶體。由於k遠遠小於N,近似等於。。

加速的話上面已經分析了加速演算法(a)add-then-conv和(b)conv-then-add,v和λ就是用到的聚類中心的個數。由於這兩個演算法不能同時使用,所以取最小值。約等於是因為加法計算也是要時間的。

 

三、變換不變聚類法(TIC)

 

對一個聚類中心,它的水平翻轉,豎直翻轉,旋轉90°。這八種上圖做所示算作一個聚類中心。。注意:不是在原來的聚類結果上再聚一次類,而是在原有的聚類結果上進行修正,即考慮了變換的情況下,對原來的沒有聚類過的資料上進行變換不變聚類。這時,聚類的表示式就變成了下面這個樣子。

 

 

四、實驗結果

 

C32代表聚類中心為32,C64代表聚類中心為64。M2表示模型分為兩部分,前10層共用一組聚類中心,後3層共用另一組聚類中心。M13代表13層卷積層每層都用一組聚類中心。TIC則是變換不變聚類的縮寫,2,4,8分別表示只有豎直翻折,只有豎直水平翻折,翻折並旋轉。注:有可能出現所有核數目沒有預設的聚類中心個數多的情況,這時兩者取最小。

 

文章的方法和剪枝的方法不衝突,可以同時使用,使得壓縮和計算效果更好。P代表最常見的剪枝,基於L1去除一半的卷積核。原文:P is simple thresholding which removing 50% of the spatial kernels from each layer based on their L1 norms;filter-pruning則是一篇文章(Pruning filters for efficient convnets. In: International Conference on Learning Representations (2017))提出的剪枝方法,我沒去看就不解說了。

 

這是在最近很火的有瓶頸結構的網路上做的實驗,因為1*1的卷積佔了大部分,壓縮的整體效果沒有在VGG16上明顯。但是錯誤率並沒有明顯上升,表明瓶頸對正常網路的影響在這種壓縮表示中沒有消失。

 

最後是對其他壓縮演算法的比較。由於大家的硬體軟體的配置不一樣,這些東西並不好比較,作者也只比較了一部分。

 

五、其他:

這篇文章和大多數壓縮的想法不太一樣,用了索引和聚類的方式近似的表示出所有需要儲存的引數來進行壓縮。和大多數文章中採用的去除冗餘的卷積結構的做法可以同時使用。但是文章只描述了3*3的卷積,提到了對7*7卷積做了相似的事情。但是對1*1卷積暫時沒有好的處理方式。