1 什么是激活函數?
激活函數,並不是去激活什么,而是指如何把“激活的神經元的特征”通過函數把特征保留並映射出來(保留特征,去除一些數據中是的冗余),這是神經網絡能解決非線性問題關鍵。
目前知道的激活函數有如下幾個:sigmoid,tanh,ReLu,softmax。
simoid函數也稱S曲線:f(x)=11+e−x
tanh:f(x)=tanh(x)
ReLU:f(x)=max(x,0)
softmax:f(x)=log(1+exp(x))
2 神經網絡中為什么要使用激活函數?
- 激活函數是用來加入非線性因素的,因為線性模型的表達力不夠
這句話字面的意思很容易理解,但是在具體處理圖像的時候是什么情況呢?我們知道在神經網絡中,對於圖像,我們主要采用了卷積的方式來處理,也就是對每個像素點賦予一個權值,這個操作顯然就是線性的。但是對於我們樣本來說,不一定是線性可分的,為了解決這個問題,我們可以進行線性變化,或者我們引入非線性因素,解決線性模型所不能解決的問題。
這里插一句,來比較一下上面的那些激活函數,因為神經網絡的數學基礎是處處可微的,所以選取的激活函數要能保證數據輸入與輸出也是可微的,運算特征是不斷進行循環計算,所以在每代循環過程中,每個神經元的值也是在不斷變化的。
這就導致了tanh特征相差明顯時的效果會很好,在循環過程中會不斷擴大特征效果顯示出來,但有是,在特征相差比較復雜或是相差不是特別大時,需要更細微的分類判斷的時候,sigmoid效果就好了。
還有一個東西要注意,sigmoid 和 tanh作為激活函數的話,一定要注意一定要對 input 進行歸一話,否則激活后的值都會進入平坦區,使隱層的輸出全部趨同,但是 ReLU 並不需要輸入歸一化來防止它們達到飽和。
- 構建稀疏矩陣,也就是稀疏性,這個特性可以去除數據中的冗余,最大可能保留數據的特征,也就是大多數為0的稀疏矩陣來表示。
其實這個特性主要是對於Relu,它就是取的max(0,x),因為神經網絡是不斷反復計算,實際上變成了它在嘗試不斷試探如何用一個大多數為0的矩陣來嘗試表達數據特征,結果因為稀疏特性的存在,反而這種方法變得運算得又快效果又好了。
所以我們可以看到目前大部分的卷積神經網絡中,基本上都是采用了ReLU 函數。
摘自:http://blog.csdn.net/huahuazhu/article/details/74188288
神經網絡中如果不加入激活函數,其一定程度可以看成線性表達,最后的表達能力不好,如果加入一些非線性的激活函數,整個網絡中就引入了非線性部分,增加了網絡的表達能力。目前比較流行的激活函數主要分為以下7種:
1.sigmoid
2.tanh
3.ReLu
4.Leaky ReLu
5.PReLu
6.RReLu
7 Maxout
總結
參考文獻:
[ReLu]:Rectifier Nonlinearities Improve Neural Network Acoustic Models
[PRelu]:Delving Deep into Rectifiers:Surpassing Human-Level Performance on ImageNet Classification
ReLU
tensorflow中:tf.nn.relu(features, name=None)
LReLU
(Leaky-ReLU)
其中ai
是固定的。i表示不同的通道對應不同的ai
.
tensorflow中:tf.nn.leaky_relu(features, alpha=0.2, name=None)
PReLU
其中ai
是可以學習的的。如果ai=0,那么 PReLU 退化為ReLU;如果 ai是一個很小的固定值(如ai=0.01),則 PReLU 退化為 Leaky ReLU(LReLU)。
PReLU 只增加了極少量的參數,也就意味着網絡的計算量以及過擬合的危險性都只增加了一點點。特別的,當不同 channels 使用相同的ai時,參數就更少了。BP 更新ai
時,采用的是帶動量的更新方式(momentum)。
tensorflow中:沒找到啊!
CReLU
(Concatenated Rectified Linear Units)
tensorflow中:tf.nn.crelu(features, name=None)
ELU
其中α是一個可調整的參數,它控制着ELU負值部分在何時飽和。
右側線性部分使得ELU能夠緩解梯度消失,而左側軟飽能夠讓ELU對輸入變化或噪聲更魯棒。ELU的輸出均值接近於零,所以收斂速度更快
tensorflow中:tf.nn.elu(features, name=None)
SELU
經過該激活函數后使得樣本分布自動歸一化到0均值和單位方差(自歸一化,保證訓練過程中梯度不會爆炸或消失,效果比Batch Normalization 要好)
其實就是ELU乘了個lambda,關鍵在於這個lambda是大於1的。以前relu,prelu,elu這些激活函數,都是在負半軸坡度平緩,這樣在activation的方差過大的時候可以讓它減小,防止了梯度爆炸,但是正半軸坡度簡單的設成了1。而selu的正半軸大於1,在方差過小的的時候可以讓它增大,同時防止了梯度消失。這樣激活函數就有一個不動點,網絡深了以后每一層的輸出都是均值為0方差為1。
tensorflow中:tf.nn.selu(features, name=None)