1. 程式人生 > 其它 >[轉]Must Know Tips/Tricks in Deep Neural Networks閱讀筆記

[轉]Must Know Tips/Tricks in Deep Neural Networks閱讀筆記

http://www.fenghz.xyz/Must-Know-Tips-in-DL/

 

Must Know Tips/Tricks in Deep Neural Networks閱讀筆記

2018-04-15      深度學習  Train  Tricks

文章題目: Must Know Tips/Tricks in Deep Neural Networks

簡介

本文是Lambda實驗室魏秀參寫的關於深度神經網路訓練技巧,非常齊全。我對它進行了整理。

Data Argumentation

一般來說用扭曲資料的方法進行資料增廣是可行的。如果資料庫只有少量的圖片的時候,資料增廣是增加表現的理想手段。

一般來說可以用水平翻轉,隨機取樣等技術進行。作則還說了一個非常有用的fancy PCA方法

Pre-Processing

幾個有效的手段:

  1. 資料中心化
  2. 資料正則化

一般圖片需要用到中心化思想。

網路初始化(Initialization)

全零初始化的壞處

理論上因為輸入是一個對稱的初始化操作,那麼是否可以給神經網路全0初始化呢?當然不可以。因為全0了之後相當於後面幾層神經網路接受了相同的輸入(反正前面都是0)。或者說如果神經網路的引數都一樣的話,那麼第一層的輸出是引數對輸入的乘積,第一層輸出全部相同,第二層輸出也全部相同,這樣神經網路所有引數梯度都一樣,這樣就沒辦法改變了。

隨機小數字初始化的

一般用期望為0的分佈初始化。用weights0.001×N(0,1)weights−0.001×N(0,1)進行初始化和[1,1][−1,1]的均勻分佈基本差不多。

###Xavier

What is xavier initialization

為了保證輸入與輸出的方差都是一樣的,因此對權重進行了操作。

如果初始化引數太小,那麼輸入訊號在每一個單元裡就會收縮,以至於最後沒有了。如果初始化引數太大,那麼訊號就會在每一個layer內迅速爆炸,使得最後的輸出非常混亂。使用Xavier初始化,能夠讓權重不太大,也不太小。

其本質就是讓輸入X與輸出Y的方差一致。最後得到的一個結果是權重應該以0為均值,然後方差為Var(Wi)=2nin+nout

Var(Wi)=2nin+nout

據說這個初始化是可以無腦用的?我可以在如果網路跑了好多次然後仍然不收斂的時候用。

一般推薦

一般使用正態分佈,然後引數×2/n‾‾‾√×2/n 來進行初始化,無腦xavier

訓練過程中的Tips

過濾器尺寸與池化尺寸

一般輸入圖片尺寸是2的冪次大小,一般是64或者32的2,4,6,8倍。

過濾器無腦選3*3,步長為1,0填充。因為這個可以保留圖片的大部分特徵

池化一般情況下選2*2

學習率

一個大神的建議是用batch size來除梯度,而學習率保持不變(如果變了batch size的話),這個建議是增大batch size 或者減小的時候的建議,非常有用。

一般來說用test set來檢驗學習率是最有用的。如果驗證集上loss不再降低,可以把學習率除2,再除2直到降低為止。

一般初始學習率選0.1。(一般選1e-3比較有用)

在預訓練模型上微調

現在很多影象處理網路都給了引數,這種引數可以進行預訓練。

假如我們的資料集很小,而我們用的預訓練網路資料集特徵與我們的很像,我們只需要在網路後面加幾個小層,改變這些引數就可以了,網路引數不變。

假設我們的資料很多,且與預訓練的網路很像,那麼我們需要用很小的學習率去訓練網路一開始的幾層就可以了,因為後面幾層都已經把特徵高度抽象化了。

假設我們的資料很多,與預訓練網路不像,那麼我們直接訓練整個網路,但是學習率很小就可以了。

假設我們的資料很小與預訓練也不像,不要用預訓練的網路。

啟用函式s

按Deep Learning一書中所言,所謂的啟用函式就是為神經網路增加非線性性的一個關鍵而重要的東西。文章對比了Sigmoid,tanh,ReLU,Leaky ReLU,Parametric ReLu,以及Randomized ReLU的區別並給出了對比。

Sigmoid

Sigmoid函式我們都知道,它的好處在於模擬了網路不啟用(0)與網路全飽和啟用(1)的關係。它的缺陷在於它會導致梯度消失,也就是說殺死了梯度,這就意味著神經網路的引數不能過大,因為過大的引數意味著特別小的梯度,也就是引數一旦大起來就小不了了。

