日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

为了压榨CNN模型,这几年大家都干了什么

發(fā)布時間:2025/3/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为了压榨CNN模型,这几年大家都干了什么 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

?

?

?

? ? 如果從2006年算,深度學(xué)習(xí)從產(chǎn)生到火爆已經(jīng)十年了,在工業(yè)界已經(jīng)產(chǎn)生了很多落地的應(yīng)用。現(xiàn)在網(wǎng)絡(luò)的深度已經(jīng)可達(dá)1000層以上,下面我們關(guān)注一個問題:

? ? 這些年大家是怎么“壓榨”CNN模型的。

?

?

?

?

? ? 首先回顧一下幾個經(jīng)典模型,我們主要看看深度和caffe模型大小。

?

?

?

?

? ? 當(dāng)然,在實際應(yīng)用中,各自調(diào)試出的version會有出入,網(wǎng)絡(luò)的大小也不止和深度有關(guān)系,此處想說明的問題是:好像模型大小(參數(shù)量)和模型的深淺并非是正相關(guān)。

?

?

?

?

下面言歸正傳

?

?

?

?

?

?

?

?

?

?

?

?

?

這里要講的壓榨主要是將模型變小,以便在ARM,FPGA,ASIC等存儲空間有限的平臺應(yīng)用。

?

從2個方面進(jìn)行回顧。第一條是經(jīng)典模型的設(shè)計路線,可以看得出本身就在不斷壓縮模型。第二條是在網(wǎng)絡(luò)結(jié)構(gòu)基本不變的情況下,對模型參數(shù)的壓縮。

?

?

?

?

?

?

?

?

?

?

?

1 經(jīng)典模型進(jìn)階路

?

?

?

?

?

?

?

?

?

?

?

1 全連接網(wǎng)絡(luò)到卷積神經(jīng)網(wǎng)絡(luò)

?

?

?

?

?

?

?

?

Fully connect to local connect

?

?

?

?

?

?

? ? 這里我們?nèi)匀环胚@張經(jīng)典的比較圖,從最早的全連接神經(jīng)網(wǎng)絡(luò)到卷積神經(jīng)網(wǎng)絡(luò)本身就是一場大的參數(shù)壓縮革命。

? ? 按照全連接神經(jīng)網(wǎng)絡(luò)的思想,1000×1000的圖像,如果隱藏層也是同樣大小(1000*1000個)的神經(jīng)元,那么由于神經(jīng)元和圖像每一個像素連接,則會有參數(shù)1000×1000×1000×1000。光是一層網(wǎng)絡(luò),就已經(jīng)有10^12個參數(shù)。

? ? 而如果采用卷積神經(jīng)網(wǎng)絡(luò),則由于權(quán)值共享,對于同樣多的隱藏層,假如每個神經(jīng)元只和輸入10×10的局部patch相連接,則參數(shù)為:1000×1000×100,降低了4個數(shù)量級。

? ? 至于為什么可以這么做,讀者可以自己去關(guān)注卷積神經(jīng)網(wǎng)絡(luò)的由來,主要原理在于圖像的局部patch可以與全圖有類似的統(tǒng)計特性。

? ? 這第一招,也是最厲害的一招,一舉將神經(jīng)網(wǎng)絡(luò)的參數(shù)減小許多個數(shù)量級,才能有深度學(xué)習(xí)的發(fā)展。

?

?

?

?

?

?

?

?

?

2 1×1卷積使用

?

?

?

?

?

?

?

?

NIN

?

?

?

? ? Alexnet[1]是一個8層的卷積神經(jīng)網(wǎng)絡(luò),有約60M個參數(shù),如果采用32bit float存下來有200M。值得一提的是,AlexNet中仍然有3個全連接層,其參數(shù)量占比參數(shù)總量超過了90%。

? ? NIN[2]是一個4層的網(wǎng)絡(luò)結(jié)構(gòu),其直接對標(biāo)對象就是AlexNet,那么為什么模型大小只有前者的1/10呢?

