AutoML全稱是automated machine learning,下面有一段AutoML不是什么的描述:
AutoML is not automated data science. While there is undoubtedly overlap, machine learning is but one of many tools in the data science toolkit, and its use does not actually factor in to all data science tasks. For example, if prediction will be part of a given data science task, machine learning will be a useful component; however, machine learning may not play in to a descriptive analytics task at all.
大至意思是說不要迷信AutoML,它只是數(shù)據(jù)科學眾多工具中的一種,而且它也只能解決眾多數(shù)據(jù)科學任務中的某些任務。
AutoML可以做如下這些事情:
預處理(preprocess)并清理數(shù)據(jù)
選擇并構造合適的特征(features)
從現(xiàn)有的模型部件中選擇合適的模型結構(model family),類似堆積木
優(yōu)化模型超參數(shù)(hyperparameters)
后處理(postprocess)機器學習模型
嚴格分析模型輸出結果
從AutoML可以做的這些事情可以看出,至少針對一些特定的場景,它是能夠做到全自動的,即數(shù)據(jù)清洗、特征選擇、建模、超參優(yōu)化、模型評估等。我們可能關鍵是要知道automl適合哪些場景,把它做成我們AI的亮點,而不是所有。
在描述本文的AutoML之前,需要看幾個概念,即人工智能、機器學習、深度深度之間的關系,下圖是從網(wǎng)上找到的:

簡單的說機器學習是實現(xiàn)人工智能的一種手段,而深度學習是在機器學習的發(fā)展過程中,發(fā)展出來的一個分支,廣義上講它也是機器學習,但是由于其實現(xiàn)機制和原來的機器學習算法有較大的不同,所以發(fā)展為一個獨立的領域。機器學習和深度學習都是建模的有效工具,只是它們面向的場景有所不同。
所以,
AutoML也需要分為兩個種類,傳統(tǒng)的AutoML和深度AutoML。即傳統(tǒng)的AutoML是為了解決傳統(tǒng)機器學習的建模問題,它面向的是傳統(tǒng)機器學習相關算法,如線性回歸、邏輯回歸、決策樹等等。而深度AutoML更多的是面向深度學習中神經(jīng)網(wǎng)絡的建模。
本文主要研究的就是面向深度學習領域的AutoML。
AutoML和神經(jīng)架構搜索(NAS)是深度學習領域當前最熱門的話題。 它們能以快速而有效的方式,只需要做很少的工作,即可為你的機器學習任務構建好網(wǎng)絡模型,并獲得高精度。 簡單有效!
Being able to go from idea to result with the least possible delay is key to doing good research.
將想法快速實現(xiàn)(變成結果)是優(yōu)秀研究的關鍵。
AutoML完全改變了整個機器學習領域的游戲規(guī)則,因為對于許多應用程序,不需要專業(yè)技能和知識。 許多公司只需要深度網(wǎng)絡來完成更簡單的任務,例如圖像分類。 那么他們并不需要雇用一些人工智能專家,他們只需要能夠數(shù)據(jù)組織好,然后交由AutoML來完成即可。
從上面這段話可以看出,AutoML并不是萬能的,并不是所有的機器學習問題都能交由它來完成,它是針對特定領域所提供的自動化解決方案,以降低普通公司使用機器學習的門檻及成本。
AutoML是目前比較熱門的一個研究領域,主要應用于圖像識別,但在其它領域應用的較少。
下面是使用Auto-Keras實現(xiàn)mnist的一個例子,用它來看看AutoML到底在做什么。
1. Auto Keras
它是AutoML的一個實現(xiàn)工具包,google也有自己的automl,但是那個要收費,我就從這個著手,先看看AutoML能做什么,后期再去深入了解其實現(xiàn)原理及機制。
不出意外的情況下,安裝auto keras只需要一行命令即可:pip3 install autokeras,如果出現(xiàn)異常情況,比如缺少依賴包,按照異常提示補裝上即可。
下面是一個使用auto keras編寫的手寫數(shù)字識別mnist的源碼:
from keras.datasets import mnist
import autokeras as ak
if __name__ == '__main__':
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(x_train.shape + (1,))
x_test = x_test.reshape(x_test.shape + (1,))
clf = ak.ImageClassifier(verbose=True, augment=False)
clf.fit(x_train, y_train, time_limit=12 * 60 * 60)
clf.final_fit(x_train, y_train, x_test, y_test, retrain=True)
y = clf.evaluate(x_test, y_test)
print(y * 100)
從上面的代碼可以看出它的寫法非常簡單,一般使用tensorflow構建一個mnist的神經(jīng)網(wǎng)絡模型,可能需要一兩百行代碼,中間涉及到各個輸入輸出層的構造;而使用auto keras只需要編寫幾行代碼,它的寫法有點類似機器學習工具包scikit-learn,完全隱藏了復雜的神經(jīng)網(wǎng)絡構建過程。
但是我們可以從這段代碼的運行日志中看到它大概在做什么:


