1. 程式人生 > >激活函數種類

激活函數種類

features 正數 就會 res bubuko 改進 特殊 速度 none

1.sigmod函數

\[ \sigma(x)=\frac{1}{1+e^{-x}} \]

技術分享圖片

sigmod函數的輸出值再(0,1)這個開區間中,經常被用來映射為概率值。
sigmod函數作為激活函數曾經比較流行。
缺陷

  • 當輸入稍微遠離了坐標原點,函數的梯度就變得很小了,幾乎為零。當反向傳播經過了sigmod函數,這個鏈條上的微分就很小很小了,況且還可能經過很多個sigmod函數,最後會導致權重w對損失函數幾乎沒影響,這樣不利於權重的優化,這個問題叫做梯度飽和,也可以叫梯度彌散。
  • 函數輸出不是以0為中心的,這樣會使權重更新效率降低
  • sigmod函數要進行指數運算,這個對於計算機來說是比較慢的。
tf.sigmoid(x, name=None)

2.tanh函數

\[ 雙曲正弦函數=\tanh(x)=\frac{sinh(x)}{cosh(x)}=\frac{e^x-e^{-x}}{e^x+e^{-x}} \]

技術分享圖片

sigmod函數的輸出值在(-1,1)這個開區間中,而且整個函數是以0為中心的,這個特點比sigmod的好。
缺陷

  • 當輸入稍微遠離了坐標原點,函數的梯度就變得很小了,幾乎為零。當反向傳播經過了sigmod函數,這個鏈條上的微分就很小很小了,況且還可能經過很多個sigmod函數,最後會導致權重w對損失函數幾乎沒影響,這樣不利於權重的優化,這個問題叫做梯度飽和,也可以叫梯度彌散。
  • sigmod函數要進行指數運算,這個對於計算機來說是比較慢的。
一般二分類問題中,隱藏層用tanh函數,輸出層用sigmod函數
tf.tanh(x, name=None)

3.ReLU函數

\[ \sigma(x)=,max(0,x) \]

技術分享圖片

ReLU(Rectified Linear Unit)函數是目前比較火的一個激活函數
1.輸入為正數的時候,不存在梯度飽和問題。
2.不存在指數運算,計算速度要快很多
缺陷

  • 當輸入是負數的時候,ReLU是完全不被激活的,這就表明一旦輸入到了負數,ReLU就會死掉
  • ReLU函數也不是以0為中心的函數
tf.nn.relu(
    features,
    name=None
)

4.ELU函數

\[ f(x)=\begin{cases} x &x>0 \\ \alpha(e^x-1) &x<=0 \end{cases} \]

技術分享圖片

相比於ReLU函數,在輸入為負數的情況下,是有一定的輸出的,而且這部分輸出還具有一定的抗幹擾能力。這樣可以消除ReLU死掉的問題,不過還是有梯度飽和和指數運算的問題。

tf.nn.elu(features, name=None)

5.PReLU函數

\[ f(x)=max(ax,x) \]

技術分享圖片

PReLU也是針對ReLU的一個改進型,在負數區域內,PReLU有一個很小的斜率,這樣也可以避免ReLU死掉的問題。相比於ELU,PReLU在負數區域內是線性運算,斜率雖然小,但是不會趨於0,這算是一定的優勢吧。
我們看PReLU的公式,裏面的參數α一般是取0~1之間的數,而且一般還是比較小的,如零點零幾。當α=0.01時,我們叫PReLU為Leaky ReLU,算是PReLU的一種特殊情況吧。

激活函數種類