近年來機器學習有了大幅增長,自動化機器學習也有很大需求。本文將從傳統機器學習和深度學習兩個角度介紹。
傳統機器學習AutoML
CASH
AutoML的範圍很廣,可以包括從自動數據分析,自動特徵工程,自動縮放,自動正則化,自動特徵選擇,自動模型選擇,自動超參數優化等等。目前的研究方向,主要集中在CASH[1],既Combined Algorithm Selection and Hyperparameter Optimization。
CASH問題最早由Auto-Weka[1]的作者Thornton提出,他同時提出了用貝葉斯優化 [2] 解決。
貝葉斯優化
在介紹貝葉斯優化之前,先回顧一下有哪些找極值的方法。最簡單的當然是網格搜索和隨機搜索。任何學過機器學習的人,都應該知道梯度下降。那麼爲什麼這裏不用梯度下降,而用貝葉斯優化呢?因爲梯度下降要求目標函數是凸函數,可微分。我們並不知道機器學習算法的超參數是不是這樣的函數,所以,我們用了更加通用的貝葉斯優化。他的好處是,不需要凸函數,不需要可微分。
貝葉斯優化我們把我們要研究的這個黑盒函數叫做目標函數Objective Function。因爲目標函數的開銷大,我們要給他找一個近似函數,這個函數叫代理函數Surrogate Function。代理函數會計算出一條平均值曲線和對應的標準差(Standard Deviation)。有個代理函數,我們就可以找到一下個探索點。這個過程,用一個獲取函數Acquisition Function裏實現。
貝葉斯優化,是在一個特定的搜索空間search space展開的。
整個過程如下:
- 在搜索空間中,選幾個初始點X
- 用目標函數計算初始點X對應的解y
- 更新代理函數
- 通過acquisition function獲得下一個樣本點。
- Goto 2
中英文流程圖如下:
下面是一個具體的例子:
假如我們有如下的目標函數:
我們計算了x=0和1時的兩個值,代理用他們擬合了平均值和方差如下:
上圖中的藍色線段爲我們的目標函數,綠色的是通過代理函數擬合的平均值,綠色虛線是平均值減去或者加上標準差。或者說,代理函數認爲真實函數的值的範圍在綠色虛線範圍內。
這時,我們可以根據代理函數提供的信息,去尋找下一個點。這裏,我們的代理函數用的算法是UCB (Upper Confidence Bound),他找下一個點的方法是找平均值和標準差的和。這裏我們忽略beta,或者說我們讓beta等於1。
這時,我們看到,最大值出現在5.5附近。我們用這個x,帶入目標函數,求得對應的y。這樣,我們就有了三個樣本點了。這時,我們繼續。
我們看到,經過4次迭代,貝葉斯優化已經很接近最大值了。
比起其他的優化方法,貝葉斯優化掉用目標函數次數比較少。而我們知道,機器學習擬合函數(fit)是一個開銷比較大的函數,如果是深度學習,那就更大了。
比起梯度下降,貝葉斯優化不容易陷入局部最優解。
Auto-Sklearn
Auto-Sklearn[3]繼承了Auto-Weka的貝葉斯優化,並在貝葉斯優化的基礎上,提出了兩個新的改進。
一個改進是meta-learning,Auto-Sklearn通過機器學習的方法,根據數據集的大小,數據集的目標等特徵可以大致估計出應該選擇的超參數。這樣可以減小超參數的搜索空間,從而提高了效率。
另一個改進是ensemble learning,通過ensemble,可以提高準確率。
筆者安裝了Auto-Sklearn,並用我們最常見的,Kaggle中的泰坦尼克和波斯頓房價做了實驗,實驗用的CPU是一塊i7。兩個數據庫,都跑了一個小時。成績score分佈是0.76和0.85。這個表現,一般對準確率要求沒那麼高的場景,應該可以應付了。
Auto-Skleran並不會處理任何的字符行的特徵。所以,只能自行刪除泰坦尼克裏面的名字,船票等字符型特徵。登船地點,性別也只能自行OneHot,或者轉成布爾型。
示例代碼:
import autosklearn.classification
cls = autosklearn.classification.AutoSklearnClassifier()
cls.fit(X_train, y_train)
predictions = cls.predict(X_test)
官網:
https://automl.github.io/auto-sklearn/master/
深度學習AutoML
原生NAS
Neural Architecture Search[4]是現在深度學習自動化的主要研究方向。原生的NAS用字符串表示深度模型,這樣,就把深度學習模型裏層(Layer)的預測,轉化成了一個RNN的問題。NAS把這個RNN叫做控制器Controller。通過強化學習,控制器不斷的調整自己的參數。
這樣,就可以訓練出串聯模型了。
那麼,如果模型有分叉怎麼辦呢?
NAS的辦法是,訓練N-1個二分類,用來預測當前層(第N層),分別和前面的(N-1)成的哪個層相連接。
NAS發現了很多新的結構,比如:
上圖中的第一個爲原始的LSTM,後面兩個爲NAS發現的。
NAS家族
NAS出現以後,不同的學者提出了很多不同的NAS。香港浸會大學的he xin[5]等人對其進行了總結。這些新的NAS用了不同的控制器算法,有網格搜索、隨機搜索、強化學習、遺傳算法(EA)、貝葉斯優化、梯度下降等。在提高效率方面,也想出了Low Fidelity, Transfer Learning, Surrogate, Early Stopping等方法。
Low Fidelity是指減少深度學習的數據量,使其更快收斂。Transfer Learning遷移學習保留了之前的層的參數,只訓練新加入的層。Surrogate是指用代理函數。Early Stopping提前結束訓練,也可以節省計算資源。
下圖是各種NAS的比較:
Network Morphism
在NAS的時候,我們會不斷的嘗試新的網絡結構。如果,我們可以讓新的網絡從已經訓練過的網絡學習參數,就可以大大的節省時間了。
Network Morphism[6]很好的解決了這個問題。NM有人翻譯成網絡變形,也有翻譯成網絡態射的。網絡變形把父網絡的知識遷移到子網絡,這樣,子網絡可以達到高於或者等於父網絡的表現。
他主要包括線性變化,非線性變化,寬帶變化,Kernal變化,子網變化等。
線性變化
網絡從第l-1層到第l+1層,線性變化的時候,其實就是乘了矩陣G。那麼,我們把G分解成Fl和Fl+1就完成了變形。
非線性變化
非線性變化,無法像線性變化一樣處理。在兩個激活函數(φ)中間直接插入一個激活函數肯定不行。所以,有了一個Parametric Activation Function,或者叫P激活函數。
他的思路是,a的初始值是1,這樣一開始P激活就退化成了Identity矩陣了。以後a的值會被訓練出來。
寬度獨立變化
帶浪線的是子網的函數,經過一系列變化,可以得到
這時,我們只要讓乘式兩邊其一爲0,另一個爲隨機值即可。
Kernal獨立變化
Kernal變化比較簡單,只需要做Padding。
子網變化
子網變化分爲兩步,第一步是不斷的執行線性或者非線性變化,插入新的層。第二步產生分支,既把G等分。
AutoKeras
AutoKeras是一款基於Keras的開源的AutoML框架。他採用了貝葉斯優化和網絡變形等技術。目前,他支持CNN,RNN和簡單的深度學習模型的搜索。
只需要四行代碼,就可以自動搜索出一個神經網絡。
import autokeras as ak
clf = ak.ImageClassifier()
clf.fit(x_train, y_train)
results = clf.predict(x_test)
具體可以參考其官網:
https://autokeras.com/
運用場景
AutoML針對的是比較成熟的人工智能解決方案。這時,調參和神經網絡的結構已經有了成熟的解決方案。這些場景包括傳統的機器學習,圖像識別,目標檢測,文本識別等。
對於語音等不成熟的人工智能解決方案,還無法使用AutoML。
參考
[1] C. Thornton, F. Hutter, H. Hoos, and K. Leyton-Brown. Auto-WEKA: combined selection and hyperparameter optimization of classification algorithms. In Proc. of KDD’13, pages 847–855, 2013.
[2] E. Brochu, V. Cora, and N. de Freitas. A tutorial on Bayesian optimization of expensive cost functions, with application to active user modeling and hierarchical reinforcement learning. CoRR, abs/1012.2599, 2010.
[3] Efficient and Robust Automated Machine Learning, Feurer et al., Advances in Neural Information Processing Systems 28 (NIPS 2015).
[4] Zoph, Barret, and Quoc V. Le. “Neural Architecture Search with Reinforcement Learning.” arXiv: Learning (2016).
[5] He, Xin, Kaiyong Zhao, and Xiaowen Chu. “AutoML: A Survey of the State-of-the-Art…” arXiv: Learning (2019).
[6] Wei, Tao, et al. “Network morphism.” international conference on machine learning (2016): 564-572.