如何訓練你的ResNet(四):網路架構對訓練時間的影響
作者:David Page
編譯:Bing
在這篇文章中,我們會基於該系列的前面幾篇文章所得出的結果,嘗試不同型別的網路。
相關閱讀:
ofollow,noindex">如何訓練你的ResNet(一):復現baseline,將訓練時間從6分鐘縮短至297秒
如何訓練你的ResNet(二):Batch的大小、災難性遺忘將如何影響學習速率
如何訓練你的ResNet(三):正則化目前為止,我們使用的都是固定網路架構,即在CIFAR10上用單個GPU最快的DAWNBench記錄,經過簡單改變,我們將網路達到94%精度的時間從341秒縮短至154秒。今天,我們要研究其他的替代性架構。
讓我們先回顧下目前所用的網路:

粉色的殘差塊包含了一個identity shortcut並保留了輸入的空間和通道維度:

淺綠色的下采樣模組將空間解析度降低兩倍,輸出通道的數量增加一倍:

加入殘差模組的原因是通過在網路中建立shortcut讓優化變得更簡單。我們希望較短的路徑代表相對容易訓練的淺層子網路,而較長的路徑可以增加網路的能力和計算深度。這樣一來,研究最短路徑如何通過網路孤立訓練,並且如何採取措施進行改進似乎是合理的。
清除長分支會生成一下主要網路,其中除了第一個網路,所有的卷積網路的步長都為2:

在接下來的實驗中,我們會訓練20個epoch,利用比之前學習速率更快速的版本訓練,因為網路較小,收斂得更快。復現這一結果的程式碼在此: http:// github.com/davidcpage/c ifar10-fast/blob/master/experiments.ipynb

對最短的路徑網路訓練20個epoch,在36秒內的測試精度僅達到55.9%。刪除掉重複的批標準化ReLU群組,將訓練時間縮短到32秒,但是測試精度仍然不變。
這一網路有個嚴重的缺陷,即下采樣卷積有1×1的核以及為2的步長,所以與其擴大接受域,它們反而會拋棄資訊。如果我們用3×3的卷積替換,測試精度在36秒的訓練後達到了85.6%。
我們還能繼續對下采樣進行優化,使用3×3、步長為1的卷積,並且後面跟一個池化層。我們選擇最大池化和2×2的視窗大小,43秒訓練後的測試精度為89.7%。用平均池化法得到相似的結果,但時間稍長。

分類器前的最後一個池化層是全域性平均池化層和最大池化層的連線,從原始網路中得來。我們用更標準的全域性最大池化層替換它,並且將最終的卷積層的輸出維度變為原來的兩倍,對輸入維度進行補償,最終在47秒內,測試精度達到了90.7%。注意,這一階段的平均池化層並不如最大池化層。
預設情況下,在PyTorch0.4中,初始批規範化的範圍在0到1之間隨機選擇。初始接近0的通道可能被浪費,所以我們用常數1來替代。這導致通過網路中的訊號更大。為了補償,我們提出了一種整體恆定懲罰對分類器進行重新調整。對這一額外超引數,大致的手動優化值是0.125。經過這些改變,經過20個epoch的訓練,網路在47秒內達到了91.1%的測試精度。
下表總結了我們上文中提到的各種改進步驟:

現在的網路看起來沒什麼問題了,接下來我們要進行收益遞減,新增一些圖層。目前網路僅有5個圖層(四個卷積,一個全連線層),所以還不確定我們是否需要殘差分支,或者新增額外的層後能否得到94%的目標精確度。
如果只增加寬度似乎不可行。如果我們讓通道維度增加一倍,訓練60個epoch後,可以達到93.5%的精確度,但是會用321秒。
在增加網路深度方面,我們還面臨著多種問題,例如不同的殘差分支型別、深度和寬度以及新的超引數,例如初始範圍和殘差分支的偏見。為了讓結果更進一步,我們要嚴格限制搜尋空間,所以,不能調整任何新的超引數。
特別的是,我們要考慮兩種型別的網路。第一種是選擇性地在每個最大池化層後新增一個卷積層。第二種是新增一個含有兩部分3×3卷積的殘差塊,其中有identity shortcut,也是在最大池化層之後新增。
我們在最後卷積模組後、全域性最大池化層之前插入了一個2×2的最大池化層。是否新增新層要根據不同情況決定,我們還考慮混合兩種型別,但這並沒有提升效能,所以我們就不在此展開了。
下圖是第一種網路示例,其中我們在第二個最大池化層之後添加了額外的卷積:

