Must known Tips/Tricks in Deep Neural Networks(譯文)

深度神經網絡(DNN),尤其是卷積神經網絡(CNN),使得由多個處理層組成的運算模型可以學習到數據的多層抽象表示。這些方法極大地提高了視覺物體識別、物體探測、文本識別以及其他諸如藥物發現和生物學等領域的最先進的水準。

除此之外,很多關於這些主題的具有實質性內容的文章也相繼發表,同時很多高質量的CNN開源軟件包也被廣泛傳播。當然也出現了很多有關CNN的教程和CNN軟件使用手冊。但是,唯一缺少的可能是一個完整介紹如何實現深度卷積神經網絡所需要的所有細節的綜合性文章。因此,本文就蒐集和整理了DNN實現的所有細節,並對所有細節進行講解。

(一)介紹
本文將從八個方面來講述DNN的細節實現。包括(1)數據集擴展;(2)圖像的預處理;(3)網絡的初始化;(4)訓練過程中的一些技巧;(5)激活函數的選擇;(6)正則化的多種手段;(7)對圖像的深入認識;(8)多種深度網絡的整合。

(1)數據集的擴展
由於深度網絡在訓練時需要大量的數據才能達到令人滿意的性能,所以當原始數據較少時,最好是通過一些手段來擴展數據集,而且數據擴展也漸漸成爲訓練深度網絡的必要過程。
數據擴展的方法包括常用的水平翻轉、隨機剪切和顏色抖動,甚至還可以將上述方法組合起來,比如對圖像同時進行旋轉和隨機縮放。此外,也可以對像素的飽和度和純度進行0.25-4倍範圍內的冪次縮放,或者進行0.7-1.4範圍內的乘法縮放,或者加上-1~1之間的數值。同樣也可以對色度進行類似的加法處理。
Krizhevsky等人在優化訓練Alex網絡時提出了Fancy PCA[1]-它通過改變RGB信道的強度來擴展數據集。他們發現Fancy PCA近乎能捕獲到自然圖像的重要特性,即識別物體時對光照的強度和顏色的變化具有不變性。在分類性能上,這一方案將在ImageNet2012的top-1的錯誤率降低了超過1%。

(2)預處理
得到大量數據集後,是有必要對其進行預處理的,本部分介紹幾種預處理方法。
最簡單的就是中心化,然後歸一化。還有一種類似的就是對數據集的每一維都進行歸一化。當然,這種歸一化只在不同特徵的尺度不同時纔有效,而在圖像中,由於像素尺度範圍一致,所以這種預處理過程對圖像而言就沒有必要了。
還有一種預處理方法是PCA白化,首先也是中心化,然後通過計算協方差矩陣來發現數據中的關聯結構,接着通過將原始數據映射到特徵向量來解耦數據,最後就是白化過程,即對特徵向量進行歸一化。白化過程的缺陷在於它會引入噪聲,因爲它使得輸入的所有維度尺度相同,但實際上有些維度基本上是噪聲。這可以通過引入更強的平滑性先驗來緩解。
需要注意的是這些預處理在CNN中並非必要。

(3)網絡初始化
在理想情況下,經過數據擴展後,假定網絡權重一半是正數一半是負數是合理的,所以將所有的權重初始化爲0看起來並沒有什麼問題。但事實證明這是錯誤的,因爲若網絡中的每個神經元的輸出都一樣,那麼利用BP計算的梯度也會都一樣,使得所有的參數更新都一樣,這樣就使得神經元之間不存在非對稱性。

因此這種完全的零初始化並不可取。但爲了使得初始化權重儘可能小些,你可以將它們隨機初始化爲近0值,這樣就可以打破上述的對稱性。這種初始化的思想是,神經元在開始時的狀態都是隨機和獨立的,所以它們可以進行不同的更新,從而組合成以個豐富的網絡。比如利用0.001*N(0,1)這樣分佈或者均勻分佈來初始化參數。

上述初始化存在的問題是,隨機初始化的神經元的輸出分佈中存在一個隨着輸入個數變化而變化的變量。實踐證明可以通過縮放權重矢量來歸一化每個神經元輸出的變量。
這裏寫圖片描述
其中的randn是高斯分佈,n是輸入個數,這就保證了網絡中的所有神經元在初始階段都有着差不多相同的輸出分佈,同時也能提高收斂速度。需要注意的是當神經單元是ReLU時,權重的初始化略有不同[2]:
這裏寫圖片描述

(4)訓練過程的一些技巧
a)濾波器和池化大小。在訓練時輸入圖像的大小傾向於選擇2的冪次值,比如32,64,224,384,512等。同時,利用較小的濾波器,較小的步幅和0填充值既可以減少參數個數,也可以提升整個網絡的精確度。

b)學習率。一如Ilya Sutskever在一篇博客[3]中所說的,利用小批量尺度來分解梯度,這樣當你改變批量大小時,就不必總要改變學習率了。利用驗證集是一種高效選擇學習率的方法。通常將學習率的初始值設爲0.1,若在驗證集上性能不再提高,可以將學習率除以2或者5,然後如此循環直到收斂。

c)預訓練模型的微調。現今,很多最好性能的模型都是由一些著名的研究團隊提出來的,比如caffe model zoo 和vgg group。由於這些預訓練模型都有着很好的泛化能力,所以可以直接將這些模型運用到自己的數據集上。想要進一步提高這些模型在自己的數據集上的性能,最簡單的方法就是在自己的數據集上對這些模型進行微調。一如下表所示,最需要關注的兩個參數就是新數據集的大小以及它和原始數據集之間的相似度。不同情形下可利用不同的微調方法。比如,比較簡單的情形就是你的數據集和預訓練模型的數據集十分相似,若你擁有的數據集很小,你只需利用預訓練模型的頂層特徵就能訓練出一個線性分類器,若你擁有的數據集很大時,最好利用較小的學習率對預訓練模型的幾個較高層都進行微調。要是你的數據集較大而且和原始數據集之間存在很大的差別,那麼需要利用較小的學習率來微調更多的層。要是你的數據集不僅和原始數據集差別大,而且很小,此時訓練就變得很困難。因爲數據少,最好是隻訓練一個線性分類器,又因爲數據集差別大,利用最頂層的特徵來訓練這個分類器又不合適,因爲最頂層的特徵包含了很多關於原始數據集特性的特徵。更合適的方法是在網絡的某個更靠前些的層的特徵上訓練SVM分類器。
這裏寫圖片描述

(5)激活函數的選擇
DL網絡中一個重要的環節就是激活函數的選取,正是它使得網絡具有了非線性。本部分將介紹幾個常用的激活函數並給出一些選擇建議。
a) sigmoid:它的數據表達式是
這裏寫圖片描述,輸入是實數,輸出在(0,1)之間,非常小的負數對應的輸出爲0,非常大的正數對應的輸出爲1。sigmoid函數得到廣泛應用是因爲它很好的模仿了神經元從未激活到完全激活的過程。現今,sigmoid函數應用得很少,主要是因爲它存在如下兩個缺陷:
1)sigmoid容易飽和,導致梯度消失。
這裏寫圖片描述
當神經元的激活值爲0或者1時,處於這一區域的梯度爲0,而在BP算法中,這種局部梯度會使得梯度消失,從而導致該神經元無信號經過。此外,在初始化sigmoid神經元的權重時,也需要注意防止飽和,若初始化權重很大,很多的神經元會很快就達到飽和,從而導致這些神經元不能再學習。
2)sigmoid的輸出並不是中心化的。這會影響梯度下降的波動狀態,因爲若進入一個神經元的輸入總是正數,那麼關於該神經元的權重梯度計算時要麼都是正的或者都是負的,這會導致利用梯度更新權值時發生所不想要的之字形波動。不過若將一批數據的梯度加起來再進行權值更新時,權值就能取到正負值,某種程度上緩解了這一問題。

