一、什麼是超引數

機器學習一般有兩類引數,一類是引數,透過資料訓練,可逐步最佳化與完善,另一類是超引數,通常是人類透過以往經驗設定的值,沒法透過普通訓練完善,比如,學習率和強化學習裡計算reward的引數等。

二、當前主流的超引數最佳化演算法

a。暴力型

網格搜尋,

顧名思義,每個超引數用規則得到幾個列舉點,然後交叉組合得到一堆解,挨個列舉選出結果最好的超引數。

隨機搜尋,

顧名思義,就是隨機生成一堆解,然後挨個嘗試,選出結果最好的作為最優解。

b。擬合型

a中方法很暴力,在大多數情況下也是比較實用的,但該類方法多次嘗試之間是獨立的,因而往往需要大量嘗試才能獲得非常優的解。

有研究者針對此進行最佳化,使用模型來擬合這個問題,把超引數作為輸入,訓練模型的能力作為輸出,其他作為黑盒,即“模型能力=f(超引數)”,透過合適的模型來擬合這個f。這類方法通常如下圖的步驟所示:

機智AutoML:超引數最佳化--初探貝葉斯最佳化演算法

這類演算法最典型的就是

貝葉斯最佳化,

在本文第三節會對其進行更深入的介紹

ps. 擬合方法需要面對的幾個難題:

(1) 訓練的不穩定性,同一組超引數多次訓練無法完全一致 (2) 模型能力的刻畫,衡量方法很難準確的刻畫出模型能力 (3) 受資源和時間的原因,無法進行大量的嘗試 (4) 隨機因素太多,很難用簡單固定的模型來擬合

c。其他型

比如pbt演算法,pbt是基於遺傳演算法的靈感改進出來的演算法,從結果上講他是找到了一個訓練過程(一個階段一組超引數),而不是一組最優超引數

三、貝葉斯最佳化演算法流程介紹和原始碼分析

理論介紹

貝葉斯最佳化演算法是透過高斯過程迴歸來擬合第二節中提到的f,由於本文聚焦於演算法流程和原始碼分析,具體理論分析可參見[1]。

演算法流程主要分為4步和第二節提到的流程幾乎一致:

1。 隨機一些超引數x並訓練得到模型,然後刻畫這些模型的能力y,得到先驗資料集合D = (x1, y1)、(x2, y2)、。。。、(xk,yk)

2。 透過先驗資料D來擬合出高斯模型GM

3。 透過採集函式找到在GM下的極大值 超引數x‘,並透過x’訓練得到模型和刻畫模型能力y‘,將(x’,y‘)加入資料集D

4。 重複2-3步,直至終止條件

這裡值得注意的是,第2步擬合的模型GM,對於任何一組超引數x輸入,輸出的是一個分佈即均值和標準差,而不是一個準確的值(因而需要效用函式來量化),具體如下圖所示,透過藍色先驗點擬合出的GM,綠色區域即為對應輸入x,輸出y的可能範圍

機智AutoML:超引數最佳化--初探貝葉斯最佳化演算法

圖片來源網路

原始碼分析

現在開始分析高star原始碼[2]的具體實現,他實現的主流程如下程式碼所示:

機智AutoML:超引數最佳化--初探貝葉斯最佳化演算法

其中_queue中為隨機生成和使用者提供的需要驗證超引數,而n_iter就是步驟2-3的迭代次數,而suggest()就對應上文介紹的2-3步,他包含2個過程,先用之前得到的先驗資料來更新模型,如下文的紅框所示,再用更新後的模型找到極值推薦值,

機智AutoML:超引數最佳化--初探貝葉斯最佳化演算法

而程式碼中的suggestion就是第3步找出的區域性極大值 超引數x’。這裡找極值的的實現方法也很簡單暴力,是透過隨機撒點,然後用最最佳化方法找到隨機點附近的極值,選擇這些極值中的最優值作為推薦點。

機智AutoML:超引數最佳化--初探貝葉斯最佳化演算法

其中,效用函式ac作為量化超引數均值和方差函式,使用是為主流的ucb/ei/poi,具體原理如下圖所示:

機智AutoML:超引數最佳化--初探貝葉斯最佳化演算法

機智AutoML:超引數最佳化--初探貝葉斯最佳化演算法

到這裡貝葉斯最佳化的1-4步的程式碼邏輯基本介紹清楚了。

四、總結和展望

最近我們團隊在強化學習上嘗試AutoML超引數最佳化,然而發現普通的貝葉斯最佳化反而沒有2倍搜尋量的隨機引數最佳化好用,主要原因有下:

1。 訓練時間長,常規的貝葉斯最佳化實現是序列嘗試,跑20組嘗試需要好幾天

2。 隨機搜尋可並行化,可進行更多嘗試,大力出奇跡

3。 隨機因素太多,對模型能力刻畫的方法不太準確,導致擬合的準確度不夠

近期我們團隊正在嘗試改進貝葉斯最佳化,讓他可以並行化,已具備初步效果,將在後續的文章進行介紹。

參考文獻:

1. https://www.cnblogs.com/marsggbo/p/9866764.html

2. https://github.com/fmfn/BayesianOptimization/tree/master/bayes_opt