AutoML简要概述
前言
AutoML是指盡量不通過人來設定超參數,而是使用某種學習機制,來調節這些超參數。這些學習機制包括傳統的貝葉斯優化,多臂老虎機(multi-armed bandit),進化算法,還有比較新的強化學習。
我將AutoML分為傳統AutoML ,自動調節傳統的機器學習算法的參數,比如隨機森林,我們來調節它的max_depth, num_trees, criterion等參數。 還有一類AutoML,則專注深度學習。這類AutoML,不妨稱之為深度AutoML ,與傳統AutoML的差別是,現階段深度AutoML,會將神經網絡的超參數分為兩類,一類是與訓練有關的超參數,比如learning rate, regularization, momentum等;還有一類超參數,則可以總結為網絡結構。對網絡結構的超參數自動調節,也叫 Neural architecture search (nas) 。而針對訓練的超參數,也是傳統AutoML的自動調節,叫 Hyperparameter optimization (ho) 。
傳統AutoML
1. 貝葉斯優化
貝葉斯優化是一種近似逼近的方法,用各種代理函數來擬合超參數與模型評價之間的關系,然后選擇有希望的超參數組合進行迭代,最后得出效果最好的超參數組合。
算法流程
初始化,隨機選擇若干組參數x,訓練模型,得到相應的模型評價指標y
用代理函數來擬合x,y
用采集函數來選擇最佳的x*
將x*帶入模型,得到 新的y,然后進入第2步
具體算法
| BO | 高斯過程 | Expected Improvement | 應用廣泛,在低維空間表現出色 |
| SMAC | 回歸隨機森林 | Upper Confidence Bound | 對離散型變量表現出色 |
| TPE | 高斯混合模型 | Expected Improvement | 高維空間表現出色,有論文表明最實用 |
特點
-
需要消耗大量資源及時間。由于需要至少幾十次迭代,即需要訓練幾十次的模型,因而會造成大量資源、時間消耗。基于這個特點,可以說貝葉斯優化算法適合傳統AutoML ,而不適合深度AutoML
-
效果不穩定。由于初始化存在隨機性,其效果不穩定。也有論文表明,貝葉斯優化算法并不顯著優于隨機搜索(random search)
?
2. Multi-armed Bandit
multi-armed bandit是非常經典的序列決策模型,要解決的問題是平衡“探索”(exploration)和“利用”(exploitation)。
舉一個bandit例子,你有20個按鈕,每個按鈕按一次可能得到一塊錢或者拿不到錢,同時每個按鈕的得到一塊錢的概率不同,而你在事前對這些概率一無所知。在你有1000次按按鈕的機會下,呼和得到最大收益。
這類算法,通過將自動調參問題,轉化為bandit問題,配置更多資源給表現更優異的參數模型。
具體算法
Hyperband是一個頗具代表的算法。總體思路我們由一個自動調節LeNet的例子來展示:
image
R=81代表總資源,? 代表每次篩選的比例,ni代表參數配置的組合數,ri代表資源數,這里代表一個epoch,第一行代表隨機得到ni個參數配置,然后經過第ri次迭代之后,根據模型validation loss選擇出top k個表現好的模型,繼續下一行ri的訓練。
特點
Bandit思想還是很重要的,是一類針對資源配置的算法,可以有效避免資源浪費在很差的參數配置上。
Bandit結合貝葉斯優化,就構成了傳統的AutoML的核心,比如伯克利的這篇paper,或者今年cmu的atm 。事實上,在華為,我也搞了這方面的專利,核心也是Bandit與貝葉斯優化。
Bandit同樣適合于深度AutoML中nas任務,但是對ho任務的應用,我是存疑的,比如學習率lr 一大一小兩組實驗,在前期極有可能是大lr那組的loss下降快,如果用bandit判斷這個lr優秀,而停止了另一組的實驗,很有可能造成錯誤。因為大的學習率,在前期可能確實會加快收斂,但是一段時間后,可能就會震蕩了,最后的收斂精度可能就很低。
深度AutoML
1. 進化算法
一般的進化算法其實大同小異,差別在如何選擇變異,有比較細的變異,比如在Large-Scale Evolution of Image Classifiers 這篇文章中,就定義了非常具體的變異,比如有改變通道數量,改變filter大小,改變stride等等;而在Simple And Efficient Architecture Search for Convolutional Neural Networks這篇論文中,它的變異,就借鑒了現有公認的比較好的結構,加深網絡就用conv-bn-relu3件套,加寬網絡加大通道數量,增加skip connection。
這些進化算法在做自動模型選擇時,每次迭代都不可避免的需要在整個數據集上跑若干個epoch,而每次迭代都有許多個變異,又需要很多次迭代,導致最后的訓練時間太久。
fine-tune基礎上的進化
Simple And Efficient Architecture Search for Convolutional Neural Networks 這篇論文提出,我們先用一個成熟的模型去訓練(也可以fine-tune訓練),然后在這個模型的基礎上去變異,變異之后用fine-tune訓練幾個epoch即可。這帶來兩個好的結果:
fine tune減少了大量的訓練時間
我們最后拿出來的模型,至少不比成熟模型差
個人認為,這篇論文很有實際意義。
2. 強化學習
強化學習在nas和ho兩方面都有應用。
強化學習-自動網絡結構搜索
Learning Transferable Architectures for Scalable Image Recognition
用RNN作為controller,產生網絡結構,然后根據收斂精度調節rnn。
將整個網絡分為兩種cell,Normal cell 和 Reduction cell,每個cell有B個block組成,而一個cell由rnn生成的過程如圖所示:
image
選擇一個hidden layer A
選擇一個hidden layer B
為A選擇一個op
為B選擇一個op
選擇一個結合op
重復1-5步驟B次,生成一個cell
該方法現在cifar10上尋找到兩種cell的結構,然后遷移到imagenet上。
值得注意的是,該方法雖然效果驚人,但是人為的提前設定非常多:
每個cell有B個block組成,B是人為設定的值,這里被設為了5;
cell的數量及cell的排序順序都是提前訂好的;
因此在這個網絡結構的搜索中,模型的探索空間有限,同時它在cifar10上進行訓練,因此相對于最早的用強化學習來做automl的方法,已經加速了許多。但是還是不夠快,針對速度問題,有一篇paper:enas。
ENAS 在上述方法的基礎上,采用參數共享的方式,避免每次新產生的模型重頭訓練的問題,因此大大加速了訓練時間,使得gpu耗時降低到了一天之內(cifar10數據集),可謂效果驚人!
強化學習-優化器
Neural Optimizer Search with Reinforcement Learning
用RNN作為optimizer的controller,產生optimizer,然后用小的cnn模型訓練5個epoch,得到的val_acc作為reward,訓練。
將每個optimizer抽象的表達為:
image
比如:
image
最后產生了兩類optimizer:
image
強化學習總結
強化學習在深度學習中的應用可謂方方面面,比如用強化學習做圖像的增強學習 、device配置等等,但是強化學習的問題在于每一類問題,哪怕換一份相近的數據,也要從頭訓練;而且訓練消耗的時間非常長。
3. 其它方法
1. 輔助網絡初始化參數
SMASH: One-Shot Model Architecture Search through HyperNetworks 在這篇論文中,介紹了一種利用輔助網絡給不同的網絡初始化參數,從而無需重訓練的方法。
其大致流程是在一堆待搜索的網絡結構中,隨機挑選數據和網絡結構,用輔助網絡負責參數初始化,然后訓練用梯度下降訓練這個輔助網絡。在該輔助網絡訓練的足夠好之后,就可以用它給各個不同的網絡初始化參數,然后測試validation loss,最后挑出最優的網絡結構,從頭開始正常訓練。
該方法通過訓練一次輔助網絡,避免每個網絡都需要訓練的情況,使得訓練時間大大減小。該方法非常具有參考意義。
2. DARTS
Differentiable architecture search (DARTS). 在這項研究中,將神經網絡的探索空間從discrete變為continuous,從而可以使用梯度下降的方式,來優化神經網絡的結構。
這個研究生非常有意思,非常有希望,期待這方面的繼續發展!
?
總結
以上是生活随笔為你收集整理的AutoML简要概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 孤立森林异常检测之入门
- 下一篇: 表数据比图数据更难处理