快速高效訓練ResNet

1、模型複雜度與泛化能力的關係

例如對於VGG而言,有11,13,16,19四種深度的模型對應着四種不同的模型複雜度,當然層數越多模型越複雜。大部分人一開始肯定會覺得模型越複雜它所具有的函數擬合能力越強,肯定效果會更好,理論上應該是這樣的。但是對於那些追求極致泛化能力的人做了很多實驗,發現可能這個結論並不是那麼絕對,比如下面這張圖

vgg.png

用VGG訓練CIFAR-10達到94%的準確率已經很高了,但是這個最大值並不是出現在VGG19而是VGG13。

2、DAWNBench

斯坦福大學提出了DAWNbench,它是一種用於端到端深度學習的基準,用於在不同的優化策略、模型架構、軟件框架、雲和硬件條件下量化訓練時間、訓練成本、推理延遲和推理成本。下面我們主要來關注一下各路大神對於CIFAR-10數據集的效果

DAWN.png

第一名用了10s就將CIFAR-10的準確率訓練到了94%以上,很驚人的結果。當然現階段硬件上和別人是有差距的,他們用了8塊TeslaV100,而我們現在用的雲服務器只有1塊TeslaM40,但是依然可以從這個結果上發現很多我們可以利用的地方。

  • 我們知道ResNet也有很多種(18,50,101…),但是他們這裏用的是比原作者提出的最小的模型還要小的一個模型,其中一個參賽者提出的具體模型架構如下圖(將下圖保存在自己電腦上可以查看具體每一層的參數設置)。僅僅使用9層就達到了我自己之前做ResNet作業56層都達不到的一個效果。
  • 硬件雖然達不到別人的要求但是我們可以從他們的代碼中學到一些快速訓練的tricks,例如在他們訓練中都用到了Cycle Learning Rate、大batch_size(512,768)、ReLU換成CELU、數據增強用到了Cutout…後面會展示實驗對比。

3、Some Tricks

  • CLR(Cycle Learning Rate)第一次提出是在2017年的一篇WACV上,這個想法還是很新穎的。
clr.png

我們最開始接觸深度學習的時候設置學習率可能會默認SGD設置爲0.01,Adam設置爲0.001;到了後來學的東西多了了解了一些scheduler可能就是從一個較大的lr開始隨着epoch開始分段遞減。但是這個文章給出了一種循環設置學習率的思想,他將學習率設置爲週期變化,由小變大再由大變小,如下圖所示

clr1.png

我自己復現了一下發現效果是有的,但是精度上不去很高,不過也有可能是因爲我沒有太理解作者這篇文章中三個超參數(max_lr,base_lr,stepsize)的設置方法,就不了了之了。

index.png

但是後來看到DAWNBench的各路大神們也用到了這個方法,就再一次聚焦到這個方法。但是有所不同的是DAWNBench裏面用到這個方法沒有讓它循環很多次,而是一上一下就結束了(在後面的復現結果中會有展示)。

  • 用到CLR就會發現,max_lr設置的很大,所以致使batch_size很大(512,786),自己做實驗最大設置過128,沒想過這麼大的batch_size。而且如果GPU核數夠大batch_size越大時間越小,但是現在我們用的效果不明顯因爲已經超過最大負荷了,所以時間都一樣,都是要排隊的。
  • 將線性修正單元ReLU改爲CELU,ReLU分段都是線性有折點,而CELU是全程非線性的並且無折點。
  • 數據增強用到了pytorch中不自帶的Cutout功能,隨機將一張圖片的一小部分”遮擋“,需要自己寫函數完成。

4、實驗效果

  • 實驗結果顯示出有很大提升,之前完成VGG和ResNet作業跑100-300 epochs(快的話1-2 hours)才能達到的效果,運用上述方法在30 epochs(10 min)之內便可以達到93%左右的精度,並且如果GPU性能更好,在時間上節省會更多。
  • 在實驗設置上比較了四種學習率的設置,第一個是應對768 batchsize的CLR學習率設置,第二個是應對512 batchsize的CLR學習率設置,第三個是我自己之前一直用的效果也很好的每三十個回合學習率減半的設置,第四個是最普通的恆定學習率。模型上對比了ResNet9和ResNet56的收斂時間。也對比了trick之間的影響。
resnet9.png

5、展望

  • 其實最近也在學習apex進行精度混合訓練,將pytorch默認的32位運算變成16位和32位自動混合運算,精度不會下降很多但是可以極大減小訓練時間,並且顯存也能降低。但是現階段雲端服務器不支持tensorcore,希望疫情過後早日迴歸大家庭,沖沖衝!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章