如何NAS之後的發展或者有什麼獨特見解,請大家一起討論一下,相互啟發。


之後的發展不知道,說下歷史吧~

-----------------------------------------

神經網路架構搜索(NAS)今年也是火的不行,本文簡單梳理一下個人覺得比較有代表意義的工作,如果有錯誤或者遺漏歡迎大家指出hhhh

另外推薦一篇survey(雖然到處都在說這個,但我還是要推薦一下)

Neural Architecture Search: A Survey

大致按照時間線來,內容分為這麼幾塊:大力出奇蹟平民化落地

1,大力出奇蹟

--------------------------------

被人們所熟知的第一篇NAS工作應該是Google的這篇NEURAL ARCHITECTURE SEARCH WITH REINFORCEMENT LEARNING[ICLR17],充分展現了Google的實力和財力(劃掉)。思路也是簡單明瞭,以前每一層的filter數量大小等等都需要人為來定,那就可以做成一個優化問題列幾個選項讓它自己選個最好的,這樣的選擇組合起來就成了編碼某個網路結構的token。為了讓其更加靈活支持變長token,使用RNN來作為這裡的controller,然後用policy gradient來最大化controller採樣網路的期望reward,也就是validation accuracy

思路很直接,效果也不錯,然鵝Google用了800塊gpu跑了快一個月(還只是在cifar10)...直接勸退

後來這幫大佬可能覺得跑個cifar10太naive了,應該整個ImageNet,但是像之前這麼搞直接在ImageNet上搜肯定是跑不動的,別說800張卡,8000張都搞不定。

於是Google又出了一篇Learning Transferable Architectures for Scalable Image Recognition[CVPR18]。那我不搜整個結構,搜個cell然後堆起來就行了,反正VGG/Inception/ResNet也是這麼乾的,於是沿用了之前的思路,繼續用RNN和policy gradient在新的搜索空間中尋找最佳的結構,在cifar上搜cell然後堆起來用到ImageNet上。搜索目標只包括兩種cell,一種是normal cell,另一種reduction cell用於downsample,每個cell裡麪包括一些block,新的搜索空間包括選擇這些block使用什麼op,用什麼作為輸入等。之後很多工作都沿用了NASNet Search Space這個套路。

最後整體結構和搜到的cell長這個樣子,也就是NASNet

performance也很不錯,cifar10最好的一次跑到了2.19%的error rate,在同樣參數下ImageNet也都超過了手工設計的網路

這次的速度比上次快多了,500塊gpu只跑了4天就跑完了(再次勸退)

之後大佬們可能覺得現在的token都定長了,或許RNN+policy gradient的優化方式可以換成一些其他的演算法(也可能是覺得強化學習調參太tm蛋疼了),於是Google又出來一篇Regularized Evolution for Image Classifier Architecture Search[AAAI19],搜索空間沿用上面的NASNet Search Space,只是將優化演算法換成了regularized evolution(具體演算法還是看paper吧...寫出來感覺內容太多了(其實就是懶)),搜到的結構叫做AmoebaNet。實驗表明確實evolution更加好使,收斂快,效果好,調參還沒那麼蛋疼。

右邊兩個是不同數據集上的

AmoebaNet這種方法用450塊gpu跑了7天,依舊勸退。。

後來Google自己也覺得之前的方法太花時間了,於是又搞了個Progressive Neural Architecture Search[ECCV18],主要目標就是做加速。將搜索空間減小並且用預測函數來預測網路精度,最後時間縮短到大概225個gpu-day,相比AmoebaNet少了十幾倍,然而對於普通玩家還是在勸退。。。

2,平民化

--------------------------------

像上面這種大力出奇蹟的玩法平民玩家基本玩不起,但是計算量的問題擺在這裡,自然就有一些解決方案來加速這個過程。

比較有代表性的就是weight sharing加速validation的Efficient Neural Architecture Search via Parameter Sharing[ICML18](咦,還是Google的Quoc V. Le他們),大概思路就是將NAS的採樣過程變成在一個DAG裡面採樣子圖的過程,採樣到的子圖裡面的操作(卷積等)是參數共享的。與之前的方法主要差別就在於ENAS中子圖的參數從DAG繼承而來而不是重新初始化,不需要train-from-scratch即可以驗證子圖的精度,極大的加速了NAS的過程。

從DAG中採樣子圖,這裡1是輸入節點,3/6是輸出節點

為了評估採樣到的子圖在數據集上的表現,DAG的參數(weight等)是需要優化的,除此之外為了找到最好的子圖,採樣器(這裡使用的RNN)也是需要優化的。ENAS採用的是交替優化DAG中的參數和採樣器中的參數。DAG參數的優化是通過採樣一個子圖,然後forward-backward計算對應操作的梯度,再將梯度應用到DAG上對應的操作通過梯度下降更新參數。採樣器RNN的更新採用了之前policy gradient的優化方式。

ENAS搜索整個CNN,RNN採樣每個節點的操作以及輸入的前置節點

