這個月,筆者複盤了2020年做的一些automl項目,并在多個優秀的開源項目的基礎上,博采衆長,寫了一個超參優化庫:<code>ultraopt</code>。這個庫包含一個筆者自研的貝葉斯優化算法:<code>etpe</code>,其在基準測試中比<code>hyperopt</code>的<code>tpe</code>算法表現更為出色。<code>ultraopt</code>對分布式計算有更強的适應性,支援mapreduce和異步通信兩種并行政策,并且可以擴充到各種計算環境中。
除此之外,<code>ultraopt</code>對與新手也特别友好,筆者特地花了3周的時間寫中文文檔,就是為了讓小白也能0基礎看懂automl(自動機器學習)是在做什麼。<code>ultraopt</code>使用起來也是相當的輕量簡潔,并且有大量的可視化工具函數幫助您更快地分析問題。
受篇幅所限,本文隻能簡明扼要地将<code>ultraopt</code>的關鍵特性介紹出來,文本的所有代碼與參考文獻都能在代碼倉庫的readme和中文文檔中找到。如果您覺得這個項目對您有幫助,也歡迎給ultraopt點一個小小的★star 喲~
安裝方法:
代碼倉庫:
https://github.com/auto-flow/ultraopt
中文文檔:
https://auto-flow.github.io/ultraopt/zh/
目錄
快速上手
用于超參優化
考慮算法選擇與較少代價的評估政策
為什麼比hyperopt更強
從性能上
從功能上
首先我們通過一個對随機森林進行超參優化的過程來了解<code>ultraopt</code>~
如果要啟動一個優化過程,首先我們要提供兩個東西:1) 參數空間 2) 目标函數。
首先,定義一個超參空間,在<code>ultraopt</code>中超參空間可以用<code>hdl</code>(hyperparameters description language,超參描述語言)來定義:
然後我們定義一個用于評判超參好壞的目标函數,接受一個字典類型的<code>config</code>,傳回<code>loss</code>,即 <code>1</code> 減去交叉驗證中驗證集的平均正确率。我們的優化目标是 <code>loss</code> 越小越好。
在定義了超參空間和目标函數後,進行優化其實就是一行代碼的事情,隻需要調用<code>ultraopt</code>的<code>fmin</code>函數就行了:
優化過程中會列印進度條,完成後列印<code>result</code>對象會對優化結果進行一個彙總。
調用<code>result</code>對象的<code>plot_convergence</code>方法會繪制拟合曲線。
在安裝了facebook的可視化工具<code>hiplot</code>後,你可以檢視這次超參優化結果的高維互動圖
可能有小夥伴要問,如果我想先從一組優化器中選一個優化器(算法選擇),再對這個優化器進行超參優化,<code>ultraopt</code>能解決這樣的算法選擇與超參優化問題(<code>cash problem</code>)嗎?答案是可以的。首先我們定義一個解決<code>cash problem</code>的<code>hdl</code>:
我們看到,首先我們要從<code>【随機森林,knn】</code>這兩個優化器中選一個,再對這個優化器進行超參優化。
這時又有小夥伴提問:上個案例中automl的評估函數需要進行一次完整的訓練與預測流程,耗時比較長,換句話說就是代價比較大。有什麼方法可以解決這個問題呢?有的大佬就提出了一種簡單粗暴的方法:連續減半(successive halving,sh),即用少量樣本來評價大量超參配置,将表現好的超參配置保留到下一輪疊代中,如圖所示:
後面又有大佬在sh的基礎上提出了hyperband(hb), 但為了讀者朋友了解,今天咱們就以sh為例,讓<code>ultraopt</code>采用較少代價的評估政策 。
我們在考慮了<code>評估代價</code>(或者稱為預算,budget)這一影響因素後,需要重新設計我們的目标函數,即添加<code>budget</code>參數并做相應的改變:
這段代碼可能有點難了解,簡單說做了以下修改:
考慮了評估代價(量化為<code>budget</code>,取值範圍0到1,表示訓練樣本采樣率)
考慮了算法選擇,<code>as</code>表示算法選擇結果,<code>hp</code>表示超參優化結果。
再執行個體化用于支援sh的疊代生成器:
現在菜都配齊了,往<code>ultraopt.fmin</code>的鍋裡一扔,炖了:
<code>ultraopt</code>提供了大量的可視化工具函數,您可以檢視優化過程與優化結果:
我們在<code>synthetic benchmark</code>和<code>tabular benchmark</code>上對優化算法進行了對比實驗,結果如下:
synthetic benchmark
tabular benchmark
tabular benchmark(考慮hyperband評價政策)
<code>ultraopt</code>的設計哲學是以優化器為中心,優化器與評估器分離,并且是目前所有黑盒優化庫中唯一能做到同時支援<code>tpe</code>算法和<code>smac</code>算法的,未來還會支援<code>mcmc-gp</code>和<code>貝葉斯回歸</code>,<code>貝葉斯網絡</code>等更多的優化器。
并且<code>ultraopt</code>把<code>multi-fidelity</code>(也就是hyperband、連續減半等評估政策)也解耦和了出來,相比于bohb的原生實作hpbandster庫,你可以在<code>ultraopt</code>中更自由地将多保真度優化與貝葉斯優化進行混搭,創造屬于你的bohb算法。
下圖表格從各種角度列出了<code>ultraopt</code>相比于其他優化庫的優勢:
如果您在使用中遇到了問題,歡迎issue回報。如果您有idea,也歡迎pull request~