b)tanh(x):tanh函數的輸出範圍是(-1,1)。和sigmoid函數類似,它也存在飽和問題,但和sigmoid不同的是它的輸出是中心化的。所以實際中更傾向使用tanh函數。
這裏寫圖片描述
c)ReLU:改進的線性神經單元在過去幾年深受歡迎,它的激活函數是f(x)=max(0,x),即閾值設爲0,如下圖所示:
這裏寫圖片描述
ReLU有如下優缺點:
1.不同於sigmoid和tanh函數操作的複雜性,ReLU只需要對激活值矩陣設置0閾值即可,同時ReLU還不存在飽和問題;
2.ReLU極大地提高了隨機梯度的收斂速度;
3.其缺陷是比較脆弱且在訓練過程中容易發生神經元的死亡的現象。比如,當一個較大的梯度經過ReLU時會使得相應的權值更新幅度很大,導致神經元在其他任何數據點上不再被激活。這樣就導致流經此神經元的梯度隨後總是爲0,即此單元在訓練過程中不再起作用。
d)Leaky ReLU:它是試圖解決ReLU單元死亡問題的一種方法。
這裏寫圖片描述
此時x<0時函數值不再爲0,而是取一個很小的負值,即當x<0時f(x)=ax,當x>0時f(x)=x,a是一個很小的常數。一些研究在此激活函數上取得了很大的成功,但每次試驗結果很難保持一致。
e)PReLU/RReLU:它和Leaky ReLU的區別在於常數a不再是確定的,而是學習到的。而RReLU中的a是從一個給定範圍內隨機抽取得到的,在測試階段才固定下來。
這裏寫圖片描述
He等人宣稱PReLU是DL在Imagenet的分類任務上超越人類水平的關鍵所在。而在kaggle的一個比賽中,提出RReLU因爲其隨機性而可以緩解過擬合問題。
在[]中作者對這幾種激活函數在不同數據集上的性能進行了比較,結果如下:
這裏寫圖片描述
需要注意的是表中a的實際取值是1/a。同時我們也可以看到,ReLU在這三個數據集上並不總是最好的,而當Leaky ReLU的a取值較大時能達到更高的精確率。PReLU在小數據集上容易發生過擬合,但性能仍然比ReLU要好。RReLU[4]在NDSB數據集上是性能最好的,這也說明了RReLU確實能夠緩解過擬合,因爲NDSB數據集比其他兩個數據集都小。
總之,ReLU的三種變形都比其本身性能要好。

(6)正則化
可以通過以下幾種方法來控制神經網絡的容量,從而避免過擬合:
1)L2範式:通過直接在目標函數中加上所有參數值的平方來補償過擬合,即對每個參數w,都在目標函數中加上對應項這裏寫圖片描述,這裏的係數λ是衡量正則化強度的量。之所以含有係數1/2是爲了在對w求梯度時將結果簡化爲λw。L2範式對含有多峯值的權值的極大補償有着較爲直觀的解釋並且它傾向於分散權重矢量。
2)L1範式:對於每個權重w,在目標函數中增加對應項λ|w|。也可以將L1和L2範式整合起來使用,即這裏寫圖片描述,也被稱爲彈性網絡正則化。L1範式有趣之處在於它使得權重矢量在優化階段變得稀疏,即經過L1正則化後神經元只利用那些總要的輸入並且對輸入噪聲不敏感。而L2正則化後的權重矢量經常是分散的且值很小。在實際應用中,如果你不是很關心顯示特徵的選取,L2範式是個不錯的選擇。
3)最大約束範式:它是對每個神經元的權重矢量最大值的絕對值給予限制並且利用設計好的梯度下降來加強這一限制。實際操作中先是對參數進行正常的更新,然後再通過鉗制每個神經元的權重矢量使它滿足這裏寫圖片描述 c的典型取值是3或者4。它的一個引人注意額特性是即使學習率很大,網絡也不會發生膨脹,因爲權重更新都受到了限制。
4)dropout[5]:它是一個十分高效、簡單的正則化方法。在訓練過程中,dropout可看做是在整個網絡中抽取一個子網絡,並基於輸入數據訓練這個子網絡,但是這些子網絡並不是獨立的,因爲他們的參數共享。

這裏寫圖片描述

在測試階段不再運用dropout,而是基於對所有指數級數目的子網絡的預測求平均來進行評估。實際操作中dropout比率經常取爲p=0.5,不過在驗證集上這一數值是可以調整的。

(7)對圖像的深入認識
利用上述方法基本可以得到令人滿意的網絡設置,而且在訓練階段,你也可以抽取一些圖像處理結果來實時觀察網絡訓練的效果。
1)我們知道,學習率的調整是十分敏感的,從下圖可以看到,學習率很高時會產生一個十分奇怪的損失曲線。一個很低的學習率即使經過多輪訓練你的訓練誤差依然降低得十分緩慢,而很高的學習率在開始訓練時誤差會降低得很快,但卻會停留在局部最小點,這樣就會導致你的結果無法令人滿意。一個好的學習率,其對應的誤差曲線應用具有很好的平滑性並最終使得網絡達到最優性能。
2)我們放大誤差曲線看看會發現什麼。輪即是在訓練數據上完成一次訓練,所以在每輪中有很多小批次數據,畫出每個小批次數據的分類誤差,如圖二。和圖一類似,若誤差曲線很接近線性,這意味着學習率很低,若其降低幅度很小,意味着學習率可能太大了。曲線的寬度和批次大小有關,若寬度很寬,意味着批次大小相差很大,這時應該儘量減少批次間的差別。
3)另外我們還可以觀察精確率曲線,如圖三。紅線是訓練精確率,綠線是驗證集精確率。當驗證集的精確率開始收斂時,紅綠曲線之間的差別可以表現網絡訓練是否高效。若差別較大,即在訓練集上的精確率很高而在驗證集上的精確率很低,這意味着你的模型在訓練集上出現了過擬合,這時就應該增強對網絡的正則化。然而,若兩者間差別很小但精確率很低,這意味着你的模型的學習能力很弱,這時就需要增大網絡的容量來提高其學習能力。
這裏寫圖片描述

