1. 程式人生 > >深度學習筆記2-啟用函式

深度學習筆記2-啟用函式

深度學習筆記2-啟用函式

目前啟用函式有sigmoid、Tanh、ReLU、LeakyReLU、ELU。

  1. Sigmoid函式
    在這裡插入圖片描述
    Sigmoid函式表示式 f ( x ) =

    1 1 + e x
    f(x) = \frac{1}{{1 + {e^{ - x}}}} Sigmoid函式在遠離座標原點的時候,函式梯度非常小,在梯度反向傳播時,會造成梯度消失(梯度彌散),無法更新引數,即無法學習。另外,Sigmoid函式的輸出不是以零為中心的,這會導致後層的神經元的輸入是非0均值的訊號。那麼對於後層的神經元,其區域性梯度 w
    = x × f ( x ) × ( 1 f ( x ) ) w'=x \times f(x) \times (1-f(x))
    永遠為正,假設更深層的神經元的梯度反向傳遞到這為 w w'' 。根據鏈式法則,此時後層神經元的全域性梯度為 w × w w'\times w'' 。當 w w'' 為正時,對於所有的連線權 w w ,其都往“負”方向修正(因為 w × w w'\times w'' 為正,要往負梯度方向修正);而當 w w'' 為負時,對於所有的連線權 w w ,其都往“正”方向修正。所以,如果想讓 w w 中的 w 1 w_1 往正方向修正的同時, w 2 w_2 往負方向修正是做不到的。對於 w = ( w 1 , w 2 , . . . , w n ) w=(w_1,w_2,...,w_n) 會造成一種捆綁的效果,使得收斂很慢。如果是按batch來訓練的話,不同的batch會得到不同的符號,能緩和一下這個問題。
    由於以上兩個缺點,sigmoid函式已經很少用了。

  2. Tanh函式
    在這裡插入圖片描述
    Tanh函式的表示式
    tanh ( x ) = e x e x e x + e x \tanh (x) = \frac{{{e^x} - {e^{ - x}}}}{{{e^x} + {e^{ - x}}}} Tanh函式能解決sigmoid函式輸出不是零均值的問題,但和sigmoid函式一樣,Tanh函式還是會存在很大的梯度彌散問題。

  3. ReLU函式
    在這裡插入圖片描述
    ReLU函式表示式為 f ( x ) = m a x ( 0 , x ) f(x)=max(0,x)
    ReLU函式在輸入為正的時候,不存在梯度彌散的問題,對梯度下降的收斂有巨大加速作用。同時由於它只是一個矩陣進行閾值計算,計算很簡單。但它也有兩個缺點,一個是當輸入x小於零時,梯度為零,ReLU神經元完全不會被啟用,導致相應引數永遠不會被更新;另一個和sigmoid一樣,輸出不是零均值的。

  4. LeakyReLU函式
    為了解決ReLU函式在輸入小於零神經元無法啟用的問題,人們提出了LeakyReLU函式。
    在這裡插入圖片描述
    該函式在輸入小於零時,給了一個小的梯度(斜率,比如0.01)。因此就算初始化到輸入x小於零,也能夠被優化。其表示式為 f ( x ) = m a x ( α x , x ) f(x)=max(\alpha x,x) α \alpha 為斜率。當把 α \alpha 作為引數訓練時,啟用函式就會變為PReLU。LeakyReLU以其優越的效能得到了廣泛的使用。

  5. ELU函式
    ELU函式也是ReLU函式的一個變形,也是為了解決輸入小於零神經元無法啟用的問題。
    在這裡插入圖片描述
    與LeakyReLU不同的是,當 x < 0 x<0 時, f ( x ) = α ( e x 1 ) f(x)=\alpha (e^x-1)

在tensorflow和pytorch中,都已經集成了這些啟用函式,可以拿來直接用。詳見:
http://www.tensorfly.cn/tfdoc/api_docs/python/nn.html#AUTOGENERATED-activation-functions
https://pytorch.org/docs/stable/nn.html#non-linear-activation-functions

參考:
深度學習使用到的啟用函式種類和優缺點解釋!
幾種常用啟用函式的簡介