【神經(jīng)網(wǎng)絡(luò)搜索】Single Path One Shot
【GiantPandaCV導(dǎo)讀】Single Path One Shot(SPOS)是曠視和清華、港科大聯(lián)合的工作。與之前的工作不同,SPOS可以直接在大型數(shù)據(jù)集ImageNet上搜索,并且文章還提出了一種緩和權(quán)重共享的NAS的解耦策略,讓模型能有更好的排序一致性。
代碼:https://github.com/megvii-model/SinglePathOneShot
論文:https://arxiv.org/abs/1904.00420
摘要
之前的One-Shot NAS訓(xùn)練難度很大,并且在大型數(shù)據(jù)集比如ImageNet上非常低效。SPOS就是來解決訓(xùn)練過程中的挑戰(zhàn),其核心思想構(gòu)建一個簡化的超網(wǎng),每個結(jié)構(gòu)都是單路徑的,每次訓(xùn)練是一個單路徑的子網(wǎng)絡(luò),通過這種方式可以緩解權(quán)重耦合的問題。訓(xùn)練過程中使用的是均勻路徑采樣,這樣所有的子網(wǎng)的權(quán)重才能被充分且公平地得到訓(xùn)練。
SPOS訓(xùn)練方式簡單并且搜索非常迅速,支持多重搜索空間比如block-wise, channel-wise,混合精度量化和資源受限情況下的搜索等,并且在ImageNet上實現(xiàn)了SOTA。
簡介
目前的神經(jīng)網(wǎng)絡(luò)搜索方法可以分成以下幾種:
使用嵌套優(yōu)化的方式處理權(quán)重優(yōu)化和網(wǎng)絡(luò)架構(gòu)優(yōu)化的問題。 使用權(quán)重共享策略來降低計算量,加速搜索過程。 使用基于梯度的方法,將離散空間松弛到連續(xù)空間。 使用嵌套聯(lián)合優(yōu)化方法。
在基于梯度的方法中,存在一些問題:
超網(wǎng)中的權(quán)重是緊密耦合的,尚不清楚子網(wǎng)的權(quán)重繼承為何是有效的。 使用同時優(yōu)化的方式也給網(wǎng)絡(luò)架構(gòu)參數(shù)和超網(wǎng)參數(shù)引入了耦合。
基于梯度的方法在優(yōu)化過程中可能會引入bias,從而誤導(dǎo)網(wǎng)絡(luò)的搜索,出現(xiàn)馬太效應(yīng),算子被訓(xùn)練的次數(shù)越多,權(quán)重會越大,強(qiáng)者越強(qiáng)。
本文主要貢獻(xiàn):
對現(xiàn)有的NAS算法進(jìn)行詳盡的分析,并指出了現(xiàn)有的使用嵌套優(yōu)化方法存在的缺點。 提出了均勻采樣的single path one-shot方法,可以克服現(xiàn)有one-shot方法的缺點。其簡單的形式允許更大的搜索空間,包括通道搜索、比特寬度搜索等。采用進(jìn)化算法來進(jìn)行搜索,可以滿足低延遲等約束。
回顧以往的NAS方法
早期的NAS方法采用嵌套優(yōu)化的方式來實現(xiàn),第一步優(yōu)化是優(yōu)化子網(wǎng)絡(luò)的權(quán)重,優(yōu)化目標(biāo)是降低在訓(xùn)練集上的loss;第二步優(yōu)化是網(wǎng)絡(luò)架構(gòu)優(yōu)化,所有子網(wǎng)中驗證集上準(zhǔn)確率最高的那個網(wǎng)絡(luò)。這種方式最大的缺點是訓(xùn)練代價太大,很多工作只能在Cifar10這樣的小數(shù)據(jù)集或者小的搜索空間中完成。
近來的NAS方法通常會采用權(quán)重共享的訓(xùn)練策略,在這種策略中,所有子網(wǎng)會繼承超網(wǎng)的權(quán)重,這樣就可以不從頭開始訓(xùn)練,降低搜索代價。這樣的策略可以在ImageNet這類大型數(shù)據(jù)集上進(jìn)行快速搜索。
大多數(shù)權(quán)重共享方法將離散的搜索空間轉(zhuǎn)化為連續(xù)的搜索空間,這樣就可以使用梯度優(yōu)化的方式來建模神經(jīng)網(wǎng)絡(luò)搜索問題。權(quán)重和架構(gòu)參數(shù)是同時優(yōu)化的,或者使用兩級優(yōu)化方法來處理。
基于權(quán)重共享方法的NAS有兩個缺點:
超網(wǎng)中各個子網(wǎng)耦合度高,尚不清楚為何從超網(wǎng)繼承權(quán)重的方式是有效的。 同時優(yōu)化網(wǎng)絡(luò)權(quán)重參數(shù)W和架構(gòu)參數(shù)θ會不可避免對架構(gòu)引入某些偏好,這樣在優(yōu)化過程中會偏向于訓(xùn)練某些權(quán)重,造成不公平訓(xùn)練。
Single Path One-Shot
架構(gòu)參數(shù)和權(quán)重的耦合是基于權(quán)重共享的NAS方法不得不面對的問題,這是由于同時對兩者進(jìn)行優(yōu)化導(dǎo)致的。為了緩解耦合問題,很自然的想法就是將超網(wǎng)的訓(xùn)練和網(wǎng)絡(luò)搜索解耦合。
one-shot方法分為兩步,具體描述如下:
第一步,超網(wǎng)優(yōu)化方式為:
代表網(wǎng)絡(luò)搜索空間,W代表超網(wǎng)權(quán)重,代表超網(wǎng)中編碼的搜索空間。
第二步,網(wǎng)絡(luò)架構(gòu)搜索為:
a代表被采樣的子網(wǎng)架構(gòu),它會繼承超網(wǎng)的權(quán)重, 然后在這個過程中挑選驗證集上準(zhǔn)確率最高的子網(wǎng)結(jié)構(gòu)。
耦合問題的緩解方法
耦合緩解的方法有Path dropout 策略, 超網(wǎng)的每個邊會被隨機(jī)drop。通過這種方式可以降低節(jié)點之間的耦合程度,但是網(wǎng)絡(luò)對其中的超參數(shù)dropout rate非常敏感,讓訓(xùn)練過程變得更加困難。
基于均勻采樣的單路徑方法緩解耦合問題
權(quán)重共享的神經(jīng)網(wǎng)絡(luò)搜索方法背后有一個基礎(chǔ)原則:即繼承權(quán)重后的子網(wǎng)絡(luò)在驗證集上的表現(xiàn)能夠反映出該子網(wǎng)絡(luò)充分訓(xùn)練以后的結(jié)果。在NAS中,這被稱為一致性問題,繼承權(quán)重訓(xùn)練的子網(wǎng)得到的驗證集精度(supernet performance)高,是否能代表子網(wǎng)從頭訓(xùn)練的驗證集精度(evaluation performance)同樣高呢?實際上,很多基于權(quán)重共享的神經(jīng)網(wǎng)絡(luò)搜索方法的排序一致性都沒有很理想。
SPOS處理方法是:提出了一個單路徑的超網(wǎng)結(jié)構(gòu),如下圖所示:
為了減少權(quán)重之間的耦合度,在每個Choice Block選擇的時候必定會選擇其中的一個choice,不存在恒等映射。在訓(xùn)練階段隨機(jī)選擇子網(wǎng),并驗證其在驗證集上的準(zhǔn)確率。
此外,為了保證每個選項都有均勻的訓(xùn)練機(jī)會,采用了均勻采樣策略。同時為了滿足一定的資源約束,比如FLOPS大小,會通過均勻采樣策略采樣一批網(wǎng)絡(luò),只訓(xùn)練滿足資源約束的子網(wǎng)絡(luò)。
不同類型的搜索方式
通道數(shù)搜索:提出了一個基于權(quán)重共享的choice block, 其核心思想是預(yù)先分配一個最大通道個數(shù)的,然后隨機(jī)選擇通道個數(shù),切分出對應(yīng)的權(quán)重進(jìn)行訓(xùn)練。通過權(quán)重共享策略,發(fā)現(xiàn)超網(wǎng)可以快速收斂。
混合精度量化搜索:在超網(wǎng)的訓(xùn)練過程中,每個選擇block的 Feature Bit Width和Weight Bit Width會被隨機(jī)采樣,這個過程會在進(jìn)化算法過程中決定。
進(jìn)化神經(jīng)網(wǎng)絡(luò)架構(gòu)搜索:之前的one-shot工作使用的是隨機(jī)搜索策略,對于較大的搜索空間來說不夠高效。與其他工作不同,SPOS不需要將每個架構(gòu)都從頭進(jìn)行搜索,而是每個架構(gòu)只進(jìn)行推理,來決定該架構(gòu)是否有效。
“重要細(xì)節(jié):在進(jìn)行子網(wǎng)推理之前,網(wǎng)絡(luò)中所有的Batch Normalization的需要在訓(xùn)練集的子集上重新計算。這是因為supernet中由BN計算的數(shù)值往往不能應(yīng)用于候選網(wǎng)絡(luò)中。這部分操作被稱為BN校正。
”
BN校正代碼實現(xiàn):
def bn_calibration_init(m):
""" calculating post-statistics of batch normalization """
cumulative_bn_stats = True
if getattr(m, 'track_running_stats', False):
# reset all values for post-statistics
m.reset_running_stats()
# set bn in training mode to update post-statistics
m.training = True
# if use cumulative moving average
# if getattr(FLAGS, 'cumulative_bn_stats', False):
if cumulative_bn_stats:
m.momentum = None
使用了BN校正技術(shù)以后,需要在訓(xùn)練集上再次訓(xùn)練。
4. 實驗結(jié)果
數(shù)據(jù)集: 在ImageNet上完成,將原先的訓(xùn)練集切分成50000張作為驗證集,剩下的作為訓(xùn)練集,原先的驗證集作為測試集。
搜索空間:block 基于ShuffleNetv2設(shè)計的搜索空間,具體采用的架構(gòu)如下,總共有20個CB(choice block),每個choice block 可以選擇四個block,分別是kernel=3、5、7的shufflenet Units和一個Xception的block組成。
初步baseline:
其baseline是所有的choice block中都選擇相同的選擇,比如3x3的shufflenet Units,得到的top1準(zhǔn)確率都差不太多;從搜索空間中隨機(jī)采樣一些候選網(wǎng)絡(luò),得到的結(jié)果雖然一樣,但是作者認(rèn)為這是由于隨機(jī)搜索方法太過簡單,以至于不能從大型的搜索空間找到好的候選網(wǎng)絡(luò);使用進(jìn)化算法進(jìn)行搜索,得到的結(jié)果是74.3,比所有的的baeline模型都高。
可以看出,同時搜索block和channel的結(jié)果性能更高,超過了其他同類型方法。
一致性分析: 基于超網(wǎng)模型的表現(xiàn)和獨立訓(xùn)練模型的表現(xiàn)之間的相關(guān)性越強(qiáng)代表NAS算法有效性更強(qiáng)。SPOS對相關(guān)性進(jìn)行了分析來測試SPOS的有效性,使用NAS-Bench-201這個benchmark來分析SPOS的有效性。NASBench201是cell-based搜索空間,搜索空間中包含5個可選操作zero, skip connection,1x1卷積,3x3卷積,3x3 average pooling。基于這個進(jìn)一步設(shè)計了一些縮小的搜索空間,Reduce-1代表刪除了1x1卷積、Reduce-2代表刪除了3x3 average pooling, Reduce-3代表刪除了以上兩者。使用的是kendell Tau來計算相關(guān)性。
通過以上實驗可以看出,SPOS有一定的局限性:SPOS的超網(wǎng)是部分相關(guān)的,無法實現(xiàn)完美的真實排序。搜索空間越小,其相關(guān)性越強(qiáng)。
結(jié)論
Sinlge Path One Shot分析了以往的基于權(quán)重共享的NAS方法中存在的權(quán)重耦合問題,并提出了單路徑訓(xùn)練策略來緩解耦合問題。本文還分析了SPOS的搜索代價和排序一致性問題,還指出了算法的局限在于超網(wǎng)的排序一致性是部分關(guān)聯(lián)的,并不能完美的符合真實排序。搜索空間越小,排序一致性越強(qiáng)。
想加入GiantPandaCV交流群或者對文章有疑問的,歡迎添加筆者微信。











