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