ENAS提出了兩種模式(這裡只介紹CNN),一種是搜整個網路結構,一種是搜個cell然後按照之前的方式堆起來,在搜索cell的時候只需要一張卡跑半天就能跑完。不過最近ICLR20的投稿中對於weight sharing有很多不同的聲音,有興趣的可以去openreview看一看。

還有一個很快就能跑完的NAS工作是用可微分的方式進行搜索的DARTS: Differentiable Architecture Search[ICLR19],在今年被各種魔改(我猜很可能是因為開源了pytorch的代碼,然後代碼寫得很漂亮改起來也比較容易)。DARTS和ENAS很像,也是從DAG中找子圖,並且同樣採用了weight sharing,主要的區別在於搜索空間和搜索演算法上。搜索空間比較類似NASNet search space,搜索演算法則是採用了可微分的方式。

DARTS也是搜cell然後按照一定的模式堆起來,在搜索演算法上與之前的方法最大的區別在於DARTS選擇某個操作的時候並不是像之前按照RNN的輸出概率進行採樣,而是把所有操作都按照權重(不是直接加權,先將權重softmax歸一化)加起來,那這樣權重就在計算圖裡面了,在計算驗證集loss之後就可以backward計算權重的梯度,直接通過梯度下降來優化權重。搜索的過程也就是優化權重的過程,最後保留權重最大的操作就是最後搜到的結構。

DARTS裡面的一個cell,不同顏色的邊表示不同的操作,顏色深淺表示不同的權重,最後留下權重最大的

權重的優化和DAG裡面weight的優化類似於ENAS,也是交替進行的(在訓練集上優化weight,在驗證集優化權重),不過DARTS是整個DAG進行forward-backward(這樣的缺點在於內存開銷會比較大)而不是像ENAS一樣先採樣子圖。

DARTS的搜索演算法,很漂亮的工作

DARTS搜索一次只需要一張1080ti跑一天即可,對於平民玩家完全沒壓力hhhhh

上面這兩項工作讓很多隻有幾張顯卡的平民玩家也能玩得起NAS。

3,落地

--------------------------------

上面所介紹的NAS工作很少有人工設計網路的影子,基本都是重新設計了新的搜索空間。從實驗結果上來NAS搜到的網路確實能取得很好的效果,但並不一定適合實際部署(比如DARTS能在很小的參數量下達到很高的精度,但是實際forward其實很慢)。既然之前已經有了很多優秀的人工設計的網路結構,NAS可以通過引入這些先驗知識來加速或者取得更好的實際部署性能。

先舉個最直觀的例子,EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks[ICML19]簡單粗暴,既然MobileNet在同樣精度下速度快,那我把它拿來搞大一點,同樣的速度下精度會不會高一點?答案是肯定的

問題在於怎麼放大這個網路,單獨加深/加寬/加大解析度效果一般般,EfficientNet搜索了寬度/深度/解析度之間的相對縮放因子,將他們按照一定的比例放大,事實證明這種方式(我覺得這應該也算是NAS)雖然簡單但是有效。

EfficientNet(縮放之後的MobileNetV2)性能很殘暴並且縮放的組合方式很重要

還有一個魔改MobileNetV2的工作出自MIT Song Han組,ProxylessNAS: Direct Neural Architecture Search on Target Task and Hardware[ICLR19],這篇工作的point不在於魔改MobileNetV2(kernel size,expansion ratio等),而是在於proxyless的理念。想要某個數據集在某硬體上的結果就直接在對應的數據集和硬體上進行搜索,而不是像之前的工作先在cifar10搜然後transfer到ImageNet等大數據集上,並且在目標函數上加入硬體latency的損失項作為多目標NAS,直接面向部署的硬體。

另一個系列的工作也是出自Google,MnasNet: Platform-Aware Neural Architecture Search for Mobile[CVPR19]用來魔改MobileNetV2裡面的layer數/卷積操作/加attention等等,然後用之前同樣的RNN+policy gradient的方式來優化

除此之外,NetAdapt: Platform-Aware Neural Network Adaptation for Mobile Applications[ECCV18]針對特定硬體對已有的網路做壓縮,相當於對網路在硬體上做一個結構上的fine-tune。

Google後來結合了上面這兩項工作,推出了Searching for MobileNetV3[ICCV19],把MnasNet魔改的MobileNetV2再用NetAdapt做微調,然後加了一些工程技巧,得到了最後的MobileNetV3。

性能很強悍,超過了ProxylessNAS和MnasNet

最後再介紹一個同樣是Song Han組最近的工作,Once for All: Train One Network and Specialize it for Efficient Deployment[Arxiv],直接train一個大網路,需要哪種網路直接去裡面取就可以,將訓練過程和搜索的過程解耦開來,相當於只需要train一次。

比較神奇的地方在於訓完了之後不需要fine-tune就能取得很好的結果,應該是跟下面這種progressive shrinking的訓練方式相關。如果再fine-tune精度會更高,openreview上的版本甚至比MobileNetV3高出4個點。

progressive shrinking

