深度學習中幾種常見的激活函數理解與總結
https://www.cnblogs.com/XDU-Lakers/p/10557496.html
神經網絡梯度消失和梯度爆炸及解決辦法
https://blog.csdn.net/program_developer/article/details/80032376
這文章詳細分析了幾個激活函數優缺點,值得分享;
飽和激活函數:
sigmod:
優點:
提供非線性激活函數
缺點:
1.sigmoid函數飽和,使梯度消失;
2.sigmoid函數輸出不是零中心(zero-centered);
3.指數函數計算耗費計算資源;
tanh:
優點:tanh解決了sigmoid的輸出非“零爲中心”的問題
缺點:
1.依然有sigmoid函數過飽和的問題。
2.依然進行的是指數運算
非飽和激活函數:
ReLu
優點:
1.ReLU解決了梯度消失的問題,至少x在正區間內,神經元不會飽和;
2.由於ReLU線性、非飽和的形式,在SGD中能夠快速收斂;
3.計算速度要快很多。ReLU函數只有線性關係,不需要指數計算,不管在前向傳播還是反向傳播,計算速度都比sigmoid和tanh快
缺點:
1.ReLU的輸出不是“零爲中心”(Notzero-centered output)。
2.隨着訓練的進行,可能會出現神經元死亡,權重無法更新的情況。這種神經元的死亡是不可逆轉的死亡
總結:訓練神經網絡的時候,一旦學習率沒有設置好,第一次更新權重的時候,輸入是負值,那麼這個含有ReLU的神經節點就會死亡,再也不會被激活。所以必須設置一個合理的學習率。爲了解決神經元節點死亡的情況,有人提出了Leaky ReLU、P-ReLu、R-ReLU、ELU等激活函數。
Leaky ReLU
優點:
1.神經元不會出現死亡的情況。
2.對於所有的輸入,不管是大於等於0還是小於0,神經元不會飽和。
3.由於Leaky ReLU線性、非飽和的形式,在SGD中能夠快速收斂。
4.計算速度要快很多。Leaky ReLU函數只有線性關係,不需要指數計算,不管在前向傳播還是反向傳播,計算速度都比sigmoid和tanh快。
缺點:
1.Leaky ReLU函數中的α,需要通過先驗知識人工賦值。
總結:Leaky ReLU很好的解決了“dead ReLU”的問題。因爲Leaky ReLU保留了x小於0時的梯度,在x小於0時,不會出現神經元死亡的問題。對於Leaky ReLU給出了一個很小的負數梯度值α,這個值是很小的常數。比如:0.01。這樣即修正了數據分佈,又保留了一些負軸的值,使得負軸信息不會全部丟失。但是這個α通常是通過先驗知識人工賦值的。
RReLU
特點:
(1).RReLU是Leaky ReLU的random版本,在訓練過程中,α是從一個高斯分佈中隨機出來的,然後再測試過程中進行修正。
(2).數學形式與PReLU類似,但RReLU是一種非確定性激活函數,其參數是隨機的
總結:
(1)PReLU中的α是根據數據變化的;
(2)Leaky ReLU中的α是固定的;
(3)RReLU中的α是一個在給定範圍內隨機抽取的值,這個值在測試環節就會固定下來。
ELU
優點:
(1)ELU包含了ReLU的所有優點。
(2)神經元不會出現死亡的情況。
(3)ELU激活函數的輸出均值是接近於零的。
缺點:
(1)計算的時候是需要計算指數的,計算效率低的問題。
Maxout
優點:
(1)Maxout具有ReLU的所有優點,線性、不飽和性。
(2)同時沒有ReLU的一些缺點。如:神經元的死亡。
缺點:
(1)從這個激活函數的公式14中可以看出,每個neuron將有兩組w,那麼參數就增加了一倍。這就導致了整體參數的數量激增。
如何選擇合適的激活函數?
看了這多激活函數,想必大家都應該有所瞭解,那這麼多的激活函數該如何選擇呢?目前還不存在定論,在實踐過程中更多還是需要結合實際情況,考慮不同激活函數的優缺點綜合使用。我在這裏給大家一點在訓練模型時候的建議。
(1)通常來說,不能把各種激活函數串起來在一個網絡中使用。
(2)如果使用ReLU,那麼一定要小心設置學習率(learning rate),並且要注意不要讓網絡中出現很多死亡神經元。如果死亡神經元過多的問題不好解決,可以試試Leaky ReLU、PReLU、或者Maxout。
(3)儘量不要使用sigmoid激活函數,可以試試tanh,不過我還是感覺tanh的效果會比不上ReLU和Maxout。