最近看了些NAS的論文,發現上面這篇綜述寫的很不錯,非常全面,詳細拜讀了一下。有很多細節不是很懂,也沒空去精讀原論文,但是能夠對大致的脈絡有個初步的了解。因此簡單寫一下這篇綜述講了些啥,第一次接觸NAS,可能有理解有誤,望指正批評。
介紹
首先這篇綜述是講AutoML的,不單單是NAS,但是因為NAS是AutoML中最最重要的一部分,所以主要篇章還是用來講NAS了。據作者所說,應該是第一篇完整講述AutoML整個流程的綜述。
首先,本文將AutoML劃分成了如下幾個流程:
先是數據準備,然后是特征工程,接著是模型生成,最后就是模型評估了。其中模型生成又可以分為搜索空間和優化方法,搜索空間有傳統的ML模型或者DL模型,優化方法又分為超參數優化和結構優化。NAS的話主要就涉及到DL模型的搜索空間定義、結構優化和模型評估策略這三塊。
因為我主要關注NAS這塊,所以其他部分就只簡單介紹一下,不做過多解讀。
數據準備
看上面這個圖應該很清楚了,數據準備主要分為數據收集、數據清洗和數據增強三個部分。
數據收集
有開源的就去下開源的,沒開源的就去互聯網上爬,要是什么都沒有呢,那就通過GAN之類的技術來生成偽數據,有總比沒有好嘛。
數據清洗
就是清洗數據中的噪聲、臟數據,這一過程可能需要一些知識去判斷什么是噪聲。還有一個研究主題就是如何清洗每天更新的源源不斷的新數據。
數據增強
數據增強某種程度上也可以被視為數據收集的一種工具,因為效果都是一樣的,增加了新數據。但是它的目的有所不同,主要是為了防止模型過擬合。上圖針對不同數據有很多增強方法,這里就不介紹了。
特征工程
有句話叫:數據和特征決定了機器學習的上界,而模型和算法只是為了去近似這個上界。主要可以分成三塊,特征選擇、特征構建和特征提取。這里也不多介紹了,因為在DL里特征工程用得很少,DL模型可以自己從數據中學出特征,很少需要自己手動構造特征了。
模型生成
從這塊開始進入到了NAS的領域。之前說了,搜索空間分為ML和DL兩塊,本文只關注DL,而優化方法又分為超參優化和網絡架構優化,本文也主要只關注網絡架構優化,因為超參優化是挑選出最優網絡架構之后的事情了,不過也有工作將NAS用在超參優化上的,這個就不在討論范圍內了。
上面兩張圖是NAS的一般流程:
首先針對不同的任務定義一個搜索空間,這個搜索空間就決定了你搜出來的網絡架構可能長什么樣子,也決定了你搜出來的架構可能性有多少,當然是越大越好,但是帶來的后果就是搜索速度太慢。
然后在這個搜索空間里進行搜索,采樣出一個比較好的模型架構,這里方法就非常多了,最簡單的就是隨機搜索,隨機采樣一個網絡架構。
最后就是在訓練集上評估你采樣出的架構效果,反饋給架構優化,讓它優化,然后繼續采樣,循環下去。評估方法也有很多,最簡單的就是像正常訓練模型那樣完整訓練一遍,得到效果,但是這樣太慢了,因此需要其他方法來加速訓練或者估計效果。
搜索空間
神經網絡可以看作是一個DAG,而如何定義這個DAG,其實你可以用生成圖的方式做加法生成它,也可以做減法,從大圖中抽取出子圖等等,有很多方法。
定義搜索空間需要人類知識,這一步目前還不夠Auto,定義的好,生成出來的架構才可能好。而有些工作發現只要你搜索空間定義的足夠好,隨機搜索都能達到和各種架構優化方法相似的效果,那么NAS將變得毫無意義,所以這一塊還是挺玄學的。
整體結構搜索
就是按照DAG的拓撲序,依次生成出模型架構出來。一般來說,用一個RNN來生成,每生成一個node,都要預測出它的輸入是哪些node(殘差)、作用在它上面的op有哪些。
但是這種方法太慢了,搜索的復雜度是指數級別的,因此在最初的幾篇RL論文里,都用了幾百個GPU訓練了幾十天才搜出來,窮苦人家可搜不起。
cell搜索
這種方式也是借鑒了人類設計神經網絡的經驗,像ResNet系列都是將一個個cell層層堆疊得到的,因此如果只搜一個cell,然后將相同的cell堆疊起來豈不是大大減小了搜索空間。后面的很多工作都是基于cell來搜索的,比如NASNet。
在NASNet中,cell被分成了兩種,一種是normal cell,它的輸入輸出維度保持相同,另一種是reduction cell,它的結構和normal cell相似,但是輸出的寬度和高度減半,通道數加倍。
最后搜索出最優cell之后,根據需要堆疊不同層數的cell就行了,這個層數也是人為定義的。但是這里就會存在一個訓練和評估不一致的問題,一般來說,在搜索的時候,為了減小顯存占用,會堆疊比較少的層數去評估。但是在得到最優cell之后,用來retrain時會堆疊比較多的層數,這里就不一定是最優解了。也有工作做這方面的優化,比如P-DARTS,在搜索階段逐漸增加堆疊的層數。
分層搜索
當然搜索cell也是存在問題的,忽視了整體結構的優化,而且每一層的cell相同也不一定最好啊。因此后來的工作又提出了分層搜索的方法。
比如Auto-deeplab在搜索cell的同時,還搜索了不同層的分辨率,下一層的分辨率可以是一半、不變或兩倍,這一步限制一是為了減小搜索空間,二是為了增加穩定性,防止分辨率變化太大。
再如HierNAS,按照層次結構來搜索網絡架構,第一層是一些原子操作,第二層用這些原子操作生成一些比較小的網絡,第三層用第二層的小網絡再搭建出一個更大的網絡,依次下去。
再如progressive NAS,為了減小一個cell里面的搜索空間大小,從一個cell里面只有一個block開始搜索,每次挑出top-k個cell,在基礎上衍生出兩個block,依次下去。評估性能用的是代理模型直接預測,不需要真的訓練一遍。
再如MnasNet,它將整個網絡分為了若干個cell,每個cell串行了若干個block,每個cell的block數量可能不同,而單個cell里面的block結構是相同的,這樣就考慮到了整體的網絡搜索空間。和堆疊cell不同的是,每個block的結構比較簡單,不然的話整體上搜索復雜度還是太大了。當然這篇主要還是為了做移動端部署,因此做了多目標NAS,將延時也考慮到了目標函數中去。
之前的方法還存在一個問題,就是基本都是在小數據集上做的搜索評估,最后將最優結構運用到大數據集上,這就存在不一致性。因此例如ProxylessNAS就直接在大數據集上搜索評估,為了減小顯存消耗,采用BinaryConnect,每次只激活兩個結點之間的一條邊。
網絡態射
這類方法主要思想就是在已經訓練好的成熟網絡基礎上增加寬度、深度等等,繼承父網絡的參數,加速子網絡的訓練。
首先是Net2Net,擴展分為兩個方向,一種是寬度上的,一種是深度上的,不能同時進行。
因此后來就有了網絡態射,可以處理任意線性層和非線性層,并且深度和寬度上可以同時擴展。
架構優化
定義好搜索空間后,就要采用架構優化算法來搜索出最優的架構了。
演化算法
演化算法就是模仿的生物進化過程。首先要對網絡架構進行編碼,方便之后的操作。可以將圖結構編碼為二進制串,但是這樣固定長度不靈活。于是就有了Cartesian genetic programming、Neuro evolution of augmenting topologies、Cellular encoding等各種編碼方法,詳細就不介紹了。
一般演化算法分為四步:選擇、交叉、變異、替換。
選擇。就是從候選的網絡架構中挑選出適應度最高的,一種可以直接挑絕對值最高的,另一種可以挑相對值最高的,第三種比較有名的是錦標賽選擇算法,也就是放回抽樣,每次等概率隨機選k個,挑出最好的那一個,進入下一代,其余放回,重復上述操作。
交叉。交叉方式和編碼方式有很大關系,
變異。上面兩步做完后,有很多方式可以對個體進行變異,比如隨機翻轉某一位,隨機增加或者刪除兩層之間的連接等等。
替換。新的個體加入種群后,舊的個體要被刪除掉。可以刪除最久之前的,也可以刪除效果最差的,也有工作一個都不刪除,只要你內存和時間頂得住。
強化學習
強化學習主要思想就是用一個控制器(一般是RNN)來生成網絡架構,然后評估得到得分作為反饋更新控制器參數。有用策略梯度的,也有用Q-learning的,還有用PPO算法的等等。第一篇NAS論文就是用的RL,但是這一類方法普遍很費卡,一般人玩不起。
梯度下降
前兩種都是在離散空間搜結構,梯度下降方法是將離散空間變為了連續空間。第一個提出的是DARTS,在兩個結點之間定義了若干種操作,然后做softmax,最后在評估的時候取argmax。
這種方法也有不好,比如成倍增加了顯存,本來一條邊現在需要成倍的計算量,此外用了代理任務,在小數據集上訓的層數比較少,遷移到大數據集上層數又很多。也有解決方法,比如P-DARTS,隨著訓練進行逐漸加層數,為了減小計算量,還逐漸減少了每條邊上的操作數。而GDAS每次只選概率最大的那個操作邊做前向,反向傳播用gumbel softmax。
兩套參數聯合優化也是很困難的,DARTS用的是交替優化,一次優化結構參數,一次優化模型權重。
最后還有個問題,就是搜索后期會傾向于搜索殘差連接之類的操作,這不好。于是DARTS+發現一個cell里出現兩個或以上殘差連接后就直接停止。P-DARTS則是給殘差加了正則化,減小出現的次數。
代理模型
這一類方法(SMBO)使用一個代理模型來指導最優模型的生成。傳統的方法有貝葉斯優化(高斯過程、隨機森林、TPE等等),就不詳細介紹傳統方法了。
也有用神經網絡當作代理模型的,比如PNAS、EPNAS、NAO都用一個LSTM或者MLP將離散的結構編碼成連續的表示,然后預測性能,接著找出性能最高的最優表示,用解碼器還原出離散的結構。
網格和隨機搜索
這就是最原始最普通的優化方法,比如直接在搜索空間隨機搜索結構,然后評估,最后取最優的就行了。雖說隨機搜索聽起來不大行,但實際出來的效果,能和大多數NAS方法達到相似效果,還很簡單。
混合優化方法
上面這么多方法混合在一起,可能效果會更好。演化算法是全局優化的,魯棒性很強,但是隨機性有點大,不穩定,計算消耗也大。強化學習也是的,訓練很不穩定。梯度下降方法訓練快,但是需要提前定義好超網絡結構,限制了結構的多樣性。
演化算法可以結合強化學習、梯度下降、SMBO,梯度下降也可以結合SMBO等等,這里就不詳細介紹了,典型的例子有Evo-NAS、NAO等等。
超參優化
這一步其實是脫離了NAS的,就和一般的超參優化一樣,網絡搜索、隨機搜索、貝葉斯優化、梯度優化等等方法,這里不做過多介紹了。
模型評估
在模型生成之后,需要對模型進行評估,然后指導架構優化模塊生成更好的架構。最一般的方法就是從頭開始訓練到收斂,但是這樣太慢了,一般都要生成個幾百萬以上的架構的,訓練時間太久了。
低保真度
可以在評估時降低數據集的分辨率,降低cell堆疊的層數,使用小數據集等等,這樣可以快速得到架構的大致效果,但是最后得到的架構可能在目標數據集上不是全局最優的。
權重共享
比如ENAS,可以在多次評估模型性能時,繼承之前相同node的參數,可以加快收斂速度。網絡態射也是用到了權重共享。
代理模型
直接學習一個預測器,輸入是網絡架構,輸出是它的性能,當然這需要提前先訓練一些模型,得到(架構,性能)的若干數據,然后才能學習出這個預測器,PNAS就是這么干的。當然預測器的學習數據肯定不會多,所以SemiNAS就用半監督的方法,利用大量無標注的結構去預測出性能,加入到訓練集中繼續優化預測器。
early stop
可以只訓練幾輪,然后根據前期的學習曲線預測出最終的性能。
一些討論
效果對比
可以看出,演化算法和強化學習搜索時間都非常長,除了個別幾個用了權重共享之類技巧的。梯度下降方法全部都挺快的,但是整體效果都不如其他幾類方法。
其他
從整體流程上來看,NAS方法還可以分為一階段和兩階段。兩階段是一般做法,第一個階段就是搜索評估階段,選出最好的架構,第二個階段就是retrain這個最優架構,在驗證集上評估。而一階段就是只需要訓練一次超網絡,聯合優化架構參數和模型權重,之后不需要再retrain了。比如比較有名的Once-for-all,采用了progressive shrinking算法來使得子網絡之間的性能相互不受到影響。
NAS還可以分為one-shot和non-one-shot,one-shot意思就是搜索空間重合的,可以重復利用之前的參數,比如ENAS、網絡態射、ProxylessNAS等都是的。
大多數NAS都只是把最終的效果當作目標,其實在移動端部署上還要考慮延時、模型大小、計算量等目標,一般都是解帕累托最優,比如MnasNet考慮到了延時。
開放性問題
搜索空間的靈活性
現在的搜索空間基本都還是人為定義的,參考了很多人類設計神經網絡的經驗,比如原子操作定義成conv、pooling之類的,結構上cell堆疊等等,但是真正的auto應該是模型自動設計網絡架構和原子操作,比如AutoML-Zero就用最基本的原子操作(sin、cos、mean、std等)設計出了兩層的神經網絡。這一塊應該是今后的一大方向,例如目前工作主要在CV上,而對于NLP的Transformer模型,搜索空間如何定義的很好?目前工作還寥寥無幾,看了幾篇也都是堆疊conv,分支結構之類的。
探索更多的領域
如上所說,目前大多數工作都是在CV上,搜的是conv結構,而像NLP、語音等領域探索甚少,像多目標領域也只有很少的工作(韓松老師組工作很多),即使是在CV,任務也大多數局限在CIFAR-10和ImageNet上。
可解釋性
搜出來的網絡為什么好?現在人類設計的網絡大多數都能強行解釋一下好處,即使它仍然是個黑盒。但是NAS搜出來的基本看不出設計的邏輯。
可復現
之前也說了,例如演化算法和強化學習這一類方法訓練很不穩定,很難復現出結果。很多論文也都只是公開了最好的模型,都不放出源碼的(當然我并沒有質疑他們),超參數之類的也有些沒有公布,這導致我們平民玩家沒法復現,沒法用啊。而且大家評測的環境都不相同,眾說紛紜,沒法公平比較,因此也有一些工作提出了NAS統一的數據集來評測。
魯棒性
如果目標領域數據添加了噪聲,可能會對搜出來的模型產生很大影響。所以如何搜出更加魯棒、能適應不同領域或者有噪聲數據的結構可能是未來的一個研究方向。
聯合超參優化和架構優化
目前大多數NAS方法都是先搜出最優架構,再調整超參在目標領域上retrain,如何同時學好這兩塊也是一個方向。
完全的AutoML的pipeline
做到從數據收集開始一直到最后的模型生成訓練全部流程化,不需要人為參與,那樣才是真正的智能。目前的話有一些比較好的開源工具了,AutoKeras、NNI等等。
終身學習
當新的數據源源不斷進來時,當只有少量有標簽數據或者有大量無標簽數據時,如何做NAS,有幾個不錯的工作,比如UnNAS是做無監督NAS的,MetaNAS是結合meta-learning的。
經典論文簡析
(NAS)[ICLR 17] Neural Architecture Search with Reinforcement Learning
動機
用強化學習來采樣網絡,生成出最優網絡結構,避免人工設計。
方法
用RNN來預測CNN或者RNN的結構,采樣結構,下游任務效果作為強化學習得分,策略梯度更新參數。
CNN預定義好層數,LSTM每5層預測CNN一層的5個參數。
RNN預定義好cell的計算拓撲圖,LSTM預測每個node的計算邏輯。
實驗
接近人類設計網絡的最好水平。速度超慢,800 K40,28天,只適用于小數據集例如CIFAR-10。
評價
強化學習應用到NAS的第一篇論文。
(NASNet)[CVPR 18] Learning Transferable Architectures for Scalable Image Recognition
動機
RL直接搜太慢了,只能用在小數據集,ImageNet之類的大數據集沒法用。
方法
提出了NASNet,用堆疊相同cell的方式減小搜索空間。在CIFAR-10上面學習cell結構,通過增加堆疊層數的方式遷移到ImageNet上去。用PPO替代策略梯度。
選擇之前的兩個node,分別預測對應op,然后預測合并op。
實驗
效果和參數量都好于前作,達到了SOTA水平。速度加快很多,500 P100,4天,相比于前作加速7倍。
評價
NASNet,通過cell堆疊加快了結構搜索的速度,同時效果達到了SOTA,并且容易遷移到其他任務上去。
(ENAS)[ICML 18] Efficient Neural Architecture Search via Parameter Sharing
動機
之前的方法采樣出一個結構,在dev上得到acc,然后就會拋棄權重,重新采樣訓練,非常耗時。
方法
定義一個超圖,每次搜出的子圖共享權重。
對于RNN cell,LSTM的每兩個step預測之前某個node作為輸入,再預測op,最后出度0的node拼接作為輸出。
對于CNN,一種策略是直接生成整個網絡,每個node先預測之前哪些作為輸入,然后預測op。
另一種策略和NASNet類似,堆疊cell,搜索空間縮小到一個cell。
實驗
優于NAS和NASNet,1 1080Ti,16小時,相比NAS加速1000倍。
評價
訓練速度很快,AutoKeras背后就采用了ENAS。
(DARTS)[ICLR 19] DARTS: Differentiable Architecture Search
動機
離散結構搜索太慢了,采樣+驗證+反饋的循環很耗時。
方法
連續域結構搜索代替離散域結構搜索,用微分來優化結構。
兩套參數:模型參數(訓練集優化)、結構參數(驗證集優化)。
交替優化兩套參數,softmax+relax學習最終結構。
實驗
效果達到或接近了SOTA,速度上比ENAS慢,比其他的方法快。
評價
第一個用可微分方法做NAS的,第一個連續空間搜索代替離散空間搜索。
[ICLR 19] Rethinking the Value of Network Pruning
動機
現有的剪枝方法存在問題,很多操作不合理,沒有必要。
方法
傳統剪枝方法基于兩個假設:
過參數化很重要,訓練大模型再剪枝優于直接訓練剪枝后的模型。
繼承大模型參數,再finetune很重要,優于隨機初始化剪枝后模型再重新訓練。
本文認為都不一定對:
對于預定義好的模型,直接訓練可以達到和訓練-剪枝-finetune相同甚至更好的效果。
大模型剪枝后,隨機初始化重新訓練,效果和繼承參數finetune差不多。
所以本文認為剪枝后的結構重要,而參數不是那么重要。
實驗
一系列實驗結果驗證了猜想,此外本文還否定了彩票假設,認為剪枝后隨機初始化即可,沒必要和原始初始化相同。
評價
仍然有一些局限性,比如數據分布均衡、模型比較大,估計在其他設置下不一定work。而且不如finetune速度快。
參考鏈接
不錯的綜述或討論
https://lilianweng.github.io/lil-log/2020/08/06/neural-architecture-search.html
https://jinzhuojun.blog.csdn.net/article/details/84698471
http://www.tensorinfinity.com/paper_136.html
https://zhuanlan.zhihu.com/p/73785074
https://www.zhihu.com/question/359162202
https://github.com/pzhren/Awesome-NAS
Neural Architecture Search: A Survey
A Comprehensive Survey of Neural Architecture Search: Challenges and Solutions
AutoML: A Survey of the State-of-the-Art
A Comprehensive Survey of Neural Architecture Search: Challenges and Solutions
一些經典論文
Neural Architecture Search with Reinforcement Learning
Designing Neural Network Architectures using Reinforcement Learning
Efficient Neural Architecture Search via Parameter Sharing
Learning Transferable Architectures for Scalable Image Recognition
DARTS: Differentiable Architecture Search
Neural Architecture Optimization
FP-NAS: Fast Probabilistic Neural Architecture Search
SNAS: Stochastic Neural Architecture Search
EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
Once for All: Train One Network and Specialize it for Efficient Deployment
Rethinking the Value of Network Pruning
TextNAS: A Neural Architecture Search Space Tailored for Text Representation
The Evolved Transformer
HAT: Hardware-Aware Transformers for Efficient Natural Language Processing
Searching Better Architectures for Neural Machine Translation
一些經典源碼或工具
https://github.com/quark0/darts
https://github.com/melodyguan/enas
https://github.com/mit-han-lab/once-for-all
https://github.com/mit-han-lab/hardware-aware-transformers
https://github.com/microsoft/nni
https://github.com/IntelLabs/distiller
https://autokeras.com/
[1]
AutoML: A survey of the state-of-the-art: https://arxiv.org/abs/1908.00709
責任編輯:xj
原文標題:一文看懂AutoML
文章出處:【微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
-
數據
+關注
關注
8文章
7145瀏覽量
89590 -
算法
+關注
關注
23文章
4630瀏覽量
93364 -
NAS
+關注
關注
11文章
292瀏覽量
112632
原文標題:一文看懂AutoML
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
教你三招異地訪問NAS
![教你三招異地訪問<b class='flag-5'>NAS</b>](https://file1.elecfans.com//web3/M00/04/86/wKgZPGd2B2CASj0tAACUmwXNGp8897.png)
剛到手的NAS怎么玩?這些TIPS請收好~
![剛到手的<b class='flag-5'>NAS</b>怎么玩?這些TIPS請收好~](https://file1.elecfans.com/web2/M00/0D/3C/wKgaomdEKx-AA9RxABCVJRFQByw864.png)
SensiML開源了Analytics Studio AutoML引擎
![SensiML開源了Analytics Studio <b class='flag-5'>AutoML</b>引擎](https://file1.elecfans.com/web1/M00/F4/64/wKgaoWcqyGKAGA5BAAAb6xGR32U822.png)
淺談芯片制造的完整流程
![淺談芯片制造的<b class='flag-5'>完整流程</b>](https://file1.elecfans.com/web2/M00/0A/5B/wKgZomcfMA2AL8ODAABgBWLCubE490.png)
NAS工具軟件大盤點:瞧瞧哪個被你遺漏了
PCBA加工打樣流程詳解,看這一篇就夠了
SensiML開源AutoML解決方案-Piccolo AI發布
那些年我的NAS用過的常用套件?
![那些年我的<b class='flag-5'>NAS</b>用過的常用套件?](https://file1.elecfans.com/web2/M00/EB/D8/wKgZomZgAxGAYs_9ABPqcya9ZnY302.png)
除了容量大還能干啥?教你如何用NAS提升居家幸福感!
NAS使用小妙招丨系統&域名&配件
![<b class='flag-5'>NAS</b>使用小妙招丨系統&域名&配件](https://file1.elecfans.com/web2/M00/EB/06/wKgaomZW1JKAP-egAAA2Lxrr830034.png)
一機實現All in one,NAS如何玩轉虛擬機!
![<b class='flag-5'>一</b>機實現All in one,<b class='flag-5'>NAS</b>如何玩轉虛擬機!](https://file1.elecfans.com/web2/M00/EA/BA/wKgaomZVfOKAUMIgAAC0krPP23c433.png)
一文掃盡Nas常用Docker軟件
教你一招,一鍵解鎖云盤與NAS自動同步!
![教你<b class='flag-5'>一</b>招,<b class='flag-5'>一</b>鍵解鎖云盤與<b class='flag-5'>NAS</b>自動同步!](https://file1.elecfans.com/web2/M00/E5/CB/wKgZomZEeQKAbSisAAEcSKnNjM8650.png)
評論