天天看點

論文解讀-Bag of Tricks for Image Classification with Convolutional Neural Networks

文章目錄

    • 1 動機
    • 2 baseline
    • 3 改進點
      • 3.1 訓練速度
        • 3.1.1 batch size調整
        • 3.1.2 Low-precision training
        • 3.1.3 實驗結果
      • 3.2 網絡結構
        • 3.2.1 理論
        • 3.2.2 實驗結果
      • 3.3 訓練過程優化
        • 3.3.1 Cosine Learning Rate Decay
        • 3.3.2 Label Smoothing
        • 3.3.3 Knowledge Distillation
        • 3.3.4 Mixup Training
        • 3.3.5 實驗結果
    • 4 總結
    • 5 參考資料

計算機視覺包含了很多研究方向,目前發展比較成熟的是識别和檢測任務。一個不争的事實是,很多的深度學習算法并未開源,即便有開源,也隻開源了推理代碼,而沒有開源訓練代碼,比如這兩天雷軍親自在微網誌宣傳的超分辨重建算法FALSR。因為網絡的訓練存在很多的Tricks,往往很難複現論文中的效果,是以不開源訓練代碼就有點不厚道了哈。

”Bag of Tricks for Image Classification with Convolutional Neural Networks“,由Amazon的李沐團隊出品,将mobilenet_v1_224的精度提升到了73.28%。筆者記得以前使用tensorflow官方代碼,從0開始訓練該網絡,Top1精度也隻有70.4%,距離官方的70.9%還差0.5個點。是以學習該論文中的訓練技巧是很有必要的。

這篇論文中的幹貨挺多的,很多的技術細節筆者之前是不知道的,為了将其中的政策應用于其他的cv任務,精度論文還是很有必要的,以下是筆者對論文的了解,希望也能對各位cv愛好者有所幫助。

1 動機

分類算法有好的效果,可以從以下幾個方面做優化,(1)資料預處理;(2)網絡結構;(3)優化目标,也即損失函數;(4)訓練過程控制,那麼具體來說,哪些政策會有效呢,作者基于“單因子變量分析”的思想,在公開資料集上做了大量實驗,給出了結論。

2 baseline

作者基于mxnet深度學習架構,複現了多種網絡結構的效果,具體的對比名額如下,

論文解讀-Bag of Tricks for Image Classification with Convolutional Neural Networks

其中,Baseline指mxnet團隊複現的結果,Reference指模型作者給出的結果,後面的tricks是對Baseline所做的修改。因為論文的主要貢獻在這些tricks,是以這裡就不詳述baseline的實作細節了。

3 改進點

3.1 訓練速度

在訓練網絡模型時,我們的一個共識是,batch size參數盡量設定大一些,這種做法存在如下的優缺點,

優點:模型收斂後的精度相對更高;

缺點:(1)模型收斂速度慢;(2)占用更多的機器顯存。

那麼怎麼在獲得大batch帶來的紅利,同時避免這些缺點呢?顯然,缺點2可以通過使用更大顯存的機器來解決,缺點1呢,此時的救星便是Float point 16了。

作者分析了同大batch和低精度訓練相關的技術,它們能夠在不降低精度的前提下,提高模型的訓練速度。

3.1.1 batch size調整

(1)Linear scaling learning rate

增大batch size,單batch資料中噪聲的影響會更小,此時就可以使用大的學習率步長,比如ResNet-50網絡,官方采用的batch size為256,初始學習率為0.1,那麼當使用更大的batch size,符号表示為 b b b,那麼可以設定初始學習率為 0.1 × b / 256 0.1\times b/256 0.1×b/256。

(2)Learning rate warmup

因為模型的初始參數是随機的,是以初始學習率太大容易導緻模型不收斂,表現為loss不下降。學習率熱啟動政策具體操作為,将實驗中用的學習率參數從0逐漸增大到初始學習率大小,然後再采用正常的學習率衰減方案,逐漸增大學習率的過程被稱作warmup階段。

這種政策的好處:防止訓練過程中出現的instablility。

(3)Zero γ \gamma γ