網(wǎng)絡結構的構建過程是自動的
訓練過程是自動的
它構造了不止一個網(wǎng)絡模型,每個模型它都會訓練一番
后一個模型似乎是在前一個模型的基礎上做了一些調整,繼承了前一個模型,并且會加一些操作(調整網(wǎng)絡結構)
調整的依據(jù)有可能是日志中的
loss以及metric value等,主要應該還是它有自己內部改變各種網(wǎng)絡結構的算法。(其實就是ENAS算法)
下面是autokeras官網(wǎng)上的一段說明:
Auto-Keras provides functions to automatically search for architecture and hyperparameters of deep learning models.
也就是說Auto-Keras提供了一些工具包,可以自動搜索神經(jīng)網(wǎng)絡結構,以及自動進行深度學習模型的超參數(shù)調整。
從對auto keras的初步了解,可以看出AutoML通過自己的一套算法,把構建網(wǎng)絡結構、調整網(wǎng)絡結構、調整超參數(shù)、模型評估等等過程全部封裝起來了,全部自動化完成。將原來可能毫無目的的結構調整、參數(shù)調整,通過科學化的算法變成結構有序的調整,降低了機器學習的門檻,縮短了整個建模過程。
2. 其它AutoML產(chǎn)品(工具包)
2.1 AutoWEKA
它是基于WEKA的一種AutoML實現(xiàn),WEKA好像是一個老牌的數(shù)據(jù)挖掘工具。AutoWEKA就是針對WEKA的自動模型選擇和超參數(shù)優(yōu)化。基于Java的。
2.2 Auto-sklearn
基于scikit-learn的AutoML實現(xiàn),它主要也是上面提到的,針對傳統(tǒng)機器學習而言的自動建模。
該工具包使用15個分類器,14個特征預處理方法和4個數(shù)據(jù)預處理方法,產(chǎn)生具有110個超參數(shù)的結構化假設空間。
它的基本原理可以通過下圖看個大概:

核心思想是使用貝葉斯優(yōu)化!
2.3 H2O AutoML
它是基于H2O平臺的一個AutoML實現(xiàn),該平臺主要面向傳統(tǒng)機器學習算法,但是也包含了簡單的深度學習網(wǎng)絡模型,比如DNN。
這是一個非常好的機器學習平臺,它綜合了機器學習算法、深度學習算法、數(shù)據(jù)分析、數(shù)據(jù)可視化、自動超參搜索、以及多種訓練指標可視化等,為用戶提供了一套完整的人工智能解決方案。
2.4 Google Cloud AutoML
谷歌的AutoML是一個新興的(alpha階段)云計算機學習工具軟件套件。 它基于谷歌最先進的圖像識別研究,稱為神經(jīng)架構搜索(NAS)。NAS基本上是一種算法,根據(jù)您的特定數(shù)據(jù)集,搜索最佳神經(jīng)網(wǎng)絡以在該數(shù)據(jù)集上執(zhí)行特定任務。
Google AutoML是一套機器學習工具,可以輕松培訓高性能深度網(wǎng)絡,無需用戶掌握深度學習或AI知識; 所有你需要的是標記數(shù)據(jù)! Google將使用NAS為您的特定數(shù)據(jù)集和任務找到最佳網(wǎng)絡。并且通過AutoML所找到的最佳網(wǎng)絡一般情況下要遠遠好于人工設計的神經(jīng)網(wǎng)絡!
下圖是Google Cloud's AutoML pipeline:

