卷積神經網絡中激活函數的意義

激活函數的意義:

在生物意義上的神經元中,只有前面的樹突傳遞的信號的加權和值大於某一個特定的閾值的時候,後面的神經元纔會被激活。

簡單的說激活函數的意義在於判定每個神經元的輸出

有沒有達到閾值。

放在人臉識別卷積神經網絡中來思考,卷積層的激活函數的意義在於這一塊區域的特徵強度如果沒有達到一定的標準,就輸出0,表明這種特徵提取方式(卷積核w)不能在該塊區域提取到特徵,或者說這塊區域的這種特徵很弱。由於輸出0時,激活函數梯度幾乎都爲0,所以在特徵很弱的區域,梯度幾乎不下降,也就是說,和該特徵無關的區域不會影響到該特徵提取方式的訓練。

反過來說,如果沒有激活函數,就算特徵很弱時,仍然可以得到輸出,後面的層次繼續把這個輸出當成一個特徵使用,這是不合理的。爲了形象起見,我們做個比喻,本來我們可能希望在這個區域看到一個圓形,但是這裏卻是一個三角形,如果該三角形和我們期望看到的圓形形狀相差很大的時候神經元的輸出WX+B很小,我們就不希望輸出值去衡量這個三角形有多不圓,而是希望輸出這裏沒有一個圓形(對於分類問題而言,有多不圓對於我們的分類沒有意義,因爲我們是通過了解到形狀的組合來判定人臉屬於哪一類,驗證問題同理)。

個人理解這也是激活函數要非線性的意義。
Sigmod與tanh

Sigmoid. Sigmoid 非線性激活函數的形式是σ(x)=1/(1+e−x),其圖形如上圖左所示。之前我們說過,sigmoid函數輸入一個實值的數,然後將其壓縮到0~1的範圍內。特別地,大的負數被映射成0,大的正數被映射成1。sigmoid function在歷史上流行過一段時間因爲它能夠很好的表達“激活”的意思,未激活就是0,完全飽和的激活則是1。而現在sigmoid已經不怎麼常用了,主要是因爲它有兩個缺點:

    1.Sigmoid**容易飽和,並且當輸入非常大或者非常小的時候,神經元的梯度就接近於0了,從圖中可以看出梯度的趨勢。這就使得我們在反向傳播算法中反向傳播接近於0的梯度,導致最終權重基本沒什麼更新**,我們就無法遞歸地學習到輸入數據了。另外,你需要尤其注意參數的初始值來儘量避免這一情況。如果你的初始值很大的話,大部分神經元可能都會處在飽和的狀態而把梯度kill掉,這會導致網絡變的很難學習。

    對於這一點,我個人的理解就是對於數據特別小的時候,梯度確實應該接近0(等於0就不好了),理由如上所述,數據特別大的時候,梯度不應該接近0。就像Relu函數做的那樣。

    2.Sigmoid 的輸出不是0均值的,這是我們不希望的,因爲這會導致後層的神經元的輸入是非0均值的信號,這會對梯度產生影響:假設後層神經元的輸入都爲正(e.g. x>0 elementwise in f=wTx+b),那麼對w求局部梯度則都爲正,這樣在反向傳播的過程中w要麼都往正方向更新,要麼都往負方向更新,導致有一種捆綁的效果,使得收斂緩慢。

    當然了,如果你是按batch去訓練,那麼每個batch可能得到不同的符號(正或負),那麼相加一下這個問題還是可以緩解。因此,非0均值這個問題雖然會產生一些不好的影響,不過跟上面提到的 kill gradients 問題相比還是要好很多的。

    (個人認爲,如果使用SGD,則Batch訓練仍然不能達到上面說的效果,所以sigmod使用SGD效果不好。)

Tanh. Tanh和Sigmoid是有異曲同工之妙的,它的圖形如上圖右所示,不同的是它把實值得輸入壓縮到-1~1的範圍,因此它基本是0均值的,也就解決了上述Sigmoid缺點中的第二個,所以實際中tanh會比sigmoid更常用。但是它還是存在梯度飽和的問題。Tanh是sigmoid的變形:tanh(x)=2σ(2x)−1。
RELU

ReLU. 近年來,ReLU 變的越來越受歡迎。它的數學表達式是:

f(x)=max(0,x)