Resnet網絡結構中包含了多個residual blocks,記某個block的輸入為 x x x,那麼經過殘差求和後的結果為 x + b l o c k ( x ) x+block(x) x+block(x),而block的最後一層為batch norm層,batch norm層先将該層的輸入資料标準化,記作 x ^ \hat{x} x^,那麼batch norm層的輸出為 γ x ^ + β \gamma \hat{x}+\beta γx^+β,其中, γ \gamma γ和 β \beta β為可訓練參數,是以也需要在模型訓練之前做初始化,通常的做法是将它們分别初始化為1和0。Zero γ \gamma γ 的做法是将它們均初始化為0。

這種政策的好處:将所有residual blocks中的最後一個batch norm層的 γ ​ \gamma​ γ​和 β ​ \beta​ β​參數設定為0,也即residual block的輸出和輸入相等,可以使模型在初始階段更容易訓練。

(4)No bias decay

隻對卷積層和全連接配接層中的weight參數做正則化,不對bias參數做正則化。

這種政策的好處:防止過拟合。

3.1.2 Low-precision training

通常,計算機使用64-bit或者32-bit浮點精度(FP64/FP32)做訓練,英偉達的部分顯示卡針對FP16做了定制化優化,能夠達到更快的計算速度,比如最新的顯示卡V100。另外,關于低精度訓練相關的算法理論,可以參見筆者之前寫的一篇文章。

3.1.3 實驗結果

(1)單一政策的對比結果如下圖,

論文解讀-Bag of Tricks for Image Classification with Convolutional Neural Networks

(2)大batch和FP16的組合政策的結果如下圖,

論文解讀-Bag of Tricks for Image Classification with Convolutional Neural Networks

顯然,使用大batch和FP16的組合政策,網絡模型的訓練速度更快,這裡的訓練速度可以用Time/Epoch來衡量。值得一提的是,對于mobilenet這一輕量級網絡,Top-1結果提升了近3個點,是以,有必要使用這一政策重新訓練tensorflow版本的mobilenet模型參數,進而得到具有更強表征能力的預訓練模型,用于各種移動端cv任務。

3.2 網絡結構

3.2.1 理論

論文中選取了經典的ResNet網絡作為研究對象,僅僅修改某些卷積層的stride參數,注意,這裡的stride參數影響目前卷積層的輸出feature map的尺寸。

論文解讀-Bag of Tricks for Image Classification with Convolutional Neural Networks

如上圖,左圖為标準的ResNet-50網絡結構,右側(a)圖修改了Down sampling子產品,也即修改Path A中池化的順序。(b)圖在(a)的基礎之上,進一步修改input stem子產品,©圖在(b)的基礎之上,進一步修改Down sampling子產品。

既然作者這樣改進,那麼設計的初衷是什麼呢?

将下采樣操作放到非 1 × 1 1\times 1 1×1卷積層。 1 × 1 1\times 1 1×1卷積層等價于對輸入feature maps沿着channel次元做權重求和,是以設定stride為2會導緻丢失3/4的特征資訊。對于 3 × 3 ​ 3\times 3​ 3×3​ 的卷積層,設定stride為2不會丢失特征資訊,為什麼呢,請參見下圖,

論文解讀-Bag of Tricks for Image Classification with Convolutional Neural Networks

顯然,當卷積的kernel size為3時,輸出神經元1、2、3分别包含了輸入神經元123、234、345的資訊,如果進而設定stride為2,那麼輸出神經元僅僅為1和3,已經包含了輸入的5個神經元的資訊,也即目前卷積層沒有丢失特征資訊。

3.2.2 實驗結果

不同網絡結構的結果如下表,

論文解讀-Bag of Tricks for Image Classification with Convolutional Neural Networks

顯然,ResNet-50-D相對于未修改前的網絡結構,Top-1結果提升了近0.1個點。

3.3 訓練過程優化

3.3.1 Cosine Learning Rate Decay

學習率從0增大到初始學習率的過程,被稱作warmup階段,随後的學習率下降階段則有多種方案,resnet官方代碼使用的是stair decay方案,作者對比了cosine decay方案的效果差異,如下圖,

論文解讀-Bag of Tricks for Image Classification with Convolutional Neural Networks

基于作者在論文中給出的實驗結果,cosine decay相對于stair decay方案提升了0.75個百分點,在一些比賽中這點提升也是挺大的了。

3.3.2 Label Smoothing

Label Smoothing政策最早被提出用于訓練Inception-v2網絡結構,它修改ground truth的機率分布如下,