不過Google的這個是要收費的,而且還很貴!
3. AutoML實現(xiàn)原理分析
根據(jù)Thomas Elsken的論文介紹,AutoML主要包含三大領域:
NAS:Neural Architecture Search,神經(jīng)網(wǎng)絡結構搜索,即需要通過某種結構及算法,實現(xiàn)神經(jīng)網(wǎng)絡結構的自動生成。Hyper-parameter optimization:超參數(shù)優(yōu)化,針對神經(jīng)網(wǎng)絡中的超參數(shù)進行自動優(yōu)化。meta-learning:元學習,或者叫learning to learn,即學會學習。
3.1 NAS
Neural Architecture Search(NAS),即神經(jīng)網(wǎng)絡結構搜索技術,通過某種結構及算法,實現(xiàn)神經(jīng)網(wǎng)絡結構的自動生成,它主要包含搜索空間,以及搜索策略、性能評估策略等幾個維度的知識。
3.1.1 搜索空間
可以簡單理解為基于一定的前提和假設,并根據(jù)已有的經(jīng)驗,預置一些網(wǎng)絡結構單元,就像堆積木一樣,預先提供了各種各樣的積木,最終的網(wǎng)絡結構就是通過搜索空間中的這些原始積木組合成的。
也正是因為如此,通過這種模式生成的最終網(wǎng)絡結構其實只是在給定的搜索空間中查找效果最優(yōu)的模型結構而已,機器只是沿著人類設計好的算法,依據(jù)某些評估指標,通過不斷的測試從而生成一個比較完美的網(wǎng)絡結構。
絕大部分機器學習都不是人工智能,計算機并不是真的具有智能了,也不會無緣無故獲得既定目標以外的能力。

下圖是對搜索空間以及空間中各單元之間關系的一個說明:

NAS算法所生成的網(wǎng)絡結構是基于這樣的一個前提:它認為一個大的神經(jīng)網(wǎng)絡結構是由很多小的、重復的單元所組成的。我們在構建整個神經(jīng)網(wǎng)絡時,只需要針對這些小的單元進行搜索,而不是每次針對整個網(wǎng)絡結構進行搜索。
如上圖左側上下兩張圖所示,NAS將這種最小的組件稱之為cells或blocks,有兩種類型的單元,一種是維持維度的正常單元(normal cell),一種是降低維度的還原/降低單元(reduction cell),然后通過以預定義的方式堆疊這些單元來構建最終的網(wǎng)絡架構(右上圖右側部分)。
何為維持維度的單元,何為降低維度的單元,這部分我沒有看明白。
以圖像識別為例,在Google的NASNet網(wǎng)絡中,就將圖像識別網(wǎng)絡分成如下這些單元(或塊):