同時,如果我們的輸入被限制在[-1,1]之間,這意味著神經網路引數也應該被限制在0附近,但是sigmoid函式並不是一個好的函式.

tanh(x)

tanh函式除了把範圍弄到了zero附近以外也沒解決梯度飽和的問題。

ReLU

為了解決以上問題,ReLU函式憑空出現了。ReLU的好處是計算方便(沒有指數計算,計算量少了好幾個量級),同時ReLU不會面臨梯度飽和的問題。同時ReLU在SGD方法下收斂得非常非常快。

但是ReLU也有缺陷,它可能會使神經網路的一部分處於”死亡”的狀態。比如如果有一個很大的梯度使得神經網路的權重更新很大,最終導致這個神經元對於所有的輸入都給出了一個負值,也就是說輸出為0了。這個時候流過這個神經元的梯度就永遠會變成0形式,也就是說不可逆轉地,這個神經元”死去”了。如果我們的學習率設定不當,這個很可能發生。

### Leaky ReLU

為了防止這個事情的發生,出現了leaky relu。它定義為 f(x)={xαxif x > 0,if x<0.α0.001f(x)={xif x > 0,α∗xif x<0.α≤0.001

PReLU

對於PReLU而言,引數αα是可以學習的,有梯度的,我們可以直接對它求導學習。

RReLU

對於RReLU而言,每一個數據xi的αα都是不一樣的,隨機給出的,而test階段取它的期望。

作者給出了這幾種啟用函式在Cifar與NDSB資料集上的測試,大概結論就是Leaky ReLU, PReLU,RReLU更好一些,後兩者尤其好,可以無腦用。

Regularization

正則化是為了防止過擬合的。

L2正則化

L2正則化顯然是對大權重的一種懲罰

L1正則化

L1正則化一般與L2同時使用,L1正則化迫使引數變得稀疏(比L2有效),一般L1正則化對噪聲較大的資料有用,可以過濾資料抓重點。

最大範數正則化

對每一個權重規定一個上界

Dropout

最有效的方法,相當於對神經網路進行了重取樣。一般Dropout的p可以設定為0.5。

來自圖例的直觀

關於Learning Rate,如何判斷你當前選取的Learning Rate是一個健康的數字呢?作者分為了4類。

過高的learning rate會讓loss直接瘋漲上去,過低的learning rate會讓loss慢慢跌下去,而中高的learning rate會讓loss一開始飛速下降,然後陷入區域性極小值。可以通過看圖來除錯learning rate。

關於loss一般是一個非常震盪的影象。如果說這個影象不震盪,一直向下這說明learning rate比較低,如果發現曲線震盪的上下界,也就是width變大了,那麼這說明batch的方差很大,這就需要增大batch size

如何判斷over fitiing:

如果在驗證集上的loss(或者說VoE)與訓練集上的loss(VOE)相差得越來越大的話,也就是兩條曲線的gap越來越大這就說明出現了過擬合。

神經網路的融合

融合好幾個網路可以獲得更好的結果,這是一個公認的事實。一般來說好的比賽都是通過融合多個神經網路來得到的,而如果我們訓練時間有限的話,融合多個神經網路也是一個好的方面。那麼如何融合呢?有以下幾個辦法

  1. 相同的模型,不同的初始化

    採用驗證集來獲取好的超引數,用這個給定的超引數來進行初始化。

  2. 選取超引數後,直接把訓練過程中的少數幾個好的模型來融合為ensemble。也就是說直接選訓練階段的模型做ensemble,這個會導致納入了非最佳模型。

  3. 如果訓練很花時間,那麼可以嘗試在每個epoch後選模型的幾個檢驗點(這裡沒有理解),然後用這些進行ensemble,它的特點是便宜。

  4. 直接用不同的資料集訓練,然後ensemble

    作者在挑戰ICCV 2015的時候,利用了分別在image of imagenet,Place Database,以及挑戰的資料集分別訓練了5個模型,然後把5個模型的深層輸入作為5個特徵,看作多維資料。最後作者融合了 early fusion與late fusion得到了第二名。

資料不均衡

類不均衡問題很重要。類不均衡問題會導致嚴重的負面影響(對於整體表現來說)。簡單地降取樣,增取樣當然是一個好辦法,這裡提出的一個解決方案是隨機crop[7],或者我們可以採用微調的策略。我們可以把我們的資料集分為2個部分,第一個部分是類別充足的部分,第二個部分是類別不充足的。在每個資料集上類別不均衡問題都不嚴重。在微調的過程中,我們可以先對那些類別充足的資料集進行微調,然後繼續再在不充足的資料集上微調。