深度學習中幾種常見的激活函數理解與總結


學習神經網絡的時候我們總是聽到激活函數這個詞,而且很多資料都會提到常用的激活函數,比如Sigmoid函數、tanh函數、Relu函數。肯定很多人剛開始和我一樣一頭霧水,接下來就讓我們詳細了解一下激活數方方面面的知識。

目錄

1.激活函數的概念和作用;

2.通俗的理解一下激活函數(圖文結合);

3.幾種激活函數的對比;

4.如何選擇合適的激活函數?


1.激活函數的概念和作用

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

關於神經網絡中的激活函數的作用,通常都是這樣解釋:不使用激活函數的話,神經網絡的每層都只是做線性變換,多層輸入疊加后也還是線性變換。因為線性模型的表達能力通常不夠,所以這時候就體現了激活函數的作用了,激活函數可以引入非線性因素疑問就來了,激活函數是如何引入非線性因素呢?

2.通俗的理解一下激活函數(圖文結合);

為了解釋激活函數如何引入非線性因素,接下來讓我們以神經網絡分割平面空間作為例子。

(1)無激活函數的神經網絡

  神經網絡最簡單的結構就是單輸出的單層感知機,單層感知機只有輸入層和輸出層,分別代表了神經感受器和神經中樞。下圖是一個只有2個輸入單元和1個輸出單元的簡單單層感知機。圖中x1、w2代表神經網絡的輸入神經元受到的刺激,w1、w2代表輸入神經元和輸出神經元間連接的緊密程度,b代表輸出神經元的興奮閾值,y為輸出神經元的輸出。我們使用該單層感知機划出一條線將平面分割開,如圖所示:

同理,我們也可以將多個感知機(注意,不是多層感知機)進行組合獲得更強的平面分類能力,如圖所示:

 

再看看包含一個隱層的多層感知機的情況,如圖所示:

通過對比可以發現,上面三種沒有激勵函數的神經網絡的輸出是都線性方程,其都是在用復雜的線性組合來試圖逼近曲線。

 (2)帶激活函數的神經網絡

  讓我們在神經網絡每一層神經元做完線性變換以后,加上一個非線性激勵函數對線性變換的結果進行轉換,結果顯而易見,輸出立馬變成一個不折不扣的非線性函數了,如圖所示: 

 

拓展到多層神經網絡的情況, 和剛剛一樣的結構, 加上非線性激勵函數之后, 輸出就變成了一個復雜的非線性函數了,如圖所示: 

 

總結:加入非線性激勵函數后,神經網絡就有可能學習到平滑的曲線來分割平面,而不是用復雜的線性組合逼近平滑曲線來分割平面,使神經網絡的表示能力更強了,能夠更好的擬合目標函數。 這就是為什么我們要有非線性的激活函數的原因。如下圖所示說明加入非線性激活函數后的差異,上圖為用線性組合逼近平滑曲線來分割平面,下圖為平滑的曲線來分割平面:

 

3.幾種激活函數的對比;

首先讓我們看看激活函數的大分類,如下圖所示:

 

首先讓我們看看什么是飽和激活函數:

反之,不滿足以上條件的函數則稱為非飽和激活函數。

sigmoid和tanh是“飽和激活函數”,而ReLU及其變體則是“非飽和激活函數”。使用“非飽和激活函數”的優勢在於兩點:(1)"非飽和激活函數”能解決所謂的“梯度消失”問題。(2)它能加快收斂速度。

Sigmoid函數需要一個實值輸入壓縮至[0,1]的范圍---------σ(x) = 1 / (1 + exp(−x))

tanh函數需要講一個實值輸入壓縮至 [-1, 1]的范圍---------tanh(x) = 2σ(2x) − 1

由於使用sigmoid激活函數會造成神經網絡的梯度消失和梯度爆炸問題,所以許多人提出了一些改進的激活函數,如:tanh、ReLU、Leaky ReLU、PReLU、RReLU、ELU、Maxout。下面我們具體來分析一下這幾個激活函數的區別。

 

(1)Sigmoid

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

其函數圖像如圖所示:

導函數圖像如圖所示:

