在類神經網路中使用激勵函數,主要是利用非線性方程式,解決非線性問題,若不使用激勵函數,類神經網路即是以線性的方式組合運算,因為隱藏層以及輸出層皆是將上層之結果輸入,並以線性組合計算,作為這一層的輸出,使得輸出與輸入只存在著線性關係,而現實中,所有問題皆屬於非線性問題,因此,若無使用非線性之激勵函數,則類神經網路訓練出之模型便失去意義。
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/4的n次方 ,這邊還是以最大導數為例,因此過深的網路架構也會使導數相乘逐漸為0。
Sigmoid Sigmoid導數
梯度爆炸問題探討
在深層類神經網路中,網路透過誤差反向傳遞(BP)更新權重,若在權重更新中,梯度累積得到非常大的值,使得每一層會大幅度的更新權重參數,而造成網路相當不穩定,若權重參數變得相當大,並超出可計算之臨界值,則輸出結果會產生溢位的狀況發生(無窮大、非數值)。
激勵函數類型探討:
常見的激勵函數如下圖所示,包含: Sigmoid、tan h以及ReLU 函數,而基於梯度消失、爆炸以及收斂性等問題,一般最常使用ReLU函數進行激發,而ReLU函數還有一些變形,如Leaky ReLU、Randon Leaky ReLU以及Maxout等。
1. Sigmoid函數介紹:
Sigmoid Sigmoid導數
Sigmoid函數是深度學習領域開始時使用頻率最高的activation function,它是便於求導數之平滑函數,其導數如上圖所示,然而Sigmoid存在著三大缺點:
A. 容易出現梯度消失gradient vanishing (上面有介紹)
B. 函數輸出並不是zero-centered :
Sigmoid函數中,當後面神經元之輸入皆為正數時,對權重值求梯度時,梯度數值恆為正,因此在誤差反向傳遞的過程中,權重都正方向更新或往負方向更新,導致收斂曲線不平滑,形成一種綑綁現象,也影響模型的收斂速度。
C. 指數運算較為耗時:
相較於前兩項,運算時間較為容易克服,但與ReLU函數相比,運算效能還是相差甚遠。
2. tan h函數介紹:
tan h tan h導數
tan h讀作Hyperbolic Tangent,如上圖所示,雖然此函數順利解決Sigmoid函數中zero-centered的輸出問題,但是梯度消失問題以及需要指數運算的問題依然存在,但相較於Sigmoid函數,可用性還是相差不小。
3. ReLU函數介紹:
ReLU ReLU導數
ReLU函數圖形如上圖所示,若值為正數,則輸出該值大小,若值為負數,則輸出為0,ReLU函數並不是全區間皆可微分,但是不可微分的部分可以使用Sub-gradient進行取代,ReLU是近年來最頻繁被使用的激勵函數,因其存在以下特點,包含:解決梯度爆炸問題、計算數度相當快、收斂速度快等特性,以下會進行詳細解析。
A. 解決梯度消失問題 (vanishing gradient problem)
對於使用誤差反向傳遞運算(BN)之類神經網路來說,更新權重時,梯度計算的考量最為重要,使用Sigmoid以及tan h函數容易發生梯度消失問題,當輸入值接近飽和區(sigmoid函數在 [-4, +4] 之外)進行激發時,一階微分值趨近於0,梯度消失問題發生,使得誤差反向傳遞計算,無法有效地進行權重更新,而神經網路層數加深時更為明顯,因此,是深度神經網路訓練時會遭遇到之困難,而ReLU的分段線性性質能有效地克服梯度消失之問題。
B. 計算量大幅降低:
ReLU函數相較於Sigmoid以及tan h來說,大幅下降計算量,無需使用任何指數運算,只需要判斷輸入值是否大於0,來進行輸出。
C. 生物事實(細胞激活現象):
對於細胞的刺激未達到一定強度時,神經元不會進行訊息傳遞,但當超越啟動之強度時,會引起神經衝動,而進行訊息之傳遞,ReLU函數成功模擬了此現象。
D. 類神經網路的稀疏性(奧卡姆剃刀原則):
ReLU激勵函數會使負數部分的神經元輸出為0,可以讓網路變得更加多樣性,如同Dropout的概念,可以緩解過擬合(Over fitting)之問題,但會衍生Dead ReLU的問題,當某個神經元輸出為0後,就難以再度輸出,當遇到以下兩種情形時容易導致dead ReLU發生。
D.1. 初始化權重設定為不能被激活的數值。
D.2. 學習率設置過大,在剛開始進行誤差反向傳遞時,容易修正權重值過大,導致權重梯度為0,神經元即再也無法被激活。
4. Leaky ReLU函數介紹:
ReLU ReLU導數
為了解決Dead ReLU Problem,Leaky ReLU將ReLU的前半段輸出設為0.01x,如此一來,即能防止值為負號時永遠無法被激活之問題,且理論上來說,Leaky ReLU擁有ReLU的所有優點,也成功避免Dead ReLU Problem的問題產生,但是於實際使用上,並沒有辦法完全證明Leaky ReLU永遠優於ReLU。
5. ELU (Exponential Linear Units)函數介紹:
f (x) f (x)導數
ELU函數也是為了解決Dead ReLU問題而被提出,基本上除了運算量之問題,ELU賦有ReLU所有優點,也順利克服Dead ReLU問題,類似於Leaky ReLU,理論上雖然好於ReLU,但在實際使用中目前並沒有好的證據ELU總是優於ReLU。
#結論:
建議使用ReLU函數,但是要注意初始化和learning rate的設置,避免造成Dead ReLU問題發生,也可以嘗試使用Leaky ReLU或ELU函數進行測試,此外,不建議使用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
留言列表