? ? 除了去掉了全連接層外(這也是模型變小的關(guān)鍵),提出了1×1的卷積核,后來被廣泛用于GoogLeNet[3]和ResNet[4]。

?

?

?

?

? ? 下面舉一個例子,假如輸入為28×28×192,輸出feature map通道數(shù)為128。那么,直接接3×3卷積,參數(shù)量為3×3×192×128=221184。

? ? 如果先用1×1卷積進(jìn)行降維到96個通道,然后再用3×3升維到128,則參數(shù)量為:1×1×192×96+3×3×96×128=129024,參數(shù)量減少一半。雖然參數(shù)量減少不是很明顯,但是如果1×1輸出維度降低到48呢?則參數(shù)量又減少一半。對于上千層的大網(wǎng)絡(luò)來說,效果還是很明顯了。

? ? 移動端對模型大小很敏感。下載一個100M的app與50M的app,首先用戶心理接受程度就不一樣。

? ? 到此你可能有一個疑問?原則上降低通道數(shù)是會降低性能的,這里為什么卻可以降維呢?

? ? 筆者沒有能力去完整回答這個問題,但是我們可以從很多embedding技術(shù),比如PCA等中得到思考,降低一定的維度可以去除冗余數(shù)據(jù),損失的精度其實很多情況下都不會對我們解決問題有很大影響。

? ? 當(dāng)然了該文章最重要的貢獻(xiàn)應(yīng)該是通過這種內(nèi)嵌的結(jié)構(gòu),在通道之間組合信息從而增強(qiáng)了網(wǎng)絡(luò)的非線性表達(dá)能力。

? ? 一句話:1×1卷積,在?GoogLeNet Inception v1[3]以及后續(xù)版本,ResNet[4]中都大量得到應(yīng)用,有減少模型參數(shù)的作用。

?

?

?

?

3 卷積拆分

?

?

?

?

?

?

?

?

?

?

?

?

?

VGG

?

?

?

? ? VGG可以認(rèn)為是AlexNet的增強(qiáng)版,兩倍的深度,兩倍的參數(shù)量。不過,也提出了一個模型壓縮的trick,后來也被廣泛借鑒。

? ? 那就是,對于5×5的卷積,使用兩個3×3的卷積串聯(lián),可以得到同樣的感受野,但參數(shù)量卻有所降低,為3×3×2/(5×5)=0.72,同樣的道理3個3×3卷積代替一個7×7,則參數(shù)壓縮比3×3×3/(7×7)=0.55,降低一倍的參數(shù)量,也是很可觀的。

?

?

?

?

?

GoogLeNet[3]

?

?

?

? ? GoogleLet Inception v2就借鑒了VGG上面的思想。而到了Inception V3[3]網(wǎng)絡(luò),則更進(jìn)一步,將大卷積分解(Factorization)為小卷積。

? ? 比如7×7的卷積,拆分成1×7和7×1的卷積后。參數(shù)量壓縮比為1×7×2/(7×7)=0.29,比上面拆分成3個3×3的卷積,更加節(jié)省參數(shù)了。

? ? 問題是這種非對稱的拆分,居然比對稱地拆分成幾個小卷積核改進(jìn)效果更明顯,增加了特征多樣性。

只能說

?

?

?

?

? ? 后來的Resnet就不說了,也是上面這些trick。到現(xiàn)在,基本上網(wǎng)絡(luò)中都是3×3卷積和1×1卷積,5×5很少見,7×7幾乎不可見。

?

?

?

?

?

SqueezeNet[7]

?

?

?

? ? squeezenet將上面1×1降維的思想進(jìn)一步拓展。通過減少3×3的filter數(shù)量,將其一部分替換為1×1來實現(xiàn)壓縮。

? ? 具體的一個子結(jié)構(gòu)如下:一個squeeze模塊加上一個expand模塊,使squeeze中的通道數(shù)量,少于expand通道數(shù)量就行。

?

?

?

?

? ? 舉上面那個例子,假如輸入為M維,如果直接接3×3卷積,輸出為7個通道,則參數(shù)量:M×3×3×7。

