為什麼要壓縮模型,而不是直接訓練乙個小的CNN?

時間 2021-05-05 14:18:52

1樓:木頭人

我補充一下,《Gradient Descent Finds Global Minima of Deep Neural Networks》和《Global Optimality in Neural Network Training》在理論上證明,在當前的優化演算法下,小模型比大模型更難求解。

但是,我認為大模型容易過擬合,而且會產生更多的冗餘。所以,要想優化出乙個參數量適當的模型,要麼考驗優化演算法,要麼考驗模型壓縮的能力。我覺得在相同的優化演算法下,大模型可能會更快收斂,我建議在現有的評測標準內加入訓練時間,這樣會有更加全面的認識。

2樓:Ironboy

題主說的小CNN應該指的是compact neural network design的內容吧,這個一直都有人在研究,並且還有針對mobile/IoT裝置專門去設計小網路的工作,例如SkyNet,FBNet和HardNet等等,而且要說的是設計乙個有效的網路模型並不容易,手動設計需要很多專家知識和無數的調參工作,以及靈光一閃的創新想法,用NAS的話也需要大量的計算資源和對優化和搜尋方面的深度理解。所以說一般理解的模型壓縮方法和小CNN的工作都有人在做,至少在學術界不存在「為什麼......而不是......

」這樣的偏向性。

然而對於很多具有實際生產需求的公司來說,拿來主義是最節省時間和人力的(這點不該被吐槽),相比自己去設計乙個有效能用的小模型,不如直接去git clone已經開源的模型來的快且來的好,而這個時候往往因為經典模型本身引數的冗餘和魯棒性,在壓縮之後效果還能保持的很不錯,而輕量級網路在定點化的過程需要非常小心翼翼,對精度的影響很敏感(我曾對ShuffleNet v2做8bit量化掉了6個點),所以有的時候感覺選擇模型壓縮的看著比較多。

實際上現在都是多種方法一起使用,尤其剪枝+量化的結合,即使用的小網路,也會嘗試去進行mix-precision的量化工作,在速度和精度之間做乙個trade-off。

最後來一句:壓縮一時爽,掉點火葬場。

3樓:莫名

這兩種方法在實際工業級專案中都有使用。

壓縮模型一種是數值量化,已經挺成熟,挺好用的,幾乎不影響效能。另一種剪枝或者稀疏化,剪枝因為特徵的分布表示性和集群智慧型性,目前沒有找到完美的修剪策略或重新表示方法。稀疏化由於成熟硬體大多不支援,目前也很少應用於真正的專案。

在嵌入式,邊緣計算,終端裝置上,還是優先使用結構一致,但引數較小的模型。

4樓:阿松

第一種方法參考下圖右側結構,是從模型整體角度選定乙個全域性的壓縮比例引數,並未對於每一層的壓縮比例進行限定,即network slimming的方法(該方法中使用BN層引數作為剪枝依據,各層引數放在一起進行篩選,這種方法給了網路結構搜尋更大的自由,也就是不同的網路層中的壓縮比例也不一定是相同的,這種壓縮後的結構是不能提前預知的,而是網路學到的);

另一種方法參考下圖左側,是對每乙個網路層指定乙個相同的壓縮比例(種方法和人工設計乙個小網路比較類似了,乙個確定的大網路結構中每乙個層按照乙個指定的壓縮比例進行壓縮後,就是乙個確定的小網路結構,類似於人工設計小網路的過程)。

結果發現有些情況下如對於VGG網路來說前者效果好,但是在一些比較新的網路結構形式上如resnet,densenet上並不完全是這樣,兩者效果差別並不明顯。

作者的解釋是: Compared to ResNet and DenseNet, we can see that VGG』s redundancy is rather imbalanced across layer stages。就是說,不同的網路結構在不同的網路層上的冗餘程度是不相同的。

而在作者之前所做的試驗中不同的網路層的壓縮比例不同,參考下圖(width* 表示在總體壓縮比例為60%的情況下各層裁剪後的通道數量),也印證了這種冗餘的不均衡現象是存在的。

正是這種冗餘不均衡性導致了我們手工設計小網路的時候並不能找到乙個在該任務上最適合的網路結構,而使用這種大網路中裁剪小網路的方式可以視為一種有效的網路結構搜尋方式,幫助我們找到那個體積可能比較接近手工設計的小網路,但是對該任務更加合適的小網路結構,這在大多數情況下是行之有效的。(然而當網路的體積被壓縮到乙個極限值附近的時候,任何形式網路結構壓縮都會導致網路精度嚴重下降,這也是本身就比較精簡的Resnet網路上兩者表現接近的原因,此時再談壓縮也沒了意義)

