激活函數就相當於人體的神經元,它的主要作用就是對輸入的信號進行轉換,比如將疼痛轉化爲疼痛信號。但是疼痛的來源有很多種,也就是可能來自於很多的上一個層的神經細胞,比如敲打、拉扯、針刺等等,但是歸根結底,它就是一個痛。但是爲什麼會存在這麼多的激活函數?原因在於,當前的計算機並不能很好地模擬人體的神經元,比如,敲打可以加重疼痛,但是藥物也可以緩解疼痛,但是對於Sigmoid函數,它的輸出並不是以0爲中心,所以只能進行加性計算。
激活函數的幾個改進點:
激活函數的不同主要在於,對於不同的模型,選擇更合適的函數來模擬人體神經網絡的結構
1. 梯度消失
這個問題主要是在深度學習之後出現的,深度學習之前主要使用的是sigmoid。但是這個函數由於靠近0-1兩端的時候,梯度幾乎接近於零。即,隨着網絡的不斷訓練,輸出值會越來越靠近0-1兩端,此時,梯度將接近於零,導致方向傳播基本上不會發生梯度改變,即神經元飽和,就如同神經麻木一樣,此時的神經元將沒有任何感覺能力。
2. 以零爲中心-zero-centered
意思就是0均值,但是對於這個問題,網上的一直沒有很好的解釋清楚,我這裏說說我的理解
神經網絡並不是只有一個權重w,而是由一羣權重w組成,這些權重都是統一進行梯度計算,也就是w只能一起加上或者減去梯度值,這樣就導致一個問題,比如對一組權重w,如果最優點的權重比一部分w大,比另一部分要小,那麼由於只能統一加減計算,所以,不得不先更新一部分,保持另一部分爲0,;然後再更新一部分,這樣的效率將會很低,很顯然,如果正負都可以計算,完全可以一步到位。計算步驟如下圖:
參考鏈接:https://zhuanlan.zhihu.com/p/25110450
3. 計算成本
深度神經網絡需要進行大量的計算,之前的激活函數都是指數或者倒數函數,計算複雜,將大大增加計算量,因此,爲了簡化計算量,現在開始大量使用RELU函數,即max(x,0)
常用激活函數及其導數:
激活函數分類
- tf.nn.relu
修正線性單元(Rectified linear unit)
ReLU也有幾個需要特別注意的問題:
* ReLU的輸出不是zero-centered
* Dead ReLU Problem,指的是某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新。有兩個主要原因可能導致這種情況產生: (1) 非常不幸的參數初始化,這種情況比較少見 (2) learning rate太高導致在訓練過程中參數更新太大,不幸使網絡進入這種狀態。解決方法是可以採用Xavier初始化方法,以及避免將learning rate設置太大或使用adagrad等自動調節learning rate的算法。
儘管存在這兩個問題,ReLU目前仍是最常用的activation function,在搭建人工神經網絡的時候推薦優先嚐試!
- tf.nn.relu6
- tf.nn.crelu
- tf.nn.elu
指數線性單元(Exponential Linear Units)
ELU也是爲解決ReLU存在的問題而提出,顯然,ELU有ReLU的基本所有優點,以及:
* 不會有Dead ReLU問題
* 輸出的均值接近0,zero-centered
它的一個小問題在於計算量稍大。類似於Leaky ReLU,理論上雖然好於ReLU,但在實際使用中目前並沒有好的證據ELU總是優於ReLU。
- tf.nn.selu
- tf.nn.softplus
- tf.nn.softsign
- tf.sigmoid
- tf.tanh
補充:
1. Leaky ReLU函數
人們爲了解決Dead ReLU Problem,提出了將ReLU的前半段設爲0.01x而非0。另外一種直觀的想法是基於參數的方法,即Parametric ReLU:f(x) = \max(\alpha x, x),其中\alpha
可由back propagation學出來。理論上來講,Leaky ReLU有ReLU的所有優點,外加不會有Dead ReLU問題,但是在實際操作當中,並沒有完全證明Leaky ReLU總是好於ReLU。
- SoftMax
這個公式一般用於多分類問題,比如手寫數字識別中,有10個分類,我們最後的輸出並不是10個數中的某一個,而是每個數字都佔有一定的權重,這裏的意思就是權重佔比。權重越大的被取到的可能性越高。
一個別人的例子:SVM只選自己喜歡的男神,Softmax把所有備胎全部拉出來評分,最後還歸一化一下
參考:enter description here
小結
建議使用ReLU函數,但是要注意初始化和learning rate的設置;可以嘗試使用Leaky ReLU或ELU函數;不建議使用tanh,尤其是sigmoid函數。
關鍵詞
* 梯度消失
例如sigmoid的函數,它的導數的取值範圍是(0, 0.25],也就是說對於導數中的每一個元素,我們都有 , ,小於1的數乘在一起,必然是越乘越小的。這才僅僅是3層,如果10層的話, 根據乘法計算,第10層的誤差相對第一層卷積的參數的梯度將是一個非常小的值,接近於0,這就是所謂的“梯度消失”。