說說激活函數

前言

以前總覺得可能激活函數裏面relu最好用(不知道是什麼經歷留下的印象了。。。。。)是網絡的輸出需要有正有負,所以適合選擇tanh,而不適合relu,藉此機會,查閱了一下激活函數相關的資料,對這個問題做一個加深的理解。

正文

激活函數概覽

下面一張圖片是各種激活函數的一個總結,包含了函數圖像,表達式以及函數的導數。
圖片來自:https://zhuanlan.zhihu.com/p/30567264

這裏寫圖片描述

激活函數的用途是進行輸入的特徵的保留以及映射。

sigmoid

歷史上,sigmoid 函數曾非常常用,然而現在它已經不太受歡迎,實際很少使用了,因爲它主要有兩個缺點:

1. 函數飽和使梯度消失
sigmoid 神經元在值爲 0 或 1 的時候接近飽和,這些區域,梯度幾乎爲 0。因此在反向傳播時,這個局部梯度會與整個代價函數關於該單元輸出的梯度相乘,結果也會接近爲 0 。這樣,幾乎就沒有信號通過神經元傳到權重再到數據了,因此這時梯度就對模型的更新沒有任何貢獻。
除此之外,爲了防止飽和,必須對於權重矩陣的初始化特別留意。比如,如果初始化權重過大,那麼大多數神經元將會飽和,導致網絡就幾乎不學習。
2. sigmoid 函數不是關於原點中心對稱的
這個特性會導致後面網絡層的輸入也不是零中心的,進而影響梯度下降的運作。
因爲如果輸入都是正數的話(如 f=wTx+b中每個元素都 x>0 ),那麼關於 w 的梯度(即x)在反向傳播過程中,要麼全是正數,要麼全是負數(具體依據整個表達式 f而定),這將會導致梯度下降權重更新時出現 z 字型的下降。當然,如果是按 batch 去訓練,那麼每個 batch 可能得到不同的信號,整個批量的梯度加起來後可以緩解這個問題。因此,該問題相對於上面的神經元飽和問題來說只是個小麻煩,沒有那麼嚴重。

tanh

tanh 函數同樣存在飽和問題,但它的輸出是零中心的,因此實際中 tanh 比 sigmoid 更受歡迎。tanh 函數實際上是一個放大的 sigmoid 函數,數學關係爲:tanh(x)=2σ(2x)−1

Relu

這裏寫圖片描述
是二維時,ReLU 的效果如圖:
ReLU 的優點:
1.相較於 sigmoid 和 tanh 函數,ReLU 對於 SGD 的收斂有巨大的加速作用(Alex Krizhevsky 指出有 6 倍之多)。有人認爲這是由它的線性、非飽和的公式導致的。
2. 相比於 sigmoid/tanh,ReLU 只需要一個閾值就可以得到激活值,而不用去算一大堆複雜的(指數)運算。
ReLU 的缺點是,它在訓練時比較脆弱並且可能“死掉”。
舉例來說:一個非常大的梯度經過一個 ReLU 神經元,更新過參數之後,這個神經元再也不會對任何數據有激活現象了。如果這種情況發生,那麼從此所有流過這個神經元的梯度將都變成 0。
也就是說,這個 ReLU 單元在訓練中將不可逆轉的死亡,導致了數據多樣化的丟失。實際中,如果學習率設置得太高,可能會發現網絡中 40% 的神經元都會死掉(在整個訓練集中這些神經元都不會被激活)。
合理設置學習率,會降低這種情況的發生概率。

Leakly Relu

Leaky ReLU 是爲解決“ ReLU 死亡”問題的嘗試。
ReLU 中當 x<0 時,函數值爲 0。而 Leaky ReLU 則是給出一個很小的負數梯度值,比如 0.01。
這裏寫圖片描述

如何選擇激活函數?

通常來說,很少會把各種激活函數串起來在一個網絡中使用的。
如果使用 ReLU,那麼一定要小心設置 learning rate,而且要注意不要讓你的網絡出現很多 “dead” 神經元,如果這個問題不好解決,那麼可以試試 Leaky ReLU、PReLU 或者 Maxout.
最好不要用 sigmoid,可以試試 tanh,不過可以預期它的效果會比不上 ReLU 和 Maxout.

參考資料
https://livc.io/blog/176
http://cs231n.github.io/neural-networks-1/
https://zhuanlan.zhihu.com/p/21462488
http://blog.csdn.net/cyh_24/article/details/50593400

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章