5樓:

這裡有乙個可能的答案。

TL;DR 文章的實驗在部分常見的網路上,驗證了大的sparse網路可能好於小的dense網路。

文章看起來是提出了一種在training中逐漸pruning的方法,更重要的是文章驗證了乙個想法,是大的sparse的網路效能好,還是小的dense的網路效能好。

6樓:Donald

從實際使用的角度強答一發~

對於移動端部署來說,應該很少用剪枝的策略,主要以設計小模型為主,之後定點化再部署。移動端的模型本來就很緊湊,剪枝的話,效果不好,稍不留神掉點非常嚴重。如果模型剪枝後各個方面,精度啊,在更大資料集的泛化能力啊,定點化後的精度啊,都相差不大的話,只能說明這個模型本可以設計的更緊湊,來能達到速度和精度的平衡~移動端的話,定點化比剪枝策略在記憶體速度和精度損失上收益更大,建議多花時間研究定點化。

對於雲端部署來說,都使用的大模型,參數量多,可以用剪枝策略,來降低模型複雜度從而加速。

7樓:路邊社

利用乙個pretrain好的模型進行壓縮,好處在於:

1)壓縮後的模型應該盡可能靠近pretrain模型的精度,從而可以經過很少幾次finetune迅速提公升精度。這樣時間很短,計算代價也比較低,是從頭訓練乙個網路,或者利用網路結構搜尋所沒法比擬的。

2)從頭訓練乙個小的CNN,你怎麼知道小的CNN長什麼樣子?基於pretrian的模型進行壓縮,至少對模型結構有乙個先驗,是基於原來的模型結構進行壓縮。壓縮完得到的模型結構至少不會太離譜。

不過,如果你能找到/搜到乙個比較好的小的CNN結構,並且train足夠多的時間,那麼最終它的performance和剪枝完的網路是差不多的。可以參考rethinking of network pruning。

8樓:yang

看一看下面這篇文章。作者argue說訓練乙個大而稀疏的神經網路要比訓練乙個小的神經網路準確度更高。

To prune, or not to prune: exploring the efficacy of pruning for model compression

9樓:Zhaozhe Song

沒有人說過「不直接訓乙個小的CNN」。有足夠的gpu就訓唄。模型壓縮乙個重要價值是你可以直接拿乙個公開的大模型用少量的計算壓成乙個小模型。

performance就算高也不會高多少,畢竟冗餘性永遠擺在那。

相比很多文章壓縮出來的雜亂的結構,小模型更適合部署因為它就是為了快而設計的。小模型並不需要花很多時間去調參,根據你想要的大小把mobilenet/shufflenet裡channel數整體乘個係數,或者去掉/增加幾層,一般就能work了。相反很多模型壓縮演算法更需要調參。

兩者都是很有趣的學術方向。至於工業界目前用什麼我也很好奇,至少我目前還不知道有什麼簡單粗暴的standard way去壓縮乙個模型。個人覺得直接訓小模型更有潛力一些,就算你把pruning作為implicit architecture search,最後搜出來的也大概率和人工的heuristic相吻合,回報太低。

10樓:

我覺得,首先你一開始並不知道這個小的CNN是什麼樣的結構。

畢竟你從乙個更大的模型空間中,找到了乙個模型,然後把它壓縮得到的小模型。而你一開始是不知道這個小模型長什麼樣的,也就無從訓練。

那麼,問題來了。在得到壓縮後的模型之後,重新訓練小網路(用壓縮後的結構),是否會讓模型表現更好呢?雖然模型存在於給定模型空間,但能不能找到是另一回事。

如果大網路確實更容易訓練(這塊我不是很了解,可以參考其他人的回答),那麼直接訓練小網路也就是不太可行的。注意這裡的重訓練和一般意義的小網路訓練是不同的,它是有條件的,因為這個子模型空間是通過大網路找到的,不是一般意義上的大網路比小網路容易訓練。

而如果壓縮後繼續訓練,很有可能會有提公升,至少是不會更差。

11樓:擺渡

12樓:學而時習

問題不成立,當前除了在已有模型基礎上再做「濃縮」外,同時也有在模型結構上做文章,以便在同樣結果水平下大幅降低複雜度(尤其是時間複雜度)的。

題主的原意,應該是先訓練再壓縮這個步驟為什麼不能二合一,一步到位。這就涉及到了兩者的難度了。先做大模型,擬合更容易,至少先規避了欠擬合的問題,再壓縮,有諸多方法可以用;一步到位設計乙個更高效的低複雜度模型結構,難度更大,畢竟類似mobilenet和shufflenet這種相對成熟,工業友善,可用的高效結構成果不多。

13樓:ibirds

我覺得是網路訓練對初始化依賴很大,隨機初始化得到比較好的filter 假設概率一定,那大模型肯定這樣的filter更多,於是更容易學習

14樓:鶇棟tian

專門做這個方向的,說一下自己的觀點吧。

首先,「直接訓練乙個小的CNN」這個說法並不是很恰當,因為你需要乙個前提:已經有乙個設計好了的小模型(VGG19 ResNet152這種大模型並不是石頭裡面蹦出來的,也是人家精心設計、試錯才推出來的)。所以這邊就涉及到了乙個問題:

如何設計乙個小模型。

然鵝,整個模型加速演算法體系中就有乙個分支專門研究這個問題,美其名曰:精簡網路設計。典型的代表就是 SqueezeNet MobileNet v1/v2 ShuffleNet v1/v2 IGC v1/v2/v3。

看起來很多,本質上都是在group卷積的前提下工作的。

其次,壓縮/加速乙個模型是為了更好地讓其進行部署,譬如部署到手機,FPGA,無人機上去。乙個是pretrained model,乙個是 the compact version,兩者精度一般差不多,後者功耗會低很多,當然要壓縮/加速模型。(如何保證精度差不多那是演算法的事情)

再者,使用一些加速壓縮演算法去push乙個模型,不但可以得到更快更小的模型,而且精度還可以超出所給的pretrained model(這個一般通過加速壓縮演算法中的distillation技術實現)。顯然地,錦上添花的一件事情。

更錦上添花的事情:壓縮演算法還可以將模型push到 low-bit(通過quantization實現),實現硬體級別的加速。典型的工作,BinaryConnect、BNN、XNOR-Net。

這方面的工作以後勢必會合深度學習晶元協同設計,更是可以極大地加速乙個模型,很具有實際意義。

最後,模型加速演算法體系中的各個分支演算法可以疊加使用,譬如你先過一遍pruning再來一次quantization,加速效果嗖嗖的。

忘了說,這個體系一般分:1)pruning 2)quantization 3) knowledge distillation 4)low-rank decomposition 5)compact architecture design 這幾個分支的方法。(還有其他的比較小眾而且實際意義不是很大的就不提了)

貼兩篇綜述:A Survey of Model Compression and Acceleration for Deep Neural Networks ([1710.09282] A Survey of Model Compression and Acceleration for Deep Neural Networks

Recent Advances in Efficient Computation of Deep Convolutional Neural Networks([1802.00939] Recent Advances in Efficient Computation of Deep Convolutional Neural Networks),總結地還是很不錯的。

水稻為什麼要移植而不是直接把種子扔稻田?

城裡農民 水稻不是非要移植 栽 可以直接將種子扔在稻田,如今水稻直播 包括水直播和旱直播 在長江中下游地區很流行,其他水稻主產區有部分也這麼做,近幾年無人機 直播機不斷湧現,播種效率越來越高。當然在水稻直播剛出現的時候,的確有種植專家反對過。直播栽培省去移栽方式的育秧和插秧等作業環節,將大田翻耕整理...

為什麼要搞雜交水稻而不是直接種紅薯土豆?

馮金 因為中國還不是很富裕,也沒窮到叮噹響。很富裕的國家,吃大量土豆的時候,會配有大量的肉食和油脂,所以土豆不難吃。很窮的國家,吃大量土豆的時候,除了土豆還是土豆,餓得只能吃土豆。大多數國家,紅薯還不如土豆呢。而大公尺的情況很特殊,中國大公尺七分之六是被人吃掉了。因為雜交水稻再難吃,也比用來當飼料的...

關鍵點檢測中,為什麼要生成高斯圖,而不是直接與ground truth比較?

在醫學影象中,解剖關鍵點檢測是可以直接回歸的。直接回歸的精度也不差。但是,如果你需要更好的精度,可以替換成高斯核這種。兩種方法的計算量,看你實際需求進行取捨。 張良懷 對於關鍵點檢測任務,有兩種方式去監督 1 直接用目標點的座標進行監督,這樣網路是乙個回歸網路 最後是全連線層 網路輸出應該是目標點的...