轉載自:http://blog.csdn.net/cyh_24/article/details/50593400,感謝原博主的整理和分享。
日常 coding 中,我們會很自然的使用一些**函數,比如:sigmoid、ReLU等等。不過好像忘了問自己一()件事:
本文正是基於這些問題展開的,歡迎批評指正!
**函數通常有如下一些性質:
Sigmoid 是常用的非線性的**函數,它的數學形式如下:
正如前一節提到的,它能夠把輸入的連續實值「壓縮」到0和1之間。
特別的,如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1.
Sigmoid 函數曾經被使用的很多,不過近年來,用它的人越來越少了。主要是因爲它的一些 缺點:
tanh 是上圖中的右圖,可以看出,tanh 跟sigmoid還是很像的,實際上,tanh 是sigmoid的變形:
與 sigmoid 不同的是,tanh 是0均值的。因此,實際應用中,tanh 會比 sigmoid 更好(畢竟去粗取精了嘛)。
近年來,ReLU 變的越來越受歡迎。它的數學表達式如下:
很顯然,從圖左可以看出,輸入信號時,輸出都是0, 的情況下,輸出等於輸入。 是二維的情況下,使用ReLU之後的效果如下:
ReLU 的優點:
ReLU 的缺點: 當然 ReLU 也有缺點,就是訓練的時候很」脆弱」,很容易就」die」了. 什麼意思呢?
舉個例子:一個非常大的梯度流過一個 ReLU 神經元,更新過參數之後,這個神經元再也不會對任何數據有**現象了。
如果這個情況發生了,那麼這個神經元的梯度就永遠都會是0.
實際操作中,如果你的learning rate 很大,那麼很有可能你網絡中的40%的神經元都」dead」了。
當然,如果你設置了一個合適的較小的learning rate,這個問題發生的情況其實也不會太頻繁。
Leaky ReLUs: 就是用來解決這個 「dying ReLU」 的問題的。與 ReLU 不同的是:
這裏的 是一個很小的常數。這樣,即修正了數據分佈,又保留了一些負軸的值,使得負軸信息不會全部丟失。
關於Leaky ReLU 的效果,衆說紛紜,沒有清晰的定論。有些人做了實驗發現 Leaky ReLU 表現的很好;有些實驗則證明並不是這樣。
Parametric ReLU: 對於 Leaky ReLU 中的,通常都是通過先驗知識人工賦值的。
然而可以觀察到,損失函數對的導數我們是可以求得的,可不可以將它作爲一個參數進行訓練呢?
Kaiming He的論文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》指出,不僅可以訓練,而且效果更好。
公式非常簡單,反向傳播至未**前的神經元的公式就不寫了,很容易就能得到。對的導數如下:
原文說使用了Parametric ReLU後,最終效果比不用提高了1.03%.
Randomized ReLU:
Randomized Leaky ReLU 是 leaky ReLU 的random 版本 ( 是random的).
它首次試在 kaggle 的NDSB 比賽中被提出的。
核心思想就是,在訓練過程中, 是從一個高斯分佈 中 隨機出來的,然後再測試過程中進行修正(有點像dropout的用法)。
數學表示如下:
在測試階段,把訓練過程中所有的 取個平均值。NDSB 冠軍的 是從 中隨機出來的。那麼,在測試階段,**函數就是就是:
看看 cifar-100 中的實驗結果:
Maxout出現在ICML2013上,作者Goodfellow將maxout和dropout結合後,號稱在MNIST, CIFAR-10, CIFAR-100, SVHN這4個數據上都取得了start-of-art的識別率。
Maxout 公式如下:
假設 是2維,那麼有:
可以注意到,ReLU 和 Leaky ReLU 都是它的一個變形(比如, 的時候,就是 ReLU).
Maxout的擬合能力是非常強的,它可以擬合任意的的凸函數。作者從數學的角度上也證明了這個結論,即只需2個maxout節點就可以擬合任意的凸函數了(相減),前提是」隱隱含層」節點的個數可以任意多.
所以,Maxout 具有 ReLU 的優點(如:計算簡單,不會 saturation),同時又沒有 ReLU 的一些缺點 (如:容易 Go die)。不過呢,還是有一些缺點的嘛:就是把參數double了。
還有其他一些**函數,請看下錶:
怎麼選擇**函數呢?
我覺得這種問題不可能有定論的吧,只能說是個人建議。
如果你使用 ReLU,那麼一定要小心設置 learning rate,而且要注意不要讓你的網絡出現很多 「dead」 神經元,如果這個問題不好解決,那麼可以試試 Leaky ReLU、PReLU 或者 Maxout.
友情提醒:最好不要用 sigmoid,你可以試試 tanh,不過可以預期它的效果會比不上 ReLU 和 Maxout.
還有,通常來說,很少會把各種**函數串起來在一個網絡中使用的。
[1]. http://www.faqs.org/faqs/ai-faq/neural-nets/part2/section-10.html
[2]. http://papers.nips.cc/paper/874-how-to-choose-an-activation-function.pdf
[3]. https://en.wikipedia.org/wiki/Activation_function
[4]. http://cs231n.github.io/neural-networks-1/