前四種TPE、Random、Anneal、Naive Evolution方法,比較容易,只需要修改config.yml文件,其余方法會在算法介紹中詳細(xì)解釋使用過程中遇到的問題:
NNI提供了幾種最新的Tunner算法,以下是官方github文檔對算法的解釋和實(shí)驗(yàn)結(jié)果截圖+除官方文檔給出的步驟以外的步驟記錄:
1、TPE:是一種sequential model-based optimization(SMBO,即基于序列模型優(yōu)化)的方法。 SMBO 方法根據(jù)歷史指標(biāo)數(shù)據(jù)來按順序構(gòu)造模型,來估算超參的性能,隨后基于此模型來選擇新的超參。

記得把config.yml設(shè)置參數(shù)
gpuNum=1,即可使用GPU計算,否則默認(rèn)是不會使用GPU的。
2、Random:在超參優(yōu)化時,隨機(jī)搜索算法展示了其驚人的簡單和效果。 建議當(dāng)不清楚超參的先驗(yàn)分布時,采用隨機(jī)搜索作為基準(zhǔn)。

3、Anneal:這種簡單的退火算法從先前的采樣開始,會越來越靠近發(fā)現(xiàn)的最佳點(diǎn)取樣。 此算法是隨機(jī)搜索的簡單變體,利用了反應(yīng)曲面的平滑性。 退火率不是自適應(yīng)的。

4、Naive Evolution:樸素進(jìn)化算法來自于大規(guī)模圖像分類進(jìn)化。 它會基于搜索空間隨機(jī)生成一個種群。 在每一代中,會選擇較好的結(jié)果,并對其下一代進(jìn)行一些變異(例如,改動一個超參,增加或減少一層)。 進(jìn)化算法需要很多次 Trial 才能有效,但它也非常簡單,也很容易擴(kuò)展新功能。

5、SMAC: 基于 Sequential Model-Based Optimization (SMBO,即序列的基于模型優(yōu)化方法)。 它會利用使用過的結(jié)果好的模型(高斯隨機(jī)過程模型),并將隨機(jī)森林引入到 SMBO 中,來處理分類參數(shù)。 SMAC 算法包裝了 Github 的 SMAC3。 注意:SMAC 需要通過 nnictl package 命令來安裝。
分別運(yùn)行一下兩個命令:
conda install gxx_linux-64 gcc_linux-64 swig
nnictl package install --name SMAC
即可成功安裝。
(CentOS(Conda 4.5.4)上提示 ModuleNotFoundError: No module named '_regression' ,可能是之前安裝的包影響了環(huán)境,直接新建了conda的虛擬環(huán)境,重新進(jìn)行安裝。)

- 安裝時候遇到的問題
- 使用nnictl package的時候,如果服務(wù)器網(wǎng)速不給力,SMAC很有可能安裝失敗,(如果可以直接使用pip中的smac包就好了)。
- SMAC成功安裝以后,其中使用到的一個包SpaceConfig在我使用的conda(conda 5+,清華的源)中沒有找到,因此安裝失敗,運(yùn)行的時候會報錯,使用
pip install SpaceConfig手動安裝這個包即可解決。 - 運(yùn)行Mnist-annotation中的例子會失敗,config中配置的
useAnnotation=true,換成了mnist中的例子即可(查看了ERR覺得是這個元嬰,但是并不確定),并且指定參數(shù)空間(SearchSpace)。 - SMAC不可以使用
combine_params類型的參數(shù)文件。
TIPS:
- 使用
nnictl experiment show可以查到本次實(shí)驗(yàn)的編號id,可以找到log文件和一些配置文件、運(yùn)行文件的位置,在調(diào)試的時候,非常有效,或者網(wǎng)頁中查看日志文件,位置一般是:/home/XXX/nni/experiments/nptml4D,其中最后一個是隨機(jī)id。 - nnictl 可以同時運(yùn)行多個實(shí)驗(yàn),只要使用不同的端口,(如果可以把所有的實(shí)驗(yàn)都能用一個網(wǎng)頁顯示,選擇不同id的實(shí)驗(yàn)查看是不是更方便?)
nnictl create --config config.yml --port 8081,運(yùn)行時候會生成id,此時需要對相應(yīng)id的時候進(jìn)行操作就需要直接加上id號:nnictl experiment show nptml4D即可。
6、Batch tuner: Batch Tuner 能讓用戶簡單的提供幾組配置(如,超參選項(xiàng)的組合)。 當(dāng)所有配置都執(zhí)行完后,Experiment 即結(jié)束。 Batch Tuner 僅支持 choice 類型。
searchSpacePath中定義搜索空間json文件,
searchSpacePath: search_space.json
注意: useAnnotation和searchSpacePath兩個字段互斥,useAnnotation=True,searchSpacePath 字段必須被刪除。useAnnotation 定義使用標(biāo)記來分析代碼并生成搜索空間。
使用了/mnist/例子中的的配置運(yùn)行,運(yùn)行后發(fā)生錯誤,查看log(experiment中有l(wèi)ogPath),發(fā)現(xiàn)搜索空間的.json文件,必須要用combine_params :

