tensorflow:激活函數(Activation Function)

激活函數(Activation Function)運行時激活神經網絡中某一部分神經元,將激活信息向後傳入下一層的神經網絡。

神經網絡的數學基礎是處處可微的,所以選取激活函數要保證數據輸入與輸出也是可微的。TensorFlow中提供哪些激活函數的API。

激活函數不會改變數據的維度,也就是輸入和輸出的維度是相同的。TensorFlow中有如下激活函數:

1. sigmoid 函數

這是傳統神經網絡中最常用的激活函數之一,公式和函數圖像如下:

{\displaystyle S(x)={\frac {1}{1+e^{-x}}}.}

 

優點:它輸出映射在(0,1)內,單調連續,非常適合用作輸出層,並且求導比較容易;

缺點:具有軟飽和性,一旦輸入落入飽和區,一階導數就變得接近於0,很容易產生梯度消失。

飽和性:當|x|>c時,其中c爲某常數,此時一階導數等於0,通俗的說一階導數就是上圖中的斜率,函數越來越水平。

2. tanh函數

tanh也是傳統神經網絡中比較常用的激活函數,公式和函數圖像如下:

tanh函數也具有軟飽和性。因爲它的輸出是以0爲中心,收斂速度比sigmoid函數要快。但是仍然無法解決梯度消失問題。

 

3. relu 函數

relu函數是目前用的最多也是最受歡迎的激活函數。公式和函數圖像如下:

由上圖的函數圖像可以知道,relu在x<0時是硬飽和。由於當x>0時一階導數爲1。所以,relu函數在x>0時可以保持梯度不衰減,從而緩解梯度消失問題,還可以更快的去收斂。但是,隨着訓練的進行,部分輸入會落到硬飽和區,導致對應的權重無法更新。我們稱之爲「神經元死亡」。

 

除了relu本身外,TensorFlow還定義了relu6,也就是定義在min(max(features, 0), 6)tf.nn.relu6(features, name=None),以及crelu,也就是tf.nn.crelu(features, name=None).

 

 

4. softplus 函數

softplus函數可以看作是relu函數的平滑版本,公式和函數圖像如下:

5. leakrelu 函數

leakrelu函數是relu激活函數的改進版本,解決部分輸入會落到硬飽和區,導致對應的權重無法更新的問題。公式和圖像如下:

 

 

左邊縮小方差,右邊保持方差;方差整體還是縮小的,而均值得不到保障。

 

6. ELU 函數

leakrelu函數是relu激活函數的改進版本,解決部分輸入會落到硬飽和區,導致對應的權重無法更新的問題。公式和圖像如下:

 

左邊縮小方差,右邊保持方差;方差整體還是縮小的,而均值得不到保障。

 

6. SELU函數

最近的自歸一化網絡中提出,函數和圖像如下:

藍色是:selu,橙色是:elu

 

左邊縮小方差,右邊放大方差,適當選取參數alpha和lambda,使得整體上保持方差與期望。如果選取:

lambda=1.0506,alpha=1.67326,那麼可以驗證如果輸入的x是服從標準正態分佈,那麼SELU(x)的期望爲0,方差爲1.