1. 程式人生 > >常用啟用函式(sigmoid、tanh、relu、Leaky relu、prelu、rrelu、elu、softplus、softsign、softmax、MaxOut)、如何選擇合適的啟用函式

常用啟用函式(sigmoid、tanh、relu、Leaky relu、prelu、rrelu、elu、softplus、softsign、softmax、MaxOut)、如何選擇合適的啟用函式

啟用函式 (Activation Function):

神經網路中的每個神經元節點接受上一層神經元的輸出值作為本神經元的輸入值,並將輸入值傳遞給下一層,輸入層神經元節點會將輸入屬性值直接傳遞給下一層(隱層或輸出層)。在不使用激勵函式時,神經網路的每層都只是做線性變換,多層輸入疊加後也還是線性變換。在這種情況下你每一層節點的輸入都是上層輸出的線性函式,此時無論你的神經網路有多少層,輸出都是輸入的線性組合,與沒有隱藏層效果相當,這種情況就是最原始的感知機(Perceptron)了,網路的逼近能力就相當有限。

激勵函式用於神經網路的層與層之間,上一層的輸出通過激勵函式的轉換之後輸入到下一層中。這樣我們輸出的就不是線性組合的函式,而是一個非線性函式。非線性函式可以更好地學習和表示輸入輸出之間非線性的複雜的任意函式對映。

如:

正因為上面的原因,我們決定引入非線性函式作為激勵函式,這樣深層神經網路幾乎可以逼近任何函式。

你甚至可以創造自己的激勵函式來處理自己的問題, 不過要確保的是這些激勵函式必須是可以微分的,因為在backpropagation誤差反向傳遞的時候,只有這些可微分的激勵函式才能把誤差傳遞回去。

常用啟用函式:

Sigmoid:

函式影象如下:

函式求導:

優點:

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

缺點:

當輸入稍微遠離了座標原點,函式的梯度就變得很小了,幾乎為零。在神經網路反向傳播的過程中,我們都是通過微分的鏈式法則來計算各個權重w的微分的。當反向傳播經過了sigmod函式,這個鏈條上的微分就很小很小了,況且還可能經過很多個sigmod函式,最後會導致權重w對損失函式幾乎沒影響,這樣不利於權重的優化,這個問題叫做梯度飽和,也可以叫梯度彌散;

Sigmoid 的 output 不是0均值(即zero-centered),這會導致後一層的神經元將得到上一層輸出的非0均值的訊號作為輸入。 產生的一個結果就是:如果資料進入神經元的時候是正的(e.g. elementwise in ),那麼計算出的梯度也會始終都是正的;

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

tanh:

又可以變形為

故還可以寫成:

函式影象如下:

函式求導:

tanh是雙曲正切函式,tanh函式和sigmod函式的曲線是比較相近的。相同的是,這兩個函式在輸入很大或是很小的時候,輸出都幾乎平滑,梯度很小,不利於權重更新;不同的是輸出區間,tanh的輸出區間是在(-1,1)之間,而且整個函式是以0為中心的,這個特點比sigmod的好。

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

Relu:

上面的sigmoid和tanh是“飽和啟用函式”,而ReLU及其變體則是“非飽和啟用函式”。

使用“非飽和啟用函式”的優勢在於兩點:首先,“非飽和啟用函式”能解決所謂的“梯度消失”問題;其次,它能加快收斂速度。

CNN中常用。對正數原樣輸出,負數直接置零。在正數不飽和,在負數硬飽和。ReLU函式的計算是在卷積之後進行的,因此它與tanh函式和sigmoid函式一樣,同屬於“非線性啟用函式”。

函式影象如下:

ReLU函式其實就是一個取最大值函式,輸入訊號<0時,輸出都是0;>0 的情況下,輸出等於輸入。

函式求導:

 當x <0 時,dy/dx = 0; 當 x >= 0時,dy/dx = 1。

優點:

在輸入為正數的時候,不存在梯度飽和問題;

計算速度要快很多。ReLU函式只有線性關係,不管是前向傳播還是反向傳播,都比sigmod和tanh要快很多;

收斂速度遠快於sigmoid和tanh,ReLU在SGD中能夠快速收斂。

缺點:

與sigmoid類似,ReLU的輸出不是zero-centered;

當輸入是負數的時候,ReLU是完全不被啟用的,這就表明一旦輸入到了負數,ReLU就會死掉。這樣在前向傳播過程中,還不算什麼問題,有的區域是敏感的,有的是不敏感的。但是到了反向傳播過程中,輸入負數,梯度就會完全到0,這個和sigmod函式、tanh函式一樣;

ReLU目前是最常用的activation function,在搭建人工神經網路的時候推薦使用。

Leaky ReLU:

ReLU是將所有的負值都設為零,相反,Leaky ReLU是給所有負值賦予一個非零斜率。

這裡的a固定不變,等於0.01。

函式影象如下:

    

PReLU:

ai是可學習引數。當ai為固定的非零較小數時,它等價於LeakyReLU;當它為0時,PReLU等價於ReLU。

後向傳播計算:

ai的更新公式如下:

函式影象如下:

RReLU:

