我嘗試在一些公開的搜索出的網路結構(如MNasnet, Efficientnet, Mixnet等 )上面訓練自己的任務,而且是在pretrain的模型上訓練的,效果並不好,我想問網路結構搜索出來的網路的泛化能力強不強,適不適合在新的任務上面訓練並使用?


還是Kaiming厲害,一個Randomly Wired就可以用來破除NAS領域的很多迷思:

如何看待 Kaiming He 新作 Randomly Wired Neural Networks??

www.zhihu.com圖標

在我看來,這篇論文並不具有很強的「建設性」,裡面提出的隨機連線方法本身價值不大,妙就妙在一個「破壞性」的結論:如果搜索空間定得好,NAS就成功了一半,哪怕胡亂瞎隨機都能很快找到不錯的結構!

如此一來以前的所有NAS工作就需要被重新審視,那些所謂的好結果多大程度是來自於一個強先驗的搜索空間,多大程度來自於搜索演算法本身?要是強先驗設計出來的搜索空間佔據了主要的因素,以至於random search就能達到不錯的效果,那NAS跟手工設計結構有很大的分別嗎?設計單個網路結構叫手工設計,設計一族網路的搜索空間就叫AutoML了?就「調參俠都要失業了」?

回到題目本身,NAS網路的可遷移性如何?同樣可以用上面的思路來考慮,如果搜索空間裡面的絕大多數網路結構本來就適合target domain,那麼搜索空間本身就包含了很強的可遷移性先驗,這樣在source domain上搜索出來的結構自然就「有可遷移性」;但是如果搜索空間太寬泛,結果在source domain上性能更好,在target domain上變差,也是很合理的。

我個人從randomly wired得到的認識就是,無論討論搜索演算法(不管是gradient based的、RL的、遺傳演算法的)還是可遷移性,都不能脫離搜索空間這個大背景。反過來說,在搜索演算法這一環節的研究開始變得過於火熱的當下,研究不同搜索空間的特性也許會為NAS打開新路子。事實上現在已經看到一些這樣的研究了:

Random Search and Reproducibility for Neural Architecture Search

https://arxiv.org/pdf/1902.07638.pdf?

arxiv.org

Evaluating the Search Phase of Neural Architecture Search

https://arxiv.org/pdf/1902.08142.pdf?

arxiv.org


首先nas離不開搜索空間設計,而目前很多做nas的一個共識就是現在沒有任何nas的方法是真正有效的,特別是那些水nas的paper,要麼在搜索空間(randwire, proxylessnas, mobilev3, mixnet, nas-fpn 甚至包括darts,詳見On Network Design Spaces for Visual Recon.)上動手腳,要麼在訓練超參上改進(efficientnet作者系列,靠著google超參法刷了好幾篇了,諾亞p-darts系列,為什麼不敢用darts同一套訓練超參?),說到底從方法上來說並沒有真正有效的。

但我們談論一個領域是否真的有用時不能一概而論。首先nas真正對比的應該是手工設計模型,而手工設計模型時明顯是沒有考慮過泛化性能的。其次不同網路結構在不同任務上泛化能力完全不同,樓上說了有些領域densenet就好於resnet,又比如object detection上mobilenet又完全不能用,同類型的shufflenet就強很多,所以你如果做檢測相關任務把mobile系列拿來用那肯定是效果不好的,但這個鍋到底是模型泛化能力不夠,還是超參挑的不對(google的超參你照著他的跑是跑不出來的),還是你壓根就復現錯了(mbv3和efficientnet根本沒有開源並且沒有好的開源復現,mixnet和mnasnet倒是有官方tf,但是如果你真的拿來跑過imagenet我相信你就知道有多難了,比如proxylessnas你拿他開源搜出來的模型跑一遍可能差好幾個點),我覺得你可能先需要找一下自己的毛病,不是上層出個模型你下面分支任務就能拿來水paper的,沒有這麼簡單。


題主說的泛化應該是指用於其他任務時候變現出來的特徵遷移能力,Nas結果一般都不太適用於做新任務,不過重新跑一個同類任務還是湊合的。

目前 nas 的搜索模板分為兩種,一種是在原有優秀網路結構做進一步調整,這種模板還不至於出現題主說的泛化問題。第二種是到處亂連,然後裁剪出來一個子網路。據我的不怎麼科學的經驗,到處亂連然後裁剪出來的網路遷移能力普遍比第一種要差,是差的多。

Nas主要目的,不是為了泛化,而是在受限資源和場景下,快速設計擁有自主產權的網路,並快速用於輕量化部署,目前nas很多搜索路有點偏,因為受限資源,輕量化,以及性能,三者在統計上是矛盾的,聯合起來優化數學上說不清楚。

nas和泛化不沾邊,本身搜索輕量化也沒意思,比如我不加激活連著n層,計算量是很大的,但是inference時候可以把這些層合併,受限計算圖必須展開,nas沒辦法在搜索時候估算這種優化。所以,我認為nas真正目的,是在以後期神經網路編譯器為基礎,儘可能發揮編譯器性能前提下,釋放網路在特定任務上的能力。

如果要換問題,重新搜索一個便是。


我在Valse 2019上也向NAS會場的幾位嘉賓問了這個問題。

起初是因為我發現在有的跨域任務上,源域上訓練的模型直接遷移到目標域(不加任何域適應方法)時DenseNet比ResNet要好不少。我很好奇NAS搜出來的結構遷移效果如何。

當時回答是這樣的,一個是NAS其實是偏工業界的做法,缺少數據咱們就去標,沒有這種跨域的潛在要求(但是我覺得相近域的跨域能力其實就是模型泛化能力)。還有一個觀點就是以前咱們是手動設計模型,然後給數據去自動學習參數,而現在NAS連模型架構都是自動學出來的,實際上我們是在過擬合這條道路上越走越遠,這樣一來就更依賴於數據,泛化性能可能並得不到保證。


我覺得既然選擇了nas那就是想要盡量得到當前的最優解吧。

如果考慮的側重點是泛用性或者拓展性的話是不是應該人工構建結構比較好?


9月3號更新實驗結果:上次效果差是因為樣本圖片解析度過低,而Efficientnet原版並沒有考慮低解析度圖片,所以1、更換樣本到128*128解析度,結果準確度大幅提升,同時效率大幅降低;2、更改Efficientnet結構(又一次調參),目前準確率已經比自己設計的densenet稍高,但參數遠比densenet多,效率也差3倍以上。

而OCR輸入高解析度圖片並沒有意義,純粹是浪費。也許對於這個任務「Efficient」這種網路也太笨重了。

另外 Efficientnet雖然訓練參數不多,但是因為各種 se_expand_block ,訓練時實際佔用的顯存非常大。

==============

彙報一個這兩周試的Efficientnet做OCR識別漢字,用默認參數,效果慘不忍睹.....,我甚至覺得有可能這種Nasnet是更抽象的針對數據集的過擬合而已。

隨便搭的Resnet或者Inception都可以輕鬆做到95%以上,而Efficientnet 0~7 只能跑到70~85%之間。

效率是比較快。還在調參,有進展上來更新。


NAS的目標在於替代人工的網路結構設計,而即使是人工的網路結構設計其實也很少能考慮到泛化能力問題,因為結構設計僅僅是設定了一個可能的解空間,在網路訓練完成之前是談不到泛化性能的。對於目前的NAS而言,則更談不到考慮泛化能力問題。

當然,這不是說NAS不可以將泛化能力作為一個目標納入其體系中。畢竟NAS就是靠對大量可能的網路結構空間的搜索來尋找好的網路,只要我們找到與泛化能力有關的代價函數,將其納入NAS的搜索目標就可以了。理論上說,NAS具有找到具有好的泛化能力的網路的潛力。

另外,隨著問題複雜度的增加,網路結構的搜索空間體積應該是指數擴張的,究竟NAS的方式能走多遠,很難說,除非我們另外增加對於網路搜索空間的先驗或者對NAS搜索空間的搜索。


大家可以試一下DARTS,我用的是GitHub上的改寫版本https://github.com/khanrc/pt.darts,我把它在CIFAR10上搜出的最優結構用來跑我自己的數據集,總共224類,一共2w多張圖,本來以為只是個青銅,沒想到可以硬剛ResNet,目前DARTS網路結構的acc達到了0.7(相比跑CIFAR10的超參,除了batchsize調小到40,layers從20調到了5,resize調到224,其他都沒變),而ResNet18達到了0.72;當然DARTS的網路結構模型大小達到了48M(模型大小的激增,應該是因為那個輔助頭AuxiliaryHead全連接層改了適配224特徵圖大小的輸入參數),600個epoch總共花了56h。

另外,相對於CIFAR10這種標準數據集,對於我這種類別數較大的小樣本圖像,batchsize和resize大小真的很重要,我在ResNet18上40的batchsize,最終acc竟然比128的batchsize提高了5個點多;而resize32的效果更是慘不忍睹


推薦閱讀:
相關文章