神经网络之激活函数面面观
轉(zhuǎn)載自:
【機(jī)器學(xué)習(xí)】神經(jīng)網(wǎng)絡(luò)之激活函數(shù)面面觀 - 仙道菜 - 博客頻道 - CSDN.NET
http://blog.csdn.net/cyh_24/article/details/50593400
日常 coding 中,我們會很自然的使用一些激活函數(shù),比如:sigmoid、ReLU等等。不過好像忘了問自己一(n)件事:
本文正是基于這些問題展開的,歡迎批評指正!
(此圖并沒有什么卵用,純屬為了裝x …)
Why use activation functions?
激活函數(shù)通常有如下一些性質(zhì):
- 非線性:?當(dāng)激活函數(shù)是線性的時候,一個兩層的神經(jīng)網(wǎng)絡(luò)就可以逼近基本上所有的函數(shù)了。但是,如果激活函數(shù)是恒等激活函數(shù)的時候(即f(x)=x),就不滿足這個性質(zhì)了,而且如果MLP使用的是恒等激活函數(shù),那么其實整個網(wǎng)絡(luò)跟單層神經(jīng)網(wǎng)絡(luò)是等價的。
- 可微性:?當(dāng)優(yōu)化方法是基于梯度的時候,這個性質(zhì)是必須的。
- 單調(diào)性:?當(dāng)激活函數(shù)是單調(diào)的時候,單層網(wǎng)絡(luò)能夠保證是凸函數(shù)。
- f(x)≈x:?當(dāng)激活函數(shù)滿足這個性質(zhì)的時候,如果參數(shù)的初始化是random的很小的值,那么神經(jīng)網(wǎng)絡(luò)的訓(xùn)練將會很高效;如果不滿足這個性質(zhì),那么就需要很用心的去設(shè)置初始值。
- 輸出值的范圍:?當(dāng)激活函數(shù)輸出值是?有限?的時候,基于梯度的優(yōu)化方法會更加?穩(wěn)定,因為特征的表示受有限權(quán)值的影響更顯著;當(dāng)激活函數(shù)的輸出是?無限?的時候,模型的訓(xùn)練會更加高效,不過在這種情況小,一般需要更小的learning rate.
這些性質(zhì),也正是我們使用激活函數(shù)的原因!
Activation Functions.
Sigmoid
Sigmoid 是常用的非線性的激活函數(shù),它的數(shù)學(xué)形式如下:?
正如前一節(jié)提到的,它能夠把輸入的連續(xù)實值“壓縮”到0和1之間。?
特別的,如果是非常大的負(fù)數(shù),那么輸出就是0;如果是非常大的正數(shù),輸出就是1.?
sigmoid 函數(shù)曾經(jīng)被使用的很多,不過近年來,用它的人越來越少了。主要是因為它的一些?缺點:
- Sigmoids saturate and kill gradients.?(saturate 這個詞怎么翻譯?飽和?)sigmoid 有一個非常致命的缺點,當(dāng)輸入非常大或者非常小的時候(saturation),這些神經(jīng)元的梯度是接近于0的,從圖中可以看出梯度的趨勢。所以,你需要尤其注意參數(shù)的初始值來盡量避免saturation的情況。如果你的初始值很大的話,大部分神經(jīng)元可能都會處在saturation的狀態(tài)而把gradient kill掉,這會導(dǎo)致網(wǎng)絡(luò)變的很難學(xué)習(xí)。
- Sigmoid 的 output 不是0均值.?這是不可取的,因為這會導(dǎo)致后一層的神經(jīng)元將得到上一層輸出的非0均值的信號作為輸入。?
產(chǎn)生的一個結(jié)果就是:如果數(shù)據(jù)進(jìn)入神經(jīng)元的時候是正的(e.g.?x>0?elementwise in?f=wTx+b),那么?w?計算出的梯度也會始終都是正的。?
當(dāng)然了,如果你是按batch去訓(xùn)練,那么那個batch可能得到不同的信號,所以這個問題還是可以緩解一下的。因此,非0均值這個問題雖然會產(chǎn)生一些不好的影響,不過跟上面提到的 kill gradients 問題相比還是要好很多的。
tanh
tanh 是上圖中的右圖,可以看出,tanh 跟sigmoid還是很像的,實際上,tanh 是sigmoid的變形:?
與 sigmoid 不同的是,tanh 是0均值的。因此,實際應(yīng)用中,tanh 會比 sigmoid 更好(畢竟去粗取精了嘛)。
ReLU
近年來,ReLU 變的越來越受歡迎。它的數(shù)學(xué)表達(dá)式如下:?
很顯然,從圖左可以看出,輸入信號<0時,輸出都是0,>0?的情況下,輸出等于輸入。w?是二維的情況下,使用ReLU之后的效果如下:
ReLU 的優(yōu)點:
- Krizhevsky et al.?發(fā)現(xiàn)使用 ReLU 得到的SGD的收斂速度會比 sigmoid/tanh 快很多(看右圖)。有人說這是因為它是linear,而且 non-saturating
- 相比于 sigmoid/tanh,ReLU 只需要一個閾值就可以得到激活值,而不用去算一大堆復(fù)雜的運算。
ReLU 的缺點:?當(dāng)然 ReLU 也有缺點,就是訓(xùn)練的時候很”脆弱”,很容易就”die”了. 什么意思呢?
舉個例子:一個非常大的梯度流過一個 ReLU 神經(jīng)元,更新過參數(shù)之后,這個神經(jīng)元再也不會對任何數(shù)據(jù)有激活現(xiàn)象了。
如果這個情況發(fā)生了,那么這個神經(jīng)元的梯度就永遠(yuǎn)都會是0.
實際操作中,如果你的learning rate 很大,那么很有可能你網(wǎng)絡(luò)中的40%的神經(jīng)元都”dead”了。?
當(dāng)然,如果你設(shè)置了一個合適的較小的learning rate,這個問題發(fā)生的情況其實也不會太頻繁。
Leaky-ReLU、P-ReLU、R-ReLU
Leaky ReLUs:?就是用來解決這個?“dying ReLU”?的問題的。與 ReLU 不同的是:?
f(x)=x,(x>=0)
這里的?α?是一個很小的常數(shù)。這樣,即修正了數(shù)據(jù)分布,又保留了一些負(fù)軸的值,使得負(fù)軸信息不會全部丟失。
關(guān)于Leaky ReLU 的效果,眾說紛紜,沒有清晰的定論。有些人做了實驗發(fā)現(xiàn) Leaky ReLU 表現(xiàn)的很好;有些實驗則證明并不是這樣。
Parametric ReLU:?對于 Leaky ReLU 中的α,通常都是通過先驗知識人工賦值的。?
然而可以觀察到,損失函數(shù)對α的導(dǎo)數(shù)我們是可以求得的,可不可以將它作為一個參數(shù)進(jìn)行訓(xùn)練呢??
Kaiming He的論文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》指出,不僅可以訓(xùn)練,而且效果更好。
公式非常簡單,反向傳播至未激活前的神經(jīng)元的公式就不寫了,很容易就能得到。對α的導(dǎo)數(shù)如下:
δyiδα=0,(ifyi>0),else=yi
原文說使用了Parametric ReLU后,最終效果比不用提高了1.03%.
Randomized ReLU:?
Randomized Leaky ReLU 是 leaky ReLU 的random 版本 (α?是random的).?
它首次試在 kaggle 的NDSB 比賽中被提出的。
核心思想就是,在訓(xùn)練過程中,α?是從一個高斯分布?U(l,u)?中 隨機(jī)出來的,然后再測試過程中進(jìn)行修正(有點像dropout的用法)。
數(shù)學(xué)表示如下:
在測試階段,把訓(xùn)練過程中所有的?αij?取個平均值。NDSB 冠軍的?α?是從?U(3,8)?中隨機(jī)出來的。那么,在測試階段,激活函數(shù)就是就是:?
看看 cifar-100 中的實驗結(jié)果:
Maxout
Maxout出現(xiàn)在ICML2013上,作者Goodfellow將maxout和dropout結(jié)合后,號稱在MNIST, CIFAR-10, CIFAR-100, SVHN這4個數(shù)據(jù)上都取得了start-of-art的識別率。?
Maxout 公式如下:?
假設(shè)?w?是2維,那么有:?
可以注意到,ReLU 和 Leaky ReLU 都是它的一個變形(比如,w1,b1=0?的時候,就是 ReLU).
Maxout的擬合能力是非常強(qiáng)的,它可以擬合任意的的凸函數(shù)。作者從數(shù)學(xué)的角度上也證明了這個結(jié)論,即只需2個maxout節(jié)點就可以擬合任意的凸函數(shù)了(相減),前提是”隱隱含層”節(jié)點的個數(shù)可以任意多.
所以,Maxout 具有 ReLU 的優(yōu)點(如:計算簡單,不會 saturation),同時又沒有 ReLU 的一些缺點 (如:容易 go die)。不過呢,還是有一些缺點的嘛:就是把參數(shù)double了。
還有其他一些激活函數(shù),請看下表:
How to choose a activation function?
怎么選擇激活函數(shù)呢?
我覺得這種問題不可能有定論的吧,只能說是個人建議。
如果你使用 ReLU,那么一定要小心設(shè)置 learning rate,而且要注意不要讓你的網(wǎng)絡(luò)出現(xiàn)很多 “dead” 神經(jīng)元,如果這個問題不好解決,那么可以試試 Leaky ReLU、PReLU 或者 Maxout.
友情提醒:最好不要用 sigmoid,你可以試試 tanh,不過可以預(yù)期它的效果會比不上 ReLU 和 Maxout.
還有,通常來說,很少會把各種激活函數(shù)串起來在一個網(wǎng)絡(luò)中使用的。
Reference
[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/
總結(jié)
以上是生活随笔為你收集整理的神经网络之激活函数面面观的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。