作者:Sanyam Bhutani
編譯:ronghuaiyang
導讀
這篇文章是對Bag of Tricks for Image Classification with Convolutional Neural Networks中分享的思想的概述和我自己的一點思考。
關於這個系列:
這篇文章標誌著這一系列文章的開始,這篇文章是對Bag of Tricks for Image Classification with Convolutional Neural Networks中分享的思想的概述和我自己的一點思考。
這篇paper討論了一些技巧,並獨立分析了他們對訓練幾個最近的CNN模型的綜合貢獻。
上下文
儘管深度學習網絡在圖像分類任務上的精度已經超過了人類的水平,但我們仍然注意到,圖像分類模型的精度正在不斷提高,這些突破不僅僅是因為架構或者僅僅因為神經網絡模型不斷「變深」。
許多改進都是由於一些小「技巧」,這些技巧通常沒有發布出來,或者在論文裡面沒有特別突出的顯示出來。
作者的目標是分享這些技巧以及基於每個「技巧」的大量實驗。
這些技巧有兩個目的:
- 提高準確度:對神經網絡模型的微調可以提高精確度。
- 加快訓練,例如:利用新的RTX卡上的張量核使用FP16計算。
技巧
作者們討論了一些技巧,我們來過一遍:
- 線性縮放學習率:在訓練神經網絡時,我們在內存允許的情況下分批地將圖像輸入GPU。這些在SGD中是隨機的,並且有一定的方差。當我們增加批的大小時,我們的批對圖像的批方差減小,這允許設置更積極的學習率。
- 學習率採用公式:0.1 x (Batch_size)/256
- 學習速度熱身:當我們訓練一個神經網絡時,我們要設置學習率,這決定了模型學習的「速度」,或者我們說是我們對於來自它的預測的懲罰的積極程度。當我們開始訓練我們的神經網絡,我們可以期望權重有更多的隨機性。如果我們設定一個積極的學習率,可能會導致網絡兩級分化。
- 為了解決這個問題,使用了學習率預熱,它允許在開始時將學習率設置為較低的值,然後將學習率設置為較高的值。
- 步驟如下:初始學習率設置為~0,然後根據公式對「初始批次」進行遞增:
- 當前epoch*(學習率)/(Num_of_Initial_Epochs)
- 初始epoch數量:是一個超參數,我們選擇保留這個數,直到模型「預熱」為止。
- 學習率:我們為NN設置的最終學習率。
- 學習率的設置採用公式:0.1 x (Batch_size)/256
- Zero Y:ResNet由多個殘塊組成。為了簡單起見,可以將它們表示為x+ block(x)
- 這些層之後通常是一個batch normalization層,這些層將進一步按比例轉換為Y*(x)+bias。(當我們訓練網絡時,Y和bias是「學習得到的」)
- 這篇文章建議對ResNet塊末尾的層進行初始化,將Y初始化為0。這減少了初始可學習參數的數量。
- 不對bias做衰減:
- 正則化通常應用於所有可學習的參數,然而,這往往導致過擬合。
- 作者建議僅對卷積和全連接的層進行正則化,而不對bias和batch normalization參數進行正則化。
- 混合精度訓練:混合精度訓練允許我們使用最新GPU中速度更快的張量核,從而允許我們利用快速FP16運算和FP32訓練來計算權重或梯度,從而允許「不安全」的運算能夠全精度的完成。
- 模型調整:
- 本文比較了對ResNet體系結構所做的一些調整。
- 這些包括調整卷積層內部的步驟,靈感來自於最近的架構。我將跳過這一部分的細節,因為這需要稍微詳細的步長和卷積知識。
- 一般來說,爭論的焦點是對現有體系結構的調整也提高了準確性。
- cosine學習速率:
- 當我們訓練我們的模型時,我們可以預期它會隨著時間的推移而變得更好(假設一切都運行得很好),隨著我們的損失值減少,我們正在接近一個「極小值」。在這一點上,我們想要降低我們的學習速度。
- 固定步長學習率以「固定步長」衰減,本文建議使用餘弦調度學習率,代替固定步長衰減:
- 學習率(Cosine_Decayed) =初始設置學習率* 0.5 * (1 + cos(Current_Batch * (Pi))/ total_num_batch))
- 標籤平滑:
- 這意味著調整預測的最終層和機率分布,使網絡能夠更好地泛化。我跳過了如何實現這一點的細節。
- 知識蒸餾:
- 這種方法將知識從另一個預先訓練過的「教師」模型「蒸餾」到我們當前的學生網絡中。
- 這是通過增加蒸餾損失來實現的,蒸餾損失會懲罰我們的學生網絡,其依據是與「教師模型」相比,學生網絡的預測偏離了多少。
結論
本文在ImageNet中顯示了最大的前景,使用ResNet 50模型得到了最大的改進。
最後,對遷移學習在兩個任務上的應用進行了比較:
總結&自己的想法
這是第一篇擁抱小技巧的論文之一,這些技巧通常不在聚光燈下,或者在論文中不那麼重要。
本文深入研究了所有這些觀點,並進行了廣泛的比較。
作為一個小練習,我認為這應該是一個很好的實驗,在個人目標任務上嘗試這些技巧,並記錄下改進。
我也很想在以後的文章中讀到更多關於這種技巧的內容,或者有專門介紹這種方法的詳細部分。
英文原文:https://hackernoon.com/bag-of-tricks-for-image-classification-with-convolutional-neural-networks-paper-discussion-693c9e17d1cc
更多文章,請關注微信公眾號:AI公園