很顯然,從上圖左可以看出,輸入信號 \<0時,輸出爲0,>0時,輸出等於輸入。ReLU的優缺點如下:

    優點1:Krizhevsky et al.在ImageNet Classification with Deep Convolutional
    Neural Networks 提出使用 ReLU 得到的SGD的收斂速度會比 sigmoid/tanh 快很多(如上圖右)。有人說這是因爲它是linear,而且梯度不會飽和。

    爲什麼線性不飽和,就會收斂的快?反向傳播算法中,下降梯度等於敏感度乘以前一層的輸出值,所以前一層輸出越大,下降的梯度越多。該優點解決了sigmod的問題1的一部分

    優點2:相比於 sigmoid/tanh需要計算指數等,計算複雜度高,ReLU 只需要一個閾值就可以得到激活值。

    缺點1: ReLU在訓練的時候很”脆弱”,一不小心有可能導致神經元”壞死”。舉個例子:由於ReLU在x<0時梯度爲0,這樣就導致負的梯度在這個ReLU被置零,而且這個神經元有可能再也不會被任何數據激活。如果這個情況發生了,那麼這個神經元之後的梯度就永遠是0了,也就是ReLU神經元壞死了,不再對任何數據有所響應。實際操作中,如果你的learning rate 很大,那麼很有可能你網絡中的40%的神經元都壞死了。 當然,如果你設置了一個合適的較小的learning rate,這個問題發生的情況其實也不會太頻繁。

​ 這個缺點類似sigmod問題1的另一部分,也就是說,如果在訓練中某一次下降的太快,會導致該卷積覈對要提取的特徵要求過高,形象的說,就是變成了一個“完美主義”卷積核,所有形狀都入不了它的眼,這樣這個神經元就沒用了,壞死了
leaky ReLU

Leaky ReLU. Leaky ReLUs 就是用來解決ReLU壞死的問題的。和ReLU不同,當x\<0時,它的值不再是0,而是一個較小斜率(如0.01等)的函數。也就是說f(x)=1(x\<0)(ax)+1(x>=0)(x),其中a是一個很小的常數。這樣,既修正了數據分佈,又保留了一些負軸的值,使得負軸信息不會全部丟失。關於Leaky ReLU 的效果,衆說紛紜,沒有清晰的定論。有些人做了實驗發現 Leaky ReLU 表現的很好;有些實驗則證明並不是這樣。

Leaky ReLU相當於對sigmod問題2有一定改善,更主要的是解決了ReLu的壞死問題,讓壞了的神經元可以自我慢慢恢復,但是壞處就是,如果a過大,會丟失作爲激活函數的原意。

我認爲,Leaky ReLu的作用肯定是有的,但是既有好處也有壞處,關鍵在於a值的把握。

    PReLU. 對於 Leaky ReLU 中的a,通常都是通過先驗知識人工賦值的。然而可以觀察到,損失函數對a的導數我們是可以求得的,可不可以將它作爲一個參數進行訓練呢? Kaiming He 2015的論文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》指出,不僅可以訓練,而且效果更好。原文說使用了Parametric ReLU後,最終效果比不用提高了1.03%.
    -Randomized Leaky ReLU. Randomized Leaky ReLU 是 leaky ReLU 的random 版本, 其核心思想就是,在訓練過程中,a是從一個高斯分佈中隨機出來的,然後再在測試過程中進行修正。


maxout

假設我們網絡第i層有2個神經元x1、x2,第i+1層的神經元個數爲1個,如下圖所示:

img

(1)以前MLP的方法。我們要計算第i+1層,那個神經元的激活值的時候,傳統的MLP計算公式就是:

z=W*X+b

out=f(z)

其中f就是我們所謂的激活函數,比如Sigmod、Relu、Tanh等。

(2)Maxout 的方法。如果我們設置maxout的參數k=5,maxout層就如下所示:

img

相當於在每個輸出神經元前面又多了一層。這一層有5個神經元,此時maxout網絡的輸出計算公式爲:

z1=w1*x+b1

z2=w2*x+b2

z3=w3*x+b3

z4=w4*x+b4

z5=w5*x+b5

out=max(z1,z2,z3,z4,z5)

所以這就是爲什麼採用maxout的時候,參數個數成k倍增加的原因。本來我們只需要一組參數就夠了,採用maxout後,就需要有k組參數。

我的理解是,本來只能提取一類特徵,現在提供五類特徵提取方式,選擇其中最符合一類。

那麼可以分析得知:

優勢是具有上述的恢復能力,而且恢復的是最接近的一個特徵提取方式,由於有五個備選,那麼雖然是線性,但是對整體系統影響不那麼大。

缺點是參數數目大幅增加,網絡結構複雜。

References:
1.《ImageNet Classification with Deep Convolutional
Neural Networks》
2.《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》
3.《A Lightened CNN for Deep Face Representation》

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章