感覺是一個很好的思路,大部分NAS的主要時間到都花在驗證/比較網路精度上,那麼把這個時間都花在訓練一個大網路上,然後再選所需要的小網路或許是一種更高效/性能更好的方式。Once for All使用的一些技巧也比較多,推薦大家看一下原paper

最後再說一個Rethinking the Value of Network Pruning[ICLR19]裡面的結論,對於結構化的剪枝,Training---Pruning---Fine-tuning的pipeline得到的精度並不如將目標網路train-from-scratch的精度高,也就是說剪枝的目標網路的結構設計其實最為重要,這也就是NAS正在做的事情。不過在train-from-scratch代價比較大的時候,pruning和fine-tuning的策略也很重要,爭取在計算量盡量少的情況下維持原有精度。


我看到的目前NAS領域比較熱的基本上是基於可微分的方案的一些方法,然後內容是定義一個有一定容量的residual block空間,在這個空間內搜索最優的residual block,數據集基本上是在cifar10上搜索架構,然後在cifar100/imagenet測,運行時間基本上在一天以內,總的來說比較無聊~

說實話我覺得開始那些耗時1000+ gpu days的纔是真正意義上NAS,而這類可微分NAS我覺得純粹就是小打小鬧的煉丹~~


公眾號:將門創投 (thejiangmen)

網路結構搜索(神經架構搜索)是自動化機器學習的重要分支,具有廣泛的應用前景。

我「門」有幸邀請到微軟亞洲研究院研究員—彭厚文博士來到將門TechBeat,為我們帶來NeurIPS 2020 系列Talk之「"百裏挑一":基於優先路徑蒸餾的網路結構搜索

本次Talk中,彭厚文分享了他的NeurIPS 2020工作,重點介紹了One-Shot NAS方法,並提出基於優先路徑蒸餾的結構搜索方法。採用優先路徑搜索得到的網路結果在ImageNet上達到了80.0% 的Top-1分類準確率,超越了現有的EfficientNet-B0/B1以及MobileNetV3方法。

Talk已在將門TechBeat上線!【點擊這裡】,即可馬上免費觀看!

本次分享的主要內容如下:

1. One-Shot NAS

2. One-Shot NAS with Knowledge Distillation

3. Distilling Prioritized Paths for One-Shot NAS

4. Experiments and Results

5. Applications

? Talk·參考資料

這是本次分享中將會提及的資料,建議提前預習哦!

論文鏈接:

https://arxiv.org/pdf/2010.15821.pdf

代碼鏈接:

https://github.com/microsoft/Cream

? Talk·精彩片段

? Talk·嘉賓介紹

彭厚文 微軟亞洲研究院研究員

彭厚文現在是微軟亞洲研究院多媒體組研究員。他的研究興趣包括神經網路結構搜索與設計,視頻目標跟蹤、分割與檢測,視頻內容檢索,以及顯著物體檢測等。他曾在領域內多個學術會議和期刊上發表過論文,其中包括TPAMI的Featured Paper;同時,也在多個領域內競賽中獲得過冠亞軍,例如VOT2019-RGBD Track第一名。

在2018年加入微軟亞洲研究院之前,他曾是高通研究院的高級工程師。他於2016年獲得中國科學院自動化研究所的博士學位,並於2015年至2016年作為Research Scholar在Temple University研究學習。

? 點擊【這裡】,一起聽Talk啦~


1:全自動方向:初始化就是一個神經元並且不指定搜索空間,以神經元為單位進行search,執行過程中也不需要人為幹預。

2:無需藉助大量計算資源:不需要大量計算資源就能夠進行NAS,這樣纔能夠真正落地。

現在的方法都很對得起名字裏的「search」,期待「generate」能成為主流


NAS煉丹巨痛苦。

NAS離落地還遠,首先有個問題,它的搜索空間是提前設定好的,超參數也是設定好的,相當於在指定的搜索空間內,搜索到相對較好的網路結構。那麼問題來了,指定的搜索空間怎麼定義好壞,超參數怎麼設定。。

ps:最近我在NAS練丹,需求是超低Flops,0.3M級別的,有同好,可以交流交流。


從對特徵的特徵工程,到對網路結構的特徵工程,再到對NAS搜索空間的特徵工程,我們一直在擴展解空間。相應的,完成任務所需要的數據也要相應擴展,對於特徵的特徵工程,我們只需要少量代表性數據,我們需要找到局部的特徵;對於網路結構的特徵工程,我們需要大量特定任務的數據,我們需要找到的是一個網路整體的特徵;現在對於NAS,我們可能實際需要的是針對某一類別的不同任務的大量數據,相應的,我們需要找到一類網路的特徵;這其實就進入了元學習的領域。感覺針對一個特定任務的NAS可能是一種過渡階段的系統,NAS可能更應該針對元學習。


目前好像大多數還是CV的分類檢測分割用的多,想請問一下NAS有沒有在NLP/推薦方面的工作?NLP只看到一篇用在NER上的。


推薦閱讀:
相關文章