1.激活函數的選擇
使用一個神經網絡時,需要決定使用哪種激活函數用隱藏層上,哪種用在輸出節點上。
sigmoid:
tanh:
ReLu:
圖像如下:
tanh 函數是 sigmoid 的向下平移和伸縮後的結果。對它進行了變形後,穿過了(0,0)點,並且值域介於+1 和-1 之間。
結果表明,如果在隱藏層上使用函數tanh效果總是優於 sigmoid 函數。因爲函數值域在-1 和+1的激活函數,其均值是更接近零均值的。在訓練一個算法模型時,如果使用 tanh 函數代替sigmoid 函數中心化數據,使得數據的平均值更接近 0 而不是 0.5。
tanh函數在所有場合都優於sigmoid函數。
但有一個例外:在二分類的問題中,對於輸出層,因爲的值是0或1,所以想讓的數值介於0和1之間,而不是在-1和+1之間。所以需要使用sigmoid激活函數。
sigmoid函數和tanh函數兩者共同的缺點是,在特別大或者特別小的情況下,導數的梯度或者函數的斜率會變得特別小,最後就會接近於0,導致降低梯度下降的速度。
另一個很流行的函數是:修正線性單元的函數(ReLu)
只要是正值的情況下,導數恆等於1,當是負值的時候,導數恆等於0。從實際上來說,當使用的導數時,=0的導數是沒有定義的。但是當編程實現的時候,的取值剛好等於0.00000001,這個值相當小,所以,在實踐中,不需要擔心這個值,是等於0的時候,假設一個導數是1或者0效果都可以。
選擇激活函數的經驗法則:
如果輸出是0、1值(二分類問題),則輸出層選擇sigmoid函數,然後其它的所有單元都選擇Relu函數。
這是很多激活函數的默認選擇,如果在隱藏層上不確定使用哪個激活函數,那麼通常會使用Relu激活函數。有時,也會使用tanh激活函數,但Relu的一個優點是:當是負值的時候,導數等於0。
這裏也有另一個版本的Relu被稱爲Leaky Relu。
當是負值時,這個函數的值不是等於0,而是輕微的傾斜。
這個函數通常比Relu激活函數效果要好,儘管在實際中Leaky ReLu使用的並不多。
兩者的優點是:
第一,在的區間變動很大的情況下,激活函數的導數或者激活函數的斜率都會遠大於0,在程序實現就是一個if-else語句,而sigmoid函數需要進行浮點四則運算,在實踐中,使用ReLu激活函數神經網絡通常會比使用sigmoid或者tanh激活函數學習的更快。
第二,sigmoid和tanh函數的導數在正負飽和區的梯度都會接近於0,這會造成梯度彌散,而Relu和Leaky ReLu函數大於0部分都爲常數,不會產生梯度彌散現象。(同時應該注意到的是,Relu進入負半區的時候,梯度爲0,神經元此時不會訓練,產生所謂的稀疏性,而Leaky ReLu不會有這問題)
在ReLu的梯度一半都是0,但是,有足夠的隱藏層使得z值大於0,所以對大多數的訓練數據來說學習過程仍然可以很快。
概括一下不同激活函數的過程和結論
sigmoid激活函數:除了輸出層是一個二分類問題基本不會用它。
tanh激活函數:tanh是非常優秀的,幾乎適合所有場合。
ReLu激活函數:最常用的默認函數,如果不確定用哪個激活函數,就使用ReLu或者Leaky ReLu。
Leaky ReLu:
爲什麼常數是0.01?當然,可以爲學習算法選擇不同的參數。
在選擇自己神經網絡的激活函數時,有一定的直觀感受,在深度學習中的經常遇到一個問題:在編寫神經網絡的時候,會有很多選擇:隱藏層單元的個數、激活函數的選擇、初始化權值……這些選擇想得到一個對比較好的指導原則是挺困難的。
鑑於以上三個原因,以及在工業界的見聞,提供一種直觀的感受,哪一種工業界用的多,哪一種用的少。但是,自己的神經網絡的應用,以及其特殊性,是很難提前知道選擇哪些效果更好。所以通常的建議是:如果不確定哪一個激活函數效果更好,可以把它們都試試,然後在驗證集或者發展集上進行評價。然後看哪一種表現的更好,就去使用它。
2.爲什麼要用非線性激活函數
爲什麼神經網絡需要非線性激活函數?事實證明:要讓神經網絡能夠計算出有趣的函數,必須使用非線性激活函數。如果是用線性激活函數或者叫恆等激勵函數,那麼神經網絡只是把輸入線性組合再輸出。
證明如下:
這是神經網絡正向傳播的方程,現在我們去掉函數,然後令,或者我們也可以令,這個有時被叫做線性激活函數(更學術點的名字是恆等激勵函數,因爲它們就是把輸入值輸出)。爲了說明問題我們把,那麼這個模型的輸出或僅僅只是輸入特徵的線性組合。
如果我們改變前面的式子,令:
(1)
(2)
將式子(1)代入式子(2)中,則:
(3)
簡化多項式得
只有一個地方可以使用線性激活函數------,就是在做機器學習中的迴歸問題。 是一個實數,舉個例子,比如你想預測房地產價格, 就不是二分類任務0或1,而是一個實數,從0到正無窮。如果 是個實數,那麼在輸出層用線性激活函數也許可行,你的輸出也是一個實數,從負無窮到正無窮。
總而言之,不能在隱藏層用線性激活函數,可以用ReLU或者tanh或者leaky ReLU或者其他的非線性激活函數,唯一可以用線性激活函數的通常就是輸出層;除了這種情況,會在隱層用線性函數的,除了一些特殊情況,比如與壓縮有關的。在這之外,在隱層使用線性激活函數非常少見。因爲房價都是非負數,所以我們也可以在輸出層使用ReLU函數這樣你的都大於等於0。
3.激活函數的導數
在神經網絡中使用反向傳播的時候,你真的需要計算激活函數的斜率或者導數。針對以下四種激活,求其導數如下:
1)sigmoid activation function
代入數字驗證:
當 = 10或 ;
當= 0 ,
在神經網絡中;
- Tanh activation function
導數爲:
代入數字驗證:
當 = 10或
當 = 0,
在神經網絡中;
3)Rectified Linear Unit (ReLU)
注:通常在= 0的時候給定其導數1,0(雖然這一點並不可微);當然=0的情況很少
4)Leaky linear unit (Leaky ReLU)
與ReLU類似
注:通常在的時候給定其導數1,0.01;當然的情況很少。