【神經網絡架構搜索】NAS-Bench-101: 可復現神經網絡搜索

【GiantPandaCV導語】Google Brain提出的NAS領域的Benchmark,是當時第一個公開的網絡架構數據集,用於研究神經網絡架構搜索。本文首發GiantPandaCV,請不要隨意轉載。

Title

0. 摘要

神經網絡搜索近年來取得進步巨大,但是由於其需要巨大的計算資源,導致很難去復現實驗。本文目標是通過引入NAS-Bench-101的方法來緩解以上問題。在NAS-Bench-101中,設計了一個緊湊且豐富的搜索空間。通過圖同構的方式來區別423k個網絡架構。

在CIFAR10數據集上多次訓練以上所有網絡,並得到驗證集上的結果。這使得研究人員可以通過查詢預先計算的數據集,以毫秒爲單位評估各種模型的質量。通過分析數據集作爲一個整體,並通過對一系列架構優化算法進行基準測試來證明它的實用性。

1. 介紹

簡單來說,NAS-Bench-101就是谷歌設計了一個搜索空間,在搜索空間中窮盡枚舉了大約5百萬個子網絡。在CIFAR10數據集上進行訓練,在驗證集上測試。將子網的結構以及對應的驗證集精度記錄下來,形成一個表,研究人員使用的時候只需要通過查表就可以得到對應的驗證集精度,這樣就不需要重新訓練和測試,降低了對計算資源的依賴。

爲了摸清這篇工作內容,我們需要搞清楚幾個關鍵點:

  • 搜索空間,如何設計搜索空間的?
  • 訓練策略,採用了什麼訓練策略?
  • 使用方法,研究人員如何使用NAS-bench-101?
  • 潛在方向,使用nas-bench-101有哪些潛在的研究方向?

2. 搜索空間

NasBench101中設計的搜索空間是基於cell的搜索空間,如圖所示,網絡的初始層(conv stem)是由3x3卷積和128的輸出通道組成的主幹,每個單元堆疊三次,然後進行下采樣,使用最大池化將通道數和空間分辨率減半,最後使用一個global average pooling和一個softmax層得到分類的概率。

網絡骨架構成

每個cell內部有V個節點,每個節點包括L個標籤,分別代表相應的操作。其中in和out代表輸入的tensor和輸出的tensor。該有向無環圖的搜索空間與V和L呈指數關係增長,爲了控制搜索空間的大小,提出了以下幾個約束:

  1. L=3,包括3x3卷積、1x1卷積、3x3 maxpool
  2. \(V\le 7\)
  3. 邊的最大個數設置爲9

cell內部示意圖

單元編碼方法:Nas-Bench-101中使用了一個通用的編碼方式,有7個頂點的有向無環圖,使用7x7的上三角二進制矩陣和一個包含5個標籤的列表(分別代表5個中間節點的op)

區分同構的cell 在以上搜索空間中,存在不同的鄰接矩陣或者不同標籤,但計算等價的模型,這就稱爲同構的cell

兩個同構的cell

從上圖得知,兩個cell雖然編碼不相同,但實際的計算過程是相同的。所以採用迭代圖哈希算法來快速確定兩個cell是否是同構的。

經過去掉不符合要求和同構的網絡以後,剩下了大概423k個子網絡。

此外,還有一個小問題:通道個數的匹配和特徵融合方法的選擇。Nas-Bench-101進行了認爲固定設置,如下圖所示:

融合方法

上圖中&代表concate操作,+代表addition操作,proj代表1x1卷積。所以具體策略是:將所有指向輸出節點的張量concate到一起,將指向其他頂點(非輸出節點)的張量add到一起。來自輸入頂點的輸出張量使用1x1卷積映射,以匹配通道個數的一致性。

3. 訓練策略

由於訓練策略的不同對最終的實驗結果造成的影響非常大,所以要對訓練策略、實現細節、超參數選取進行確認。

參數選擇:對所有的Nas-bench-101模型選取一組固定的參數,而並不是對每個模型自己設置各自的超參數。而固定的超參數的選擇是通過網格搜索50個隨機抽樣得到的子網絡平均精度得到的。

實現細節: 使用和resnet一致的數據增強技術,learning rate使用cosine decay, 使用RMSporp作爲優化器。

超參數選擇

4. 使用方法

4.1 評價指標

nas-bench-101中使用到了以下幾種指標:

  • 訓練精度
  • 驗證精度
  • 測試精度
  • 訓練時間
  • 訓練模型參數

4.2 安裝環境

從github上clone該項目

git clone https://github.com/google-research/nasbench

進入該項目文件夾

cd nasbench

安裝(若當前環境中無tensorflow cpu版本,該步會安裝Tensorflow)

pip install -e .

下載數據集:

4.3 使用教程

官方提供的demo如下所示:

from absl import app
from nasbench import api

