【神經網絡搜索】NasBench301 使用代理模型構建Benchmark

【GiantPandaCV導語】本文介紹的是NAS中的一個benchmark-NASBench301, 由automl.org組織發表,其核心思想是針對表格型基準存在的不足提出使用代理模型擬合架構與對應準確率。

Paper: NAS-Bench-301 and The case for surrogate benchmarks for Neural Architecture Search

Code: https://github.com/automl/nasbench301

0. 動機

  • NAS領域需要統一的benchmark,否則研究NAS需要的計算量對大多數人來說很難承受。

  • 目前存在的表格型Benchmark(例如NASbench101中使用了表格進行管理,根據網絡結構編碼得到對應準確率)存在搜索空間受限的問題,同時遷移性比較差。

  • 爲了解決以上問題,提出使用代理模型構建benchmark,其中包含了\(10^{18}\)量級的網絡架構,同時可以遷移到其他模型空間中。

  • 所謂代理模型可以理解爲一個預測器,輸入是網絡架構編碼,輸出是對應架構精度。

根據以上介紹,需要重點關注:

  • 爲了適配更多的benchmark,如何進行網絡編碼?

  • 使用代理模型進行迴歸就一定會帶來誤差,如何選擇迴歸模型?如何避免誤差帶來干擾?

1. 貢獻

  • 提出代理NAS Benchmark - NAS-Bench-301, 其搜索空間能夠覆蓋真實場景中NAS的空間(\(10^{18}\)規模),提出使用代理來估計模型性能。

  • 證明了使用代理模型來擬合架構能夠比表格型benchmark更能反映架構的真實性能

  • 分析並開源了NASbench301的訓練集(60k規模),詳見Open Graph Benchmark

  • 在NASBench301上詳盡的評估了一系列迴歸模型,證明了在更大的搜索空間中,歸回模型依然可以表現出很強的泛化能力。

  • 在NASBench301上運行了一系列NAS算法,發現NAS算法搜索軌跡和真實的搜索軌跡是高度一致的

  • NASBench301可以得到科研方面的insight,以local search爲例進行了實驗。

2. 證明代理模型優越性

在seed不固定的情況下,模型運行結果並不是固定的,即便是seed固定,一些模型也存在無法精確復現的問題。NAS的Benchmark製作中也會遇到這樣的問題,NASBench101中使用三個不同的seed從頭開始訓練,得到對應模型的三個精度。因此對錶格型的基準來說,也是存在一定的誤差的,如果基於代理的基準的MAE(MeanAbsoluteError)能夠低於表格型,就證明其具有更好的預測能力。

實驗結果如下:

其中代理模型選擇是GIN(A fair comparison of graph neural networks for graph classification),實驗發現代理模型可以隨着訓練規模的增大,更好的學習平滑噪聲。

3. NAS-Bench-301數據集

NAS-Bench-301數據集詳細信息如下:

  • 由60k個架構組成

  • 數據集是CIFAR10

  • 搜索空間:DARTS-Like search space

3.1 數據採集

由於搜索空間巨大,不可能將整個搜索空間遍歷並訓練,需要考慮均勻採樣搜索空間。

通過對整個搜索空間進行可視化t-SNE:

可以發現,並不存在大量突變,同時性能最好的架構在整個簇的外邊,形成獨立的簇。

可視化不同算法在整個搜索空間中採樣結果可得:

3.2 性能表現統計

參數量和驗證集error:可以發現形成了帕累託前沿。

比較奇特的是,隨着參數量的增加,error還會進行一次反彈,這說明模型容量過大會導致出現過擬合問題。

下圖發現Cell depth對性能影響不大:

4. 在NAS-Bench-301擬合代理模型

代理模型的任務還是迴歸,本文中並沒有提出新的迴歸模型,而是普遍驗證了多種迴歸算法並進行選擇。

可選的代理模型有:

  • Deep GCN

  • GIN

  • Random Forests

  • Support Vector Regression(SVR)

  • XGBoost

  • LGBoost

  • NGBoost

  • predictor-based NAS

評估指標包括:

  • 決定係數R

  • sparse Kendall Tau肯德爾係數\(\tau\)

肯德爾係數適用評估模型預測的排序與真實排序的一致性,普通的肯德爾係數過於嚴苛,需要整個排序嚴格一致,但是由於相同精度的模型可能數量非常多,如果排序過於嚴格會導致指標不夠精確,所以稀疏肯德爾係數允許出現0.1%的排序改變,能夠更好地反映代理模型的性能。

實驗結果:最好的幾個模型是:LGBoost,XGBoost,GIN, 因而

引入噪聲建模:發現GIN依然是性能最好的。

5. 注意事項

使用NASBench301存在的風險和注意事項:

  • 代理模型被視爲黑盒,只能用於預測模型,單不應該被用於提取梯度信息。

  • 不鼓勵使用類似於NASBench301中的代理模型,如GNN-based 貝葉斯優化方法,GIN

  • 爲了確保可比性,在測評過程中需要提供基準的版本號,比如NB301-XGB-v1.0, NB301-GIN-v1.0

6. 代碼使用

環境安裝:

git clone https://github.com/automl/nasbench301.git
cd nasbench301
cat requirements.txt | xargs -n 1 -L 1 pip install
pip install .

環境安裝可能會出現問題,因爲原先的requirements.txt只針對cuda10.0,如果本身就是cuda10.0環境可以直接使用官方提供的api,但是如果是cuda11.1可以繼續往下看。

安裝過程中,主要是問題在於torch_sparse包安裝非常繁瑣,對版本要求非常高。如果版本不匹配,會出現段錯誤,或者undefined symbols等問題。

torch_sparse: https://github.com/rusty1s/pytorch_sparse

本文所用環境:

  • ubuntu16.04

  • cuda11.1

  • torch=1.8+cu111

  • python==3.7

經過一整天的配置,終於試出來一個版本:

torch==1.8.0+cu111 -f https://download.pytorch.org/whl/cu111/torch_stable.html
torchvision==0.9.0+cu111 -f https://download.pytorch.org/whl/cu111/torch_stable.html

torch-scatter==2.0.6 -f https://data.pyg.org/whl/torch-1.9.0%2Bcu111.html
torch-sparse==0.6.12 -f https://data.pyg.org/whl/torch-1.9.0%2Bcu111.html

torch-cluster==1.5.9 -f https://data.pyg.org/whl/torch-1.9.0%2Bcu111.html
torch-spline-conv==1.2.0 -f https://data.pyg.org/whl/torch-1.9.0%2Bcu111.html
torch-geometric==1.6.3

遇到的錯誤:

TypeError: load() missing 1 required positional argument: ‘Loader‘

YAML 5.1版本後棄用了yaml.load(file)這個用法,因爲覺得很不安全,5.1版本之後就修改了需要指定Loader,通過默認加載器(FullLoader)禁止執行任意函數,該load函數也變得更加安全

用以下三種方式都可以

d1=yaml.load(file,Loader=yaml.FullLoader)
d1=yaml.safe_load(file)
d1 = yaml.load(file, Loader=yaml.CLoader)

原文鏈接:https://blog.csdn.net/qq_34495095/article/details/120905179

OSError: python3.7/site-packages/torch_sparse/_version_cuda.so: undefined symbol

這個主要是由於環境不匹配導致的問題,需要選擇正確對應關係的版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章