「神經網絡」 通俗易懂的激活函數

轉載文,對激活函數講解的十分通俗易懂

什麼是激活函數

神經網絡中的每個神經元節點接受上一層神經元的輸出值作為本神經元的輸入值,並將輸入值傳遞給下一層,輸入層神經元節點會將輸入屬性值直接傳遞給下一層(隱層或輸出層)。在多層神經網絡中,上層節點的輸出和下層節點的輸入之間具有一個函數關係,這個函數稱為激活函數(又稱激勵函數)

激活函數的用途

如果不用激勵函數,在這種情況下每一層節點的輸入都是上層輸出的線性函數,很容易驗證,無論神經網絡有多少層,輸出都是輸入的線性組合,與沒有隱藏層效果相當,這種情況就是最原始的感知機(Perceptron)了,那麼網絡的逼近能力就相當有限。正因為上面的原因,決定引入非線性函數作為激勵函數,這樣深層神經網絡表達能力就更加強大(不再是輸入的線性組合,而是幾乎可以逼近任意函數)。

激活函數分類

Sigmoid函數

Sigmoid 是常用的非線性的激活函數,它的數學形式如下:

「神經網絡」 通俗易懂的激活函數

特點:

它能夠把輸入的連續實值變換為0和1之間的輸出,特別的,如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1.

缺點:

sigmoid函數曾經被使用的很多,不過近年來,用它的人越來越少了。主要是因為它固有的一些 缺點。

缺點1:在深度神經網絡中梯度反向傳遞時導致梯度爆炸和梯度消失,其中梯度爆炸發生的概率非常小,而梯度消失發生的概率比較大。首先來看Sigmoid函數的導數,如下圖所示:

「神經網絡」 通俗易懂的激活函數

如果我們初始化神經網絡的權值為 [0,1]之間的隨機值,由反向傳播算法的數學推導可知,梯度從後向前傳播時,每傳遞一層梯度值都會減小為原來的0.25倍,如果神經網絡隱層特別多,那麼梯度在穿過多層後將變得非常小接近於0,即出現梯度消失現象;當網絡權值初始化為 (1,+∞)區間內的值,則會出現梯度爆炸情況。

缺點2:Sigmoid 的 output 不是0均值(即zero-centered)。這是不可取的,因為這會導致後一層的神經元將得到上一層輸出的非0均值的信號作為輸入。 產生的一個結果就是:如x>0, f=xw^T+b,那麼對w求局部梯度則都為正,這樣在反向傳播的過程中w要麼都往正方向更新,要麼都往負方向更新,導致有一種捆綁的效果,使得收斂緩慢。 當然了,如果按batch去訓練,那麼那個batch可能得到不同的信號,所以這個問題還是可以緩解一下的。因此,非0均值這個問題雖然會產生一些不好的影響,不過跟上面提到的梯度消失問題相比還是要好很多的。

缺點3:其解析式中含有冪運算,計算機求解時相對來講比較耗時。對於規模比較大的深度網絡,這會較大地增加訓練時間。

tanh函數

tanh函數解析式:

「神經網絡」 通俗易懂的激活函數

它解決了Sigmoid函數的不是zero-centered輸出問題,然而,梯度消失(gradient vanishing)的問題和冪運算的問題仍然存在。

Relu函數

Relu函數的解析式:

「神經網絡」 通俗易懂的激活函數

ReLU函數其實就是一個取最大值函數,注意這並不是全區間可導的,但是我們可以取sub-gradient,如上圖所示。ReLU雖然簡單,但卻是近幾年的重要成果,有以下幾大優點:

1) 解決了gradient vanishing問題 (在正區間)

2)計算速度非常快,只需要判斷輸入是否大於0

3)收斂速度遠快於sigmoid和tanh

ReLU也有幾個需要特別注意的問題:

1)ReLU的輸出不是zero-centered

2)Dead ReLU Problem,指的是某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新。有兩個主要原因可能導致這種情況產生: (1) 非常不幸的參數初始化,這種情況比較少見 (2) learning rate太高導致在訓練過程中參數更新太大,不幸使網絡進入這種狀態。解決方法是可以採用Xavier初始化方法,以及避免將learning rate設置太大或使用adagrad等自動調節learning rate的算法。

儘管存在這兩個問題,ReLU目前仍是最常用的activation function,在搭建人工神經網絡的時候推薦優先嚐試!

Leaky ReLU函數(PReLU)

函數表達式:

「神經網絡」 通俗易懂的激活函數

人們為了解決Dead ReLU Problem,提出了將ReLU的前半段設為αx而非0,通常α=0.01。另外一種直觀的想法是基於參數的方法,即ParametricReLU:f(x)=max(αx,x),其中α可由方向傳播算法學出來。理論上來講,Leaky ReLU有ReLU的所有優點,外加不會有Dead ReLU問題,但是在實際操作當中,並沒有完全證明Leaky ReLU總是好於ReLU。

ELU (Exponential Linear Units) 函數

函數表達式:

「神經網絡」 通俗易懂的激活函數

ELU也是為解決ReLU存在的問題而提出,顯然,ELU有ReLU的基本所有優點,以及:

1、不會有Dead ReLU問題

2、輸出的均值接近0,zero-centered

它的一個小問題在於計算量稍大。類似於Leaky ReLU,理論上雖然好於ReLU,但在實際使用中目前並沒有好的證據ELU總是優於ReLU。

如何選擇合適的激活函數

1)深度學習往往需要大量時間來處理大量數據,模型的收斂速度是尤為重要的。所以,總體上來講,訓練深度學習網絡儘量使用zero-centered數據 (可以經過數據預處理實現) 和zero-centered輸出。所以要儘量選擇輸出具有zero-centered特點的激活函數以加快模型的收斂速度。

2)如果使用 ReLU,那麼一定要小心設置 learning rate,而且要注意不要讓網絡出現很多 “dead” 神經元,如果這個問題不好解決,那麼可以試試 Leaky ReLU、PReLU 或者 Maxout.

3)最好不要用 sigmoid,可以試試 tanh,不過可以預期它的效果會比不上 ReLU 和 Maxout.


分享到:


相關文章: