什么是激活函數
為什么要用激活函數
1、Sigmod激活函數
公式:
曲線:
也叫 Logistic 函數,用於隱層神經元輸出,取值范圍為(0,1)。
它可以將一個實數映射到(0,1)的區間,可以用來做二分類。(它不像SVM直接給出一個分類的結果,Logistic Regression給出的是這個樣本屬於正類或者負類的可能性是多少,當然在多分類的系統中給出的是屬於不同類別的可能性,進而通過可能性來分類。)
Sigmod函數優點
輸出范圍有限,數據在傳遞的過程中不容易發散。
輸出范圍為(0,1),所以可以用作輸出層,輸出表示概率。
抑制兩頭,對中間細微變化敏感,對分類有利。
在特征相差比較復雜或是相差不是特別大時效果比較好。
sigmoid缺點:
激活函數計算量大,反向傳播求誤差梯度時,求導涉及除法反向傳播時,很容易就會出現梯度消失的情況,從而無法完成深層網絡的訓練(sigmoid的飽和性)。
下面解釋為何會出現梯度消失:
反向傳播算法中,要對激活函數求導,sigmoid 的導數表達式為:
sigmoid 原函數及導數圖形如下:
(2) Tanh函數
公式
曲線
也稱為雙切正切函數,取值范圍為[-1,1]。
tanh在特征相差明顯時的效果會很好,在循環過程中會不斷擴大特征效果。與 sigmoid 的區別是,tanh 是 0 均值的,因此實際應用中 tanh 會比 sigmoid 更好,然而,tanh一樣具有軟飽和性,從而造成梯度消失。
(3) ReLU
Rectified Linear Unit(ReLU) - 用於隱層神經元輸出
公式
曲線
輸入信號 <0 時,輸出都是0,>0 的情況下,輸出等於輸入
ReLU 的優點:
Krizhevsky et al . 發現使用 ReLU 得到的 SGD 的收斂速度會比 sigmoid/tanh 快很多。除此之外,當x<0時,ReLU硬飽和,而當x>0時,則不存在飽和問題。所以,ReLU 能夠在x>0時保持梯度不衰減,從而緩解梯度消失問題。這讓我們能夠直接以監督的方式訓練深度神經網絡,而無需依賴無監督的逐層預訓練。
ReLU 的缺點:
隨着訓練的推進,部分輸入會落入硬飽和區,導致對應權重無法更新。這種現象被稱為“神經元死亡”。與sigmoid類似,ReLU的輸出均值也大於0,偏移現象 和 神經元死亡會共同影響網絡的收斂性。
eaky-ReLU、P-ReLU、R-ReLU
(1)Leaky ReLUs: 就是用來解決這個 “dying ReLU” 的問題的。與 ReLU 不同的是:
這里的

關於Leaky ReLU 的效果,眾說紛紜,沒有清晰的定論。有些人做了實驗發現 Leaky ReLU 表現的很好;有些實驗則證明並不是這樣。

數學表示如下:

maxout
參考:https://blog.csdn.net/hjimce/article/details/50414467
Maxout出現在ICML2013上,作者Goodfellow將maxout和dropout結合后,號稱在MNIST, CIFAR-10, CIFAR-100, SVHN這4個數據上都取得了start-of-art的識別率。 可以注意到,ReLU 和 Leaky ReLU 都是它的一個變形(比如,Maxout的擬合能力是非常強的,它可以擬合任意的的凸函數。作者從數學的角度上也證明了這個結論,即只需2個maxout節點就可以擬合任意的凸函數了(相減),前提是”隱隱含層”節點的個數可以任意多。
我們在一層同時訓練n組參數,然后選擇激活值最大的作為下一層神經元的激活值。

所以,Maxout 具有 ReLU 的優點(如:計算簡單,不會 saturation),同時又沒有 ReLU 的一些缺點 (如:容易 go die)。不過呢,還是有一些缺點的嘛:就是把參數double了。
還有其他一些激活函數,請看下表:


怎么選擇激活函數呢?
如果你使用 ReLU,那么一定要小心設置 learning rate,而且要注意不要讓你的網絡出現很多 “dead” 神經元,如果這個問題不好解決,那么可以試試 Leaky ReLU、PReLU 或者 Maxout.
友情提醒:最好不要用 sigmoid,你可以試試 tanh,不過可以預期它的效果會比不上 ReLU 和 Maxout.
還有,通常來說,很少會把各種激活函數串起來在一個網絡中使用的。
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/

