Activation Functions — Sigmoid & ReLu & tahn & LeakyReLu & ELU
在初學經典CNN架構時,一定會看到activation functions的出現,就會有疑問他存在的意義是什麼?有這麼多種activation functions差別在哪?就把這些疑惑重點整理在這篇文章裡~~
在這裏你可以學到以下:
- 為什麼要用Activation Functions?
- Activation Functions有什麼條件?
- Sigmoid介紹 &優缺點
- Tanh介紹 &優缺點
- ReLu介紹 &優缺點
- LeakyRelu介紹 &優缺點
- ELU介紹 &優缺點
- Zero mean & Zero centere 是什麼?
- 是zero center的activation function為什麼收斂比較快?
- 把data轉為zero mean data也可以加快收斂速度?
大部分的內容都是從cs231n 2017課程學到的,不懂的地方再從網路survy整理成以下重點 ,突然忘記或不懂的時候我會回來複習,然後補充更多資料上來~
為什麼要用 Activation Functions?
The purpose of an activation function is to add some kind of non-linear property to the function, which is a neural network. Without the activation functions, the neural network could perform only linear mappings from inputs x to the outputs y.
在類神經網路中使用激勵函數,主要是利用非線性方程式,解決非線性問題,如果不使用激勵函數,類神經網路就會是以線性的方式組合運算,因為隱藏層以及輸出層都是拿上層的結果當作下層的輸入,並以線性組合計算,作為這一層的輸出,使得輸出與輸入只存在著線性關係,而現實中,所有問題皆屬於非線性問題,因此,如果沒有使用非線性之激勵函數,那類神經網路訓練出的模型就失去意義了。
Activation Functions 有什麼條件?
- 激勵函數需選擇可微分函數,因為在誤差反向傳遞(Back Propagation)運算時,需要進行一次微分計算。
- 在深度學習中,當隱藏層之層數過多時,激勵函數不可隨意選擇,因為會造成梯度消失(Vanishing Gradient)以及梯度爆炸(Exploding gradients)等問題。
這幾個Activation function的特性有時候很容易忘記,整理成下面的表格好複習!
Sigmoid:
優點:
- 容易計算導數(偏微分)。
- 能將數據轉換至0和1之間,當輸入的數字非常大的時候,結果會接近1,當輸入非常大的負數時,則會得到接近0的結果,在早期的神經網路中使用地非常多(二元分類問題結束後透過sigmoid將機率壓至0–1之間),保證數據幅度不會有問題(0:幾乎沒有被激活;1:完全被激活)。
缺點:
- 容易出現梯度消失 (gradient vanishing) 問題:
當Sigmoid導數較大或較小時(區間[-5,+5]之外),導數接近0 (下圖紅色圈圈標示),而後向傳遞時需要將當層導數與之前各層導數的數值進行乘積,幾個趨近於0的小數相乘,結果很接近0(尤其是當神經網路層數很多的時候),就會造成梯度消失。
Sigmoid導數的最大值為0.25,表示導數在每一層至少會被壓縮為原來的1/4,通過兩層後被變為1/16,通過n層後為1/4的n次方 (這邊還是以最大導數為例),因此過深的網路架構就會使導數相乘逐漸為0。
2. 指數函數計算量較大,運算較為耗時。
3. 函數輸出不是 zero-centered (zero centeredg收斂的比較快):
當後面神經元之輸入皆為正數時,對權重值求導以後的數值都是正的,因此在誤差反向傳遞 (Backpropagation) 的過程中,權重都正方向更新或往負方向更新,導致收斂曲線不平滑,影響模型的收斂速度。
Tanh:
優點:
- 容易計算導數(偏微分)
- 函數輸出是 zero-centered,(tanh通常要優於Sigmoid的,因為 tanh的輸出在 -1~1之間,均值為0,更方便下一層網路的學習。)但是有一個例外,如果做二分類,輸出層可以使用 Sigmoid,因為sigmoid可以算出屬於某一類的概率。
缺點:
- 一樣容易出現梯度消失 (gradient vanishing) 問題:
跟Sigmoid一樣,導數較大或較小時,導數接近0,造成梯度消失。
2. 跟Sigmoid一樣,指數函數計算量較大,運算較為耗時。
ReLu:
優點:
(解決sigmoid & tanh的缺點)
- 分段線性性質能有效克服梯度消失的問題:
ReLU 函數並不是全區間皆可微分,但是不可微分的部分可以使用 Sub-gradient 進行取代
2. 計算量小(速度約為 sigmoid 和 tanh 的6倍):
只需要判斷輸入是否大於0,無需使用任何指數運算
3. 緩解 overfitting 的問題:
ReLU 會使部分神經元的輸出為0,可以讓神經網路變得稀疏
缺點:
- ReLU 的輸出也不是 zero-centered
- 沒有限制數據幅度:
Relu值域區間為[0, 無窮大]不會對數據做幅度壓縮,所以數據的幅度會隨著模型層數的增加不斷擴張
3. 可能會有 Dead ReLU Problem(由於負數部分恆為零,會導致一些神經元無法激活):
(1) 初始化權重剛好不能激活(剛好是負數) -> 採用 Xavier 初始化方法解決,避免將 learning rate 設置太大
(2) Learning rate 如果設太大,導致在訓練過程中參數更新過大,那最終權重梯度為 0,神經元從這一點開始以後就永遠都是0,無法再被激活。 -> 使用 adagrad 等自動調節 learning rate
Leaky ReLu(這種屬於Parametric ReLu,阿發為0.01的稱為Leaky relu):
優點:
(解決Relu的缺點)
優點缺點都與ReLu一樣,但是解決了:
- 解決 Dead ReLU Problem,提出了將 ReLU 的前半段設為 ax 而非0,a=0.01,值負數時,梯度不會為0
- 實際操作當中,也沒有完全證明 Leaky ReLU 總是好於 ReLU
ELU (Exponential Linear Units):
(解決Relu的缺點)
與Leaky Relu類似,優點缺點都與ReLu一樣,也解決了:
- 解決 Dead ReLU Problem:
- 融合了Sigmoid和ReLU,左側具有軟飽和性,右側無飽和性。
- 計算速度會比Lekay Relu & Relu慢一點,比Sigmoid & tanh快一點
- 實際操作當中,也沒有完全證明 Leaky ReLU 總是好於 ReLU
ZERO CENTER & ZERO MEAN:
是zero centered的activation function為什麼收斂比較快?
如果不是zero-centered的function,權重只會以「正」方向或是「負」方向更新,也就是只有一種更新的方向,zero-centered的function不只有一種更新方向,因此可以快速地朝最優的終點更新,所以相反的不是zero-centered function只有一種更新方向,就會如圖很像小碎步的方式往最優終點更新,造成收斂速度慢。
轉換為zero-mean data也可以加快收斂速度:
除了activation function 選擇zero center 能加快收斂外,也可透過data preprocessing把data轉換成zero mean,也能加快收斂,因為像素只有正的 0~255,如果只有正的值就會導致上面的狀況發生,收斂很慢,所以一般會將像素範圍轉為 [-128, 127] 或是 [-1, 1],轉換至以0為中心。
`( X / 127.5) -1`
Reference:
http://cs231n.stanford.edu/slides/2017/
https://cvfiasd.pixnet.net/blog/post/275774124-深度學習激勵函數介紹
https://codingnote.cc/zh-tw/p/176736/
想看sigmoid原理與公式推導可以看李宏毅這堂後半段: