1 激活函數(Activation functions)
之前用過 sigmoid 函數,sigmoid 函數在這里被稱為激活函數,公式為:
更通常的情況下,使用不同的函數g(z[1]),g可以是除了 sigmoid 函數意外的非線性函數 ,效果總是優於 sigmoid 函數,因為函數值域在-1 和+1的激活函數,其均值是更接近零均值的。
tanh 函數或者雙曲正切函數是總體上都優於 sigmoid 函數的激活函數,,tanh 函數是 sigmoid 的向下平移和伸縮后的結果,對它進行了變形后,穿過了(0,0)點,並且值域介於+1 和-1 之間,sigmoid 函數和 tanh 函數兩者共同的缺點是,在z特別大或者特別小的情況下,導數的梯度或者函數的斜率會變得特別小,最后就會接近於 0,導致降低梯度下降的速度,公式為:
在機器學習另一個很流行的函數是:修正線性單元的函數(ReLu),ReLu 函數圖像是如下圖:
另一個版本的 Relu 被稱為 Leaky Relu,當z是負值時,這個函數的值不是等於 0,而是輕微的傾斜,這個函數通常比 Relu 激活函數效果要好,盡管在實際中 Leaky ReLu 使用的並不多,如圖:
這是一些選擇激活函數的經驗法則:
sigmoid 激活函數:除了輸出層是一個二分類問題基本不會用它。
tanh 激活函數:tanh 是非常優秀的,幾乎適合所有場合。
ReLu 激活函數:最常用的默認函數,,如果不確定用哪個激活函數,就使用 ReLu 或者Leaky ReLu。
1.51為什么需要非線性激活函數?(why need a nonlinear activation function?)
如果你是用線性激活函數或者叫恆等激勵函數,那么神經網絡只是把輸入線性組合再輸出,事實證明,如果你使用線性激活函數或者沒有使用一個激活函數,那么無論你的神經網絡有多少層一直在做的只是計算線性函數,相當於不如直接去掉全部隱藏層,所以除非你引入非線性,否則你無法計算更有趣的函數,即使你的網絡層數再多也不行。總而言之,不能在隱藏層用線性激活函數,可以用 ReLU 或者 tanh 或者 leaky ReLU 或者其他的非線性激活函數,唯一可以用線性激活函數的通常就是輸出層。還有一些特殊情況,不做討論。
1.2 激活函數的導數(Derivatives of activation functions)
(1)sigmoid激活函數
(2)Tanh激活函數
(3)Rectified Linear Unit (ReLU)
注:通常在z= 0 的時候給定其導數 1,0;當然z=0 的情況很少
(4)Leaky linear unit (Leaky ReLU)
注:通常在z= 0的時候給定其導數 1,0.01;當然z = 0的情況很少