# Load the data from file (this will take some time)
nasbench = api.NASBench('/home/pdluser/download/nasbench_only108.tfrecord')


INPUT = 'input'
OUTPUT = 'output'
CONV1X1 = 'conv1x1-bn-relu'
CONV3X3 = 'conv3x3-bn-relu'
MAXPOOL3X3 = 'maxpool3x3'

# Create an Inception-like module (5x5 convolution replaced with two 3x3
# convolutions).
model_spec = api.ModelSpec(
    # Adjacency matrix of the module
    matrix=[[0, 1, 1, 1, 0, 1, 0],    # input layer
            [0, 0, 0, 0, 0, 0, 1],    # 1x1 conv
            [0, 0, 0, 0, 0, 0, 1],    # 3x3 conv
            [0, 0, 0, 0, 1, 0, 0],    # 5x5 conv (replaced by two 3x3's)
            [0, 0, 0, 0, 0, 0, 1],    # 5x5 conv (replaced by two 3x3's)
            [0, 0, 0, 0, 0, 0, 1],    # 3x3 max-pool
            [0, 0, 0, 0, 0, 0, 0]],   # output layer
    # Operations at the vertices of the module, matches order of matrix
    ops=[INPUT, CONV1X1, CONV3X3, CONV3X3, CONV3X3, MAXPOOL3X3, OUTPUT])

# Query this model from dataset, returns a dictionary containing the metrics
# associated with this model.
data = nasbench.query(model_spec) # 根據配置查詢結果

result = nasbench.get_budget_counters() # 返回訓練時間,epochs

print("data:", data)
print("result:", result)

fixed_metrics, computed_metrics = nasbench.get_metrics_from_spec(model_spec)
# 每個epoch結果
for epochs in nasbench.valid_epochs:
    for repeat_index in range(len(computed_metrics[epochs])):
        data_point = computed_metrics[epochs][repeat_index] # 重複次數 每個epoch重複的結果
        

輸出結果:

result

如果設置邊數太多會報錯:

max edge=9

5. 實驗內容

這篇論文中對nas-bench-101數據集的幾個指標進行了統計,並深入探索了NAS的特性。

5.1 統計量

  • 經驗累積分佈empirical cumulative distribution ECDF

左圖是準確率的經驗累積分佈,右圖是噪聲的經驗累積分佈

可以從準確率累積經驗分佈看出,accuracy在0.8-1.0之間分佈居多,並且訓練集結果逼近1;還可以從該圖中觀察到一個現象,即驗證集和測試集的相關性比較高r=0.999, 這表明模型的訓練並沒有過擬合。

noise代表的是經過多次訓練之間的準確率差異 ,可以發現108個epoch訓練的noise最小。

  • 訓練時間、可訓練參數與訓練精度之間的關係

訓練時間、可訓練參數與訓練精度之間的關係

左圖展示了橫軸訓練參數、縱軸訓練時間和訓練精度之間的關係,可以發現以下幾個規律:

  • 模型容量比較小,參數量小,訓練時間過長反而在驗證集準確率不好。
  • 模型容量比較大,參數量大,訓練時間大體上是越長效果越好。
  • 在訓練時間相同的情況下,模型參數量越大,驗證機準確率越高。

右圖展示了訓練時間和訓練精度的帕累託曲線,實驗發現resnet、inception這類人工設計的模型非常靠近帕累託前沿。這表明網絡拓撲和具體操作的選擇非常重要。

5.2 架構設計

爲了探尋選取不同操作的影響,進行了替換實驗,將原先的op替換爲新op以後查看其對準確率的影響。

探尋不同op的影響

從上圖中可以得到以下發現:

  • 將卷積替換爲池化帶來的負面影響比較大。

  • 將池化替換爲卷積帶來的正面影響比較大。

  • 將3x3卷積替換爲1x1卷積或池化可以有效降低訓練時間。

5.3 局部性

NAS中的局部性是:相似的網絡架構的準確率也是相似的。很多NAS算法都在利用NAS的局部性原理來進行搜索。局部性衡量的指標是RWA(random-walk autocorrelation) 即隨機遊走自相關。RWA定義爲當我們在空間中進行長距離隨機變化時所訪問的點的精度的自相關

RWA在比較近的距離上有較高的相關性,反映了局部性。從下圖中發現,當距離超過6以後,就無法判斷是否是相關性還是噪聲,所以搜索的過程最好約束在6以內。

RWA

6. 總結

nas-bench-101是一個表格型的數據集,在設計的搜索空間中找到網絡的架構,並通過實際運行得到每個epoch的驗證集結果。使用過程比較方便,根據規定配置從nas-bench-101中找到對應的網絡架構以及相應的準確率、參數量等信息。

7. 參考文獻

https://arxiv.org/pdf/1902.09635.pdf

https://github.com/google-research/nasbench

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