通識講解
在討論優(yōu)化算法時,有一點要說明:我基本已經(jīng)不用sigmoid激活函數(shù)了,tanh函數(shù)在所有場合都優(yōu)于sigmoid函數(shù)。
但有一個例外:在二分類的問題中,對于輸出層,因為y的值是0或1,所以想讓y帽的數(shù)值介于0和1之間,而不是在-1和+1之間。所以需要使用sigmoid激活函數(shù)。
在這個例子里看到的是,對隱藏層使用tanh激活函數(shù),輸出層使用sigmoid函數(shù)所以,在不同的神經(jīng)網(wǎng)絡(luò)層中,激活函數(shù)可以不同。
sigmoid函數(shù)和tanh函數(shù)兩者共同的缺點是,在[if !msEquation] [endif]特別大或者特別小的情況下,導(dǎo)數(shù)的梯度或者函數(shù)的斜率會變得特別小,最后就會接近于0,導(dǎo)致降低梯度下降的速度。
在機器學(xué)習(xí)另一個很流行的函數(shù)是:修正線性單元的函數(shù)(ReLu),ReLu函數(shù)圖像是如下圖。所以,只要z是正值的情況下,導(dǎo)數(shù)恒等于1,當(dāng)z是負(fù)值的時候,導(dǎo)數(shù)恒等于0。從實際上來說,當(dāng)使用z的導(dǎo)數(shù)時,z=0的導(dǎo)數(shù)是沒有定義的。但是當(dāng)編程實現(xiàn)的時候,z的取值剛好等于0.0000000,這個值相當(dāng)小,所以,在實踐中,不需要擔(dān)心這個值,z是等于0的時候,假設(shè)一個導(dǎo)數(shù)是1或者0效果都可以。
這有一些選擇激活函數(shù)的經(jīng)驗法則:
如果輸出是0、1值(二分類問題),則輸出層選擇sigmoid函數(shù),然后其它的所有單元都選擇Relu函數(shù)。
這是很多激活函數(shù)的默認(rèn)選擇,如果在隱藏層上不確定使用哪個激活函數(shù),那么通常會使用Relu激活函數(shù)。有時,也會使用tanh激活函數(shù),但Relu的一個優(yōu)點是:當(dāng)z是負(fù)值的時候,導(dǎo)數(shù)等于0。
這里也有另一個版本的Relu被稱為Leaky Relu。
當(dāng)z是負(fù)值時,這個函數(shù)的值不是等于0,而是輕微的傾斜,如圖。
這個函數(shù)通常比Relu激活函數(shù)效果要好,盡管在實際中Leaky ReLu使用的并不多。
Relu與Leaky ReLu兩者的優(yōu)點是:
第一,在z的區(qū)間變動很大的情況下,激活函數(shù)的導(dǎo)數(shù)或者激活函數(shù)的斜率都會遠大于0,在程序?qū)崿F(xiàn)就是一個if-else語句,而sigmoid函數(shù)需要進行浮點四則運算,在實踐中,使用ReLu激活函數(shù)神經(jīng)網(wǎng)絡(luò)通常會比使用sigmoid或者tanh激活函數(shù)學(xué)習(xí)的更快。
第二,sigmoid和tanh函數(shù)的導(dǎo)數(shù)在正負(fù)飽和區(qū)的梯度都會接近于0,這會造成梯度彌散,而Relu和Leaky ReLu函數(shù)大于0部分都為常熟,不會產(chǎn)生梯度彌散現(xiàn)象。(同時應(yīng)該注意到的是,Relu進入負(fù)半?yún)^(qū)的時候,梯度為0,神經(jīng)元此時不會訓(xùn)練,產(chǎn)生所謂的稀疏性,而Leaky ReLu不會有這問題)
z在ReLu的梯度一半都是0,但是,有足夠的隱藏層使得z值大于0,所以對大多數(shù)的訓(xùn)練數(shù)據(jù)來說學(xué)習(xí)過程仍然可以很快。
快速概括一下不同激活函數(shù)的過程和結(jié)論。
sigmoid激活函數(shù):除了輸出層是一個二分類問題基本不會用它。
tanh激活函數(shù):tanh是非常優(yōu)秀的,幾乎適合所有場合。
ReLu激活函數(shù):最常用的默認(rèn)函數(shù),,如果不確定用哪個激活函數(shù),就使用ReLu或者Leaky ReLu。