1. 程式人生 > >深度學習——啟用函式Sigmoid/Tanh/ReLU

深度學習——啟用函式Sigmoid/Tanh/ReLU

啟用函式(Activation Function)的特點:

  • 非線性: 當啟用函式是線性的時候,一個兩層的神經網路就可以逼近基本上所有的函數了。
  • 可微: 當優化方法是基於梯度的時候,這個性質是必須的。
  • 單調性: 當啟用函式是單調的時候,單層網路能夠保證是凸函式。
  • f(x)x 當啟用函式滿足這個性質的時候,如果引數的初始化是random的很小的值,那麼神經網路的訓練將會很高效。
  • 輸出值範圍: 當啟用函式輸出值是 有限 的時候,基於梯度的優化方法會更加 穩定,因為特徵的表示受有限權值的影響更顯著;當啟用函式的輸出是 無限 的時候,模型的訓練會更加高效,不過在這種情況小,一般需要更小的學習率。

啟用函式 
Sigmoid/Tanh/ReLU

此處輸入圖片的描述

Sigmoid 的數學形式: 

f(x)=11+ex

它能夠把輸入的連續實值“壓縮”到0和1之間。特別的,如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1. 
sigmoid 函式曾經被使用的很多,不過近年來,用它的人越來越少了。主要是因為它的一些 缺點

  • 當輸入非常大或者非常小的時候,這些神經元的梯度是接近於0的,從圖中可以看出梯度的趨勢。
  • Sigmoid 的 輸出不是0均值,這會導致後一層的神經元將得到上一層輸出的非0均值的訊號作為輸入。

Tanh的數學形式:

tanh(x)=2sigmoid(2x)1

Tanh是Sigmoid的變形,與 sigmoid 不同的是,tanh 是0均值的。因此,實際應用中,tanh 會比 sigmoid 更好。

ReLU的數學形式: 

f(x)=max(0,x)

很顯然,從圖左可以看出,輸入訊號<0時,輸出都是0,>0 的情況下,輸出等於輸入。

二維情況下,使用ReLU之後的效果如下:

此處輸入圖片的描述

ReLU 的優點:

此處輸入圖片的描述

  • 使用 ReLU 得到的SGD的收斂速度會比 sigmoid/tanh 快很多(看右圖)。相比於 sigmoid/tanh,ReLU 只需要一個閾值就可以得到啟用值,而不用去算一大堆複雜的運算。

ReLU 的缺點: 訓練的時候很容易就”die”了。

如果這個情況發生了,那麼這個神經元的梯度就永遠都會是0。實際操作中,如果你的learning rate 很大,那麼很有可能你網路中的40%的神經元都”dead”了。 

如果你設定了一個合適的較小的learning rate,這個問題發生的可能性也不大。

ReLU變體(Leaky-ReLU/P-ReLU/R-ReLU):

Leaky ReLU: 

Leaky Relu是用來解決ReLU這個 dead 的問題的。與 ReLU 不同的是: 

f(x)=αx(x<0) f(x)=x(x>=0)

這裡的 α 是一個很小的常數。這樣,即修正了資料分佈,又保留了一些負軸的值,使得負軸資訊不會全部丟失。

此處輸入圖片的描述

關於Leaky ReLU 的效果,有說好的,也有說不好的。

此處輸入圖片的描述

Parametric ReLU: 

對於 Leaky ReLU 中的α,通常都是通過先驗知識人工賦值的。 
然而可以觀察到,損失函式對α的導數我們是可以求得的,可不可以將它作為一個引數進行訓練呢? 
Kaiming He的論文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》指出,不僅可以訓練,而且效果更好。

原文說使用了Parametric ReLU後,最終效果比不用提高了1.03%.

Randomized ReLU: 
Randomized Leaky ReLU 是 leaky ReLU 的random 版本 (α 是random的)。
在訓練過程中,

α 是從一個高斯分佈 U(l,u) 中 隨機出來的,然後在測試過程中進行修正。

選擇啟用函式的建議:

一般情況下,使用ReLU會比較好

1、使用 ReLU,就要注意設定 learning rate,不要讓網路訓練過程中出現很多 “dead” 神經元;

2、如果“dead”無法解決,可以嘗試 Leaky ReLU、PReLU 、RReLU等Relu變體來替代ReLU;

3、不建議使用 sigmoid,如果一定要使用,也可以用 tanh來替代。