煉丹訣竅?卷積神經網路的縮放策略
- 2021 年 3 月 17 日
- AI
「Facebook FAIR團隊的一次對模型縮放的系統性分析。」
圖源網路
當一個深度學習演算法工程師在工作時,TA具體在做什麼?
演算法工程師們通常將對神經網路的訓練稱為「煉丹」。深度學習作為一門實驗性質很強的學科,依賴大量的實驗技巧,需要對相關的超參數進行調節。因此工程師們也會戲稱自己為「調參俠」。
這其中,一些和模型結構相關的參數尤為重要:在設計一個網路時,往往需要先驗證一個基準線模型,這個基準線模型的計算複雜度不高;然後對這一基準線模型的結構進行縮放,以提升模型的複雜度,使其擁有更強的表達能力。主要的縮放策略便是對模型的寬度(w)、深度(d)和解析度(r)進行調整。
圖源網路
最近的一篇文章通過對縮放策略的分析,得出了一種Fast Compound Scaling策略,先看結論:先對模型寬度進行縮放,深度和解析度次之。這一策略下得出的模型,能夠帶來相似精度下,更高的推理速度。
圖源[1]
雖然已經被結論給「劇透」了,我建議還是跟著文章一步步推演,順便檢驗是否真正掌握了卷積網路的一些基礎知識。
首先,我們需要分析縮放策略對模型複雜度的影響。為了衡量模型複雜度,引入三個指標:f(flops,浮點運算次數,表示模型的計算量),p(parameters,可學習的模型參數個數,表示模型的參數量),a(activations,表示卷積層激活輸出張量的個數)。
在一個CNN卷積神經網路中,通常包括卷積層、池化層、BN層。但在進行複雜度的分析時,往往只考慮卷積層,而忽略佔比較小的其他部分。因此,考慮一個標準卷積層:k*k的卷積核,輸入/輸出通道數均為w,輸入/輸出特徵長寬為r。那麼我們得到其複雜度為:
(算錯的可以去面壁了)
進一步的,讓k=1,並且考慮卷積網路的深度d(即由d個卷積層構成),可以得到:
從這個公式可以推導出:如果我們定義一個縮放因子s,分別對深度d、寬度w和解析度r進行縮放,使得模型的flops縮放為s倍。那麼,調整寬度w,對a這一指標的增加是最小的。(詳見下圖)
類似的如下圖,我們定義一個縮放因子s,同時對d、w、r的多個進行縮放,使得模型的flops縮放為s倍。有趣的是,EfficientNet論文中通過經驗得出的縮放係數1.2*d、1.1*w、1.15*r,恰巧近似於同時對dwr進行縮放,並且s=2。實驗和理論殊途同歸。
除了標準卷積外,還可以對組卷積、深度可分卷積(組卷積的特殊情況)做同樣的複雜度建模。
考慮一個組卷積,輸入輸出的通道數是w,分組的數量是w/g (每組的通道數是g,對於深度可分卷積g=1),那麼它的複雜度為:
類似的可以得到下圖的關係:
接下來,我們都關注更快、更高精度的模型,所以我們需要尋找影響模型運算速度的關鍵因素。也就是說,衡量對於不同的計算量f,參數量p,激活輸出量a的縮放策略,模型的運算速度如何變化。
下圖是在多個模型下的運算速度(epoch time)分別與f、p、a的關係,不同顏色的點表示不同的模型及縮放策略,黑色表示對多個模型結果的擬合,並求這條擬合線的Pearson相關係數。
從中可以得出有意思的結論是:
-
運算量flos、參數量parameters,均與運算速度弱相關;
-
activations與運算速度強相關(0.99和0.95),因此可以採用activations作為運算速度的代理指標。
綜上,既然activations可以作為運算速度的指標,那麼一個縮放策略需要在增加模型複雜度的同時,儘可能帶來最小的activation增加。(前面的幾個表格告訴我們:對模型寬度w進行提升,影響最小)。
然而,深度學習之所以為深度學習,便在於更深、解析度更高的網路能夠帶來更好的性能。因此,在增加w的同時,也要增加d和r。
文中引入fast compound model scaling:優先增加模型寬度,同時少量增加深度和解析度。為此引入參數alpha,和如下公式。(alpha一般的取值範圍在(1/3, 1)之間比較合適。)
當指定一個縮放係數s時,有
至此完成了理論的推演,接下來是實驗部分,不再贅述,感興趣的朋友可以公眾號回復「20210315」獲取原文。總之就是將這一縮放策略應用於多個基準線模型上,都能夠提升速度,且精度接近或達到最佳精度。
有用的煉丹技巧又增加了!
參考資料:
[1] //arxiv.org/abs/2103.06877
– END –
新朋友們可以看看我過往的相關文章
⬇
【相關推薦閱讀】
長按二維碼關注我⬇