【DL】激活函數

1.激活函數的選擇

使用一個神經網絡時,需要決定使用哪種激活函數用隱藏層上,哪種用在輸出節點上。

sigmoid: a=σ(z)=11+eza = \sigma(z) = \frac{1}{{1 + e}^{- z}}

tanh: a=tanh(z)=ezezez+eza= tanh(z) = \frac{e^{z} - e^{- z}}{e^{z} + e^{- z}}

ReLu: a=max(0,z)a =max( 0,z)

圖像如下:
在這裏插入圖片描述

tanh 函數是 sigmoid 的向下平移和伸縮後的結果。對它進行了變形後,穿過了(0,0)點,並且值域介於+1 和-1 之間。
結果表明,如果在隱藏層上使用函數tanh效果總是優於 sigmoid 函數。因爲函數值域在-1 和+1的激活函數,其均值是更接近零均值的。在訓練一個算法模型時,如果使用 tanh 函數代替sigmoid 函數中心化數據,使得數據的平均值更接近 0 而不是 0.5。
tanh函數在所有場合都優於sigmoid函數。

但有一個例外:在二分類的問題中,對於輸出層,因爲yy​的值是0或1,所以想讓y^\hat{y}​的數值介於0和1之間,而不是在-1和+1之間。所以需要使用sigmoid激活函數。

sigmoid函數和tanh函數兩者共同的缺點是,在zz特別大或者特別小的情況下,導數的梯度或者函數的斜率會變得特別小,最後就會接近於0,導致降低梯度下降的速度。

另一個很流行的函數是:修正線性單元的函數(ReLu
只要zz是正值的情況下,導數恆等於1,當zz是負值的時候,導數恆等於0。從實際上來說,當使用zz的導數時,zz=0的導數是沒有定義的。但是當編程實現的時候,zz的取值剛好等於0.00000001,這個值相當小,所以,在實踐中,不需要擔心這個值,zz是等於0的時候,假設一個導數是1或者0效果都可以。

選擇激活函數的經驗法則:

如果輸出是0、1值(二分類問題),則輸出層選擇sigmoid函數,然後其它的所有單元都選擇Relu函數。

這是很多激活函數的默認選擇,如果在隱藏層上不確定使用哪個激活函數,那麼通常會使用Relu激活函數。有時,也會使用tanh激活函數,但Relu的一個優點是:當zz是負值的時候,導數等於0。

這裏也有另一個版本的Relu被稱爲Leaky Relu

zz是負值時,這個函數的值不是等於0,而是輕微的傾斜。

這個函數通常比Relu激活函數效果要好,儘管在實際中Leaky ReLu使用的並不多。

兩者的優點是:

第一,在zz​的區間變動很大的情況下,激活函數的導數或者激活函數的斜率都會遠大於0,在程序實現就是一個if-else語句,而sigmoid函數需要進行浮點四則運算,在實踐中,使用ReLu激活函數神經網絡通常會比使用sigmoid或者tanh激活函數學習的更快。

第二,sigmoidtanh函數的導數在正負飽和區的梯度都會接近於0,這會造成梯度彌散,而ReluLeaky ReLu函數大於0部分都爲常數,不會產生梯度彌散現象。(同時應該注意到的是,Relu進入負半區的時候,梯度爲0,神經元此時不會訓練,產生所謂的稀疏性,而Leaky ReLu不會有這問題)

zzReLu的梯度一半都是0,但是,有足夠的隱藏層使得z值大於0,所以對大多數的訓練數據來說學習過程仍然可以很快。

概括一下不同激活函數的過程和結論

sigmoid激活函數:除了輸出層是一個二分類問題基本不會用它。

tanh激活函數:tanh是非常優秀的,幾乎適合所有場合。

ReLu激活函數:最常用的默認函數,如果不確定用哪個激活函數,就使用ReLu或者Leaky ReLu
Leaky ReLua=max(0.01z,z)a = max( 0.01z,z)
爲什麼常數是0.01?當然,可以爲學習算法選擇不同的參數。

在選擇自己神經網絡的激活函數時,有一定的直觀感受,在深度學習中的經常遇到一個問題:在編寫神經網絡的時候,會有很多選擇:隱藏層單元的個數、激活函數的選擇、初始化權值……這些選擇想得到一個對比較好的指導原則是挺困難的。

鑑於以上三個原因,以及在工業界的見聞,提供一種直觀的感受,哪一種工業界用的多,哪一種用的少。但是,自己的神經網絡的應用,以及其特殊性,是很難提前知道選擇哪些效果更好。所以通常的建議是:如果不確定哪一個激活函數效果更好,可以把它們都試試,然後在驗證集或者發展集上進行評價。然後看哪一種表現的更好,就去使用它。

2.爲什麼要用非線性激活函數

爲什麼神經網絡需要非線性激活函數?事實證明:要讓神經網絡能夠計算出有趣的函數,必須使用非線性激活函數。如果是用線性激活函數或者叫恆等激勵函數,那麼神經網絡只是把輸入線性組合再輸出。

證明如下:
這是神經網絡正向傳播的方程,現在我們去掉函數gg,然後令a[1]=z[1]a^{[1]} = z^{[1]},或者我們也可以令g(z)=zg(z)=z,這個有時被叫做線性激活函數(更學術點的名字是恆等激勵函數,因爲它們就是把輸入值輸出)。爲了說明問題我們把a[2]=z[2]a^{[2]} = z^{[2]},那麼這個模型的輸出yy或僅僅只是輸入特徵xx的線性組合。

如果我們改變前面的式子,令:
(1) a[1]=z[1]=W[1]x+b[1]a^{[1]} = z^{[1]} = W^{[1]}x + b^{[1]}

(2) a[2]=z[2]=W[2]a[1]+b[2]a^{[2]} = z^{[2]} = W^{[2]}a^{[1]}+ b^{[2]}
將式子(1)代入式子(2)中,則:
a[2]=z[2]=W[2](W[1]x+b[1])+b[2]a^{[2]} = z^{[2]} = W^{[2]}(W^{[1]}x + b^{[1]}) + b^{[2]}

(3) a[2]=z[2]=W[2]W[1]x+W[2]b[1]+b[2]a^{[2]} = z^{[2]} = W^{[2]}W^{[1]}x + W^{[2]}b^{[1]} + b^{[2]}
簡化多項式得
a[2]=z[2]=Wx+ba^{[2]} = z^{[2]} = W^{'}x + b^{'}

只有一個地方可以使用線性激活函數------g(z)=zg(z)=z,就是在做機器學習中的迴歸問題。yy 是一個實數,舉個例子,比如你想預測房地產價格,yy 就不是二分類任務0或1,而是一個實數,從0到正無窮。如果yy 是個實數,那麼在輸出層用線性激活函數也許可行,你的輸出也是一個實數,從負無窮到正無窮。

總而言之,不能在隱藏層用線性激活函數,可以用ReLU或者tanh或者leaky ReLU或者其他的非線性激活函數,唯一可以用線性激活函數的通常就是輸出層;除了這種情況,會在隱層用線性函數的,除了一些特殊情況,比如與壓縮有關的。在這之外,在隱層使用線性激活函數非常少見。因爲房價都是非負數,所以我們也可以在輸出層使用ReLU函數這樣你的y^\hat{y}都大於等於0。

3.激活函數的導數

在神經網絡中使用反向傳播的時候,你真的需要計算激活函數的斜率或者導數。針對以下四種激活,求其導數如下:

1)sigmoid activation function