論文解讀-Bag of Tricks for Image Classification with Convolutional Neural Networks

其中, ϵ \epsilon ϵ表示很小的常數,為超參數, K ​ K​ K​表示分類任務中目标類别的個數。

3.3.3 Knowledge Distillation

Knowledge Distillation,可以翻譯成知識蒸餾,最早由Hinton在2015年提出,它包含了一個”教師網絡”和一個”學生網絡“。其中,“教師網絡”通常采用預訓練好的模型,而“學生網路”中包含了待學習的參數。記标簽的真實機率分布為 p p p,“學生網絡”的預測機率分布為 z z z,“教師網絡”的預測機率分布為 r r r,優化的目标是,讓“學生網絡”在學習标簽的真實機率分布的同時,還要學習“教師網絡”的先驗知識,公式表示如下,

論文解讀-Bag of Tricks for Image Classification with Convolutional Neural Networks

其中,前者表示學習标簽的真實機率分布,後者表示學習“教師網絡”的先驗知識, T ​ T​ T​為超參數。

為什麼學習的目标是這樣子呢?

标簽的真實機率分布提供了hard label,準确率高但是資訊熵很低,而“教師網絡”提供了soft label,準确率相對較低但是資訊熵高。這裡的資訊熵怎麼了解呢,比如一副馬的圖檔,可以想象的到它看上去也有點像牛,而hard label給的标簽是[1, 0],soft label給的标簽是[0.7, 0.3],顯然,soft label提供了類别之間的關聯,提供的資訊量更大,有助于模型在學習時增強類間區分度,hard label和soft label結合等價于在學習真實标簽的同時,補充類間資訊。

3.3.4 Mixup Training

這屬于資料增強的一種手段,大家可能跟筆者一樣,最常用的是翻轉、小角度旋轉等操作,mixup指從訓練集中随機選取兩個樣本 ( x i , y i ) ​ (x_{i}, y_{i})​ (xi​,yi​)​和 ( x j , y j ) ​ (x_{j}, y_{j})​ (xj​,yj​)​,然後構造新的樣本 ( x ^ , y ^ ) ​ (\hat{x}, \hat{y})​ (x^,y^​)​,定義如下,

論文解讀-Bag of Tricks for Image Classification with Convolutional Neural Networks

其中, λ ∈ [ 0 , 1 ] \lambda\in [0, 1] λ∈[0,1]為随機數,且服從 B e t a ( α , α ) Beta(\alpha, \alpha) Beta(α,α)分布。在訓練的過程中,隻使用新構造的樣本 ( x ^ , y ^ ) ​ (\hat{x}, \hat{y})​ (x^,y^​)​。

3.3.5 實驗結果

不同訓練政策的效果如下表,

論文解讀-Bag of Tricks for Image Classification with Convolutional Neural Networks

其中,w/o代表with/without,從表中資料可見,對于ResNet-50-D網絡結構,使用Knowledge Distillation政策能将Top-1精度從79.15%進一步提升到79.29%,而該政策對Inception-V3和MobileNet網絡結構起反作用,作者認為,原因是“教師網絡”為ResNet-152,和ResNet-50-D具有相似的基礎block,兩者的預測分布也是相似的。

這裡給筆者一些啟發,比如想在幾乎不損失精度的前提下,對mobilent_v1_224網絡做剪枝,可以同時選擇resnet-152和mobilenet_v1_224作為“教師網絡”,人工定義的小網絡作為“學生網略”,按照上面的經驗,使用mobilenet_v1_224的“教師網略”優于resnet-152的“教師網略”。順便多說一下,對mobilenet做剪枝,目前效果最好的是Yihui He提出的基于強化學習的方法,不過并未開源,連Tencent的Pocket Flow架構都未複現出其效果,是以可以換一種思路,使用知識蒸餾而不是通道剪枝。

4 總結

(1)本文的實驗非常詳實,在以後的識别和檢測任務中,可以借鑒這些經驗知識,輔助模型的調優;

(2)盡管論文中的模型都已經開源,但是是基于mxnet架構的,可以在mobilenet的tensorflow代碼中,引入這些政策,重新訓練該模型,進而得到具有更強表達能力的特征提取器,應用于移動端的多種cv任務。

5 參考資料

https://arxiv.org/abs/1812.01187

繼續閱讀