为了压榨CNN模型,这几年大家都干了什么
?
?
?
?
? ? 如果從2006年算,深度學習從產生到火爆已經十年了,在工業界已經產生了很多落地的應用。現在網絡的深度已經可達1000層以上,下面我們關注一個問題:
? ? 這些年大家是怎么“壓榨”CNN模型的。
?
?
?
?
? ? 首先回顧一下幾個經典模型,我們主要看看深度和caffe模型大小。
?
?
?
?
? ? 當然,在實際應用中,各自調試出的version會有出入,網絡的大小也不止和深度有關系,此處想說明的問題是:好像模型大小(參數量)和模型的深淺并非是正相關。
?
?
?
?
下面言歸正傳
?
?
?
?
?
?
?
?
?
?
“
?
?
?
這里要講的壓榨主要是將模型變小,以便在ARM,FPGA,ASIC等存儲空間有限的平臺應用。
?
從2個方面進行回顧。第一條是經典模型的設計路線,可以看得出本身就在不斷壓縮模型。第二條是在網絡結構基本不變的情況下,對模型參數的壓縮。
?
?
?
?
”
?
?
?
?
?
?
?
1 經典模型進階路
?
?
?
?
?
?
?
?
?
?
?
1 全連接網絡到卷積神經網絡
?
?
?
?
?
?
?
?
Fully connect to local connect
?
?
?
?
?
?
? ? 這里我們仍然放這張經典的比較圖,從最早的全連接神經網絡到卷積神經網絡本身就是一場大的參數壓縮革命。
? ? 按照全連接神經網絡的思想,1000×1000的圖像,如果隱藏層也是同樣大小(1000*1000個)的神經元,那么由于神經元和圖像每一個像素連接,則會有參數1000×1000×1000×1000。光是一層網絡,就已經有10^12個參數。
? ? 而如果采用卷積神經網絡,則由于權值共享,對于同樣多的隱藏層,假如每個神經元只和輸入10×10的局部patch相連接,則參數為:1000×1000×100,降低了4個數量級。
? ? 至于為什么可以這么做,讀者可以自己去關注卷積神經網絡的由來,主要原理在于圖像的局部patch可以與全圖有類似的統計特性。
? ? 這第一招,也是最厲害的一招,一舉將神經網絡的參數減小許多個數量級,才能有深度學習的發展。
?
?
?
?
?
?
?
?
?
2 1×1卷積使用
?
?
?
?
?
?
?
?
NIN
?
?
?
? ? Alexnet[1]是一個8層的卷積神經網絡,有約60M個參數,如果采用32bit float存下來有200M。值得一提的是,AlexNet中仍然有3個全連接層,其參數量占比參數總量超過了90%。
? ? NIN[2]是一個4層的網絡結構,其直接對標對象就是AlexNet,那么為什么模型大小只有前者的1/10呢?
? ? 除了去掉了全連接層外(這也是模型變小的關鍵),提出了1×1的卷積核,后來被廣泛用于GoogLeNet[3]和ResNet[4]。
?
?
?
?
? ? 下面舉一個例子,假如輸入為28×28×192,輸出feature map通道數為128。那么,直接接3×3卷積,參數量為3×3×192×128=221184。
? ? 如果先用1×1卷積進行降維到96個通道,然后再用3×3升維到128,則參數量為:1×1×192×96+3×3×96×128=129024,參數量減少一半。雖然參數量減少不是很明顯,但是如果1×1輸出維度降低到48呢?則參數量又減少一半。對于上千層的大網絡來說,效果還是很明顯了。
? ? 移動端對模型大小很敏感。下載一個100M的app與50M的app,首先用戶心理接受程度就不一樣。
? ? 到此你可能有一個疑問?原則上降低通道數是會降低性能的,這里為什么卻可以降維呢?
? ? 筆者沒有能力去完整回答這個問題,但是我們可以從很多embedding技術,比如PCA等中得到思考,降低一定的維度可以去除冗余數據,損失的精度其實很多情況下都不會對我們解決問題有很大影響。
? ? 當然了該文章最重要的貢獻應該是通過這種內嵌的結構,在通道之間組合信息從而增強了網絡的非線性表達能力。
? ? 一句話:1×1卷積,在?GoogLeNet Inception v1[3]以及后續版本,ResNet[4]中都大量得到應用,有減少模型參數的作用。
?
?
?
?
3 卷積拆分
?
?
?
?
?
?
?
?
?
?
?
?
?
VGG
?
?
?
? ? VGG可以認為是AlexNet的增強版,兩倍的深度,兩倍的參數量。不過,也提出了一個模型壓縮的trick,后來也被廣泛借鑒。
? ? 那就是,對于5×5的卷積,使用兩個3×3的卷積串聯,可以得到同樣的感受野,但參數量卻有所降低,為3×3×2/(5×5)=0.72,同樣的道理3個3×3卷積代替一個7×7,則參數壓縮比3×3×3/(7×7)=0.55,降低一倍的參數量,也是很可觀的。
?
?
?
?
?
GoogLeNet[3]
?
?
?
? ? GoogleLet Inception v2就借鑒了VGG上面的思想。而到了Inception V3[3]網絡,則更進一步,將大卷積分解(Factorization)為小卷積。
? ? 比如7×7的卷積,拆分成1×7和7×1的卷積后。參數量壓縮比為1×7×2/(7×7)=0.29,比上面拆分成3個3×3的卷積,更加節省參數了。
? ? 問題是這種非對稱的拆分,居然比對稱地拆分成幾個小卷積核改進效果更明顯,增加了特征多樣性。
只能說
?
?
?
?
? ? 后來的Resnet就不說了,也是上面這些trick。到現在,基本上網絡中都是3×3卷積和1×1卷積,5×5很少見,7×7幾乎不可見。
?
?
?
?
?
SqueezeNet[7]
?
?
?
? ? squeezenet將上面1×1降維的思想進一步拓展。通過減少3×3的filter數量,將其一部分替換為1×1來實現壓縮。
? ? 具體的一個子結構如下:一個squeeze模塊加上一個expand模塊,使squeeze中的通道數量,少于expand通道數量就行。
?
?
?
?
? ? 舉上面那個例子,假如輸入為M維,如果直接接3×3卷積,輸出為7個通道,則參數量:M×3×3×7。
? ? 如果按上圖的做法,則參數量為M×1×1×3+3×4×1×1+3×4×3×3,壓縮比為:(40+M)/21M,當M比較大時,約0.05。
? ? 文章最終將AlexNet壓縮到原來1/50,而性能幾乎不變。
?
?
?
? ? 據我所知的在卷積結構上做文章的,基本上都在這里,當然怎么訓練出本來就小的模型不算。
?
?
?
?
2.1 SVD分解法
?
?
?
?
?
?
? ? 有研究表明,一層的weights,可以通過其子集進行精確預測,所以可以使用奇異值分解(SVD分解)來對每一層進行低秩近似,下面只提一下基本原理和結論。
?
?
?
? ? 原理:對于一個m×k維的實數矩陣W,其可以進行奇異值分解為W=USV,其中U維度為m×m,S維度為m×k,V維度為k×k。S是非負實數對角矩陣,如果將其對角線的值降序排列并發現其值衰減很快,則只需要前面幾維就能保持W的絕大多數信息不丟失,這也是PCA的原理。
? ? 假如只保留t維,那么原來的計算復雜度為O(m×k),現在則變成了O(m×t+t×t+t×k),對于足夠小的t,O(m×t+t×t+t×k)遠小于O(m×k)。
? ? 不過這個方法實際的模型壓縮比并不明顯,在文章[8]中為2~3的左右,加速比也是2~3左右。所以同類的方法,就不再深究。
?
?
?
?
2.2 權重參數量化與剪枝
?
?
?
?
?
?
? ? 下面是近兩年比較有代表性的研究,主要是通過權重剪枝,量化編碼等方法來實現模型壓縮。其實最早也有直接對每個權重獨立量化的研究[9],但是效果顯然是不如下面的結果的。
?
?
?
?
?
DeepCompresion
?
?
?
? ? 這是2016 ICLR最佳論文。文章早期的工作,是Network Pruning,就是去除網絡中權重低于一定閾值的參數后,重新finetune一個稀疏網絡。在這篇文章中,則進一步添加了量化和編碼,思路很清晰簡單如下。
(1) 網絡剪枝:移除不重要的連接;
(2) 權重量化與共享:讓許多連接共享同一權重,使原始存儲整個網絡權重變為只需要存儲碼本(有效的權重)和索引;
(3) 霍夫曼編碼:更高效利用了權重的有偏分布;
?
?
?
? ? 第一部分很好理解,就是如下流程:
(1) 普通網絡訓練;
(2)?刪除權重小于一定閾值的連接得到稀疏網絡;
(3)?對稀疏網絡再訓練;
? ? 霍夫曼編碼是一種成熟的編碼技巧與cnn無關。下面只說說第二部分,這是從文章摘取的圖,對于一個4×4的權值矩陣,量化權重為4階(-1.0,0,1.5,2.0)。
?
?
?
?
那么索引表就是:
0:-1.0
1:0
2:1.5
3:2.0
對weights采用cluster index進行存儲后,原來需要16個32bit float,現在只需要4個32bit float碼字,與16個2bit uint索引,參數量為原來的(16×2+4×32)/(16×32)=0.31。
? ? 存儲是沒問題了,那如何對量化值進行更新呢?事實上,文中僅對碼字進行更新。如上圖:將索引相同的地方梯度求和乘以學習率,疊加到碼字。
? ? 這樣的效果,就等價于不斷求取weights的聚類中心。原來有成千上萬個weights,現在經過一個有效的聚類后,每一個weights都用其聚類中心進行替代,作者的研究表明這樣并不會降低網絡的效果。而聚類的迭代過程,通過BP的反向傳播完成,不得不說,想法非常plain和beautiful,難怪能得best paper。
? ? 看下表就知道最終的壓縮效率非常可觀,把500M的VGG干到了11M。
?
?
?
?
? ? 文中還比較了如果只用剪枝或者只用量化對結果的影響,表明各自都對壓縮比低于一定閾值時很敏感,如下。而combine兩個trick,則在壓縮比達到5%時,仍然性能不降。當然了還有如卷積層對壓縮比比全連接層更敏感等結論,感興趣可以自己去讀。
?
?
?
?
?
?
Binarized Neural Networks
?
?
?
如果說deep compression是float到uint的壓縮,那么這篇就是uint到bool的壓縮了。前者只是將weights進行量化,而這個,權重只有+1或者-1二值。
?
?
?
? ? 將權重和每層的激活值全部二值化。如此一來大部分數學運算都是位運算。
?
?
?
? ? 二值化的方法也很簡單,文章提到了兩種,第一種就是符號函數,即x>0,則f(x)=1,x<0,則f(x)=-1。另一種是以一定的概率賦值,是不是想起了dropout?文中就是,只有在激活函數時,才采用第二種二值化方法,其余都采用符號函數。
?
?
?
? ? 其實大問題就是一個,符號函數的導數并不連續,那怎么進行梯度傳播?文中將sign(x)進行放松,在-1到1之間采用了線性函數。
f(x) = max(-1,min(1,x))
? ? 主要事項:
? ? (1) 在訓練過程中還是需要保存實數的參數的。
? ? (2)在進行權重參數更新時,裁剪超出[-1,1]的部分,保證權重參數始終是[-1,1]之間的實數。
而在使用參數時,則將參數進行二值化。
? ? 最終效果到底如何?在一些比較小的數據集,比如MNIST,CIFAR-10上,精度稍微有所下降但不明顯,模型大學降低為原來的1/32,32bit的float變成1 bit。對于時間代價可見下圖,第2個直方圖是MNIST數據集的結果,作者的優化將速度相對于cublas提升了約3.4倍,而精度不變(第三個直方圖)。
?
?
?
?
? ? 類似的還有什么XORnet,YodaNet,感興趣的可以去選讀。
? ? 就這么多,本文主要關注的是模型壓縮,這跟計算量壓縮不等價,跟加速也不等價,希望不要搞混淆。
? ? 還是那句話,如有疏漏,錯誤,請自行消化。因為本公眾號暫時沒有評論功能,所以需要交流或者有所指教,請直接加微信聯系。為了照顧受眾,很多細節也沒有深究,愛好者可以自行看下面參考文獻學習。所有觀點整理純屬個人愛好消化,不能保證100%的accuracy和recall。
?
?
?
?
“
?
?
?
?
?
補充一句,攝影相關的內容已經移至另一個公眾號<言右三的北京>,如下,歡迎關注。
?
?
”?
?
?
?
?
?
?
?
?
?
?
?
?
言右三
微信:longlongtogo
?
?
?
?
?
?
?
?
?
且聽菜鳥講幾分鐘,歡迎交流
?
?
?
?
長按二維碼關注
?
?
?
?
【1】Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.
【2】Lin M, Chen Q, Yan S. Network in network[J]. arXiv preprint arXiv:1312.4400, 2013.
【3】Szegedy C, Liu W, Jia Y, et al. Going deeper with convolutions[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015: 1-9.
【4】He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 770-778.
【5】Simonyan K, Zisserman A. Very deep convolutional networks for large-scale image recognition[J]. arXiv preprint arXiv:1409.1556, 2014.
【6】Szegedy C, Vanhoucke V, Ioffe S, et al. Rethinking the inception architecture for computer vision[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 2818-2826.
【7】Iandola F N, Han S, Moskewicz M W, et al. SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and< 0.5 MB model size[J]. arXiv preprint arXiv:1602.07360, 2016.
【8】Denton E L, Zaremba W, Bruna J, et al. Exploiting linear structure within convolutional networks for efficient evaluation[C]//Advances in Neural Information Processing Systems. 2014: 1269-1277.
【9】Vanhoucke V, Senior A, Mao M Z. Improving the speed of neural networks on CPUs[C]//Proc. Deep Learning and Unsupervised Feature Learning NIPS Workshop. 2011, 1: 4.
【10】Han S, Mao H, Dally W J. Deep compression: Compressing deep neural networks with pruning, trained quantization and huffman coding[J]. arXiv preprint arXiv:1510.00149, 2015.
【11】Hubara I, Courbariaux M, Soudry D, et al. Binarized neural networks[C]//Advances in Neural Information Processing Systems. 2016: 4107-4115.
?
總結
以上是生活随笔為你收集整理的为了压榨CNN模型,这几年大家都干了什么的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VR来了,3D人脸重建跟上《三维人脸重建
- 下一篇: 一文说说这十多年来计算机玩摄影的历史