在這裏插入圖片描述

ddzg(z)=11+ez(111+ez)=g(z)(1g(z))\frac{d}{dz}g(z) = {\frac{1}{1 + e^{-z}} (1-\frac{1}{1 + e^{-z}})}=g(z)(1-g(z))

代入數字驗證:
zz = 10或z=10z= -10 ; ddzg(z)0\frac{d}{dz}g(z)\approx0

zz= 0 , ddzg(z)=g(z)(1-g(z))=1/4\frac{d}{dz}g(z)\text{=g(z)(1-g(z))=}{1}/{4}

在神經網絡中a=g(z)a= g(z); g(z)=ddzg(z)=a(1a)g{{(z)}^{'}}=\frac{d}{dz}g(z)=a(1-a)

  1. Tanh activation function

在這裏插入圖片描述

g(z)=tanh(z)=ezezez+ezg(z) = tanh(z) = \frac{e^{z} - e^{-z}}{e^{z} + e^{-z}}

導數爲:
ddzg(z)=1(tanh(z))2\frac{d}{{d}z}g(z) = 1 - (tanh(z))^{2}

代入數字驗證:

zz = 10或z=10z= -10 ddzg(z)0\frac{d}{dz}g(z)\approx0

zz = 0, ddzg(z)=1-(0)=1\frac{d}{dz}g(z)\text{=1-(0)=}1

在神經網絡中a=g(z)a= g(z); g(z)=ddzg(z)=1(tanh(z))2g{{(z)}^{'}}=\frac{d}{dz}g(z)=1 - (tanh(z))^{2}

3)Rectified Linear Unit (ReLU)

在這裏插入圖片描述
g(z)=max(0,z)g(z)={0if z < 01if z > 0undefinedif z = 0 g(z)=\max(0,z) \\ \\ \\ g(z)^{'}= \begin{cases} 0& \text{if z < 0}\\ 1& \text{if z > 0}\\ undefined& \text{if z = 0} \end{cases}

注:通常在zz= 0的時候給定其導數1,0(雖然這一點並不可微);當然zz=0的情況很少

4)Leaky linear unit (Leaky ReLU)

ReLU類似
g(z)=max(0.01z,z)g(z)={0.01if z < 01if z > 0undefinedif z = 0 g(z)=\max(0.01z,z) \\ \\ \\ g(z)^{'}= \begin{cases} 0.01& \text{if z < 0}\\ 1& \text{if z > 0}\\ undefined& \text{if z = 0} \end{cases}

注:通常在z=0z = 0的時候給定其導數1,0.01;當然z=0z=0的情況很少。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章