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