實(shí)驗(yàn)結(jié)果

7、Grid Search:網(wǎng)格搜索會窮舉定義在搜索空間文件中的所有超參組合。 網(wǎng)格搜索可以使用的類型有 choice, quniform, qloguniform。 quniform 和 qloguniform 中的數(shù)值 q 具有特別的含義(不同于搜索空間文檔中的說明)。 它表示了在最高值與最低值之間采樣的值的數(shù)量。
實(shí)驗(yàn)運(yùn)行時,第一次參數(shù)是uniform類型的,發(fā)現(xiàn)直接改成quniform,需要再加一個q的參數(shù)值,文檔中有對q參數(shù)進(jìn)行說明。
本次實(shí)驗(yàn)直接定義了 choice類型的數(shù)值,

8、Hyperband:Hyperband 試圖用有限的資源來探索盡可能多的組合,并發(fā)現(xiàn)最好的結(jié)果。 它的基本思路是生成大量的配置,并運(yùn)行少量的步驟來找到有可能好的配置,然后繼續(xù)訓(xùn)練找到其中更好的配置。

9、Network Morphism:Network Morphism 提供了深度學(xué)習(xí)模型的自動架構(gòu)搜索功能。 每個子網(wǎng)絡(luò)都繼承于父網(wǎng)絡(luò)的知識和形態(tài),并變換網(wǎng)絡(luò)的不同形態(tài),包括深度,寬度,跨層連接(skip-connection)。 然后使用歷史的架構(gòu)和指標(biāo),來估計子網(wǎng)絡(luò)的值。 最后會選擇最有希望的模型進(jìn)行訓(xùn)練。

由于計算資源受限,因此目前還沒有跑出完整的結(jié)果,但是可以看到最高的得分0.91,最低的0.88。
安裝過程中,pytorch版本的樣例代碼中,
from network_morphism import utils,這樣會報錯,選擇/nni/examples/trials,運(yùn)行代碼即可。后續(xù)文檔希望可以晚上一下~在運(yùn)行cifar的程序過程中,由于網(wǎng)速太慢,可能會出現(xiàn)Time out的錯誤。
運(yùn)行過程中出現(xiàn)
BrokenPipeError: [Errno 32] Broken pipe,由于nni 0.4.1之前的版本有一些錯誤,所以出現(xiàn)錯誤,可以根據(jù)nni中issue解決-->ISSUE。我直接刪除了調(diào)用的包中的相關(guān)語句,或者安裝高版本的nni。10、Metis Tuner:大多數(shù)調(diào)參工具僅僅預(yù)測最優(yōu)配置,而 Metis 的優(yōu)勢在于有兩個輸出:(a) 最優(yōu)配置的當(dāng)前預(yù)測結(jié)果, 以及 (b) 下一次 Trial 的建議。 它不進(jìn)行隨機(jī)取樣。 大多數(shù)工具假設(shè)訓(xùn)練集沒有噪聲數(shù)據(jù),但 Metis 會知道是否需要對某個超參重新采樣。

默認(rèn)配置下沒有找到比較好的配置的結(jié)果。
簡單分析:
| 算法 | 最高分?jǐn)?shù) | 最低分?jǐn)?shù) | >0.80次數(shù) | >0.90次數(shù) | >0.95次數(shù) | 總次數(shù) |
|---|---|---|---|---|---|---|
| TPE | 0.9834 | 0.0958 | 7 | 5 | 3 | 10 |
| Random | 0.9823 | 0.0982 | 3 | 3 | 2 | 10 |
| Anneal | 0.9837 | 0.0892 | 2 | 2 | 2 | 10 |
| Naive Evolution | 0.9692 | 0.0958 | 2 | 1 | 1 | 10 |
| Batch Tuner | 0.9877 | 0.1135 | 3 | 3 | 2 | 6 |
| Grid Search | 0.988 | 0.0892 | 343 | 274 | 162 | 600 |
| SMAC | 0.9733 | 0.098 | 5 | 4 | 1 | 10 |
| Hyperband | 0.9831 | 0.0958 | 5 | 5 | 4 | 10 |
(使用NNI的Mnist-annotation例子分析,不同tuner算法的NNI WebUI的訓(xùn)練結(jié)果界面截圖圖像(以tuner命名),簡單總結(jié)結(jié)果)