1 前言
這篇文章會主要以《Automated Machine Learning: Methods, Systems, Challenges》這本書為主要參考,結合一些其它論文,工具架構對這個領域進行介紹。
2 背景
我們先來看什麼是AutoML。顧名思義,AutoML就是自動化的機器學習,我們先從機器學習中最常被自動化的一個任務,超參數優化來舉例。比如我們在做人工調整超參數時,經常會采用以下的方法:
- 把模型的學習率參數設為0.01,訓練模型,擷取評估名額的得分,比如準确率為0.7。
- 把模型學習率設為0.1,訓練模型,再次擷取評估名額,比如下降到了0.65。
- 根據上述的觀察結果,接下來我們可能嘗試一個比0.01更小的值,以此類推。
從上面這幾個步驟,我們不難看出我們在人工解決這個參數優化問題時,其實在不自覺中已經引入了一些優化方法。我們擴大了學習率參數,但發現準确率降低了,是以接下來我們會往相反的方向調整學習率來繼續嘗試,這是建立在準确率 = f(超參) 是一個平滑的凸函數的基礎上,模拟梯度下降的做法來進行嘗試。 是以如果隻有這一個參數,這個自動化的過程還是挺容易建立的,比如應用經典的二分法。
在這個想法的基礎上,我們可以把這個想法在各個次元上進行擴充:
- 實際的任務的超參個數比較多,而且往往會有互相影響,導緻搜尋空間很複雜。而且超參跟預測名額之間的關系,往往也不是理想的平滑凸函數。是以我們如何通過已有嘗試,去選擇下一個探索點,需要引入更複雜的方法。
- 除了預測名額外,我們往往還會有其它連帶需要優化的目标,比如希望訓練/預測的時間盡可能短,消耗的計算資源盡可能少,這就會變成一個多目标的優化問題。
- 人類專家在做算法調優時,不會每次都從頭開始,而往往會考慮曆史上碰到過的類似問題,把過去的經驗帶入到新問題中,最典型的比如選取之前有效的參數作為初始嘗試點,使用之前表現好的模型來做fine-tune等。這背後是一個多任務優化問題,而我們收集的資料,也多了一個層面,就是任務本身的資訊。
- 同樣,我們在做調優時會有大量的時間在等待模型訓練,但很多模型是可以在訓練過程中輸出驗證集名額的,對于不靠譜的超參數,我們可能盯着訓練過程一陣子之後就提前停止了。這個思想也可以融入到自動化優化過程中去,提升搜尋效率。
- 超參數本身隻是整個模組化過程中的一個優化部分,其它的例如前期的資料擷取,實驗設計,模組化過程中的資料處理,特征工程,特征選擇,模型選擇與設計,模型融合,包括後續的模型解釋,誤差分析,監控/異常檢測等環節,也都有機會使用智能算法來自動化提效。
- 另外還有模型學習本身的自動優化,例如人類能從幾張圖檔中就學會識别一個新物體,随着年齡經驗的增長,學習掌握新知識的能力會逐漸增強。如何能讓機器學習算法也擁有類似的自動化的“經驗增長”能力,而不依靠使用者的經驗積累,也是一個重要的話題。

