一文看懂JeffDean等提出的ENAS到底好在哪?

做者|第四範式先知平臺架構師 陳迪豪
編輯|Natalie
本文經做者受權發佈於 AI 前線,未經許可不得轉載!
AI 前線導讀:ENAS 全稱爲 Efficient Neural Architecture Search,出自谷歌 Jeff Dean 等人在 2018 年發表的論文《Efficient Neural Architecture Search via Parameter Sharing》,能夠在一天內自動訓練獲得一個比人類設計效果更好的模型。那麼這個看上去很神奇的 ENAS 到底有何奇妙之處?它與最近風頭正盛的 AutoML 有何關係?

本文將按部就班地介紹業界主流的自動生成神經網絡模型的 NAS 算法,以及目前最爲落地的 ENAS 算法,帶你一探 ENAS 究竟。

更多幹貨內容請關注微信公衆號「AI 前線」,(ID:ai-front)
簡介

隨着機器學習算法的突破,AutoML 逐漸被業界所熟知並開始落地應用。Google 近期頻頻發佈 AutoML 相關的論文,而且在 Google Cloud 平臺推出了 AutoML Vision 服務,此服務容許用戶上傳少許標記過的圖片數據便可從新訓練一個專屬的圖像分類模型。在我微博中大概介紹了這項「AutoML」技術,實際上能夠經過 Fine-tune 等方式實現,所以拋出本文第一個觀點,AutoML 的定義沒有強制標準,只要能自動訓練出好的模型就是有價值的 AutoMLnode

