在類神經網路中使用激勵函數,主要是利用非線性方程式,解決非線性問題,若不使用激勵函數,類神經網路即是以線性的方式組合運算,因為隱藏層以及輸出層皆是將上層之結果輸入,並以線性組合計算,作為這一層的輸出,使得輸出與輸入只存在著線性關係,而現實中,所有問題皆屬於非線性問題,因此,若無使用非線性之激勵函數,則類神經網路訓練出之模型便失去意義。

1.激勵函數需選擇可微分之函數,因為在誤差反向傳遞(Back Propagation)運算時,需要進行一次微分計算。

2.在深度學習中,當隱藏層之層數過多時,激勵函數不可隨意選擇,因為會造成梯度消失(Vanishing Gradient)以及梯度爆炸(Exploding gradients)等問題。

梯度消失問題探討:

梯度下降算法是使用非常廣泛的優化算法,一般監督式之類神經網路使用誤差反向傳遞(BP)進行神經網路權重更新,先計算輸出層對應的loss,然後將loss以導數的形式不斷向上一層網絡進行傳遞,並修正相應的權重參數,達到降低loss之目的。而某些激勵函數,如Sigmoid函數在深度網絡的權重更新中,常會因為層數過多,導致導數逐漸變為0,使得前幾層之權重參數無法順利更新,造成神經網絡無法被優化,而無法找出最佳結果,原因如以下兩點。

1.在下圖中容易看出,當中Sigmoid導數較大或較小時(區間[-5,+5]之外),導數接近0,而後向傳遞時需要將當層導數與之前各層導數的數值進行乘積,幾個趨近於0的小數相乘,結果很接近0

2.如圖中可見Sigmoid導數的最大值為0.25,因此在每一層會因為導數被壓縮為原來的,意味著導數在每一層至少會被壓縮為原來的1/4,通過兩層後被變為1/16通過n層後為1/4n次方 ,這邊還是以最大導數為例,因此過深的網路架構也會使導數相乘逐漸為0

    1.png    2.png

                         Sigmoid                                                       Sigmoid導數

梯度爆炸問題探討

在深層類神經網路中,網路透過誤差反向傳遞(BP)更新權重,若在權重更新中,梯度累積得到非常大的值,使得每一層會大幅度的更新權重參數,而造成網路相當不穩定,若權重參數變得相當大,並超出可計算之臨界值,則輸出結果會產生溢位的狀況發生(無窮大、非數值)

激勵函數類型探討:

常見的激勵函數如下圖所示,包含: Sigmoidtan h以及ReLU 函數,而基於梯度消失、爆炸以及收斂性等問題,一般最常使用ReLU函數進行激發,而ReLU函數還有一些變形,如Leaky ReLURandon Leaky ReLU以及Maxout

1. Sigmoid函數介紹 

5.PNG  

1.png    2.png

                         Sigmoid                                                       Sigmoid導數

Sigmoid函數是深度學習領域開始時使用頻率最高的activation function它是便於求導數之平滑函數,其導數如上圖所示,然而Sigmoid存在著三大缺點:

A. 容易出現梯度消失gradient vanishing (上面有介紹)

B. 函數輸出並不是zero-centered : 

Sigmoid函數中,當後面神經元之輸入皆為正數時,對權重值求梯度時,梯度數值恆為正,因此在誤差反向傳遞的過程中,權重都正方向更新或往負方向更新,導致收斂曲線不平滑,形成一種綑綁現象,也影響模型的收斂速度。

C. 指數運算較為耗時:

相較於前兩項,運算時間較為容易克服,但與ReLU函數相比,運算效能還是相差甚遠。

2. tan h函數介紹:

6.PNG

7.png    8.png

                            tan h                                                            tan h導數

tan h讀作Hyperbolic Tangent,如上圖所示,雖然此函數順利解決Sigmoid函數中zero-centered的輸出問題,但是梯度消失問題以及需要指數運算的問題依然存在,但相較於Sigmoid函數,可用性還是相差不小。