Learning Box
下文中我們會詳細介紹這些技術點上的各類技術和前沿探索成果。
3 超參數優化(HPO)
3.1 定義
超參數優化是最早利用自動化技術來進行機器學習的領域,目前在市面上看到的大多數AutoML系統與産品都還主要集中在這個方面。自動化的HPO技術對于降低機器學習的項目門檻,緩解資料科學人才短缺方面會有很大幫助。Gartner在之前的AI平台報告中也指出,對于專業資料科學家,AutoML能夠提高他們的工作效率,減少在手動調參方面的時間投入。對于平民資料科學家,或者說更擅長業務領域知識的資料分析人員,AutoML能幫助他們快速應用機器學習的能力,不需要再掌握機器學習的複雜技術細節,就能達到業界資料科學家的平均水準。在此基礎上,很多之前沒有機會應用機器學習的項目也開始可能出現正向的ROI回報,推動各行各業的AI應用落地,而不隻是集中在頭部場景和high tech公司中。
現階段自動HPO面臨的挑戰還很大,例如模型評估一般都非常消耗計算資源,導緻參數搜尋優化的運作需要大量的時間和資源成本。算法pipeline的參數空間非常複雜,超參數次元高,互相依賴,且搜尋空間本身都需要一定的經驗來進行設計。自動HPO技術中很多也基于機器學習方法,本身的穩定性,泛化能力也是一大難點。
前面一節中我們舉的例子就是一個超參數優化問題,其正式的定義如下:
HPO定義
這裡面超參數λ的類型會有很多種:
- 連續型,例如前面提到的learning rate
- 整數型,例如決策樹的深度,CNN中的channel數
- 類别型,例如優化目标函數,神經網絡中的激活函數等
在此基礎上,還會有條件參數的概念。例如當優化器選擇為Adam時,又會衍生出beta1,beta2,epsilon等參數。這種情況可以推廣到模型選擇加參數優化問題,例如選擇哪個模型可以作為一個類别型超參數,而選擇了這個模型之後,會有一系列的衍生條件參數需要聯合搜尋優化。這就是所謂的Combined Algorithm Selection and Hyperparameter Optimization(CASH)。而且這裡的搜尋和優化,也完全可以不局限在模型這塊:
CASH
順帶一提像現在比較火的NAS,其實也可以把它的搜尋空間轉化為一個HPO的搜尋空間,比如Google Brain的這篇18年的文章就有類似的方法:Zoph et al., 2018[2]。
3.2 Model-free Optimization
大家一開始玩超參優化,最先接觸到的就是這塊的技術手段了,那就是大名鼎鼎的網格搜尋和随機搜尋!
Model free優化
相信大家當年應該都用過sklearn裡的GridSearchCV和RandomizedSearchCV吧。上面這張圖對比了這兩種搜尋方法,展現出随機搜尋的一個優勢:在各個參數的變化對最終模型效果的影響度不一樣時,随機搜尋往往能在同樣的嘗試次數中探索各個參數更多不同的取值,進而取得更好的結果。另一方面,随機搜尋的并行化實作也更加簡單,如果有模型評估的任務跑挂了也不要緊,觸發一個新的評估就可以。反之在網格搜尋中,如果有任務挂了,就會導緻網格中“空洞”的出現,需要進行重試處理。綜上所述,在大多數情況下都會更推薦使用随機搜尋來進行model-free optimization,且很多其它model-based optimization在初始化階段也會使用随機搜尋方法來探索起始點。
3.3 Population-base
還有一類啟發式的群體算法也經常被應用在HPO問題中,例如遺傳算法,粒子群算法等。他們一般的思想是維護一個參數組合的群體,評估他們的fitness function(這裡就是模型評估的表現),然後使用個體選擇,變異,及互相交叉的做法,不斷衍生出下一代整體表現更好的群體。這些方法過程較為簡單,有一定并行性,收斂性也不錯。但從實際效果來看可能需要較大量級的模型評估才能達到比較好的結果。
這個類型中最著名的算法當屬CMA-ES。其背後的思想是,根據群體中的優勝者們的分布,來更新均值和協方差,然後再進行下一輪的采樣。當優勝者們距離比較遠時,下一輪搜尋采樣的範圍會擴大,而當優勝者們的分布比較集中時,下一輪的采樣搜尋範圍會減小。這個算法的論文Hansen, 2016[3]有些複雜,作者也維護了一個Python庫[4]來實作CMA-ES算法。有興趣了解這方面資訊的同學更推薦看這個blog[5]。
值得一提的是在BBOB(Black-Box Optimization Benchmarking)挑戰中,CMA-ES算法基本屬于一個統治者的地位。
3.4 貝葉斯優化
終于到了大家熟知的貝葉斯優化了!回到我們之前嘗試調優learning rate的例子,我們通過兩次嘗試得到的參數,評估效果分别是(0.01, 0.7)和(0.1, 0.65),這就可以構成HPO的輸入資料集。在這個資料集上,我們可以建構一個模型,來預測我們選取别的learning rate時會達到什麼樣的模型準确率。接下來通過這個模型,我們希望能選出下一輪應該評估的learning rate是多少,後續就可以持續疊代起來。這就是貝葉斯優化的大緻過程。
從上面的描述中,我們可以看出貝葉斯優化的兩個核心元件:
- Surrogate model,我們希望能有一個模型學習到現在已知資料形成的分布情況,尤其是在已知點附近,我們對結果輸出的信心會比較高,在沒有被探索過的區域,我們對結果輸出的分布會有很大的不确定性。
- Acquisition function,利用模型輸出的預測值及不确定性,我們希望平衡探索未知區域與利用已知區域資訊,選擇接下來的探索點。直覺點說就是一方面想看看我沒有嘗試過的區域情況會如何,另一方面也不是完全瞎找,要綜合我們的已知資訊,比如我們嘗試過學習率大于1的那些區域明顯效果都比較差,應該在效果較好的0.01附近找更有可能的點。
Bayes Opt
經典的貝葉斯優化示意圖,通過高斯過程來拟合已有的observation,然後使用acquisition function來找到下一個評估點。
Surrogate model方面,最常見的選擇是高斯過程。例如BayesianOptimization[6]庫中就使用了sklearn中的GaussianProcessRegressor:
# Internal GP regressorself._gp = GaussianProcessRegressor( kernel=Matern(nu=2.5), alpha=1e-6, normalize_y=True, n_restarts_optimizer=5, random_state=self._random_state,)
高斯過程本身又是一個大話題,有一篇非常好的tutorial[7]可以參考。對于高斯過程,kernel的先驗選擇非常關鍵,例如應用到超參數優化中,這個kernel應該能輸出符合我們預期的不那麼平滑的sample function,因而Matern kernel成為了高斯過程應用在HPO中的一個常見選擇,而且大多用的都是Matern 5/2。具體可以參考這篇Snoek et al., 2012[8],以及GPflow中對kernel的一些實驗講解[9],可以看到不同的Matern kernel的參數選擇也會導緻sample結果不一樣的平滑度表現。
在有了可以輸出後驗分布的模型後,再結合acquisition function來進行建議評估點的擷取:
suggestion = acq_max( ac=utility_function.utility, gp=self._gp, y_max=self._space.target.max(), bounds=self._space.bounds, random_state=self._random_state)
最常見的acquisition function有3種,分别是:
- EI(expected improvement)
- UCB(upper confidence bound)
- ES(entropy search)
以EI為例,其大緻的代碼形式如下:
def _ei(x, gp, y_max, xi): with warnings.catch_warnings(): warnings.simplefilter("ignore") mean, std = gp.predict(x, return_std=True)
a = (mean - y_max - xi) z = a / std return a * norm.cdf(z) + std * norm.pdf(z)
在這篇知乎文章[10]中,作者對這三種function做了非常詳細的解釋。上述代碼跟文中的公式有一些小小的差別,就是多了一個參數xi,這個參數可以用來控制Exploitation和Exploration的trade-off,具體效果可以參考這個notebook[11]。總體上看EI在各類正常貝葉斯優化中使用最多。UCB的概念和計算更加簡單,而且從一些實驗結果來看基本可以達到跟EI同樣的效果。ES相對來說計算複雜度會高很多,但個人感覺這個形式在資訊的exploration方面的能力應該是最強的,尤其在一些多任務設定的優化問題中會經常見到。
上面就是貝葉斯優化的主要流程,先用高斯過程拟合已知資料,再用一些政策(acquisition function)來根據模型選取下一步要評估的超參數。這裡也貼一篇很好的tutorial[12]來更詳細的解釋貝葉斯優化背後的機理。
3.4.1 GP和kernel的改進
在實際應用中,surrogate model這塊會有很多挑戰,例如高斯過程本身有一系列的限制和問題:
- 模型overhead:GP的fit過程的複雜度是 ,predict的複雜度是 ,當搜尋的量級較大時,模型的overhead會較為明顯。
- Kernal scalability:GP的标準kernel在高維空間中的很容易失效,除非把評估數量也以指數級增加,但這明顯是不可行的。
- 參數限制:标準的GP隻能處理連續型參數,如果是整數型,類别型,需要做額外的處理。
為了緩解這些問題,從模型和kernel兩個方面,研究者們提出了各種替代和改進方案。
沿着使用GP的路線,在模型方面一個思路是改進GP本身的性能,比如使用sparse GP來做近似:Hutter, Frank, et al., 2010[13]。而Wang, Ziyu, et al., 2016[14]中提出了一種random embedding的方法,把高維參數随機投射到低維空間中。其背後的主要假設是參數的effective space是相對比較小的。
Rembo
在Wang, Zi, et al., 2018[15]中,則采用了把input space做分割,在多個子空間中運作GP算法,最後再進行整合。想法聽起來挺直覺,不過實作細節上還是蠻複雜的,涉及到如何分割input space,使用Gibbs sampling訓練TileGP等。
還有在Lu, Xiaoyu, et al., 2018[16]中,作者使用VAE來轉換參數的input,然後後續就可以使用正常的GP來進行貝葉斯優化,本質上也是一種降維的思路。
也有不少對kernel做改進的工作,例如Oh, ChangYong, et al., 2018[17]使用cylindrical kernels把球形空間投射到了圓柱體空間中,使得球心附近包含的空間與球殼附近包含的空間基本等價,而不是原本的在次元較高情況下,大多數的搜尋空間都集中在球殼附近。其背後的假設是一般較好的參數candidate應該在球心附近分布更多。其它還有比如Gardner, Jacob, et al., 2017[18]等additive kernels方法。
Cylindrial Kernel
3.4.2 其它surrogate model
另外一個方向的思路是使用其它模型來替代GP。
例如利用神經網絡來充當surrogate model,Springenberg et al., 2016[19]中采用的是貝葉斯神經網絡,通過SGHMC(天奇大佬的工作)來sample from network擷取mean and variance,進而計算acquisition function。還可以計算出EI相對于x的gradient,進行優化求解。這個方法在RoBO中有具體實作。事實上BNN也有多種采樣方法,這裡為什麼用SGHMC,也是通過一系列的實驗嘗試得出的:
BNN compare
可以看出SGHMC給出的置信區間更符合超參搜尋優化的直覺,與GP的效果很接近。
也有使用Factorized MLP的做法,參考Schilling et al., 2015[20]。這裡需要解決預測能夠輸出時的uncertainty的問題。通過對模型參數引入貝葉斯假設,最終可以通過hessian of loss on D以及gradient on x來計算出預測性的後驗分布。
神經網絡模型目前總體在較低次元和連續型變量任務上表現非常不錯,在高次元和複雜參數空間問題中還沒有很有力的實驗驗證支援。是以相對于GP來說,神經網絡主要在模型overhead方面會有提升幫助,在實際工程應用中還不多見。
除了神經網絡,還有不少工作采用了樹模型。例如SMAC3,auto-sklearn中都有使用随機森林作為surrogate model。随機森林的處理特征能力更廣泛,可以天然處理包括類别變量,conditional變量等。且RF模型的fit,predict複雜度在O(nlogn),明顯比GP擴充性更好。對于輸出uncertainty的需求,可以通過多棵樹的結果來計算mean, variance。
另外比較常見的樹模型選擇是TPE: Bergstra et al., 2011[21],大緻的思路是選取一個門檻值,把嘗試過的參數結果分成兩塊,好的參數集以及不好的參數集。接下來對這兩個集合拟合兩個分布(GMM),l(x)表示低于門檻值(效果好的參數)的分布的density function,g(x)反之。然後根據EI的計算公式,選取l(x)/g(x)最大的x作為下一個評估點。這背後的想法也非常簡單,就是希望接下來評估的點在效果好的參數集中的機率要比效果差的參數集中的機率越大越好。在hyperopt中,就主要使用TPE方法來做貝葉斯優化。
RF scores
RF TPE
EI TPE
樹模型相比GP的主要劣勢是sample efficiency會略差一些,但是性能,穩定性,處理複雜參數空間等方面都有很大的優勢。整體的實作也相對簡單,是以實際應用也比較廣泛。
另外書中還提到了deterministic RBF:Ilievski et al., 2016[22],compressed sensing:Hazan et al., 2017[23]等方法,感覺比較小衆,沒有深入進行了解。
3.5 參數空間
前面有提到過在優化超參時,會有多種類型的參數,而在貝葉斯優化過程中,預設設計是對有範圍限制的連續型參數進行搜尋。是以對于不同的參數,我們需要進行不同的處理(Garrido-Merchán et al., 2018[24]):
- 整數型參數,例如随機森林中樹的數量,需要在優化過程中把連續變量round到整數形式。
- 類别型參數,可以使用one-hot等預處理方式。
- 條件參數,在RF這類surrogate model中,對在某些條件下不活躍的參數,可以用一個預設值代替,活躍的參數則正常輸入。另外在Jenatton et al., 2017[25]等工作中,為structured configuration spaces設計了各種特殊的kernels。
還有一系列參數搜尋空間方面的問題。例如learning rate的search space是log space,也就是說learning rate從0.001變為0.01帶來的變化,跟0.1到1帶來的變化應該是類似的。是以也有一些研究希望能夠自動探索出不同參數的搜尋空間,例如Snoek et al., 2014[26]中提出的input warping方法,通過将每個輸入次元替換為Beta分布的兩個參數并對其進行優化,可以在過程中自動學習此類轉換。
另外一個限制是大多數優化問題都需要預先定義好搜尋範圍,如果最優解并不在這個範圍内就會導緻搜尋優化的結果不理想。前面提到的TPE天然可以處理無限的搜尋空間。另外也有各種動态擴充搜尋空間的方法,例如Nguyen et al., 2018[27]中,作者在優化過程中通過invasion set來考慮是否對目前的搜尋空間進行擴充。而在Shahriari et al., 2016[28]中,作者利用regularization替代掉了範圍的限制。背後的intuition是對于距離目前最優點越遠的空間中,必須有更大的EI才會被選中來進行評估。
3.6 帶限制的優化
在現實中使用貝葉斯優化往往都會帶入一些其它的限制條件,例如計算資源的使用,訓練和預測所需要花費的時間,模型的精确度等等,包括很多AutoML challenge也在這方面設定了很嚴格的要求。一些簡單的處理辦法比如對于違反了限制的observation做penalty,例如雖然這個參數組合的模型效果不錯,但因為運作逾時了,我們會直接把它設定為效果最差的評估結果。更細緻一些的做法例如Gelbart et al., 2014[29]中,作者對違反一個或多個限制的可能性進行模組化,在優化過程中搜尋模型效果好且不太可能違反任何給定限制的參數。在Hernández-Lobato et al., 2016[30]中,作者更是提出了一個通用的framework。一方面對于task與resource之間的關系,建構了一個二分圖,并在後續優化過程中進行使用。另一方面,他們擴充了使用資訊學理論的acquisition function Entropy Search,提出了Predictive Entropy Search with Constraints,可以很好的解耦objective和constraint的評估,進而很好的解決此類帶限制的優化問題。
bi-graph
3.7 Multi-fidelity Optimization
前面介紹的model free,population based和model based一系列方法都是黑盒優化的思路。在前面背景介紹我們有提到過,人類專家在做超參數優化過程中,并不是完全把模型評估作為一個黑盒來看待,而是會采用觀察學習曲線,使用少量資料等方式來對學習效果進行快速判斷。沿着這個思路,我們可以得出此類multi-fidelity優化的幾個方向,基于學習曲線的預測的early stopping,bandit based算法,以及更進一步的adaptive fidelities方法。
3.7.1 Multi-fidelity設定
除了前面講到的學習曲線的觀察,我們也可以采用其它的方法來形成不同fidelity下的observation,例如采用部分資料或特征進行訓練,或者利用與目前資料集類似(相似度就可以做為fidelity的評估)的其它任務上的訓練結果,具體到一些場景中,比如圖像問題,可以嘗試用低分辨率的圖像來訓練,而強化學習中可以減少trial的次數等。總結一下,主要就是3個次元,訓練的時間,資料集的大小,以及相似任務的遷移。
3.7.2 Learning Curve-Based Prediction
看這個名字就基本能猜到這個方法了,實際上就是模拟我們人工來觀察各類iterative學習算法的learning curve(一般用驗證集上的評估結果),然後判斷目前嘗試的超參是不是一個靠譜的取值。如果明顯沒有向上提升的趨勢,我們就可以選擇提前終止訓練。
Learning Curve Predict
如何用模型來替代人工的判斷呢?畢竟從幾個epoch的曲線來判斷長時間訓練能達到的效果,還是挺有難度的。在Domhan et al., 2015[31]中,作者選取了11個參數方程,這些方程的曲線都跟典型的learning curve長得比較像:
Learning Curve Functions
這11個參數方程的參數,以及它們的權重,會通過MCMC方法來拟合已知learning curve部分來得到。這樣後續就可以輸出目前的這個learning curve在未來能夠達到的準确率的分布情況。然後我們就可以判斷是否要繼續進行訓練了。這個方法可以跟貝葉斯優化結合起來一起使用,比如前面通過貝葉斯優化得到的目前最好的準确率是y_best,我們可以判斷目前參數的訓練結果是否能以超過5%的機率超過y_best,來決定是否提前終止。
Learning Curve Terminate
這篇文章還提供了開源代碼實作[32],automl.org的不少工作都是既有文章又有代碼,非常貼心!
類似的工作還有Klein et al., 2017[33],他們在模型方面用BNN替代了之前的11個basis function,由于使用了表達能力更強的模型,不光可以輸入已知的learning curve資訊,連帶還可以輸入具體的超參數config資訊。例如之前learning rate設定到10呈現出來的learning curve,換到另一個資料集上也可能會長得很像。此外還有Swersky et al., 2014[34]提出的Freeze-Thaw,把learning curve的評估與選擇與貝葉斯優化做了更深入的結合,不是預測是否停止訓練,而是對多個learning curve做高斯過程拟合,通過entropy search來決定選取哪個繼續訓練。
3.7.3 Bandit-Based Selection
Multi-fidelity優化的問題與bandit算法也有着非常自然的聯系,随着模型訓練輪次的提升,我們對于目前參數設定的預期産出會越來越有确定性,是以我們也可以利用各類bandit算法來最大化我們優化過程中的預期産出。這方面目前在實際工作中應用比較多的是Jamieson and Talwalkar, 2016[35]提出的successive having方法。
Successive Having
這個方法非常的簡單有效,就是根據初始的budget,例如我們有8個小時的訓練時間(隻考慮時間并不是很嚴謹,隻是舉例),在第1小時中,把所有參數組合都進行訓練,然後到結束時,我們把表現排名靠後的50%參數組合丢棄,選取剩下的繼續訓練,到了下1一個小時結束,再次評估并丢棄表現不好的組合,這樣一直持續到budget用完。原作者用這個簡單的方法跟其它比較常見的bandit算法例如UCB,EXP3等進行了比較,發現SH算法無論在疊代次數還是計算資源需求方面都有着更好的表現。在一些automl challenge中,不少獲勝方案就采用了這個算法。
SH算法有一個需要權衡的問題在于評估的參數組合的數量。如果嘗試的參數組合數量多,那麼每個參數組合配置設定到的計算budget就相應會比較少,容易讓一些後續表現好的參數被提前終止嘗試。如果嘗試的參數組合少,那麼計算budget會比較寬裕,但是可能會導緻更多的計算資源被浪費在了表現不好的參數組合上。是以Li et al., 2018[36]提出了改進的Hyperband方法。主要的想法就是把budget分為多個組,在每個組裡設定不同的參數評估數來運作SH算法,可以在SH的基礎上進一步提升總體的搜尋優化效果。
Hyperband
如上圖中就是分了四組不同的評估數量來分别執行SH。
不過這類bandit算法有一個明顯的缺陷,就是對于評估參數的具體選擇上,并沒有利用曆史上的observations。是以有一個很自然的想法就是把Hyperband跟貝葉斯優化兩者的優點結合起來:
Hyperband: 在observation較少的情況下,能夠利用low fidelities的評估進行快速過濾,確定起始時選擇的參數一定程度上能比随機選擇有更好的總體表現。
BO: 使用貝葉斯優化替代Hyperband中的随機搜尋,確定長時間優化運作的最終結果會更好。
于是BOHB[37]就這樣誕生了!整體的結合方法也非常自然,可以參考這裡[38]的代碼實作。從實驗結果上來看,效果非常好:
BOHB
相比随機搜尋,單獨使用貝葉斯優化或Hyperband來說,在優化過程中的任意時間點,BOHB都得到了更優的結果。
還有一些其它的multi-fidelity優化思路,例如Wang et al., 2015[39]中,作者提出了在較小資料集(low fidelity)中進行優化搜尋,然後再作為更大資料集中優化搜尋的初始點的想法。另外在Zeng et al., 2017[40]中,也是類似的思路,隻不過他們是從low fidelity的搜尋結果中找出表現差的算法或者參數組合,在後續的搜尋優化的參數空間中進行移除。
3.7.4 Adaptive Fidelities
前面描述的包括learning curve prediction和bandit based方法,都是基于一個預先定義好的fidelity增長過程,比如逐漸增加的訓練輪次,或者逐漸增加資料集的subset size等。後續有不少研究方向希望能夠在整個優化過程中自适應的去選擇不同的fidelity進行評估。
一個較早的工作是Swersky et al., 2013[41]提出的Multi-Task BO。他們提出了一個多任務的設定,可以利用相似的,但是訓練評估代價更低的一些任務作為low fidelity tasks,與評估代價較高的優化目标task一起來做優化。利用multi-task GP,可以學習到這些任務之間的相關性,然後使用考慮了evaluation cost的entropy search作為acquisition function,來自動選擇“成本效益”更高的task進行評估。這個設定還可以利用之前已經做過的任務來做“經驗”的transfer,感覺想法非常不錯。
Multi-task GP
多任務高斯過程的示意,在利用到任務相似度時,藍色這個main task能夠學習到與它更相似的綠色task的表現,給出更合理的後驗分布。
Multi-task BO ES
Acquisition function使用的是改進的ES,紅框中的這個c(x)就是task的cost,這個值無法預先得知,作者提出也可以用GP來模組化預測。
另外對于多task,文中也提出了2種建構利用方式,一是fast cross-validation,例如對于5-fold CV,在所有fold上評估就是一個high fidelity的任務,而隻評估一個fold,就是相應的low fidelity任務。另一種是使用更少的資料來訓練,比如取訓練集的四分之一形成一個low fidelity任務。也可以找相似的任務,比如文中的幾個實驗就是拿SVHN作為CIFAR-10的相似任務,還有USPS作為MNIST資料集的相似任務等。從整體的結果上來看基本能在執行超參優化時節省大約一半的時間。
在Multi-Task BO中,fidelity作為多個不同任務的屬性是一個離散變量,需要預先定義,一方面引入了fidelity定義不夠好的風險,另一方面fidelity的取值數量也會相對比較有限。是以後續很多工作在fidelity的粒度定義上進行了改進。例如Klein et al., 2017[42]的這篇FABOLAS(取名上也很努力呢)中,用連續的dataset size替代了離散的不同task。在具體做法上面,他們在之前的模型評估函數f(x)中加入了dataset size的變量,變成了f(x, s),另外也跟MTBO一樣,加入了評估cost的函數c(x, s)。在優化過程中,會分别對這兩個函數做高斯過程的拟合,同時在做參數評估時,也會同時輸出模型性能和時間開銷。最後在kernel方面,在Matern 5/2的基礎上,分别為模型評估函數和cost評估函數加入了不同basis的covariance function。這篇文章也給出了代碼實作,可以參考這裡[43]。
從實驗效果來看,FABOLAS整體加速效果比MTBO要好上不少。
Fabolas
從圖中使用SVM在MNIST資料集上做訓練的例子中可以看出,在使用少量資料到使用全量資料,不同模型參數得出的模型效果分布基本是一緻的。
前面的幾個工作都是基于資訊論的acquisition function(entropy search)的基礎上做的拓展,也有一些工作在UCB的基礎上做改進,如Kandasamy et al., 2016[44]提出的MF-GP-UCB。而在Kandasamy et al., 2017[45]提出的BOCA中,對于fidelity領域的模組化更進了一步。他們把優化的空間分成了X space(即原先的參數搜尋優化),和Z space(fidelity space)兩部分,分别進行模組化優化。由此帶來的另一個好處是Z space中的fidelity的次元也像X space一樣可以進行擴充,例如同時考慮dataset size和訓練輪次兩個變量的fidelity設定。
最後總結一下Multi-Fidelity優化的思路,總體上來說就是把之前簡單的評估f(x)擴充到了更多fidelity的次元f(x, z)。而在這個z空間中,又可以引入dataset size,learning time step,other datasets幾個次元的考量。不過adaptive fidelity的問題在于z空間引入的額外次元可能也比較大,會進一步凸顯GP的性能問題,以及高次元情況下優化的難度。是以目前業界應用比較廣的還是BOHB這類比較簡單的Multi-Fidelity方法。
3.8 Ensemble
前面的HPO方法大多關注于選擇出一個效果最好的參數組合,但是HPO過程中選擇出來的表現較好的那些參數組合,也可以使用ensemble來擷取進一步性能提升并最大程度利用搜尋優化所花費的成本。除了簡單的事後ensemble,也有一些工作把ensemble的思想融入到貝葉斯優化過程中去。例如Lévesque et al., 2016[46]中,作者直接把BO的優化目标改成了尋找能夠提升現有ensemble效果最多的參數組合。
Ensemble Opt
另外也有反過來,把HPO的想法應用到模型融合中去,例如在Wistuba et al., 2017[47]中,作者先使用HPO來訓練一系列base model,再進一步使用HPO來訓練stacking模型,便于更好的融合提升。
3.9 多目标優化
前面有提到過對于帶限制條件的優化問題的解決思路,對于更加廣義的多目标優化問題,也有一些研究工作。例如以Horn et al., 2016[48],Shah et al., 2016[49]為代表的一系列Pareto Frontier Learning工作。
Pareto Learning
3.10 實際應用
HPO目前應該是AutoML領域應用最多的一個場景了,前面提到了很多方法,包括随機搜尋,貝葉斯優化,CASH,Multi-Fidelity優化等。在實際應用中如何選擇這些方法呢?這裡給出一個大緻的guideline:
- 當可以應用Multi-Fidelity來做模型評估時,選擇BOHB,這是目前綜合表現最好且效率最高的方法。
- 當無法應用Multi-Fidelity時:
- 連續型的參數組合,模型評估開銷較大:使用基于GP的貝葉斯優化。
- 次元較高,且較為複雜的參數空間:使用基于随機森林或者TPE的SMAC方法。
- 連續型的參數空間,且模型評估開銷低:使用CMA-ES方法。
3.11 開放問題
HPO方面目前還有很多開放問題亟待探索和解決:
- Benchmark方面還沒有比較好的标準,從這麼多論文來看大家用的評估方法都不太一緻,通常也不會使用獨立的測試集,帶有代碼實作的文章也不多,導緻比較難判斷到底哪個方法才是目前的SoTA。
- 灰盒優化方面的工作可以進一步深入,前面提到的Multi-Fidelity優化是一個方向,其它包括現在比較火的gradient based model如何更好的做HPO也有進一步探索提升的空間。另外config本身也有往動态化配置優化的趨勢。
- Scalability,一方面來說,模型訓練開銷導緻很多大型問題例如ImageNet的參數調優還比較難使用HPO裡的各種技術。另一方面在目前大規模分布式叢集算力日漸提升的情況下,如何利用這些算力做分布式的HPO,與MLSys相關研究結合,也是一個值得思考的方向。
- 泛化能力,由于需要在訓練資料集上做多次訓練和評估來進行參數調優,HPO算法比較容易在訓練資料上過拟合,本身的泛化能力會更加受制于資料量或資料使用方式上的問題。有一些簡單的方法例如在每次做模型評估時更換shuffle可以一定程度上緩解這個問題。也有一些研究例如Shilton et al., 2019[50]也提出需要尋找stable optima而不是sharp optima的想法。另外在ensemble方面,應該也有不少挖掘空間。
- 整體pipeline的建構,目前HPO的應用大多數還是集中在單純的模型參數優化方面,而對于整個pipeline空間的搜尋與建構還沒有比較有效的方法可以超過固定pipeline優化的效果。TPOT以及後續會提到的ML-Plan有做過一些這方面的嘗試,不過整體可以提升的空間還很大。
4 Meta Learning
人類學習新技能的時候,很少會從頭開始,而是會借鑒之前類似任務的經驗,重用一些技能手段,快速識别出新任務中的關鍵點進行快速學習。而目前的各種學習算法在這方面則普遍較弱,例如小孩子在看過一兩次貓和狗的圖檔之後就能進行區分,而大多機器學習算法需要大量的訓練資料才能完成類似的任務。雖然有遷移學習之類的想法,但在什麼場景下使用,如何進行fine-tune等,都還是基于人工的經驗來進行。理論上,我們也可以把這種從過去的經驗進行學習的任務,使用系統化和資料驅動的手段來進行自動化。這就是元學習(Meta Learning)希望解決的問題。
元學習的大緻架構如下圖所示:
Meta Learning
元學習的架構與機器學習比較接近。圖中藍色的task,指的就是機器學習任務,我們會從訓練資料中,通過學習算法(learners)來建構出一個可以執行這個任務的函數f(models)。而元學習,則是通過過去的這一系列task,及他們的訓練過程形成的各類中繼資料的基礎上,去學習出一個能夠自動建構出學習算法(右邊的base-learner)的學習算法(meta-learner)。後續有了新task,我們就可以使用這個meta-learner來生成一個base-learner,省去了人工建構學習算法的過程,且能夠更好更快的進行新task的學習。
這裡的中繼資料,包括過去任務的屬性(meta-features),過去任務使用的算法的配置和參數,所得到的模型屬性(如模型參數等),以及評估效果。元學習器的任務,就是需要從這些中繼資料中進行學習,産出特定的學習算法。跟機器學習一樣,元學習器也需要通過特定的評估方式來判斷效果好壞,并依據這個評判标準來不斷疊代改進。後續我們看到很多few-shot learning中的例子就會對多任務元學習器的評估有一個直覺的感受。
總體來說meta learning的方法随着任務之間相似度的提升,大緻分3類:
- 對于通常效果較好的知識進行遷移,主要是模型配置方面的遷移。
- 跨任務的模型效果的評估,會引入task的meta feature來進行學習。
- 從類似任務建構的模型開始訓練,例如很多few-shot learning裡會用元學習器來設定初始化參數。
接下來我們會分别詳細展開說明。
4.1 從模型評估中學習
4.1.1 任務無關的配置推薦
我們先不考慮任務的特性,直接從曆史任務的模型評估中,去學習總體上表現較好的模型配置(包括算法選擇,pipeline結構,網絡結構,超參數等)。通常的做法是在一個資料集(任務)上運作各種模型配置,擷取到評估名額,形成我們的中繼資料。鑒于在不同任務上,即使是相同的模型配置都可能産出非常不同的評估結果,為了便于後續的比較選擇,我們一般會把絕對的評估名額轉換成相對的ranking排序。然後在多個資料集上,都用類似的過程來進行建構,就能形成一個多任務,多配置的ranking矩陣。後續在選擇模型配置時,我們可以選擇整體表現較好的top-K個配置,作為後續優化任務的初始化集合,就能達到快速學習的效果。典型的工作例如這篇Xu et al., 2010[51]。
Hydra
對于建構這個矩陣所選擇的任務集合,很多研究者都會考慮采用OpenML上的公開資料集。而對于這個矩陣的建構過程和考慮因素,裡面也有很多細節。例如Brazdil et al., 2003[52]中提到,不但考慮模型評估的效果,還會考慮訓練所花費的時間等。
4.1.2 配置空間設計
我們也可以根據曆史模型評估,來學習更好的配置空間設計。一個直覺的例子就是我們在做學習率參數的調優時,一般不會考慮大于1的參數設定,另外像有些參數在大多數情況下使用預設的就好,也可以直接在配置空間的設計中固定下來。在這篇Van Rijn et al., 2018[53]中,作者使用functional ANOVA技術來評判在各個配置選項中,哪些配置最能夠解釋模型效果的variance,這些配置就會被作為重要的選項在配置空間中進行重點調優。
ANOVA
從圖中随機森林參數嘗試的這個例子中可以看出,對最終模型影響最大的兩個特征是min samples leaf和max features,是以需要重點調整。
在Probst et al., 2018[54]中,作者收集了調優特定參數與使用預設值相比,能擷取的performance gain的中繼資料,然後建立了surrogate model來評估哪些參數調優能夠擷取更多的收益,也可以用以指導配置空間的設計。這篇文章有對應R代碼開源[55]實作。
最後,在Weerts et al., 2020[56]中,作者通過尋找各個task的top-k配置中,最頻繁出現的那些非預設參數選項,來确定哪些是最需要調整的參數。
4.1.3 配置遷移
前面提到的兩種方法都沒有考慮task之間的相關性。一個自然的想法是在全局推薦的基礎上,再引入task之間的相似性資訊,以更好的進行過往經驗的利用和配置參數遷移。
在Leite et al., 2012[57]中,作者通過relative landmarks的方式來評估task之間的相似性。這個landmark實際就是使用特定模型及參數配置得到的評估值,然後在兩個不同task上用相同的模型配置來評估,計算差距就能得出這兩個task的相似度了。具體到配置遷移上,他們提出先使用整體效果最好的幾組參數(通過前面task無關的方法得出),然後根據task相似度來選擇最有可能獲勝的config進行評估,拿到結果後更新task相似度,再重複上面的流程。這個做法跟active testing的想法非常類似。
Landmark Active Testing
另外一個比較自然的想法跟貝葉斯優化類似,使用surrogate model結合acquisition function來選擇下一個評估參數。這裡主要的挑戰在于引入多任務之間的相似性。Wistuba et al., 2018[58]使用的方法是對每個task都做一個GP拟合,遷移到新task時通過relative landmarks的方式評估任務之間的相似度,形成權重系數,再把各個GP的預測輸出權重求和起來作為最後的輸出。Feurer et al., 2018[59]中也是類似的思路,提出了一個ranking-weighted Gaussian process ensemble,也是對多個GP model進行融合。融合系數使用的是該GP模型在new task中擁有最低ranking loss的機率,換而言之就是表現越好,weight就越高。
Config Transfer Surrogate
不難看出之前HPO中用到的multi-task BO理論上也可以應用在這個場景中,但有一個問題是聯合訓練多任務GP的可擴充性有點差。Perrone et al., 2017[60]提出了一個很新穎的想法,利用NN+BLR來訓練過去的task,NN部分是共享的,能夠學習到task representation,而NN的輸出會作為BLR的參數,在各個task上拟合不同的BLR去預測模型效果。這個方法能顯著提升surrogate model的scalability,對于過去的observation來說複雜度是線性的。
NN Multi-task Config
值得一提的是Google Vizier(Golovin et al., 2017[61])裡也使用了multi-task的配置遷移方法。具體做法上他們假設任務是有先後順序的,對于一個序列的任務,他們建構了一個GP stack,每個GP會建立在上一層GP的residual上。這個做法感覺有個假設是這一系列任務應該都是比較相似的才可以。
另外還有些其它的方案,例如之前有提到過的bandit based方法也可以應用在這裡(Ramachandran et al., 2018[62])。前面提過的learning curve相關的預測,不但可以用在early stopping,也可以用在這裡配置遷移推薦上(van Rijn et al., 2015[63])。最後從配置遷移的反面考慮,Wistuba et al., 2015[64]提出了用類似task中提升可能性最小的參數區域來做搜尋空間的剪枝。值得一提的是這篇文章在計算task的相關度時沒有使用歐氏距離,而采用了Kendall tau rank correlation距離函數,值得參考學習。
KTRC
4.2 從任務屬性中學習
在前面配置遷移的各類方法中,我們已經看到了relative landmarks這類對任務屬性的描述。沿着這個思路,我們可以進一步拓寬對任務描述的中繼資料,稱之為task meta-features。有了這些評估任務屬性的特征,我們一方面可以從最相似的任務上來遷移經驗,另一方面可以訓練一些meta models來預測模型配置在新任務上的performance等。
Meta Features
4.2.1 Meta-Features
在Vanschoren, 2018[65]中,作者總結了一系列人工設計的meta-features,例如:
- 資料集中的instance,特征,類别,缺失值,異常值的數量等
- 資料集中的各類統計資訊,如skewness, kurtosis,correlation,covariance等
- 資訊論中的各種名額,例如class entropy,mutual innformation,nuose-signal ratio等
- 模型名額,比如用決策樹模型來拟合,擷取到的葉節點數,樹的深度等。
- Landmarks,使用一些簡單模型來拟合資料,擷取模型名額作為特征,例如單層神經網絡,樸素貝葉斯,線性回歸等。
對于一些特定的業務場景,也有一些特定的元特征可以使用。例如針對時間序列場景Prudêncio et al., 2004[66]提出了一系列場景特定的元特征:
Timeseries Meta Features
除了人工設計的meta-feature,我們也可以使用模型來學習生成meta-feature。例如Kim et al., 2017[67]中,作者使用了Siamese network來生成meta-features:
Learn Meta Features
這裡的學習目标是希望曆史的驗證集評估值的距離越接近真實距離越好。
值得一提的是,也有研究(Bilalli et al., 2017[68])表明,對于不同的任務,需要進行元特征的選擇或降維,才能達到最優效果。
4.2.2 Warm-starting from Similar Tasks
在建構出meta-feature之後,一個比較自然的應用方式就是通過meta-feature來找到曆史上嘗試過的類似task,擷取到相應的算法配置,來warm-start新的任務的優化。比如在Gomes et al., 2012[69]和Feurer et al., 2015[70]中,作者先通過meta-feature找到最接近的k個task,再用他們的最優參數來初始化PSO優化和貝葉斯優化過程。
還有一系列工作使用meta feature來建立surrogate models。比如Bardenet et al., 2013[71]提出的SCoT,建構了一個ranking model來預測特定配置在特定task上的表現排名。後續再通過一個GP regression将ranks轉化為probabilities,然後利用EI來找到下一個評估點,依此疊代。
SCoT
在surrogate model方面,還有Schilling et al., 2015[72]使用的MLP方法,以及Yogatama et al., 2014[73]使用的joint GP。後者為了克服GP的scalability問題,在建構surrogate時隻選取了跟目标task相似的若幹個task。最後,值得一提的是Fusi et al., 2017[74]等工作用了協同過濾模型,把task作為user,把config作為item,來做配置推薦。這裡主要需要解決的問題是推薦的冷啟動問題。在上面Fusi的工作中,他們采用了probabilistic matrix factorization方法,後續擷取到的latent embeddings可以更高效的進行貝葉斯優化。
CF warm start
4.2.3 Meta-models
除了任務的warm-start,我們也可以直接建構一個從meta-feature到評估效果/最優參數的meta-model。我們根據model的預測目标的不同分為以下幾類工作:
- 參數推薦:例如前面提到的使用kNN模型來找到最類似的任務,輸出表現最好的參數。也有一些思路(Sanders et al., 2017[75])類似之前的tunability的工作,隻不過用meta-model來預測模型參數是否需要進行搜尋優化。
- 參數ranking:參考Sun, Pfahringer, 2013[76]的ART forest,以及Pinto et al., 2017[77]的autoBagging。兩者用的meta-model都是內建樹模型(後者用的是xgb),效率高且自帶特征選擇作用。
- 預測參數效果:例如早期的Guerra et al., 2008[78]使用SVM regressor針對不同的分類算法分别建構meta-model,輸入task的meta-feature來預測模型所能達到的預測準确率。Reif et al., 2014[79]也使用了類似的方法,還把這部分的meta learning內建到了RapidMiner中進行應用(可惜沒找到對應代碼)。除了預測模型性能,也有同時考慮預測模型訓練時間的一些工作,例如Yang et al., 2018[80],并把預測輸出應用到後續模型選擇中去。Eggensperger et al., 2017[81]的想法更為大膽,針對一個具體的task來建構surrogate model預測參數的評估效果,這樣就可以省去耗時的模型評估時間進行快速的參數搜尋優化了。
Predict performance
4.2.4 To Tune or Not to Tune
思路上跟之前配置空間的設計類似,隻不過這裡給定任務屬性及學習算法,我們可以用meta-model或資料統計來評估:
- 是否需要進行調優
- 在一定時間限制之内的搜尋調優能夠獲得的提升度
- 如何進行調優
在Ridd et al., 2014[82]中,作者在463個資料集上收集了不同算法使用預設參數和調優過的參數能擷取到的性能提升量。這個中繼資料的結果也很有意思,以SVM算法為例,有50.31%的資料集使用最優參數相比預設參數獲得的提升小于2.5%,有83.44%的資料集獲得的提升小于5.0%。這個資料本身還是有點驚人的……後續他們訓練了一個decision tree,來做調優提升是否會超過某個門檻值的二分類預測。文中也提到了一些比較重要的meta-feature:kurtosis, normalized attribute entropy, joint entropy, NB and NN1(landmarks)。
在Mantovani et al., 2016[83]中,作者研究了各種HPO方法在決策樹算法應用的表現效果,給出了他們的效果提升的統計顯著度。總體來說調優會比預設參數的效果好,但是gap并不是很大。另外各類調優方法的表現總體也比較接近,EDA(Estimation of Distribution Algorithm)和PSO方法的表現最好。
To tune or not to tune
4.2.5 Pipeline合成
在機器學習項目中,具體的learning box一般會是一個複雜的pipeline,這就導緻了整個配置搜尋空間變得更為龐大和複雜,如何利用之前的經驗來為不同的task生成就顯得更為重要。
比較直覺的做法是通過預先設定一系列候選pipeline或固定pipeline的結構來控制整體的搜尋空間大小,例如前面有提到過的Fusi et al., 2017[84]和Feurer et al., 2015[85]。或者針對pipeline中的某個步驟來做特定的優化建議,如資料預處理,特征選擇等,後續可以應用到更大的全pipeline優化流程中去。例如Yu et al., 2003[86]提出的針對特征選擇部分的自動優化方法。
對于整個pipeline的搜尋生成,有不少使用hierarchical task planning的方法。例如Nguyen et al., 2014[87]的工作中,使用beam search來搜尋生成pipeline,整體的系統結構如下:
HTN Planning
工作流程中1和2這兩步是系統需要一系列的曆史pipeline,任務及performance資料訓練Meta-Miner模型。後續在使用時由使用者輸入具體任務的資訊例如資料集,預測目标,top-k的數量等。接下來就進入了IDA的pipeline建構流程,AI Planner使用HTN方法根據目前的狀态生成接下來所有可行的步驟,然後把這個partial pipeline輸入到Meta-Miner中去,後者會根據task和pipeline的資訊輸出各個pipeline的ranking,依次往複,直到整個pipeline搜尋完成,最後傳回top-k ranking的完整pipeline給使用者。這裡的DMER指的是Data Mining Experiment Repository,裡面存儲了資料集,pipeline和performance results的中繼資料。對于資料集的屬性,文中也是用了上面提到過的一系列meta-feature的建構方式來生成,包括屬性,統計值,mutual information,landmarks等等。Pipeline的屬性方面,文中使用了一套抽象定義(DMOP)來表達。具體到meta-model方面,文中采用了同構和異構兩種方式來做similarity的學習和預測。前者是分别考慮資料集和pipeline的相似性,而後者通過矩陣分解手段把dataset和pipeline投影到一個共同的latent space,可以直接計算它們之間的相似度。文中的實驗結果表明,第二種異構政策的效果會更好。
另外還有Wever et al., 2018[88]提出的ML-Plan,同樣用了HTN planning來生成pipeline,使用best-first graph search來選擇具體的pipeline。具體的搜尋評估方式與MCTS很類似,從節點開始做random completion,節點得分為random completion中效果最差的分數。這個評估方法的性能開銷還是相當大的。另外他們的優化搜尋分成了2個步驟,第一步先做pipeline生成,而不考慮pipeline中每個步驟的參數。第二步再在生成好的pipeline上做參數調優。
ML Plan
另外也有一系列使用遺傳進化算法的pipeline生成嘗試。比如著名的TPOT(Olson et al., 2017[89])和gama[90]。從簡單的pipeline開始,使用genetic programming的方法逐漸演化選擇出表現更好的pipeline後代,具體的操作也是mutation,crossover這些。
TPOT
最後還有使用強化學習方式來做pipeline生成的,例如Drori et al., 2017[91]中,作者将pipeline目前的狀态定義為state,把pipeline的修改操作定義為action,然後通過強化學習來逐漸建構pipeline。在具體方法上,他們訓練了一個LSTM,輸入task的meta-feature和pipeline及evaluations,預測pipeline的performance和各個action的機率。再使用MCTS的方法來搜尋生成pipeline。從實驗結果看用上了GPU之後效率還比TPOT之類的更高,有點神奇。
Alpha D3M
4.3 從之前的模型中學習
最後一塊内容是從之前訓練好的模型中來進行元學習,這也是大多meta learning課程和文章中主要涉及的方向,因為很多方法都比較适用在神經網絡場景中,也是時下的熱門方向。這方面有一篇非常好的Tutorial[92]可以參考,肯定寫的比我好,強烈安利一波 :)
從之前的模型中學習,最自然的想法就是遷移學習。尤其在深度學習領域,預訓練模型和fine-tune基本已經是人盡皆知的方法了。在應用過程中,我們也發現當任務相似度不高時,transfer learning的效果就不太理想(Yosinski et al., 2014[93])。是否可以通過一些meta-learner來更好的從曆史模型中自動學習,加快後續模型的訓練和學習能力呢?
Transfer Learning
4.3.1 Learning Update Rules
早在上個世紀,兩位Bengio大佬就提出了替代反向傳播的大膽想法(Bengio et al., 1995[94]),後面衍生出一系列替代BP的meta-learner嘗試。例如在Metz et al., 2019[95]中,就使用了MLP(outer loop/meta learner)通過網絡内部的各類中間值(例如神經元的輸入,回報信号等)的輸入來計算生成更新參數,傳入到具體執行學習任務的model來進行疊代更新。由于神經網絡的結構會很不一樣,為了具有一定的通用性,這裡MLP對針對每個neuron來預測生成其update值。由于涉及到無監督學習的設定,這個meta-learner的訓練及整體模型的結構還是相當複雜的。不過項目有提供代碼實作[96],而且文章中的圖也畫的非常漂亮:
Learn Update 1
Learn Update 2
在此基礎上,為了讓meta-learner能有更好的對于過往task優化任務的記憶能力,能夠讓後續的優化更新更加高效,逐漸出現了一系列使用更複雜的meta-learner的工作。例如有兩篇使用RNN作為meta-learner的文章,标題也非常經典:Learning to learn by gradient descent by gradient descent(Andrychowicz et al., 2016[97])和Learning to Learn without Gradient Descent by Gradient Descent(Chen et al., 2017[98])。這裡設計的meta-learner擷取到base learner的gradient作為輸入,結合hidden state輸出base learner的參數更新量,進而替代掉傳統的BP更新方式。Meta-learner在訓練時會使用base learner unroll多步的loss之和作為優化目标,一方面可以模拟base learner應用了gradient update之後loss逐漸下降的過程,另一方面也讓loss不容易非常稀疏。在使用這個meta-learner時同樣有被更新網絡(base learner)參數特别多的問題,文中用了coordinate wise的方法,對每個參數來跑一個RNN,hidden state不同,但參數是共享的。這樣對于meta-learner的size也能控制的比較好。具體還可以參考代碼實作[99]。後面這篇文章進一步把前作擴充到無法擷取base learner的gradient的黑盒優化情況,還提出了一些并行function evaluation的手段來優化總體性能。
LSTM Meta
4.3.2 Few-shot Learning
從各種參考文獻的相關解讀文章的數量來看,這個方向絕對是目前元學習的大熱門。是以我這邊就簡短的介紹一下各個比較有代表性的工作。
我們首先來看下few-shot learning的設定。普通的機器學習一般會分train data和test data,而這裡要介紹的元學習方法,同樣也有train/test概念,容易混淆,是以在術語上做了一些區分。首先在模型上,我們分為base learner(optimizee)和meta learner(optimizer)兩塊,base就是真正執行具體任務的,而meta是為了跨任務學習,好自動生成/控制base learner的learner,不過後面也會看到并不是所有方法都能嚴格區分成這兩塊。因為是few-shot設定,是以base learner的train data一般都很少,1-5個資料點比較常見,這部分在大多數文獻中會被稱為support set,而test data一般也是5個以内比較常見,被稱為query set。另外還經常見到N-way k-shot的說法,這一般指的是一個few-shot的多分類問題,N表示有多少個類别,k表示每個類别有多少個training sample。具體到meta-learner的訓練上,通常的做法是會把一個support set的訓練加query set的評估作為一個task(episode)。然後我們可以從整體的train data中分别sample出多個task,然後再在整體的test data中sample出多個task,分别作為meta learning的training set和test set。
在One-shot learning方面,個人了解的最早的一個方法是Koch et al., 2015[100]提出的用Siamese network來做。Deeplearning.ai的課程裡也有提到這個經典的例子。
Siamese Conv Net
接下來兩個比較常見的後續經常被作為baseline的工作是Santoro et al., 2016[101]的MANN和Vinyals et al., 2016[102]的Matching Network。前者這類帶memory的NN貌似流行度并不高,我也沒有深入研究這篇文章。後者的文章Andrej Karpathy也寫了篇讀文筆記[103]。總體上看,Matching Network的核心思想,就是訓練一個端到端的類似于nearest neighbor的分類器。
Matching Net
訓練過程中,模拟測試流程,使用小樣本構造minibatch,跟前面類似的episode的設定。例如圖中就是support set size為4,query set size為1。
g_theta
詳細來看結構圖裡的各部分處理,這個g特征提取器是一個雙向lstm(樣本可能是随機順序),式子中的g'是基礎的圖像特征提取器,比如inception, vgg之類。
f_att_lstm
f特征提取器是一個帶attention的lstm,疊代k步。每一步的輸入都是f’(x)(基礎圖像特征提取),hidden state是上一步的hidden state與attention的讀數(也是示意圖中虛線部分)再concat一下,最後一步的讀數即為f的輸出。
final_attention
這個是最後輸出前的處理,計算f embedding跟各個support sample g embedding後的相似度,最後再softmax一下。
從實驗效果來看挺不錯,結構設計也很有意思,說不定可以用在其它的kNN場景中 :)
接下來是Snell et al., 2017[104]的Prototypical Network,設計上相對Matching Network來說更為簡單,直接把各個類别的embedding平均一下,求出prototype特征,然後再通過相似度來分類即可。
Prototypical Net
這篇Ravi et al., 2017[105],類似之前的learning update rules裡的RNN meta-learner,用在了few-shot設定中。
LSTM meta learner
Finn et al., 2017[106]的這篇MAML可謂是這個領域的一個重量級工作,後續引出了FOMAML,Reptile(Nichol et al., 2018[107])等。李宏毅老師的meta learning講座基本也是主要在介紹這幾個工作。背後的核心想法是找到一組模型的初始參數,能夠讓這個參數後續能通過少數幾個sample的訓練之後快速達到一個比較好的模型效果。具體的做法也很簡單,對于每一個task,假設模型的初始參數為θ,先用task的support set在模型上訓練一波,得出了一個新模型參數θ',然後再在query set上用θ'的模型參數back prop更新初始參數θ。這樣在多個task訓練後,這個逐漸學習出來的θ逐漸就會擁有快速适應task的學習更新能力!
MAML
MAML pre-train
原作上在外層的meta update過程中會涉及到二階導,後面的FOMAML和Reptile進一步簡化了這方面的計算。可以參考OpenAI放出的源碼實作[108]。
Reptile
Reptile results
從結果上看比之前的幾個工作效果都好不少,而且非常簡單優雅!
最後來看下Mishra et al., 2018[109],把few-shot learning的過程直接做成了網絡結構,通過attention block來學習過去task的資訊,感覺也挺直覺。
SNAIL
4.3.3 Beyond Supervised Learning
Meta learning也可以應用在非監督學習方面的問題。
例如在Vartak et al., 2017[110]中,為了解決基于矩陣分解的推薦模型冷啟動問題,作者提出了使用神經網絡架構,來根據使用者行為快速調整網絡的bias參數,做出相應的推薦變化。
MF cold-start
而在Duan et al., 2016[111]中,作者通過強化學習來建構meta RL learner。通過在多個任務上訓練一個RNN,後續就能利用它在新task中快速實作一個RL agent。
Meta RL
最後,在Pang et al., 2018[112]中,作者設計了一個基于deep RL network的meta-learner,能夠根據目前的資料狀态(labeled,unlabeled,base classifier),和reward(base classifier的performance),輸出一個query probability,達到active learning的效果。
Meta active learning
4.4 總結
Meta learning這塊前沿的研究和新奇的想法非常多,而且潛力巨大,畢竟設計出一個能自動學習如何學習的算法其通用性會比特定任務的自動學習大得多。當然各種未知和挑戰也很大,從上面的研究看很多方面我們也隻處于一個剛剛起步的狀态,還有很長的路要走。如何建構出能夠不斷學習的模型,而不是需要每個任務從頭來訓練?如何讓模型也有類似記憶的能力,甚至像world models那樣,具備一些常識能力?如何發揮出active learning的潛力?等等問題,都等待着我們去開拓探索。從業界落地來說,目前看到的場景還比較有限,後面在講到AutoML Systems和Challenges時會有一些涉及。
5 NAS
這塊也是目前的一個熱門領域,網上有非常多的文章來闡述這方面的各種最新進展。在這篇文章裡,我就不展開做詳細的讨論了,就做點概覽,有興趣的同學可以再去找相應的文章來學習參考。最近的一個了解是NAS目前的主要目标是設計新的網絡結構,而在實際工業界問題中,之前被驗證有效的模型的參數微調基本就足以達到不錯的效果,使用NAS技術的投入産出比相對來說會比較低。
NAS overview
5.1 搜尋空間
目前看神經網絡的結構搜尋空間基本還是由人為設計的網絡結構,從簡單的基礎網絡層到複雜的skip-connection,多分支網絡等。後續也有提出的cell結構來降低搜尋空間的複雜度。
5.2 黑盒優化
前面提到的一系列搜尋優化政策都可以使用,例如随機搜尋,貝葉斯優化,遺傳算法,強化學習(RNN controller)等。比較不同之前的是對于神經網絡,可以用基于gradient的方法來做(Liu et al., 2018[113])。從效果對比來看,遺傳算法和BOHB這類方法表現最好。
NAS search compare
NAS bench 101
5.3 超越黑盒優化
為了提升搜尋優化效率,研究者們也提出了很多方法。比如之前有提過的multi-fidelity方法,包括Hyperband的提早淘汰,基于learning curve的預測等。使用meta learning來從之前的經驗中學習,提升搜尋效率(Wong et al., 2018[114])。在神經網絡領域,一些比較特别的做法是weight inheritance & network morphisms(如Cai et al., 2018[115]),不需要每次都從頭訓練。還有類似的weight sharing & one-shot models(如著名的ENAS[116]),訓練一個super-graph模型,從其中抽取子圖來形成網絡,不再做訓練,直接評估效果。
5.4 前沿方向
2020年有一些新的工作發表,對NAS感興趣的同學可以關注一下。一個是前面截圖中的NAS-Bench-101(Ying et al., 2019[117]),是19年提出的對于這個方向Benchmark标準化的一些嘗試。但目前看起來這類Benchmark設計的搜尋空間複雜度還非常有限,在White et al., 2020[118]中的結果顯示,local search就能打敗所有的SoTA方法……但在更大的搜尋空間上,這個方法表現顯然是不足以成為SoTA的。在Elsken et al., 2020[119]中,作者提出了meta learning與NAS結合的方式來做few-shot learning,效果比之前的reptile和AutoMeta更好。還有之前提過的自動ensemble優化技術也可以與NAS的結合,進一步提升模型輸出的整體穩定性和效果,具體參考這篇:Zaidi et al., 2020[120]。
NAS的SoTA,paperswithcode上目前被Lu et al., 2020[121]的Neural Architecture Transfer霸榜了,包括後面幾名的NSGANet也是他們的工作,有點厲害。
最後,在工具架構方面,Auto-PyTorch(Zimmer et al., 2020[122])采用了NAS聯合HPO,并利用了multi-fidelity和meta learning初始化來加速優化搜尋,值得學習關注。
6 全pipeline自動化
在最開始的背景中我們介紹過,整個機器學習的pipeline的各個部分都有使用AutoML來提效的可能性。在實際項目中,往往跟資料處理,資料品質相關花費的時間非常多,但是相關的研究卻明顯少了很多。
6.1 資料準備
- van den Burg et al., 2018[123]中設計了自動檢測csv檔案類型的方法
- Valera and Ghahramani, 2017[124]提出了自動分類資料類型的方法
- Sutton et al., 2018[125]希望能夠實作資料收集過程中錯誤的自動檢測發現
6.2 特征工程
- Featuretools[126],比較知名的自動化特征工程庫,幾乎成了自動化特征工程代名詞……
- Luo et al., 2019[127]第四範式去年發表的一篇自動化特征工程的文章,要是有開源就更好了 :)
- tsfresh[128]比較知名的時間序列領域的自動化特征工程庫
總體來說這幾個方面比較突出的工作很少,包括後續模型debugging和評估方面,幾乎沒有看到相關的研究。大家如果有看到過這些方面比較impressive的研究歡迎推薦和補充。
7 AutoML Systems
這一節我們來看下業界的一些AutoML工具及相關系統。
從工具方面來說,超參數優化方面比較常用的工具主要是hyperopt[129]和SMAC[130],FB也有開源一個BoTorch[131],在PyTorch中實作了貝葉斯優化。
從AutoML的架構來看,比較有名的有auto-sklearn,TPOT,nni,auto-gluon,H2O.ai,transmogrif等。
7.1 Auto-sklearn
基于sklearn和SMAC技術,預先定義了42個有效的超參數的搜尋次元,為了優化搜尋效率,僅考慮支援multi-fidelity的算法。使用了successive halving結合BO來做參數的搜尋優化,效率非常高。另外通過最基礎的meta-learning,預先定義了一組整體期望效果最好的超參portfolio(與前面的ensemble learning有點類似),進一步提升搜尋效率。這裡比較有意思的是auto-sklearn的第一版用了更複雜的meta-learning政策,還考慮了資料集的meta-features來做超參推薦,2.0版本裡進行了簡化。最後在驗證政策方面,auto-sklearn也會根據問題的複雜度與資源budget進行動态的選擇,比如在資源充足的情況下選擇10-fold CV,而在資源缺乏的情況下隻做一組train-valid的驗證。
7.2 TPOT
前面也有介紹,是一個基于遺傳算法來做優化的AutoML架構,且能夠進行整個pipeline的搜尋生成。隻能處理分類問題。由于其他性能優化方面的措施不多,這個架構整體的性能表現比較一般。
7.3 Automatic Statistician
一個非常有野心的end-2-end AutoML架構,包含資料接入,搜尋優化,模型評估/解釋,自動報告生成等元件,可惜沒有開源實作,不太清楚具體的完成度有多高。
AS
作者希望實作:
- 一種開放式的模型語言,達到足以捕捉各種現實世界現象的表達能力
- 一種搜尋程式,可以高效地探索上述定義的模型語言空間
- 一種評估模型的原則方法,能夠權衡複雜性,資料特性和資源使用情況等
- 一種自動解釋模型的流程,使模型的假設能夠準确且可了解的方式傳達給非專業人員
看起來有點抽象,他們的一篇文章(Lloyd et al., 2014[132])實作了其中自動拟合模型加模型解釋的流程,還挺有意思。
AS timeseries
7.4 AutoGluon
應該還比較新,在知乎上看了作者寫的架構說明[133],感覺值得關注一波。同樣ray tune在大規模搜尋調優上面應該也挺有優勢,這方面AutoML與系統架構設計結合的方向在實際生産落地中也是非常關鍵的。
7.5 Optuna
一家日本公司開發的AutoML工具,最近試用了一下發現有幾個特性非常贊:
- 與各類模型架構的內建做的非常好,對于新手使用者來說上手非常友善
- 自帶了pruner功能,可以用上hyperband等進階技術,搜參效率大大提升
- 支援分布式運作超參優化任務
- 對優化搜尋結果可視化支援
尤其前兩點,相比Hyperopt這類工具的優勢很大,已經在很多其它library中看到內建Optuna來做超參搜尋的例子。