RReLU也是Leaky ReLU的一個變體。在RReLU中,負值的斜率在訓練中是隨機的,在之後的測試中就變成了固定的了。RReLU的亮點在於,在訓練環節中,aji是從一個均勻的分佈U(I,u)中隨機抽取的數值。

ELU (Exponential Linear Units):

ELUs是“指數線性單元”,它試圖將啟用函式的平均值接近零,從而加快學習的速度。同時,它還能通過正值的標識來避免梯度消失的問題。

函式影象如下:

ELU有ReLU的所有優點,不會有Dead ReLU問題,輸出的均值也接近0。

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

Softplus:

Softplus函式是Sigmoid函式的原函式。

Softplus函式與ReLU函式影象對比:

Softplus函式可以看成是ReLU函式的平滑版本。Softplus函式是對全部資料進行了非線性對映,是一種不飽和的非線性函式其表示式如公式,Softplus函式不具備稀疏表達的能力,收斂速度比ReLUs函式要慢很多。但該函式連續可微並且變化平緩,比Sigmoid函式更加接近生物學的啟用特性,同時解決了Sigmoid函式的假飽和現象,易於網路訓練和泛化效能的提高。雖然該函式的表達效能更優於ReLU函式和Sigmoid函式,即精確度相對於後者有所提高,但是其並沒有加速神經網路的學習速度。

Softsign:

函式影象如下:

softmax:

Softmax函式用於多分類神經網路輸出。softmax函式將壓縮每個類在0到1之間,併除以輸出總和。它實際上可以表示某個類的輸入概率。softmax函式最好在分類器的輸出層使用。

函式形式如下:

如,我們輸入[1.2,0.9,0.75],當應用softmax函式時,得到[0.42,0.31,0.27]。現在可以用這些值來表示每個類的概率。

MaxOut函式:

maxout也是一種啟用函式。

通常的情況下,如果激發函式採用sigmoid函式的話,在前向傳播過程中,隱含層節點的輸出表達式為:

其中W一般是2維的,這裡表示取出的是第i列,下標i前的省略號表示對應第i列中的所有行。

而maxout激發函式的隱含層節點的輸出表達式為:

這裡的W是3維的,尺寸為d*m*k,其中d表示輸入層節點的個數,m表示隱含層節點的個數,k表示每個隱含層節點對應了k個”隱隱含層”節點,這k個”隱隱含層”節點都是線性輸出的,而maxout的每個節點就是取這k個”隱隱含層”節點輸出值中最大的那個值。因為激發函式中有了max操作,所以整個maxout網路也是一種非線性的變換。

maxout的擬合能力是非常強的,它可以擬合任意的的凸函式。它同dropout一樣需要人為設定一個k值。 

舉一個簡單的例子:

假設有一個在第i層有2個節點第(i+1)層有1個節點構成的神經網路。 

我們已知,out = f(W.X+b),f是啟用函式。.表示內積。

那麼當我們對(i+1)層使用maxout(設定k=5)然後再輸出的時候,情況就發生了改變。 

此時網路形式上就變成上面的樣子,用公式表現出來就是: 
z1 = W1.X+b1; 
z2 = W2.X+b2; 
z3 = W3.X+b3; 
z4 = W4.X+b4; 
z5 = W4.X+b5; 
out = max(z1,z2,z3,z4,z5); 

也就是說第(i+1)層的啟用值計算了5次,但最後的out值只取這5次計算中結果的最大值。

這種操作可以將原本線性的輸出變成非線性的(取最大值顯然不是線性),缺點是maxout明顯增加了網路的計算量,使得應用maxout的層的引數個數變成原來的k倍。

再舉一個複雜一點的例子:

如上圖,最下面一層即第i層有3個節點,用紅點表示。第(i+1)層有4個結點,用彩色點表示。

我們在第(i+1)層採用maxout啟用函式(k=3)。則第(i+1)層的每個節點的啟用值都有3個值,3個值的最大值才是(i+1)層的最終啟用值。

也就是說,決定結點的啟用值的時並不是以層為單位,而是以節點為單位。 

maxout的擬合能力是非常強的,它可以擬合任意的的凸函式。最直觀的解釋就是任意的凸函式都可以由分段線性函式以任意精度擬合,而maxout又是取k個隱隱含層節點的最大值,這些”隱隱含層"節點也是線性的,所以在不同的取值範圍下,最大值也可以看做是分段線性的(分段的個數與k值有關)。

如:

maxout函式的作者從數學的角度上也證明了這個結論,即只需2個maxout節點就可以擬合任意的凸函式(相減),前提是”隱隱含層”節點的個數可以任意多。

如:

如何選擇合適的啟用函式:

深度學習往往需要大量時間來處理大量資料,模型的收斂速度是最為重要的。所以,訓練深度學習網路儘量使用zero-centered資料 (可以經過資料預處理實現) 和zero-centered輸出。要儘量選擇輸出具有zero-centered特點的啟用函式以加快模型的收斂速度;

如果使用 ReLU,那麼一定要小心設定 learning rate,不要讓網路出現很多 “dead” 神經元,如果不好解決,可以試試 Leaky ReLU、PReLU 或者 Maxout;

最好不要用 sigmoid。

在卷積神經網路 Convolutional neural networks 的卷積層中,推薦的激勵函式是 relu。在迴圈神經網路中 recurrent neural networks,推薦的是 tanh 或者是 relu。