? ? 如果按上圖的做法,則參數(shù)量為M×1×1×3+3×4×1×1+3×4×3×3,壓縮比為:(40+M)/21M,當(dāng)M比較大時,約0.05。

? ? 文章最終將AlexNet壓縮到原來1/50,而性能幾乎不變。

?

?

?

? ? 據(jù)我所知的在卷積結(jié)構(gòu)上做文章的,基本上都在這里,當(dāng)然怎么訓(xùn)練出本來就小的模型不算。

?

?

?

?

2.1 SVD分解法

?

?

?

?

?

?

? ? 有研究表明,一層的weights,可以通過其子集進(jìn)行精確預(yù)測,所以可以使用奇異值分解(SVD分解)來對每一層進(jìn)行低秩近似,下面只提一下基本原理和結(jié)論。

?

?

?

? ? 原理:對于一個m×k維的實數(shù)矩陣W,其可以進(jìn)行奇異值分解為W=USV,其中U維度為m×m,S維度為m×k,V維度為k×k。S是非負(fù)實數(shù)對角矩陣,如果將其對角線的值降序排列并發(fā)現(xiàn)其值衰減很快,則只需要前面幾維就能保持W的絕大多數(shù)信息不丟失,這也是PCA的原理。

? ? 假如只保留t維,那么原來的計算復(fù)雜度為O(m×k),現(xiàn)在則變成了O(m×t+t×t+t×k),對于足夠小的t,O(m×t+t×t+t×k)遠(yuǎn)小于O(m×k)。

? ? 不過這個方法實際的模型壓縮比并不明顯,在文章[8]中為2~3的左右,加速比也是2~3左右。所以同類的方法,就不再深究。

?

?

?

?

2.2 權(quán)重參數(shù)量化與剪枝

?

?

?

?

?

?

? ? 下面是近兩年比較有代表性的研究,主要是通過權(quán)重剪枝,量化編碼等方法來實現(xiàn)模型壓縮。其實最早也有直接對每個權(quán)重獨立量化的研究[9],但是效果顯然是不如下面的結(jié)果的。

?

?

?

?

?

DeepCompresion

?

?

?

? ? 這是2016 ICLR最佳論文。文章早期的工作,是Network Pruning,就是去除網(wǎng)絡(luò)中權(quán)重低于一定閾值的參數(shù)后,重新finetune一個稀疏網(wǎng)絡(luò)。在這篇文章中,則進(jìn)一步添加了量化和編碼,思路很清晰簡單如下。

(1) 網(wǎng)絡(luò)剪枝:移除不重要的連接;

(2) 權(quán)重量化與共享:讓許多連接共享同一權(quán)重,使原始存儲整個網(wǎng)絡(luò)權(quán)重變?yōu)橹恍枰鎯Υa本(有效的權(quán)重)和索引;

(3) 霍夫曼編碼:更高效利用了權(quán)重的有偏分布;

?

?

?

? ? 第一部分很好理解,就是如下流程:

(1) 普通網(wǎng)絡(luò)訓(xùn)練;

(2)?刪除權(quán)重小于一定閾值的連接得到稀疏網(wǎng)絡(luò);

(3)?對稀疏網(wǎng)絡(luò)再訓(xùn)練;

? ? 霍夫曼編碼是一種成熟的編碼技巧與cnn無關(guān)。下面只說說第二部分,這是從文章摘取的圖,對于一個4×4的權(quán)值矩陣,量化權(quán)重為4階(-1.0,0,1.5,2.0)。

?

?

?

?

那么索引表就是:

0:-1.0

1:0

2:1.5

3:2.0

對weights采用cluster index進(jìn)行存儲后,原來需要16個32bit float,現(xiàn)在只需要4個32bit float碼字,與16個2bit uint索引,參數(shù)量為原來的(16×2+4×32)/(16×32)=0.31。

? ? 存儲是沒問題了,那如何對量化值進(jìn)行更新呢?事實上,文中僅對碼字進(jìn)行更新。如上圖:將索引相同的地方梯度求和乘以學(xué)習(xí)率,疊加到碼字