ENAS 全稱 Efficient Neural Architecture Search,出自 Google 在 2018 年發佈的論文《Efficient Neural Architecture Search via Parameter Sharing》(論文連接:https://arxiv.org/pdf/1802.03268.pdf ),經過共享模型參數的形式高效實現神經網絡模型結構的探索,也就是說 能夠在一天內自動訓練獲得一個比人類設計效果更好的模型。ENAS 使用了強化學習、動態構建計算圖等技術,從宏觀角度看是一種搜索算法,產出是一個精心挑選的 NN 模型,所以這是一種很符合指望的 AutoML,除此以外要實現完整的「自動 (Auto) 機器學習 (ML)」還須要有自動特徵抽取、自動超參調優等技術支持,但暫時不在本文的討論範圍。git

對於 ENAS 的介紹,你們可能已經看過媒體界吹捧的《谷歌大腦發佈神經架構搜索新方法:提速 1000 倍》、《Jeff Dean 等人提出 ENAS:經過參數共享實現高效的神經架構搜索》等文章。這裏拋出本文第二個觀點,看媒體翻譯的技術文章沒有用,想學習技術能夠看論文原文或者本文。在介紹 ENAS 算法實現細節以前,但願能夠按部就班地介紹一些前置的基礎知識理解。github

NAS 的原理

NAS 也就是 Neural Architecture Search,目標是從一堆神經網絡組件中,搜索到一個好的神經網絡模型。咱們知道神經網絡模型是一種可任意堆砌的模型結構,基礎的組件包括 FC(全鏈接層)、Convolution(卷積層)、Polling(池化層)、Activation(激活函數)等,後一個組件能夠之前一個組件做爲輸入,不一樣的組件鏈接方式和超參配置方式在不一樣應用場景有不一樣的效果,例以下面就是在圖像分類場景很是有效的 Inception 模型結構。算法

圖內結構比較複雜不理解也不要緊,咱們只須要知道這個神經網絡結構是由圖像領域專家花費大量精力設計出來的,而且通過了巨量的實驗和測試才能(在不能解釋深度學習原理的狀況下)肯定這個網絡結構。編程

那麼計算機是否能夠本身去學習和生成這個複雜的網絡結構呢?目前是不行的,包括各類 NAS 算法的變形還有 ENAS 算法暫時也沒法生成這樣的網絡結構,這裏拋出本文第三個觀點,絕大部分機器學習都不是人工智能,計算機不會平白無故得到既定目標之外的能力。所以,計算機並非本身學會編程或者建模,咱們尚未設計出自動建模的數據集和算法,所謂的「AI 設計神經網絡模型」,其實只是在給定的搜索空間中查找效果最優的模型結構。後端

例如咱們假設模型必須是一個三層的全鏈接神經網絡(一個輸入層、一個隱層、一個輸出層),隱層能夠有不一樣的激活函數和節點個數,假設激活函數必須是 relu 或 sigmoid 中的一種,而隱節點數必須是 十、20、30 中的一個,那麼咱們稱這個網絡結構的搜索空間就是{relu, sigmoid} * {10, 20 ,30}。在搜索空間中能夠組合出 6 種可能的模型結構,在可枚舉的搜索空間內咱們能夠分別實現這 6 種可能的模型結構,最終目標是產出效果最優的模型,那麼咱們能夠分別訓練這 6 個模型並以 AUC、正確率等指標來評價模型,而後返回或者叫生成一個最優的神經網絡模型結構。數組

所以,NAS 算法是一種給定模型結構搜索空間的搜索算法,固然這個搜索空間不可能只有幾個參數組合,在 ENAS 的示例搜索空間大概就有 1.6*10^29 種可選結構,而搜索算法也不可能經過枚舉模型結構分別訓練來解決,而須要一種更有效的啓發式的搜索算法,這種算法就是後面會提到的貝葉斯優化、加強學習、進化算法等。微信

使用超參自動調優

前面提到 NAS 是一種搜索算法,是從超大規模的搜索空間找到一個模型效果很好的模型結構,這類問題咱們也能夠看做一個優化問題,也就是從搜索空間中找到另外一個模型效果更優的模型結構。而神經網絡模型的結構和效果並非線性關係的,也沒有一個函數能夠描述這種關係,若是存在這樣的函數咱們就能夠經過求導、SGD 等方法用數學的方式找到最優解了,所以這能夠看做一類黑盒優化(Black-box optimization)問題,或者是多臂老虎機(Multi-armed bandit)問題,對於黑盒優化問題的解法能夠參考專欄另外一篇文章《貝葉斯優化: 一種更好的超參數調優方式》(https://zhuanlan.zhihu.com/p/29779000) 。網絡

回到 NAS 的場景,咱們須要定義一個搜索空間來讓算法選擇更優的網絡結構,而這個搜索空間無外乎就是網絡層個數、網絡層的類型、網絡層的激活函數類型、網絡層是否加 Dropout、網絡層是否加 Batch normalization,還有就是諸如卷積層的 filter size、strip、padding 和池化層的 polling type、kernel size 等等,這些咱們均可以認爲是神經網絡的超參數。架構

若是你使用過我開源的 tensorflow_tempalate_application 應該就理解,爲何是 template application?由於咱們能夠經過傳入的參數 --model={dnn, lr, wide_and_deep, cnn}來選擇更好的模型結構,也能夠經過參數 --optimizer={sgd, adadelta, adagrad, adam, ftrl, rmsprop}來選擇更好的優化算法等等,這裏再也不細說,感興趣能夠在 Github 上了解下:

https://github.com/tobegit3hub/tensorflow_template_application

實際上,NAS 能夠是一個普通的超參調優問題,也能夠是一個針對模型結構場景的調優問題。例如 Google 開源的 NASnet 模型和 ENAS 算法就是在通用的超參調優上更進一步,固然並非說後者的方法更優更先進,而是有些問題是超參很差描述的,例如用超參來表達每一層的輸入是前面的哪一層,這裏不妨推薦一篇文章介紹基於 Policy gradient 的 NAS 經典實現:

https://lab.wallarm.com/the-first-step-by-step-guide-for-implementing-neural-architecture-search-with-reinforcement-99ade71b3d28

對於能夠用超參輕易描述而且實現的模型結構,實現 NAS 並無那麼難,咱們不須要本身去實現相似 Policy gradient 的啓發式調優算法(後面會詳細介紹到),可使用一些已有的超參調優庫,只要本身實現機器學習模型的訓練過程和返回最終的指標結果便可。

所以我嘗試在 Google Vizier 的開源實現 Advisor 上使用 NAS 的功能,發現不到一百行代碼就能夠實現完整的自動生成網絡結構功能,並且不須要服務端作任何修改,咱們用幾十行 Keras 代碼或者是 TensorFlow 等任意的框架均可以使用,只須要提早描述好超參的搜索空間便可,示例代碼我也提交到 Github 上了。

Github 連接:

https://github.com/tobegit3hub/advisor/tree/master/examples/keras

NAS 的優化算法

前面提到 NAS 算法是一種搜索算法,除了須要定義好搜索空間外,還須要有一種啓發式的能夠收斂的調優算法實現。由於通常生成網絡模型的搜索空間都很大,若是搜索空間不大就能夠暴力枚舉了,並且生成一個模型要評估好壞就須要訓練,這個成本也是很是大了。

這時咱們想到的調優算法就是貝葉斯優化(Bayesian optimization)、粒子羣優化(Particle swarm optimization)、Policy gradient、DQN 等等,這些算法均可以用於 NAS 內部的模型的優化。是的,NAS 內部也有一個模型,通常在論文或者代碼中稱爲 controller 模型,又它來控制想要生成的神經網絡模型的結構,而生成的神經網絡模型會根據客戶的使用場景(例如圖像分類)來返回模型效果對應的指標,這個通常稱爲 child 模型。

前面介紹了基於 Advisor 來實現的 NAS,其實就是使用了 Advisor 內置的調優模型做爲 NAS 的 controller 模型,默認就是貝葉斯優化,並且只須要修改一個參數就能夠經過統一的接口來使用後端已經支持的 Random search、Grid search 等調優算法。

前面推薦的博客使用的是加強學習中的 Policy gradient 算法,包括後面提到的 ENAS 論文也是使用這個算法,而在 Google 的其餘論文中有介紹使用 Evolution algorithm 和 DQN 的,AlphaZero 在超參調優中使用的是貝葉斯優化,而 Deepmind 最新的調參論文介紹了相似 PSO 的羣體優化算法。

你們須要理解這些算法從本質上沒有區別,都是黑盒優化算法,由於假設不知道優化的目標和優化的參數是否有函數關係而且不能從中獲取梯度等信息,只能從歷史的模型訓練結果中根據超參組合還有最後模型效果來選擇超參的變化值。而 這些算法的區別在於運行效率和算法複雜度上,所以也會應用到不一樣的領域上

咱們常常看到下圍棋、打遊戲的人喜歡用 DQN、A3C 算法來優化模型,是由於下棋和打遊戲都是能夠經過軟件模擬操做而且能夠快速收到 reward 的,例如一分鐘收集到幾十萬的 state 和 reward 徹底足夠訓練一個高度複雜的 AlphaZero 模型(基於 ResNet)。而 AlphaZero 的超參調優卻使用基於高斯過程的貝葉斯優化,是由於調整超參須要從新訓練模型代價很大,大概幾小時才能獲得一個 state 和 reward,這不足以訓練一個比 ResNet 弱不少的神經網絡模型,但能夠經過在數學上假設全部超參之間符合聯合高斯分佈而後經過高斯過程求 state、reward 關聯關係的均值和方差,而後基於 exploration/exploitation 原則選擇下一個更優的探索點,這也就是貝葉斯優化的實現原理了。這其實也解釋了爲何 Google 之前基於 DQN、進化算法的 NAS 模型須要幾百塊 GPU 併發訓練多個月,由於評估一個模型結構是好是壞真的很耗時,這也是爲何 ENAS 解決評估模型這個問題後這麼 Efficient,後面會有詳細的介紹。

下面有一個更直觀的圖介紹爲何貝葉斯優化在數學上會比瞎猜(Random search 算法)更好。首先紅色的點表示已經探索過超參數,這裏只有一個超參數 X 須要調整,Y 軸表示選擇這個超參數 X 後模型的效果,能夠認爲 Y 就是模型正確率也就是越大越好,藍線真實的超參 X 與正確率 Y 的對應關係,由於咱們不可能遍歷全部 X 所以藍線咱們是未知的,而咱們的目標是已知幾個紅點去找到藍線中的最高點。其中上圖有一條虛線和淺藍色區域,那就是貝葉斯優化中高斯過程返回的均值和方差,這個均值和方差是在 X 取值範圍內都有的,分別表明了這個 X 點指望的正確率是多少和這個 X 點可能浮動的空間。

若是仔細觀察能夠發現,紅點必然會在虛線上,由於這個點是已經探索過的,也就是用這個 X 去訓練模型已經獲得了正確率,所以這個點也必然在藍線上。而淺藍色區域表明了這一塊可能浮動的空間,所以淺藍色區域裏虛線越大表示這塊越值得 exploration,可能發現新的高點也不必定,而虛線越高表示對這塊指望的 Y 值也越大,也是越值得 exploitation。爲了權衡 exploration 和 exploitation 所以有了下面的 Utility function,這也是一種算法。咱們能夠簡單認爲它就是用均值加上λ倍的方差獲得的曲線,而後取最高值做爲下一個探索點,由於這個探索點表明了這個 X 位置指望的 Y 值還有想要探索更多未知的可能性,若是以爲比較難理解建議先參考《貝葉斯優化:一種更好的超參數調優方式》(https://zhuanlan.zhihu.com/p/29779000 )。

ENAS 的實現

前面一直介紹的是 NAS,爲了讓你們瞭解 NAS 只是一種搜索算法。NAS 沒有學會建模也不能替代算法科學家設計出 Inception 這樣複雜的神經網絡結構,但它能夠用啓發式的算法來進行大量計算,只要人類給出網絡結構的搜索空間,它就能夠比人更快更準地找到效果好的模型結構。

ENAS 也是一種 NAS 實現,所以也是須要人類先給出基本的網絡結構搜索空間,這也是目前 ENAS 的一種限制(論文中並無提哦)。ENAS 須要人類給出生成的網絡模型的節點數,咱們也能夠理解爲層數,也就是說人類讓 ENAS 設計一個複雜的神經網絡結構,但若是人類說只有 10 層那 ENAS 是不可能產出一個超過 10 層網絡結構,更加不可能憑空產生一個 ResNet 或者 Inception。固然咱們是能夠設計這個節點數爲 10000 或者 1000000,這樣生成的網絡結構也會複雜不少。那爲何要有這個限制呢?這個緣由就在於 ENAS 中的 E(Efficient)。

你們大概瞭解過 ENAS 爲何比其餘 NAS 高效,由於作了權值共享 (Parameter sharing),這裏的權值共享是什麼意思呢?是你們理解的模型權重共享了嗎,但 ENAS 會產生和嘗試各類不一樣的模型結構,模型都不同的權重還能共享嗎?實際上這裏我把 Parameter sharing 翻譯成權值共享就表明則這個 Parameter 就是模型權重的意思,而不一樣模型結構怎樣共享參數,就是 ENAS 的關鍵。ENAS 定義了節點(Node)的概念,這個節點和神經網絡中的層(Layer)相似,但由於 Layer 確定是附着在前一個 Layer 的後面,而 Node 是能夠任意替換前置輸入的。

下面有一個較爲直觀的圖,對於普通的神經網絡,咱們通常每一層都會接前一層的輸入做爲輸出,固然咱們也能夠定義一些分支不必定是一條線的組合關係,而 ENAS 的每個 Node 都會一個 pre-node index 屬性,在這個圖裏 Node1 指向了 Node0,Node2 也指向了 Node0,Node3 指向了 Node1。

事實上,ENAS 要學習和挑選的就是 Node 之間的連線關係,經過不一樣的連線就會產生大量的神經網絡模型結構,從中選擇最優的連線至關於「設計」了新的神經網絡模型。若是你們理解了可能以爲這種生成神經網路的結構有點 low,由於生成的網絡結構樣式比較類似,並且節點數必須是固定的,甚至很難在其中創造出 1x1 polling 這樣的新型結構。是的,這些吐槽都是對的,目前 ENAS 能夠作的就是幫你把連線改一下而後生成一個新的模型,但這個就是 ENAS 共享權重的基礎,並且能夠以極低的代碼量幫你調整模型結構生成一個更好的模型,接下來就是本文最核心的 ENAS 的 E(Efficient)的實現原理介紹了。

咱們知道,TensorFlow 表示了 Tensor 數據的流向,而流向的藍圖就是用戶用 Python 代碼定義的計算圖(Graph),若是咱們要實現上圖中全部 Layer 連成一條直線的模型,咱們就須要在代碼中指定多個 Layer,而後以此把輸入和輸出鏈接起來,這樣就能夠訓練一個模型的權重了。當咱們把上圖中全部 Layer 連成一條直線的模型改爲右邊交叉連線的模型,顯然二者是不一樣的 Graph,而前一個導出模型權重的 checkpoint 是沒法導入到後一個模型中的。但直觀上看這幾個節點位置本沒有變,若是輸入和輸出的 Tensor 的 shape 不變,這些節點的權重個數是同樣的,也就是說左邊 Node0、Node一、Node二、Node3 的權重是能夠徹底複製到右邊對應的節點的。

這也就是 ENAS 實現權重共享的原理,首先會定義數量固定的 Node,而後經過一組參數去控制每一個節點鏈接的前置節點索引,這組參數就是咱們最終要挑選出來的,由於有了它就能夠表示一個固定神經網絡結構,只要用前面提到的優化算法如貝葉斯優化、DQN 來調優選擇最好的這組參數就能夠了。

那評估模型也是先生成多組參數,而後用新的網絡結構來訓練模型獲得 AUC 等指標嗎?答案是否認的,若是是這樣那就和普通的 NAS 算法沒什麼區別了。由於訓練模型後評估就是很是不 Efficient 的操做,這裏評估模型是指各組模型用相同的一組權重,各自在未被訓練的驗證集中作一次 Inference,最終選擇 AUC 或者正確率最好的模型結構,其實也就是選擇節點的連線方式或者是表示連線方式的一組參數。

稍微總結一下,由於 ENAS 生成的全部模型節點數是同樣的,並且節點的輸入和輸出都是同樣的,所以全部模型的全部節點的全部權重都是能夠加載來使用的,所以咱們 只須要訓練一次模型獲得權重後,讓各個模型都去驗證集作一個預估,只要效果好的說明發現了更好的模型了。實際上這個過程會進行不少次,而這組共享的權重也會在一段時間後更新,例如我找到一個更好的模型結構了,就能夠用這個接口來訓練更新權重,而後看有沒有其餘模型結構在使用這組權重後能在驗證機有更好的表現。

回到前面 TensorFlow 實現 ENAS 的問題,咱們知道 TensorFlow 要求開發者先定義 Graph,而後再加載權重來運行,但定義 Graph 的過程與模型訓練過程是分開的,而 ENAS 要求咱們在模型訓練過程當中不斷調整 Graph 的結構來嘗試更好的 Graph 模型結構。這在聲明式(Declarative)編程接口的 TensorFlow 上其實很差實現,而命令式(Imperative)編程接口的 PyTorch 上反而更好實現。固然這裏能夠爲 TensorFlow 正名,由於 ENAS 的做者就提供了基於 TensorFlow 的 ENAS 源碼實現,開源地址 https://github.com/melodyguan/enas 。咱們也深刻看了下代碼,做者用了大量 tf.case()、tf.while() 這樣的接口,實際上是 在 TensorFlow 的 Graph 中根據參數來生成最終訓練的 child 模型的 Graph,所以沒有用 Python 代碼定義全部 child 模型的 Graph 的集合,也不須要每次都從新構建 Graph 來影響模型訓練的性能。

除了 Node 之間的連線外,ENAS 論文裏面能夠訓練的超參數還包括上圖中的激活函數,也是經過 controller 模型輸出的一組參數來決定每一個 Node 使用的激活函數,而這些激活函數不須要從新訓練,只須要直接加載共享權重而後作一次 Inference 來參與模型評估便可。

不少人可能以爲目前共享的權重比較簡單,只能實現矩陣乘法和加法,也就是全鏈接層的做用,但在圖像方面會用到更多的卷積網絡,也會有 filter size、polling kernel size 等參數須要選擇。實際上 ENAS 已經考慮這點了,這些 Node 擁有的權重以及使用權重的方法被稱爲 Cell,目前已經提供乘法和卷積這兩種 Cell,而且在 PTB 和 Cifar10 數據集上作過驗證,固然將來還能夠加入 RNN 等 Cell,甚至多種 Cell 一塊兒混用,固然這個在實現上例如前置節點的連線上須要有更復雜的判斷和實現。

對於 ENAS 的 controller 模型的參數調優,論文中使用的是加強學習中的 Policy gradient,固然正如前面所提到的,使用貝葉斯優化、DQN、進化算法也是沒問題的。不過目前 ENAS 的 controller 模型和共享權重的實現放在了一塊兒,所以要拓展新的 controller 提優算法比較困難,將來咱們但願把更多的調優算法集成到 Advisor 中(目前已經支持 Bayesian optimization、Random search、Grid search,正在計劃支持 Policy gradient、DQN、Evolution algorithm、Particle swarm optimization 等),讓 ENAS 和其餘 NAS 算法也能夠更簡單地使用已經實現的這些調優算法。

整體而言,ENAS 給咱們自動超參調優、自動生成神經網絡結構提供了全新的思路。經過權值共享的方式讓全部生成的模型都不須要從新訓練了,只須要作一次 Inference 就能夠得到大量的 state 和 reward,爲後面的調優算法提供了大量真實的訓練樣本和優化數據。這是一種成本很是低的調優嘗試,雖然不必定能找到更優的模型結構,但在這麼大的搜索空間中能夠快速驗證新的模型結構和調優生成模型結構的算法,至少在已經驗證過的 PTB 和 CIFAR-10 數據集上有了巨大的突破。

固然也不能忽略 ENAS 自己存在的缺陷(這也是將來優化 ENAS 考慮的方向)。首先是爲了共享權重必需要求 Node 數量一致會限制生成模型的多樣性;其次目前只考慮記錄前一個 Node 的 index,後面能夠考慮鏈接多個 Node 製造更大的搜索空間和更復雜的模型結構;第三是目前會使用某一個模型訓練的權重來讓全部模型複用進行評估,對其餘模型不必定公平也可能致使找不到比當前訓練的模型效果更好的了;最後是目前基於 Inference 的評估能夠調優的參數必須能體現到 Inference 過程當中,例如 Learning rate、dropout 這些超參就沒法調優和選擇了。

總結

最後總結下,本文介紹了業界主流的自動生成神經網絡模型的 NAS 算法以及目前最爲落地的 ENAS 算法介紹。在整理本文的時候,發現 NAS 其實原理很簡單,在必定空間內搜索這個你們都很好理解,但要解決這個問題在優化上使用了貝葉斯優化、加強學習等黑盒優化算法、在樣本生成上使用了權值共享、多模型 Inference 的方式、在編碼實現用了編寫一個 Graph 來動態生成 Graph 的高級技巧,因此要 讀好一篇 Paper 須要有一對懂得欣賞的眼睛和無死角深挖的決心

本文致謝 Hieu Pham、Melody Y Guan、Barret Zoph、Quoc V Le、Jeff Dean。

做者介紹

陳迪豪,第四範式先知平臺架構師,曾在小米科技和 UnitedStack 擔任基礎架構研發工程師。活躍於 OpenStack、Kubernetes、TensorFlow 等開源社區,實現了 Cloud Machine Learning 雲深度學習平臺,Github 帳號 https://github.com/tobegit3hub。


更多幹貨內容請關注微信公衆號「AI 前線」,(ID:ai-front)

相關文章
相關標籤/搜索