常用激活函數(激勵函數)理解與總結


引言

學習神經網絡的時候我們總是聽到激活函數這個詞,而且很多資料都會提到常用的激活函數,比如Sigmoid函數、tanh函數、Relu函數。那么我們就來詳細了解下激活函數方方面面的知識。本文的內容包括幾個部分:

  1. 什么是激活函數?
  2. 激活函數的用途(為什么需要激活函數)?
  3. 有哪些激活函數,都有什么性質和特點?
  4. 應用中如何選擇合適的激活函數?

如果你對以上幾個問題不是很清楚,下面的內容對你是有價值的。

什么是激活函數?

首先要了解神經網絡的基本模型。(不熟悉的同學請去看本人另外一篇介紹:人工神經網絡基本原理
單一神經元模型如下圖所示。

 

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

 

激活函數的用途(為什么需要激活函數)?

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

有哪些激活函數,都有什么性質和特點?

早期研究神經網絡主要采用sigmoid函數或者tanh函數,輸出有界,很容易充當下一層的輸入。
近些年Relu函數及其改進型(如Leaky-ReLU、P-ReLU、R-ReLU等)在多層神經網絡中應用比較多。下面我們來總結下這些激活函數:

Sigmoid函數

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= wTx+b,那么對w求局部梯度則都為正,這樣在反向傳播的過程中w要么都往正方向更新,要么都往負方向更新,導致有一種捆綁的效果,使得收斂緩慢。 當然了,如果按batch去訓練,那么那個batch可能得到不同的信號,所以這個問題還是可以緩解一下的。因此,非0均值這個問題雖然會產生一些不好的影響,不過跟上面提到的梯度消失問題相比還是要好很多的。

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

tanh函數

tanh函數解析式:

 

tanh函數及其導數的幾何圖像如下圖:

 

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

 

 

Relu函數

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)

函數表達式:

 

 

Leaky Relu函數及其導數的圖像如下圖所示:
(有同學在評論中反映下圖有誤,其實沒有錯誤,左半邊直線斜率非常接近0,所以看起來像是平的。就不改了,α=0.01看起來就是這樣的。感謝大家提意見)

 

 

 

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

ELU (Exponential Linear Units) 函數

函數表達式:

 

 函數及其導數的圖像如下圖所示:

 

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

 不會有Dead ReLU問題

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

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

MaxOut函數

       這個函數可以參考論文《maxout networks》,Maxout是深度學習網絡中的一層網絡,就像池化層、卷積層一樣等,我們可以把maxout 看成是網絡的激活函數層,我們假設網絡某一層的輸入特征向量為:X=(x1,x2,……xd),也就是我們輸入是d個神經元。Maxout隱藏層每個神經元的計算公式如下:

 

       上面的公式就是maxout隱藏層神經元i的計算公式。其中,k就是maxout層所需要的參數了,由我們人為設定大小。就像dropout一樣,也有自己的參數p(每個神經元dropout概率),maxout的參數是k。公式中Z的計算公式為:

 

 

       權重w是一個大小為(d,m,k)三維矩陣,b是一個大小為(m,k)的二維矩陣,這兩個就是我們需要學習的參數。如果我們設定參數k=1,那么這個時候,網絡就類似於以前我們所學普通的MLP網絡。
       我們可以這么理解,本來傳統的MLP算法在第i層到第i+1層,參數只有一組,然而現在我們不這么干了,我們在這一層同時訓練n組的w、b參數,然后選擇激活值Z最大的作為下一層神經元的激活值,這個max(z)函數即充當了激活函數。

應用中如何選擇合適的激活函數?

這個問題目前沒有確定的方法,憑一些經驗吧。
1)深度學習往往需要大量時間來處理大量數據,模型的收斂速度是尤為重要的。所以,總體上來講,訓練深度學習網絡盡量使用zero-centered數據 (可以經過數據預處理實現) 和zero-centered輸出。所以要盡量選擇輸出具有zero-centered特點的激活函數以加快模型的收斂速度。
2)如果使用 ReLU,那么一定要小心設置 learning rate,而且要注意不要讓網絡出現很多 “dead” 神經元,如果這個問題不好解決,那么可以試試 Leaky ReLU、PReLU 或者 Maxout.
3)最好不要用 sigmoid,你可以試試 tanh,不過可以預期它的效果會比不上 ReLU 和 Maxout.

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM