神经网络入门篇:激活函数(Activation functions)
激活函數(shù)
使用一個神經(jīng)網(wǎng)絡(luò)時,需要決定使用哪種激活函數(shù)用隱藏層上,哪種用在輸出節(jié)點上。到目前為止,之前的博客只用過sigmoid激活函數(shù),但是,有時其他的激活函數(shù)效果會更好。
在神經(jīng)網(wǎng)路的前向傳播中,\(a^{[1]} = \sigma(z^{[1]})\)和\(a^{[2]} =\sigma(z^{[2]})\)這兩步會使用到sigmoid函數(shù)。sigmoid函數(shù)在這里被稱為激活函數(shù)。
公式1.18:
\(a = \sigma(z) = \frac{1}{{1 + e}^{- z}}\)
更通常的情況下,使用不同的函數(shù)\(g( z^{[1]})\),\(g\)可以是除了sigmoid函數(shù)以外的非線性函數(shù)。tanh函數(shù)或者雙曲正切函數(shù)是總體上都優(yōu)于sigmoid函數(shù)的激活函數(shù)。
如圖,\(a = tan(z)\)的值域是位于+1和-1之間。
公式1.19:
\(a= tanh(z) = \frac{e^{z} - e^{- z}}{e^{z} + e^{- z}}\)
事實上,tanh函數(shù)是sigmoid的向下平移和伸縮后的結(jié)果。對它進行了變形后,穿過了\((0,0)\)點,并且值域介于+1和-1之間。
結(jié)果表明,如果在隱藏層上使用函數(shù)
公式1.20:
$g(z^{[1]}) = tanh(z^{[1]}) $
效果總是優(yōu)于sigmoid函數(shù)。因為函數(shù)值域在-1和+1的激活函數(shù),其均值是更接近零均值的。在訓(xùn)練一個算法模型時,如果使用tanh函數(shù)代替sigmoid函數(shù)中心化數(shù)據(jù),使得數(shù)據(jù)的平均值更接近0而不是0.5.
這會使學(xué)習(xí)下一層簡單一點。
在討論優(yōu)化算法時,有一點要說明:我基本已經(jīng)不用sigmoid激活函數(shù)了,tanh函數(shù)在所有場合都優(yōu)于sigmoid函數(shù)。
但有一個例外:在二分類的問題中,對于輸出層,因為\(y\)的值是0或1,所以想讓\(\hat{y}\)的數(shù)值介于0和1之間,而不是在-1和+1之間。所以需要使用sigmoid激活函數(shù)。這里的
公式1.21:
\(g(z^{[2]}) = \sigma(z^{[2]})\)
在這個例子里看到的是,對隱藏層使用tanh激活函數(shù),輸出層使用sigmoid函數(shù)。
所以,在不同的神經(jīng)網(wǎng)絡(luò)層中,激活函數(shù)可以不同。為了表示不同的激活函數(shù),在不同的層中,使用方括號上標(biāo)來指出\(g\)上標(biāo)為\([1]\)的激活函數(shù),可能會跟\(g\)上標(biāo)為\([2]\)不同。方括號上標(biāo)\([1]\)代表隱藏層,方括號上標(biāo)\([2]\)表示輸出層。
sigmoid函數(shù)和tanh函數(shù)兩者共同的缺點是,在\(z\)特別大或者特別小的情況下,導(dǎo)數(shù)的梯度或者函數(shù)的斜率會變得特別小,最后就會接近于0,導(dǎo)致降低梯度下降的速度。
在機器學(xué)習(xí)另一個很流行的函數(shù)是:修正線性單元的函數(shù)(ReLu),ReLu函數(shù)圖像是如下圖。
公式1.22:
\(a =max(0,z)\)
所以,只要\(z\)是正值的情況下,導(dǎo)數(shù)恒等于1,當(dāng)\(z\)是負值的時候,導(dǎo)數(shù)恒等于0。從實際上來說,當(dāng)使用\(z\)的導(dǎo)數(shù)時,\(z\)=0的導(dǎo)數(shù)是沒有定義的。但是當(dāng)編程實現(xiàn)的時候,\(z\)的取值剛好等于0.00000001,這個值相當(dāng)小,所以,在實踐中,不需要擔(dān)心這個值,\(z\)是等于0的時候,假設(shè)一個導(dǎo)數(shù)是1或者0效果都可以。
這有一些選擇激活函數(shù)的經(jīng)驗法則:
如果輸出是0、1值(二分類問題),則輸出層選擇sigmoid函數(shù),然后其它的所有單元都選擇Relu函數(shù)。
這是很多激活函數(shù)的默認選擇,如果在隱藏層上不確定使用哪個激活函數(shù),那么通常會使用Relu激活函數(shù)。有時,也會使用tanh激活函數(shù),但Relu的一個優(yōu)點是:當(dāng)\(z\)是負值的時候,導(dǎo)數(shù)等于0。
這里也有另一個版本的Relu被稱為Leaky Relu。
當(dāng)\(z\)是負值時,這個函數(shù)的值不是等于0,而是輕微的傾斜,如圖。
這個函數(shù)通常比Relu激活函數(shù)效果要好,盡管在實際中Leaky ReLu使用的并不多。
圖1.6.1
兩者的優(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ù)在正負飽和區(qū)的梯度都會接近于0,這會造成梯度彌散,而Relu和Leaky ReLu函數(shù)大于0部分都為常數(shù),不會產(chǎn)生梯度彌散現(xiàn)象。(同時應(yīng)該注意到的是,Relu進入負半?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ù):最常用的默認函數(shù),如果不確定用哪個激活函數(shù),就使用ReLu或者Leaky ReLu。
公式3.23:
\(a = max( 0.01z,z)\)
為什么常數(shù)是0.01?當(dāng)然,可以為學(xué)習(xí)算法選擇不同的參數(shù)。
在選擇自己神經(jīng)網(wǎng)絡(luò)的激活函數(shù)時,有一定的直觀感受,在深度學(xué)習(xí)中的經(jīng)常遇到一個問題:在編寫神經(jīng)網(wǎng)絡(luò)的時候,會有很多選擇:隱藏層單元的個數(shù)、激活函數(shù)的選擇、初始化權(quán)值……這些選擇想得到一個對比較好的指導(dǎo)原則是挺困難的。
鑒于以上三個原因,以及在工業(yè)界的見聞,提供一種直觀的感受,哪一種工業(yè)界用的多,哪一種用的少。但是,自己的神經(jīng)網(wǎng)絡(luò)的應(yīng)用,以及其特殊性,是很難提前知道選擇哪些效果更好。所以通常的建議是:如果不確定哪一個激活函數(shù)效果更好,可以把它們都試試,然后在驗證集或者發(fā)展集上進行評價。然后看哪一種表現(xiàn)的更好,就去使用它。
為自己的神經(jīng)網(wǎng)絡(luò)的應(yīng)用測試這些不同的選擇,會在以后檢驗自己的神經(jīng)網(wǎng)絡(luò)或者評估算法的時候,看到不同的效果。如果僅僅遵守使用默認的ReLu激活函數(shù),而不要用其他的激勵函數(shù),那就可能在近期或者往后,每次解決問題的時候都使用相同的辦法。
總結(jié)
以上是生活随笔為你收集整理的神经网络入门篇:激活函数(Activation functions)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 脚踏esbuild祥云,胸怀tsx利刃,
- 下一篇: 最佳实践-使用Github Action