在現今電腦視覺的領域當中,CNN已經可以達到非常高甚至超越人類的精確度,但隨之而來的代價就是追求更深更大的網路所造成的高複雜度(例如:大量的記憶體需求,大量的運算),因此對於在有限資源的硬體設備(例如:手機,嵌入式系統)中應用產生了巨大的挑戰,因為我們總不可能在每一台手機每一台監視器,都放一張1080Ti或是2080Ti,所以現今的網路需求除了對於精確度的要求,也慢慢開始注重效能的優化。
然而,設計出一個能夠兼顧準確度以及效能的網路是很困難的。
要設計一個好的網路,首先會遇到兩個問題,分別是Intractable Search Space和Non transferable optimality。
Search Space的意思是在我們搜索出一個網路的時候,我們的搜索的空間,也就是所有可能的選擇所組合成的空間。
以大家熟悉的VGG16為例,其中並沒有任何較為複雜的設計(例如:residual connection),單純為13層的conv layers,假設在每一層kernel size的選擇皆是{1, 3, 5},單是這樣可能構成的選擇便有3¹³次方種選擇。且訓練一個CNN往往會花費許多時間,更不用說要從這麼多的選擇中要挑出一個最好的架構了,畢竟我們不可能實際的訓練這3¹³種網路吧!
而對於不同的裝置,由於其不同的硬體架構,因此對於同樣的一個運算,也會有不同的速度,所以一個在A裝置表現的好的網路架構,並不一定同樣可以在B裝置表現的好,也就是CNN的 non transferable optimality。
因此便有人開始進行Neural Architecture Search的研究,目的是希望可以開法出一個方法,並且可以自動的探尋Search Space以獲得最好的網路。
簡單來說,就是可以自動的在Search Space中,根據我們的需求找到最好網路架構的方式,而我們的搜索目標有可能會是根據準確度,或是根據Inference time等等使用者可以自己定義的Objective。
而Neural Architecture Search可以分成三個大部份,也就是Search Space, Search Strategy和Performance Estimation Strategy。
搜索的空間,也就是所有可能的選擇構成的空間,例如:kernel size要用3, 5 或是7? 要用多少層layer?
利用什麼方式從Search Space中挑選出我們要的網路架構,例如:Reinforcement Learning。
當我們根據Search Strategy並從Search Space中挑選出了一個網路架構,我們要如何評估這個網路是好的網路還是不好的網路,可以根據準確率,或是根據記憶體,Inference Time。
Reinforcement Learning NAS主要可以分成兩個大部份,也就是Controller(agent)和Trainer(environment)。
Controller就像是agent,會從Search Space中取樣出一個CNN架構,而Trainer就像是environment,會將Controller 取樣出的CNN架構實際的訓練,而訓練之後的準確率就會當作reward,並且更新Controller,使得Controller可以慢慢學習出何種的CNN架構可以讓 reward最高。
但由於每次Sample出的網路架構我們都需要實際的訓練,因此在搜索的過程我們會需要花費非常大量的時間,為了減少訓練的時間,往往會利用較小的Dataset(e.g. CIFAR10)或是訓練比較少的epoch數。
雖然這個方法在過去,已經被證明可以達到很好的結果,但是這個方法所需要的時間太過龐大了,要使Controller可以生成出很優秀的架構,往往需要實際訓練上百個上千個網路,儘管訓練少量的epoch,所需要的時間還是很驚人。
Progressive NAS最主要的概念便是一層一層漸進式的方式決定在每一層要用什麼樣的選擇。
而由於要決定每一層要用什麼樣的架構,我們首先需要知道所有選擇的好壞,而實際的將所有種可能的架構training,並根據結果來決定好壞會花費許多時間,因此會額外的訓練一個Controller,而 Controller的目的就是預測當前這樣的組合的準確率會是多少 。
因此Progressive NAS主要可以分成幾個大步驟:
為了解決過去weight不能共用,每個model都需要重新training一次所花費的大量時間,便有人提出了Weight Sharing NAS,也就是將Search Space中所有的可能組合成一個網路,又稱Supernet,並同時訓練於Supernet中的所有weight,如此我們便可以透過額外的Evoluation Algorithm或是訓練額外的參數(Architecture Paramter)來選取最好的網路架構。
利用Evolution Algorithm來挑選最好的網路架構的方式,通常會將整個Search Process分成兩個大部份,Training Staget和Evoluation Stage:
利用額外的Parameter來學習能夠讓表現最好的網路架構分佈,因此除了需要訓練原本Supernet的weight,還需要訓練額外的Architecture Parameter,因此雖然也是分成兩大部份,但是這兩大部份是不斷互相重複的:
B. Zoph and Q. V. Le. Neural architecture search with reinforcement learning. In ICLR, 2017
M. Tan, B. Chen, R. Pang, V. Vasudevan, and Q. V. Le. Mnasnet: Platform-aware neural architecture search for mobile. CVPR, 2019
B. Wu, X. Dai, P. Zhang, Y. Wang, F. Sun, Y. Wu, Y. Tian, P. Vajda, Y. Jia, and K. Keutzer. Fbnet: Hardware-aware efficient convnet design via differentiable neural architecture search. CVPR, 2019
Liu, C., Zoph, B., Shlens, J., Hua, W., Li, L.J., Fei-Fei, L., Yuille, A., Huang, J. Murphy, K.: Progressive neural architecture search. ECCV 2018
Jin-Dong Dong, An-Chieh Cheng, Da-Cheng Juan, Wei Wei, and Min Sun. Dpp-net: Device-aware progressive search for pareto-optimal neural architectures. In ECCV, 2018.
H. Liu, K. Simonyan, and Y. Yang. DARTS: Differentiablearchitecture search. ICLR, 2019
G. Bender, P.-J. Kindermans, B. Zoph, V. Vasudevan, and Q. Le. Understanding and simplifying one-shot architecture search. In International Conference on Machine Learning. ICML 2018
Z. Guo, X. Zhang, H. Mu, W. Heng, Z. Liu, Y. Wei, and J. Sun. Single path one-shot neural architecture search with uniform sampling. arXiv preprint arXiv:1904.00420, 2019.
Thomas Elsken, Jan Hendrik Metzen, and Frank Hutter. Neural architecture search: A survey. arXiv preprint arXiv:1808.05377, 2018b.