? ? 這樣的效果,就等價于不斷求取weights的聚類中心。原來有成千上萬個weights,現(xiàn)在經(jīng)過一個有效的聚類后,每一個weights都用其聚類中心進(jìn)行替代,作者的研究表明這樣并不會降低網(wǎng)絡(luò)的效果。而聚類的迭代過程,通過BP的反向傳播完成,不得不說,想法非常plain和beautiful,難怪能得best paper。

? ? 看下表就知道最終的壓縮效率非??捎^,把500M的VGG干到了11M。

?

?

?

?

? ? 文中還比較了如果只用剪枝或者只用量化對結(jié)果的影響,表明各自都對壓縮比低于一定閾值時很敏感,如下。而combine兩個trick,則在壓縮比達(dá)到5%時,仍然性能不降。當(dāng)然了還有如卷積層對壓縮比比全連接層更敏感等結(jié)論,感興趣可以自己去讀。

?

?

?

?

?

?

Binarized Neural Networks

?

?

?

如果說deep compression是float到uint的壓縮,那么這篇就是uint到bool的壓縮了。前者只是將weights進(jìn)行量化,而這個,權(quán)重只有+1或者-1二值。

?

?

?

? ? 將權(quán)重和每層的激活值全部二值化。如此一來大部分?jǐn)?shù)學(xué)運(yùn)算都是位運(yùn)算。

?

?

?

? ? 二值化的方法也很簡單,文章提到了兩種,第一種就是符號函數(shù),即x>0,則f(x)=1,x<0,則f(x)=-1。另一種是以一定的概率賦值,是不是想起了dropout?文中就是,只有在激活函數(shù)時,才采用第二種二值化方法,其余都采用符號函數(shù)。

?

?

?

? ? 其實大問題就是一個,符號函數(shù)的導(dǎo)數(shù)并不連續(xù),那怎么進(jìn)行梯度傳播?文中將sign(x)進(jìn)行放松,在-1到1之間采用了線性函數(shù)。

f(x) = max(-1,min(1,x))

? ? 主要事項:

? ? (1) 在訓(xùn)練過程中還是需要保存實數(shù)的參數(shù)的

? ? (2)在進(jìn)行權(quán)重參數(shù)更新時,裁剪超出[-1,1]的部分,保證權(quán)重參數(shù)始終是[-1,1]之間的實數(shù)。

而在使用參數(shù)時,則將參數(shù)進(jìn)行二值化。

? ? 最終效果到底如何?在一些比較小的數(shù)據(jù)集,比如MNIST,CIFAR-10上,精度稍微有所下降但不明顯,模型大學(xué)降低為原來的1/32,32bit的float變成1 bit。對于時間代價可見下圖,第2個直方圖是MNIST數(shù)據(jù)集的結(jié)果,作者的優(yōu)化將速度相對于cublas提升了約3.4倍,而精度不變(第三個直方圖)。

?

?

?

?

? ? 類似的還有什么XORnet,YodaNet,感興趣的可以去選讀。

? ? 就這么多,本文主要關(guān)注的是模型壓縮,這跟計算量壓縮不等價,跟加速也不等價,希望不要搞混淆。

? ? 還是那句話,如有疏漏,錯誤,請自行消化。因為本公眾號暫時沒有評論功能,所以需要交流或者有所指教,請直接加微信聯(lián)系。為了照顧受眾,很多細(xì)節(jié)也沒有深究,愛好者可以自行看下面參考文獻(xiàn)學(xué)習(xí)。所有觀點整理純屬個人愛好消化,不能保證100%的accuracy和recall。

?

?

?

?

?

?

?

?

?

補(bǔ)充一句,攝影相關(guān)的內(nèi)容已經(jīng)移至另一個公眾號<言右三的北京>,如下,歡迎關(guān)注。

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

言右三

微信:longlongtogo

?

?

?

?

?

?

?

?

?

且聽菜鳥講幾分鐘,歡迎交流

?

?

?

?

長按二維碼關(guān)注

?

?

?

?

【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.

?

總結(jié)

以上是生活随笔為你收集整理的为了压榨CNN模型,这几年大家都干了什么的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。