人工智能-深度學習筆記6 神經網絡的激活函數

爲什麼神經網絡需要激活函數,且是非線性的。記得之前的筆記中討論過將線性系統變爲非線性的一個技巧,引入了Sigmoid激活函數。激活函數的作用就是希望輸入一些數據後可以通過函數的計算得到想要的輸出,如果僅僅是想描述下數學中的線、面等這樣的現象,那麼那些幾元幾次的方程倒是可行。但是如果先解決再高維度的數據呢?或是簡單的二分類問題,怕是這些線性函數的逼近能力就相當有限了。簡言之,神經網絡的表達能力想要更加的強大,就不能再是輸入的線性組合,而是幾乎可以逼近任意函數的非線性組合。下面就學習下幾個非線性激活函數的特點:

 

1、常用到的幾個激活函數

Sigmoid函數數學公式、幾何形式,特別注意下導數的幾何形式:

特點

它能夠把輸入的連續實值變換爲0和1之間的輸出,特別的,如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1。

但是大家注意看看其導數,這是神經網絡反向傳播少不了的計算,如果將神經網絡的權重初始化爲 [0,1]之間的隨機值,由反向傳播算法的數學推導可知,梯度從後向前傳播時,每傳遞一層梯度值都會減小爲原來的0.25倍,如果神經網絡隱層特別多,那麼梯度在穿過多層後將變得非常小接近於0,即出現梯度消失現象;當網絡權值初始化爲 (1,+∞) (1,+∞)(1,+∞) 區間內的值,則會出現梯度爆炸情況;其中梯度爆炸發生的概率非常小,而梯度消失發生的概率比較大。

還有就是Sigmoid 的 output 不是0均值(即zero-centered),這通常是不可取的,因爲這會導致後一層的神經元將得到上一層輸出的非0均值的信號作爲輸入, 產生的一個結果就是:如x>0, f=wTx+b 那麼對w求局部梯度則都爲正,這樣在反向傳播的過程中w要麼都往正方向更新,要麼都往負方向更新,導致有一種捆綁的效果,使得收斂緩慢。 當然了,如果按batch去訓練,那麼batch可能得到不同的信號,所以這個問題還是可以緩解一下的。因此,非0均值這個問題雖然會產生一些不好的影響,不過跟上面提到的梯度消失問題相比還是要好很多的。

最後就是其解析式中含有冪運算,計算機求解時相對來講比較耗時,對於規模比較大的深度神經網絡,這會較大地增加訓練時間。如果隱藏層都是如此的激活函數,那麼此就是深度神經網絡爲何很難訓練的原因之一啦。

tanh函數數學公式、幾何形式、導數的幾何形式:

tanh讀作Hyperbolic Tangent,它解決了Sigmoid函數的不是zero-centered輸出問題,但是梯度消失(gradient vanishing)的問題和冪運算的問題仍然存在。

Relu函數數學公式、幾何形式、導數的幾何形式:

ReLU函數其實就是一個取最大值函數,注意這並不是全區間可導的,但是我可以取sub-gradient,如上圖所示。ReLU雖然簡單,但卻是近幾年的重要成果,有以下幾大特點:

1)解決了gradient vanishing問題 (在正區間);2)計算速度非常快,只需要判斷輸入是否大於0;3)收斂速度遠快於sigmoid和tanh。

ReLU也有幾個需要特別注意的問題:

1)ReLU的輸出不是zero-centered;2)Dead ReLU Problem,是指某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新。有兩個主要原因可能導致這種情況產生: (1) 非常不幸的參數初始化,這種情況比較少見 (2) learning rate太高導致在訓練過程中參數更新太大,不幸使網絡進入這種狀態。解決方法是可以採用更好的參數初始化方法,以及避免將learning rate設置太大或使用adagrad等自動調節learning rate的算法。

儘管存在這兩個問題,ReLU目前仍是最常用的activation function,在搭建神經網絡的時候推薦優先嚐試!這裏推薦大家關注下Leaky ReLU函數和ELU (Exponential Linear Units) 函數。

 

2、選擇激活函數的經驗法則

如果輸出是0、1值(二分類問題),則輸出層選擇sigmoid函數,然後其它的所有單元都選擇Relu函數。這是很多激活函數的默認選擇,如果在隱藏層上不確定使用哪個激活函數,那麼通常會使用Relu激活函數。有時,也會使用tanh激活函數,但Relu的一個優點是:當z是負值的時候,導數等於0。這裏也有另一個版本的Relu被稱爲Leaky Relu,當z是負值時,這個函數的值不是等於0,而是輕微的傾斜,

在z的區間變動很大的情況下,激活函數的導數或者激活函數的斜率都會遠大於0,在程序實現就是一個if-else語句,而sigmoid函數需要進行浮點四則運算,在實踐中,使用ReLu激活函數神經網絡通常會比使用sigmoid或者tanh激活函數學習的更快。sigmoid和tanh函數的導數在正負飽和區的梯度都會接近於0,這會造成梯度彌散,而Relu和Leaky ReLu函數大於0部分都爲常熟,不會產生梯度彌散現象。(同時應該注意到的是,Relu進入負半區的時候,梯度爲0,神經元此時不會訓練,產生所謂的稀疏性,而Leaky ReLu不會有這問題)。z在ReLu的梯度一半都是0,但是,有足夠的隱藏層使得z值大於0,所以對大多數的訓練數據來說學習過程仍然可以很快。

在選擇神經網絡的激活函數時,存在一定的直觀感受,在深度學習中的經常遇到一個問題:在編寫神經網絡的時候,會有很多選擇:隱藏層單元的個數、激活函數的選擇、初始化權值……這些選擇想得到一個對比較好的指導原則是挺困難的。鑑於以上三個原因,大家可以借鑑下工業界和學術界的見聞,提供一種直觀的感受,哪一種用的多,哪一種用的少。但是,自己的神經網絡的應用,以及其特殊性,是很難提前知道選擇哪些效果更好。所以通常的建議是:如果不確定哪一個激活函數效果更好,可以把它們都試試,然後在驗證集上進行評價。然後看哪一種表現的更好,就去使用它。爲自己的神經網絡的應用測試這些不同的選擇,會在以後檢驗自己的神經網絡或者評估算法的時候,看到不同的效果。

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