一、什麼是超參數

機器學習一般有兩類參數,一類是參數,通過數據訓練,可逐步優化與完善,另一類是超參數,通常是人類通過以往經驗設置的值,沒法通過普通訓練完善,比如,學習率和強化學習裏計算reward的參數等。

二、當前主流的超參數優化演算法

a.暴力型

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

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

b.擬合型

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

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

這類演算法最典型的就是貝葉斯優化,在本文第三節會對其進行更深入的介紹

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的可能範圍

圖片來源網路

源碼分析

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

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

而代碼中的suggestion就是第3步找出的局部極大值 超參數x。這裡找極值的的實現方法也很簡單暴力,是通過隨機撒點,然後用最優化方法找到隨機點附近的極值,選擇這些極值中的最優值作為推薦點。

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

到這裡貝葉斯優化的1-4步的代碼邏輯基本介紹清楚了。

四、總結和展望

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

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

2. 隨機搜索可並行化,可進行更多嘗試,大力出奇蹟

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

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

參考文獻:

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

2. github.com/fmfn/Bayesia

推薦閱讀:

相關文章