1. 程式人生 > >斯坦福CS231n計算機視覺-神經網路訓練細節(1)

斯坦福CS231n計算機視覺-神經網路訓練細節(1)

引用:https://zhuanlan.zhihu.com/p/21462488?refer=intelligentunit

本節課沒有從頭講解神經網路,而是講了一些神經網路的細節問題。

兩個需要注意的問題

1、訓練樣本不夠多沒事,使用預訓練好的卷積神經網路,所以不用擔心訓練樣本少。

2、計算機的計算能力有限

常用啟用函式

Sigmoid函式

數學公式:

特性:它輸入實數值並將其“擠壓”到0到1範圍內。更具體地說,很大的負數變成0,很大的正數變成1。在歷史上,sigmoid函式非常常用,這是因為它對於神經元的啟用頻率有良好的解釋:從完全不啟用(0)到在求和後的最大頻率處的完全飽和(saturated)的啟用(1)。然而現在sigmoid函式已經不太受歡迎,實際很少使用了,這是因為它有兩個主要缺點:

Sigmoid函式飽和使梯度消失。sigmoid神經元有一個不好的特性,就是當神經元的啟用在接近0或1處時會飽和:在這些區域,梯度幾乎為0。回憶一下,在反向傳播的時候,這個(區域性)梯度將會與整個損失函式關於該門單元輸出的梯度相乘。因此,如果區域性梯度非常小,那麼相乘的結果也會接近零,這會有效地“殺死”梯度,幾乎就有沒有訊號通過神經元傳到權重再到資料了。還有,為了防止飽和,必須對於權重矩陣初始化特別留意。比如,如果初始化權重過大,那麼大多數神經元將會飽和,導致網路就幾乎不學習了。

Sigmoid函式的輸出不是零中心的。這個性質並不是我們想要的,因為在神經網路後面層中的神經元得到的資料將不是零中心的。這一情況將影響梯度下降的運作,因為如果輸入神經元的資料總是正數(比如在f=w^Tx+b中每個元素都x>0),那麼關於w的梯度在反向傳播的過程中,將會要麼全部是正數,要麼全部是負數(具體依整個表示式f而定)。這將會導致梯度下降權重更新時出現z字型的下降。然而,可以看到整個批量的資料的梯度被加起來後,對於權重的最終更新將會有不同的正負,這樣就從一定程度上減輕了這個問題。因此,該問題相對於上面的神經元飽和問題來說只是個小麻煩,沒有那麼嚴重。

還有一個問題是e-x的計算比較耗時,效率比較低。

Tanh函式

數學公式:

解決了關於原點不對稱的問題。注意tanh神經元是一個簡單放大的sigmoid神經元。

ReLU函式

數學公式:

這個啟用函式就是一個關於0的閾值。使用ReLU有以下一些優缺點:

優點:相較於sigmoid和tanh函式,ReLU對於隨機梯度下降的收斂有巨大的加速作用( Krizhevsky 等的論文指出有6倍之多)。據稱這是由它的線性,非飽和的公式導致的。

優點:sigmoid和tanh神經元含有指數運算等耗費計算資源的操作,而ReLU可以簡單地通過對一個矩陣進行閾值計算得到。

缺點:在訓練的時候,ReLU單元比較脆弱並且可能“死掉”。舉例來說,當一個很大的梯度流過ReLU的神經元的時候,可能會導致梯度更新到一種特別的狀態,在這種狀態下神經元將無法被其他任何資料點再次啟用。如果這種情況發生,那麼從此所以流過這個神經元的梯度將都變成0。也就是說,這個ReLU單元在訓練中將不可逆轉的死亡,因為這導致了資料多樣化的丟失。例如,如果學習率設定得太高,可能會發現網路中40%的神經元都會死掉(在整個訓練集中這些神經元都不會被啟用)。通過合理設定學習率,這種情況的發生概率會降低。還是關於原點不對稱。

Leaky ReLU函式

數學公式:

Leaky ReLU是為解決“ReLU死亡”問題的嘗試。ReLU中當x<0時,函式值為0。而Leaky ReLU則是給出一個很小的負數梯度值,比如0.01。所以其函式公式為f(x)=1(x<0)(\alpha x)+1(x>=0)(x)其中\alpha是一個小的常量。有些研究者的論文指出這個啟用函式表現很不錯,但是其效果並不是很穩定。Kaiming He等人在2015年釋出的論文Delving Deep into Rectifiers中介紹了一種新方法PReLU,把負區間上的斜率當做每個神經元中的一個引數。然而該啟用函式在在不同任務中均有益處的一致性並沒有特別清晰。

Maxout。一些其他型別的單元被提了出來,它們對於權重和資料的內積結果不再使用f(w^Tx+b)函式形式。一個相關的流行選擇是Maxout(最近由Goodfellow等釋出)神經元。Maxout是對ReLU和leaky ReLU的一般化歸納,它的函式是:max(w^T_1x+b_1,w^T_2x+b_2)。ReLU和Leaky ReLU都是這個公式的特殊情況(比如ReLU就是當w_1,b_1=0的時候)。這樣Maxout神經元就擁有ReLU單元的所有優點(線性操作和不飽和),而沒有它的缺點(死亡的ReLU單元)。然而和ReLU對比,它每個神經元的引數數量增加了一倍,這就導致整體引數的數量激增。

以上就是一些常用的神經元及其啟用函式。最後需要注意一點:在同一個網路中混合使用不同型別的神經元是非常少見的,雖然沒有什麼根本性問題來禁止這樣做。

一句話:“那麼該用那種呢?”用ReLU非線性函式。注意設定好學習率,或許可以監控你的網路中死亡的神經元佔的比例。如果單元死亡問題困擾你,就試試Leaky ReLU或者Maxout,不要再用sigmoid了。也可以試試tanh,但是其效果應該不如ReLU或者Maxout。