3. ReLU函數介紹:

9.JPG

10.png    11.png

                            ReLU                                                            ReLU導數

ReLU函數圖形如上圖所示,若值為正數,則輸出該值大小,若值為負數,則輸出為0ReLU函數並不是全區間皆可微分,但是不可微分的部分可以使用Sub-gradient進行取代,ReLU是近年來最頻繁被使用的激勵函數,因其存在以下特點,包含:解決梯度爆炸問題、計算數度相當快、收斂速度快等特性,以下會進行詳細解析。

A. 解決梯度消失問題 (vanishing gradient problem)

12.png

對於使用誤差反向傳遞運算(BN)之類神經網路來說,更新權重時,梯度計算的考量最為重要,使用Sigmoid以及tan h函數容易發生梯度消失問題,當輸入值接近飽和區(sigmoid函數在 [-4, +4] 之外)進行激發時,一階微分值趨近於0,梯度消失問題發生,使得誤差反向傳遞計算,無法有效地進行權重更新,而神經網路層數加深時更為明顯,因此,是深度神經網路訓練時會遭遇到之困難,而ReLU的分段線性性質能有效地克服梯度消失之問題。

B.  計算量大幅降低:

ReLU函數相較於Sigmoid以及tan h來說,大幅下降計算量,無需使用任何指數運算,只需要判斷輸入值是否大於0,來進行輸出。

C. 生物事實(細胞激活現象):

13.png

對於細胞的刺激未達到一定強度時,神經元不會進行訊息傳遞,但當超越啟動之強度時,會引起神經衝動,而進行訊息之傳遞,ReLU函數成功模擬了此現象。

D. 類神經網路的稀疏性(奧卡姆剃刀原則):

14.png

ReLU激勵函數會使負數部分的神經元輸出為0,可以讓網路變得更加多樣性,如同Dropout的概念,可以緩解過擬合(Over fitting)之問題,但會衍生Dead ReLU的問題,當某個神經元輸出為0後,就難以再度輸出,當遇到以下兩種情形時容易導致dead ReLU發生。

D.1. 初始化權重設定為不能被激活的數值。

D.2. 學習率設置過大,在剛開始進行誤差反向傳遞時,容易修正權重值過大,導致權重梯度為0,神經元即再也無法被激活。

4. Leaky ReLU函數介紹:

15.JPG

16.png    17.png

                            ReLU                                                            ReLU導數

為了解決Dead ReLU ProblemLeaky ReLUReLU的前半段輸出設為0.01x,如此一來,即能防止值為負號時永遠無法被激活之問題,且理論上來說,Leaky ReLU擁有ReLU的所有優點,也成功避免Dead ReLU Problem的問題產生,但是於實際使用上,並沒有辦法完全證明Leaky ReLU永遠優於ReLU

5. ELU (Exponential Linear Units)函數介紹:

18.JPG

19.png    20.png

                            f (x)                                                               f (x)導數

ELU函數也是為了解決Dead ReLU問題而被提出,基本上除了運算量之問題,ELU賦有ReLU所有優點,也順利克服Dead ReLU問題,類似於Leaky ReLU,理論上雖然好於ReLU,但在實際使用中目前並沒有好的證據ELU總是優於ReLU

#結論:
建議使用ReLU函數,但是要注意初始化和learning rate的設置,避免造成Dead ReLU問題發生,也可以嘗試使用Leaky ReLUELU函數進行測試,此外,不建議使用tanh以及sigmoid函數。

參考文獻:

https://mropengate.blogspot.com/2017/02/deep-learning-role-of-activation.html

http://neuralnetworksanddeeplearning.com/chap5.html

https://zhuanlan.zhihu.com/p/25110450

 

 

arrow
arrow

    水面上的小草 發表在 痞客邦 留言(0) 人氣()