Sigmoid函數在歷史上曾經非常的常用,輸出值范圍為[0,1]之間的實數。但是現在它已經不太受歡迎,實際中很少使用。原因是sigmoid存在3個問題:

  1. sigmoid函數飽和使梯度消失(Sigmoidsaturate and kill gradients)。我們從導函數圖像中可以看出sigmoid的導數都是小於0.25的,那么在進行反向傳播的時候,梯度相乘結果會慢慢的趨近於0。這樣,幾乎就沒有梯度信號通過神經元傳遞到前面層的梯度更新中,因此這時前面層的權值幾乎沒有更新,這就叫梯度消失。除此之外,為了防止飽和,必須對於權重矩陣的初始化特別留意。如果初始化權重過大,可能很多神經元得到一個比較小的梯度,致使神經元不能很好的更新權重提前飽和,神經網絡就幾乎不學習。
  2. sigmoid函數輸出不是“零為中心”(zero-centered)。一個多層的sigmoid神經網絡,如果你的輸入x都是正數,那么在反向傳播中w的梯度傳播到網絡的某一處時,權值的變化是要么全正要么全負。

    如上圖所示:當梯度從上層傳播下來,w的梯度都是用x乘以f的梯度,因此如果神經元輸出的梯度是正的,那么所有w的梯度就會是正的,反之亦然。在這個例子中,我們會得到兩種權值,權值范圍分別位於圖8中一三象限。當輸入一個值時,w的梯度要么都是正的要么都是負的,當我們想要輸入一三象限區域以外的點時,我們將會得到這種並不理想的曲折路線(zig zag path),圖中紅色曲折路線。假設最優化的一個w矩陣是在圖8中的第四象限,那么要將w優化到最優狀態,就必須走“之字形”路線,因為你的w要么只能往下走(負數),要么只能往右走(正的)。優化的時候效率十分低下,模型擬合的過程就會十分緩慢。

  3. 指數函數的計算是比較消耗計算資源的。

 

(2)tanh

tanh函數跟sigmoid還是很像的,實際上,tanh是sigmoid的變形,如公式5所示。tanh的具體公式如公式6所示,其圖像如下圖所示:

tanh與sigmoid不同的是,tanh是“零為中心”的。因此,實際應用中,tanh會比sigmoid更好一些。但是在飽和神經元的情況下,tanh還是沒有解決梯度消失問題。

 優點tanh解決了sigmoid的輸出非“零為中心”的問題

 缺點(1)依然有sigmoid函數過飽和的問題。(2)依然進行的是指數運算

 

 (3)ReLU

 近年來,ReLU函數變得越來越受歡迎。全稱是Rectified Linear Unit,中文名字:修正線性單元。ReLU是Krizhevsky、Hinton等人在2012年《ImageNet Classification with Deep Convolutional Neural Networks》論文中提出的一種線性且不飽和的激活函數。它的數學表達式如7所示

函數圖像如下圖所示:

 優點:(1)ReLU解決了梯度消失的問題,至少x在正區間內,神經元不會飽和;(2)由於ReLU線性、非飽和的形式,在SGD中能夠快速收斂;(3)算速度要快很多。ReLU函數只有線性關系,不需要指數計算,不管在前向傳播還是反向傳播,計算速度都比sigmoid和tanh快

 缺點:(1)ReLU的輸出不是“零為中心”(Notzero-centered output)。(2)隨着訓練的進行,可能會出現神經元死亡,權重無法更新的情況。這種神經元的死亡是不可逆轉的死亡

 總結:訓練神經網絡的時候,一旦學習率沒有設置好,第一次更新權重的時候,輸入是負值,那么這個含有ReLU的神經節點就會死亡,再也不會被激活。因為:ReLU的導數在x>0的時候是1,在x<=0的時候是0。如果x<=0,那么ReLU的輸出是0,那么反向傳播中梯度也是0,權重就不會被更新,導致神經元不再學習。也就是說,這個ReLU激活函數在訓練中將不可逆轉的死亡,導致了訓練數據多樣化的丟失。在實際訓練中,如果學習率設置的太高,可能會發現網絡中40%的神經元都會死掉,且在整個訓練集中這些神經元都不會被激活。所以,設置一個合適的較小的學習率,會降低這種情況的發生。所以必須設置一個合理的學習率。為了解決神經元節點死亡的情況,有人提出了Leaky ReLU、P-ReLu、R-ReLU、ELU等激活函數。

引出的問題:神經網絡中ReLU是線性還是非線性函數?為什么relu這種“看似線性”(分段線性)的激活函數所形成的網絡,居然能夠增加非線性的表達能力?

(1)relu是非線性激活函數。

(2)讓我們先明白什么是線性網絡?如果把線性網絡看成一個大的矩陣M。那么輸入樣本A和B,則會經過同樣的線性變換MA,MB(這里A和B經歷的線性變換矩陣M是一樣的)

(3)的確對於單一的樣本A,經過由relu激活函數所構成神經網絡,其過程確實可以等價是經過了一個線性變換M1,但是對於樣本B,在經過同樣的網絡時,由於每個神經元是否激活(0或者Wx+b)與樣本A經過時情形不同了(不同樣本),因此B所經歷的線性變換M2並不等於M1。因此,relu構成的神經網絡雖然對每個樣本都是線性變換,但是不同樣本之間經歷的線性變換M並不一樣,所以整個樣本空間在經過relu構成的網絡時其實是經歷了非線性變換的。

 