(8)網絡整合[6]
ML中,訓練多個學習器再將他們組合起來是達到最好性能的一種方法。本部分介紹幾種整合方法:
1)相同模型,不同初始化方法。利用交叉驗證來確定最優超參,然後利用這些超參來訓練初始化不同的多個模型。這種方法的缺陷在於只有初始化這一個變化。
2)在交叉驗證接過程中選取幾個性能排在最前邊的模型進行組合。先利用交叉驗證確定最優超參,然後選取幾個性能較好的模型進行整合。這種方法提高了多樣性,但可能會將次優模型也包含在內了。實際應用中,這種方法很容易實現,因爲它不需要在交叉驗證後對模型進行額外的再訓練。你也可以在caffe model zoo裏選取幾個模型進行組合訓練。
3)在單個模型裏設置不同的檢測點。若訓練成本太高,在資源受限的情況下,不得不在單個模型訓練過程中選取檢測點,並且利用這些結果進行組合。很顯然,這種方法也缺乏多樣性,但在實際應用中也能取得一定的成功。但它的成本很低。
4)一些現實例子。若你的視覺處理任務和圖像的高層語義相關,比如利用靜態圖像來進行事件識別,更好的一種途徑是在不同的數據源上訓練多個模型來提取不同且互補的深度特徵。比如在ICCV2015的文化活動識別挑戰中,我們利用五種不同的深度網絡在Imagenet,pace database和競賽組織者提供的數據集上進行訓練,這樣就獲取了五種互補的深層特徵並將它們看作是多視角數據。將前期的融合和後期的融合結合起來[],我們取得了該比賽的第二名。在[7]提出了堆積NN組合成更深網絡的思路。

在現實應用中,數據集經常會出現各類別間不均衡的現象,即一些類別有很多訓練樣例,而另一些類別的樣例很少,一如[]中所談及的,在這種不均衡數據集上訓練深層網絡會使得網絡性能很差。處理這一問題的最簡單的方法就是對數據集進行上採樣和下采樣[8]。另外一種方法是[7]中提出的特殊剪切處理,因爲原始的有關文化活動的圖像及不均衡,我們就只對那些含有較少樣例的類別圖像進行剪切,這樣既可以爲數據提供多樣性,也能緩解數據不均衡問題。除此之外,也可以通過調整微調策略來克服數據源的不均衡,比如,可以將數據源分成兩份,一份是那些含有很多樣例的類別,另一份是那些只有少量樣例的類別。在這兩份數據集裏,不均衡問題也得到了緩解。在自己的數據集上微調網絡時,先在第一份數據集上微調,然後再在第二份數據集上微調。

參考文獻:
[1]A. Krizhevsky, I. Sutskever, and G. E. Hinton. ImageNet Classification with Deep Convolutional Neural Networks. In NIPS, 2012
[2] K. He, X. Zhang, S. Ren, and J. Sun. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification. In ICCV, 2015
[3] A Brief Overview of Deep Learning, which is a guest post by Ilya Sutskever.
[4] B. Xu, N. Wang, T. Chen, and M. Li. Empirical Evaluation of Rectified Activations in Convolution Network. In ICML Deep Learning Workshop, 2015.
[5] N. Srivastava, G. E. Hinton, A. Krizhevsky, I. Sutskever, and R. Salakhutdinov. Dropout: A Simple Way to Prevent Neural Networks from Overfitting. JMLR, 15(Jun):1929−1958, 2014.
[6] Z.-H. Zhou. Ensemble Methods: Foundations and Algorithms. Boca Raton, FL: Chapman & HallCRC/, 2012. (ISBN 978-1-439-830031)
[7] M. Mohammadi, and S. Das. S-NN: Stacked Neural Networks. Project in Stanford CS231n Winter Quarter, 2015.
[8] P. Hensman, and D. Masko. The Impact of Imbalanced Training Data for Convolutional Neural Networks. Degree Project in Computer Science, DD143X, 2015.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章