深度學習中常用的激活函數詳解

什麼是激活函數?

如圖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 Networks​arxiv.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系列函數不能滿足需求,我們可以考慮使用其它的激活函數。


分享到:


相關文章: