1. 程式人生 > >利用貝葉斯優化Hyperopt庫進行自動化機器學習引數調優

利用貝葉斯優化Hyperopt庫進行自動化機器學習引數調優

之前自己一直使用網格搜尋(grid-search)來進行引數調優。顯然,這種方法調優的候選集很有限,也比較“粗糙”。因此,效能往往不能達到最優。如今越來越多的超引數調優過程都是通過自動化的方法完成的,它們旨在使用帶有策略的啟發式搜尋(informed search)在更短的時間內找到最優超引數,除了初始設定之外,並不需要額外的手動操作。

貝葉斯優化是一種基於模型的用於尋找函式最小值的方法。近段時間以來,貝葉斯優化開始被用於機器學習超引數調優,結果表明,該方法在測試集上的表現更加優異,但需要的迭代次數小於隨機搜尋。此外,現在一些 Python 庫的出現使得對任意的機器學習模型實現貝葉斯超引數調優變得更加簡單。

機緣巧合之下(無聊時刷頭條給我推薦的),在機器之心中找到了一篇文章《Python 環境下的自動化機器學習超引數調優》,該文章是對William文章的翻譯。我覺得特別好,也按照文章的流程走了一遍下來,構造了一個基於貝葉斯優化Hyperopt庫的自動化超引數調優模型。

所有的原始碼可以在William的github中下載。關於程式碼,作者寫得很簡潔。什麼時候需要再過一遍就行。

1 概述

1.1 貝葉斯優化方法

簡單地說,貝葉斯優化通過基於過去對目標的評估結果建立一個代理函式(概率模型)找到使得目標函式最小的值。代理函式比目標函式更易於優化,因此下一個待評估的輸入值是通過對代理函式應用某種標準(通常為預期提升)來選擇的。貝葉斯方法不同於隨機搜尋或網格搜尋,後兩者都使用了過去的評估結果來選擇接下來待評估的值。它們的思想是:通過根據過去表現良好的值選擇下一個輸入值來限制評價目標函式的高昂開銷(我這裡的理解是,類似於網格搜尋,先尋優幾個影響大的引數,然後固定它們,再去尋優其它引數)

對於超引數優化來說,其目標函式為使用一組超引數的機器學習模型的驗證誤差。它的目標是找出在驗證集上產生最小誤差的超引數,並希望將這些結果泛化到測試集上去。對目標函式評估的開銷是巨大的,因為它需要訓練帶有一組特定超引數的機器學習模型。理想情況下,我們希望找到這樣一方法,它既能探索搜尋空間,又能限制耗時的超引數評估。貝葉斯超引數調優使用一個不斷更新的概率模型,通過從過去的結果中進行推理,使搜尋過程「專注」於有可能達到最優的超引數。

1.2優化問題的四個組成部分

貝葉斯優化問題有四個組成部分:

1. 目標函式:我們想要最小化的物件,這裡指帶超引數的機器學習模型的驗證誤差。基本可以認為是你使用的學習器。

2. 域空間:待搜尋的超引數值。也就是候選集。只不過候選集裡的引數一般是服從於某個分佈。

3. 優化演算法:構造代理模型和選擇接下來要評估的超引數值的方法。Hyperopt中使用樹形 Parzen 評估器(Tree Parzen Estimation,TPE)作為優化演算法。

4. 結果的歷史資料:儲存下來的目標函式評估結果,包含超引數和驗證損失