什麼是激活函數?
如圖1,在神經元中,輸入的 inputs 通過加權,求和後,還被作用了一個函數,這個函數就是激活函數。引入激活函數是為了增加神經網絡模型的非線性。如果不用激活函數,每一層輸出都是上層輸入的線性函數,無論神經網絡有多少層,輸出都是輸入的線性組合,這種情況就是最原始的感知機(Perceptron)。激活函數給神經元引入了非線性因素,使得神經網絡可以任意逼近任何非線性函數,這樣神經網絡就可以應用到眾多的非線性模型中。
圖1 神經網絡示意圖
下面我將介紹深度學習中常用的激活函數
linear(線性激活函數)
linear函數的表達式為:
即不做任何改變。
exponential(自然數指數激活函數)
exponential函數的表達式為:
sigmoid
sigmoid函數的定義為:
sigmoid函數的圖像如下:
sigmoid函數圖像
sigmoid函數的導數為:
導函數圖像為:
sigmoid導函數圖像
優點:sigmoid函數可以將實數映射到
區間內。平滑、易於求導。
缺點:1. 激活函數含有冪運算和除法,計算量大;2. 反向傳播時,很容易就會出現梯度消失的情況,從而無法完成深層網絡的訓練;3. sigmoid的輸出不是0均值的,這會導致後一層的神經元將得到上一層輸出的非0均值的信號作為輸入。
hard_sigmoid
hard_sigmoid函數的定義為:
hard_sigmoid函數圖像如下:
hard_sigmoid函數與sigmoid函數對比
hard_sigmoid函數用三個線段來擬合整個sigmoid函數。
特點:計算量小,非平滑。
tanh(雙曲正切激活函數)
tanh函數的定義為:
tanh函數的圖像為:
tanh函數圖像
tanh函數的導函數為:
tanh函數的導函數圖像為:
tanh的導函數圖像
tanh激活函數是0均值的,tanh激活函數相比sigmoid函數更'陡峭'了,對於有差異的特徵區分得更開了,tanh也不能避免梯度消失問題。
softsign
softsign函數的定義為:
softsign函數圖像為:
softsign函數圖像
softsign函數的導函數為:
softsign函數的導函數圖像為:
softsign的導函數圖像
softsign函數圖像和tanh函數圖像有點像,輸出為0均值,只是陡峭程度和計算量不一樣。
ReLU
relu激活函數的定義為:
relu激活函數的圖像為:
優點:1.計算量小;2.激活函數導數維持在1,可以有效緩解梯度消失和梯度爆炸問題;3.使用Relu會使部分神經元為0,這樣就造成了網絡的稀疏性,並且減少了參數之間的相互依賴關係,緩解了過擬合問題的發生。
缺點:輸入激活函數值為負數的時候,會使得輸出為0,那麼這個神經元在後面的訓練迭代的梯度就永遠是0了(由反向傳播公式推導可得),參數w得不到更新,也就是這個神經元死掉了。這種情況在你將學習率設得較大時(網絡訓練剛開始時)很容易發生(波浪線一不小心就拐到負數區域了,然後就拐不回來了)。
解決辦法:一些對Relu的改進,如ELU、PRelu、Leaky ReLU等,給負數區域一個很小的輸出,不讓其置0,從某種程度上避免了使部分神經元死掉的問題。
softplus
softplus函數的定義為:
softplus函數的圖像為:
softplus函數圖像
softplus的導函數為:
softplus的導函數圖像為:
softplus可以看作是ReLu的平滑。
ThresholdedReLU(帶閾值的Relu)
ThresholdedReLU的定義為(其中 theta 的浮點數標量):
ThresholdedReLU的函數圖像為:
LeakyReLU(帶洩漏的 ReLU)
LeakyReLU的定義為(其中 a 的浮點數標量):
LeakyReLU的函數圖像為:
LeakyReLU在神經元未激活時,它仍允許賦予一個很小的梯度,避免ReLU死掉的問題。值得注意的是LeakyReLU是確定的標量,不可學習。
PReLU(參數化的 ReLU)
PReLU的定義為( a 為可學習參數):
注意區分PReLU和LeakyReLU,PReLU的 a 是一個可學習的數組,尺寸與 x 相同。
PReLU是針對ReLU的一個改進型,在負數區域內,PReLU有一個很小的斜率,這樣也可以避免ReLU死掉的問題。相比於ELU,PReLU在負數區域內是線性運算,斜率雖然小,但是不會趨於0,這算是一定的優勢
elu(指數線性單元)
elu激活函數的定義為(其中 a為標量,表示負數部分的斜率):
elu激活函數的圖像為:
elu函數圖像
優點:右側線性部分使得elu能夠緩解梯度消失,而左側軟飽部分能夠讓ELU對輸入變化或噪聲更魯棒。elu的輸出均值接近於零。
selu(可伸縮的指數線性單元)
詳細信息參見原論文:
Self-Normalizing Neural Networksarxiv.org
注意事項:selu要與lecun_normal初始化方法一起使用。selu要與 dropout 的變種AlphaDropout一起使用。
relu系列函數
relu系列激活函數的廣義定義為:
上面的relu激活函數定義包含了原始relu,帶截斷的relu,PReLU,Leaky ReLU。
例如, a 設為0, threshold 設為0,就是原始的relu。
a 設為0,threshold 設為固定值,就是帶截斷的relu。
a 設為0~1之間可學習參數,threshlod 設為0,就是PReLU。
a 設為0~1之間的確定值,threshold設為0,就是Leaky ReLU。
relu函數的圖像為:
softmax
softmax函數常用在分類網絡的最後一層,把網絡輸出轉化為各類別的概率。
softmax函數的定義為:
總結
激活函數有很多種,要根據具體的問題選擇合適的激活函數。從現在來看,relu系列的激活函數是優於其他激活函數的,在大部分情況下優先採用relu系列的激活函數以及其變種,但也不是說其他激活函數毫無用處,在某些情況下可能relu系列函數不能滿足需求,我們可以考慮使用其它的激活函數。