下圖是第二種網路示例,其中我們在第一和第三層之後添加了殘差分支:

現在要開始“暴力”架構搜尋了!我們訓練了15種網路(經過改進的原始網路和上述兩類網路中每類的7種變體),各訓練20個epoch,另外還對比了訓練22個epoch的結果,瞭解訓練時間增長和更深的網路架構之間的差別。如果每個實驗僅執行一次,就會花費30分鐘的計算時間。但不幸的是,每次最終測試精度的標準偏差約為0.15%。所以為了得出準確的結果,我們會對每個實驗執行10次,將每個資料點的標準偏差控制在0.05%左右。即便如此,不同架構之間從20到22個epoch執行後改進率之間的差異主要可能是噪音。
以下是結果,點表示20個epoch和精確度,線條的延伸表示22個epoch的結果:

與運用更深層的架構所得到的進步相比,訓練更長時間所得到的進步速度似乎很慢。在測試的框架中,最有前景的或許是Residual:L1+L3。網路在66秒內達到了93.8%的精確度,如果我們將訓練擴充套件到24個epoch,平均精確度為94.08%,訓練時間為79秒。
目前為止,我們已經得到了一個9層的深度殘差網路,能在79秒內達到94%的訓練精確度,幾乎將訓練時間縮短了一半。最後還有一個問題:我們是否真的需要殘差分支才能讓測試精確度達到94%?答案顯然是否定的。例如,單一的分支網路Extra:L1+L2+L3能在180秒、60個epoch內達到95%的精確度,加上正則化或更寬的版本後,精確度會更高。但是至少在現在最快的是一個殘差網路。
結語
本文結束前,讓我們再簡單回顧一下研究的目的。很多觀點認為,訓練模型在CIAFR10上達到94%的測試精確度是無意義的行為,應為現在最高的精確度都達到98%了(另外還有人認為現在ImageNet才是“唯一”的資料集,其他實驗只是浪費時間罷了)。
事實上,我們可以通過9層網路在24個epoch內達到94%的精確度,這也再次說明我們的目標門檻過低。另一方面,人類在CIFAR10上的表現也在94%左右,所以這一情況並不清楚。
在某種程度上,現在的精確度是一種“病態”的目標,只追求更大的模型、調整更多超引數、更多資料增強或者更長的訓練時間,讓各種工作之間的比較更難。另外,在訓練或結構設計上的創新會帶來額外的超引數維度,並且調整這些引數可能會導致有關訓練更好的隱式優化,否則這些與研究中的擴充套件無關。如果基礎模型的外顯超引數的維度空間較低,那麼通常被認為是最佳的對比試驗無法解決該問題。這種情況的結果是,最先進的模型難以進行比較、復現、重建。
有了這些問題,我們認為任何能輕易在各項實驗中進行比較的都是有益的。我們相信建立有競爭力的基準也是應對挑戰的一種方法。資源的限制讓各實驗之間的比較更公平,減少了為了培訓所需要做的調整。模型多餘的複雜性可能會受到資源限制基線的懲罰,哪些明確控制相關引數的方法通常會獲勝。
最近,根據模型推理時間或模型大小公佈曲線越來越多。這對於優化和解決上面的問題來說都是積極的方法,但我們相信訓練時間所帶來的額外正則化會有更多好處。另一方面,優化訓練時間並不考慮推理成本是否是次優的,這也是為什麼我們的訓練時間結構總是包含測量每個epoch中測試集的時間,並且我們避免了類似測試時間增強等技術,它可以在推理時減少訓練時間。