可以看出這是基于人類在圖像識別領域的前期研究經(jīng)驗的,它預置了很多塊,如各種維度的卷積層,各種維度的池化層等,這其中還會涉及到的些連接函數(shù)(激活函數(shù))。
接下來要做的事情就像堆積木一樣,拼裝出各種各樣的網(wǎng)絡結構,并對這些結構進行訓練評估,使用`RNN``網(wǎng)絡做為控制器,來不斷的重復這個過程,直接訓練出滿意的網(wǎng)絡結構。如下圖所示:

3.1.2 搜索策略
搜索策略詳細說明了如何探索搜索空間,它圍繞著經(jīng)典的探索-利用權衡問題,一方面希望能盡快找到性能良好的架構,另一方面,也需要解決如何避免過早收斂到次優(yōu)架構區(qū)域。
何為探索-利用問題?網(wǎng)上找到的一個例子:
假設你家附近有十個餐館,到目前為止,你在八家餐館吃過飯,知道這八家餐館中最好吃的餐館可以打8分,剩下的餐館也許會遇到口味可以打10分的,也可能只有2分,如果為了吃到口味最好的餐館,下一次吃飯你會去哪里?
所謂探索:是指做你以前從來沒有做過的事情,以期望獲得更高的回報。所謂利用:是指做你當前知道的能產(chǎn)生最大回報的事情。那么,你到底該去哪家呢?這就是探索-利用困境。
搜索策略定義了使用怎樣的算法可以快速、準確找到最優(yōu)的網(wǎng)絡結構參數(shù)配置。常見的搜索方法包括:隨機搜索(random search)、貝葉斯優(yōu)化(Bayesian optimization)、進化算法(evolutionary methods)、強化學習(reinforcement learning [RL])、基于梯度的算法(gradient-based methods)。其中,2017 年谷歌大腦的那篇強化學習搜索方法將這一研究帶成了研究熱點,后來 Uber、Sentient、OpenAI、Deepmind 等公司和研究機構用進化算法對這一問題進行了研究,這個 task 算是進化算法一大熱點應用。
注:國內有很多家公司在做 AutoML,其中用到的一種主流搜索算法是進化算法。
算法的演進歷史
在2000年以前,
進化算法被用在了改進神經(jīng)網(wǎng)絡結構的各種研究上。用進化算法對神經(jīng)網(wǎng)絡超參數(shù)進行優(yōu)化是一種很古老、很經(jīng)典的解決方案,90 年代的學者用進化算法同時優(yōu)化網(wǎng)絡結構參數(shù)和各層之間的權重,因為當時的網(wǎng)絡規(guī)模非常小,所以還能解決,但后續(xù)深度學習模型網(wǎng)絡規(guī)模都非常大,無法直接優(yōu)化。從2013年,
貝葉斯優(yōu)化也在之后獲得了一些成功,以及2015年在cifar10上通過該算法生成的網(wǎng)絡結構首次超過人類專家設計的。2017年,使用
強化學習算法,在cifar10和Penn上獲得了巨大的成功,也是從這時開始,NAS開始變成機器學習中的熱門研究話題。但是當時是使用800個GPU,跑了三四周才跑完的。從那以后,開始有越來越多的人研究如何提高NAS算法的性能。其中最出名的就是ENAS算法。
Esteban Real在2018年主導了一項研究,即研究強化學習、進化算法、隨機搜索三者的優(yōu)劣,主要是研究三者在cifar10上的表現(xiàn)。最終研究結果表明,強化學習和進化算法要優(yōu)于隨機搜索,另外在網(wǎng)絡規(guī)模小的情況下,進化算法表現(xiàn)是最好的。
貝葉斯優(yōu)化在超參數(shù)優(yōu)化問題上是最為流行的,但是很少有將其應用于NAS上,主要是因為典型的貝葉斯優(yōu)化工具包是基于高斯過程并專注于低維連續(xù)優(yōu)化問題。
在分層搜索領域,比如結合進化或者基于順序模型的優(yōu)化,蒙特卡洛樹搜索(Monte Carlo Tree Search)也是研究方向之一。
3.1.3 性能評估策略
NAS的目標就是尋找在未知數(shù)據(jù)集上有很好預測性能的網(wǎng)絡結構模型,性能評估模塊就是用來評估這些生成的網(wǎng)絡結構的性能。而一種最簡單的性能評估方法,就是針對該網(wǎng)絡結構,使用數(shù)據(jù)集進行一次標準的訓練和驗證,從而評估其性能。但是這種最簡單的方法,會帶來昂貴的計算開銷以及時間開銷,從而進一步限制我們能探索到的網(wǎng)絡結構數(shù)量。
因此,最近的許多研究都集中在開發(fā)降低這些性能評估成本的方法上。
性能評估策略中,有一種辦法是基于低保真的策略,比如更短的訓練時間、使用更少的訓練集、使用更低的圖片分辨率、或者每層中使用更少的過濾器(filter),這種作法會大大的降低訓練開銷,但是也會帶來一些指標上的偏差,不過這種偏差對最終結果影響不大。
還有一種策略是基于推斷法,比如學習曲線推斷法,這種思路的核心思想是建議推斷初始學習曲線并終止那些預測表現(xiàn)不佳的曲線,以加快架構搜索過程。還有一種推斷法是基于代理模型的推斷,即通過小的網(wǎng)絡模型的性能表現(xiàn)推斷出最終的網(wǎng)絡模型。
還有一種策略是是基于權重參數(shù)遷移的,即將一個已經(jīng)訓練好的模型參數(shù)直接應用于當前網(wǎng)絡結構,當前網(wǎng)絡模型就相當于在一個高起點的情況下進行學習,可以大大縮短訓練時間。
還有一種策略叫One-Shot架構搜索,原理沒有看明白。網(wǎng)上解釋是這種方法將所有架構視作一個 one-shot 模型(超圖)的子圖,子圖之間通過超圖的邊來共享權重。
3.1.4 NAS未來的方向
目前絕大多數(shù)聚焦在NAS上的研究都是針對圖像分類的。在其它領域仍然應用較少,如語言建模、音樂建模、圖像修復、網(wǎng)絡壓縮、語義分割等。
另外就NAS的實現(xiàn)原理而言,其搜索空間是完全基于人類經(jīng)驗的,比如針對圖像分類領域,我們給搜索空間定義了很多單元,如卷積層、池化層等,而這些基本只能針對圖像領域,我們無法將其應用到其它領域中,這種網(wǎng)絡結構的搜索,最終也會被限制在這些預定義好的單元之中。NAS未來的一個研究方向就是定義一個更通用、更可擴展的搜索空間。
3.1.5 NAS的演進
由于NAS每次搜索網(wǎng)絡結構都需要對其進行一次訓練,在Google的NASNet網(wǎng)絡上,需要使用450塊GPU訓練3到4天,這種昂貴的開銷注定小公司是消費不起的。
Efficient Neural Architecture Search (ENAS),是目前比較出名的一種nas加強版算法。它的理論基礎就是遷移學習和權重共享,ENAS算法強制所有模型共享權重,而不是從頭開始訓練到收斂。 我們之前在之前模型中嘗試過的任何塊都將使用之前學過的權重。 因此,我們每次培訓新模型時都會進行轉移學習,收斂速度更快!

如上圖所示,本來需要450塊GPU卡跑3,4天的模型,在使用了ENAS之后,只需要一塊1080Ti GPU,跑半天即可。
我們最上面的例子中,
auto keras就是使用了enas的算法。
3.2 Hyper-parameter optimization
超參數(shù)優(yōu)化,并不是最近才發(fā)展起來的,它一直伴隨著機器學習和深度學習。幾乎每一種算法,都會涉及到各種各樣的超參數(shù),這些超參數(shù)設置的好壞直接決定了建模了效率以及效果。而實際建模過程中,很多情況下就是憑經(jīng)驗進行設置,或者進行大量的試錯、反復訓練。
超參數(shù)優(yōu)化就是通過算法層面,將超參數(shù)的設置交給計算機去搜索獲得。比較流行的算法主要有:貝葉斯優(yōu)化、隨機搜索、網(wǎng)格搜索。
這其中最有名的應該就是貝葉斯優(yōu)化算法了,貝葉斯優(yōu)化是一種近似逼近的方法,用各種代理函數(shù)來擬合超參數(shù)與模型評價之間的關系,然后選擇有希望的超參數(shù)組合進行迭代,最后得出效果最好的超參數(shù)組合。代理函數(shù)中比較有名的就是高斯函數(shù)。
貝葉斯優(yōu)化的核心思想是,通過用戶給定的兩個X值以及對應的Y值,擬合一個高斯函數(shù),然后根據(jù)峰值找下一個可能的x值,其實給我的感覺也是瞎猜,不過猜的比較體面。

其它兩種超參優(yōu)化算法就比較簡單了,隨機搜索就是瞎猜,給計算機一個參數(shù)取值的范圍,讓計算機去瞎猜并不斷嘗試;網(wǎng)格搜索更簡單,用戶先瞎猜好幾個取值,然后讓計算機去嘗試。
3.3 Meta-Learning
尚未研究。
3.4 算法相關
3.4.1 強化學習
強化學習是一種非常有意思的范式,幾乎只要可以提煉出強化學習四要素,原問題就可以用強化學習來求解。
在 NAS 任務中,將架構的生成看成是一個 agent 在選擇 action,reward 是通過一個測試集上的效果預測函數(shù)來獲得(這個函數(shù)類似于工程優(yōu)化問題中的 surrogate model,即代理模型)。這類工作整體的框架都是基于此,不同的點在于策略表示和優(yōu)化算法。
3.4.2 進化算法
進化算法是一大類算法,大概的框架也基本類似,先隨機生成一個種群(N 組解),開始循環(huán)以下幾個步驟:選擇、交叉、變異,直到滿足最終條件。最近幾年流行一種基于概率模型的進化算法 EDA (Estimation Distribution of Algorithm),基本的思路類似遺傳算法,不同的是沒有交叉、變異的環(huán)節(jié),而是通過 learning 得到一個概率模型,由概率模型來 sample 下一步的種群。
用進化算法對神經(jīng)網(wǎng)絡超參數(shù)進行優(yōu)化是一種很古老、很經(jīng)典的解決方案,90 年代的學者用進化算法同時優(yōu)化網(wǎng)絡結構參數(shù)和各層之間的權重,因為當時的網(wǎng)絡規(guī)模非常小,所以還能解決,但后續(xù)深度學習模型網(wǎng)絡規(guī)模都非常大,無法直接優(yōu)化。
3.4.3 貝葉斯優(yōu)化
貝葉斯優(yōu)化(Bayesian Optimization)是超參數(shù)優(yōu)化問題的常用手段,尤其是針對一些低維的問題,基于高斯過程(Gaussian Processes)和核方法(kernel trick)。對于高維優(yōu)化問題,一些工作融合了樹模型或者隨機森林來解決,取得了不錯的效果。
除了常見的三大類方法,一些工作也在研究分層優(yōu)化的思路,比如將進化算法和基于模型的序列優(yōu)化方法融合起來,取各種方法的優(yōu)勢。Real 在 2018 年的一個工作對比了強化學習、進化算法和隨機搜索三類方法,前兩種的效果會更好一些。
4. AutoML應用場景
通過上面的描述可以知道,AutoML其實是針對一些比較成熟的人工智能解決方案,如常規(guī)機器學習,以及圖像識別、圖像分類等,主要用來解決這類場景下,網(wǎng)絡模型的自動生成,以及超參數(shù)的自動優(yōu)化。
目前的AutoML并生成不了超出人類思維以外的模型,它其實只是在預先設置好的一堆積木中,按照一定的策略去搭建一個組合的網(wǎng)絡,所有的網(wǎng)絡單元仍然是人類設置好的。
講白了就是面對這些場景,科學家們已經(jīng)知道如何去做,但是編寫各種各樣的網(wǎng)絡模型、調整超參數(shù)、訓練等,需要耗費大量的時間及金錢。而AutoML可以通過科學化的建模算法,有效的提高建模效率及質量,減少成本。所以針對這些場景使用AutoML是合適的。
而在語言建模、音樂建模、圖像修復、網(wǎng)絡壓縮、語義分割等領域,有可能在這些領域中,還沒有形成非常有效的解決方案,那么AutoML也就無從談起了。
參考材料
解釋automl相關知識,以及如何通過auto keras組件包對mnist進行AutoML實現(xiàn)。
auto keras官網(wǎng)。
https://www.automl.org/automl/
AutoML官網(wǎng)。
[Neural Architecture Search: A Survey](Neural Architecture Search: A Survey)
一篇針對NAS當前發(fā)展情況深度解讀的文章,文章從三個維度對NAS進行了分析:搜索空間、搜索策略、性能評估策略。
介紹Google AutoML的一篇文章。
一篇介紹AutoML和NAS的文章。