(4)Leaky ReLU

ReLU是將所有的負值設置為0,造成神經元節點死亡情況。相反,Leaky ReLU是給所有負值賦予一個非零的斜率。Leaky ReLU激活函數是在聲學模型(2013)中首次提出來的。它的數學表達式如公式8所示:

 其圖像如下圖:

優點:

(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。這樣即修正了數據分布,又保留了一些負軸的值,使得負軸信息不會全部丟失。但是這個α通常是通過先驗知識人工賦值的。

 

(5)RReLU

RReLU的英文全稱是“Randomized Leaky ReLU”,中文名字叫“隨機修正線性單元”。RReLU是Leaky ReLU的隨機版本。它首次是在Kaggle的NDSB比賽中被提出來的,其圖像和表達式如下圖所示:

 

RReLU的核心思想是,在訓練過程中,α是從一個高斯分布中隨機出來的值,然后再在測試過程中進行修正。在測試階段,把訓練過程中所有的取個平均值。

特點:

(1).RReLU是Leaky ReLU的random版本,在訓練過程中,α是從一個高斯分布中隨機出來的,然后再測試過程中進行修正。

(2).數學形式與PReLU類似,但RReLU是一種非確定性激活函數,其參數是隨機的

 

(6)ReLU、Leaky ReLU、PReLU和RReLU的比較

 各自圖像如下圖所示:

 

總結:

(1)PReLU中的α是根據數據變化的;

(2)Leaky ReLU中的α是固定的;

(3)RReLU中的α是一個在給定范圍內隨機抽取的值,這個值在測試環節就會固定下來。

 

(7)ELU

 ELU的英文全稱是“Exponential Linear Units”,中文全稱是“指數線性單元”。它試圖將激活函數的輸出平均值接近零,從而加快學習速度。同時,它還能通過正值的標識來避免梯度消失的問題。根據一些研究顯示,ELU分類精確度是高於ReLU的。公式如12式所示。

ELU與其他幾種激活函數的比較圖:

 

優點:

(1)ELU包含了ReLU的所有優點。

(2)神經元不會出現死亡的情況。

(3)ELU激活函數的輸出均值是接近於零的。

 缺點:

(1)計算的時候是需要計算指數的,計算效率低的問題。

 

(8)Maxout

Maxout “Neuron” 是由Goodfellow等人在2013年提出的一種很有特點的神經元,它的激活函數、計算的變量、計算方式和普通的神經元完全不同,並有兩組權重。先得到兩個超平面,再進行最大值計算。激活函數是對ReLU和Leaky ReLU的一般化歸納,沒有ReLU函數的缺點,不會出現激活函數飽和神經元死亡的情況。Maxout出現在ICML2013上,作者Goodfellow將maxout和dropout結合,稱在MNIST,CIFAR-10,CIFAR-100,SVHN這4個數據集上都取得了start-of-art的識別率。Maxout公式如13所示。

其中,假設w是2維的,那么我們可以得出公式14。

 

分析公式14可以注意到,ReLU和Leaky ReLU都是它的一個變形。比如的時候,就是ReLU。Maxout的擬合能力非常強,它可以擬合任意的凸函數。Goodfellow在論文中從數學的角度上也證明了這個結論,只需要2個Maxout節點就可以擬合任意的凸函數,前提是“隱含層”節點的個數足夠多。

優點:

(1)Maxout具有ReLU的所有優點,線性、不飽和性。

(2)同時沒有ReLU的一些缺點。如:神經元的死亡。

缺點:

(1)從這個激活函數的公式14中可以看出,每個neuron將有兩組w,那么參數就增加了一倍。這就導致了整體參數的數量激增。

 

4.如何選擇合適的激活函數?

看了這多激活函數,想必大家都應該有所了解,那這么多的激活函數該如何選擇呢?目前還不存在定論,在實踐過程中更多還是需要結合實際情況,考慮不同激活函數的優缺點綜合使用。我在這里給大家一點在訓練模型時候的建議。

(1)通常來說,不能把各種激活函數串起來在一個網絡中使用。

(2)如果使用ReLU,那么一定要小心設置學習率(learning rate),並且要注意不要讓網絡中出現很多死亡神經元。如果死亡神經元過多的問題不好解決,可以試試Leaky ReLU、PReLU、或者Maxout。

(3)盡量不要使用sigmoid激活函數,可以試試tanh,不過我還是感覺tanh的效果會比不上ReLU和Maxout。

 

 

 

 參考鏈接:https://blog.csdn.net/program_developer/article/details/80032376

      https://zhidao.baidu.com/question/565740454826072204.html

 


以上就是本次學習心得,歡迎交流!

 


免責聲明!

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



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