- TensorFlow神經網絡到深度學習
- 張德豐編著
- 1871字
- 2021-05-19 18:18:35
3.3 激活函數
激活函數的主要作用就是用來加入非線性因素的,以解決線性模型表達能力不足的缺陷,在整個神經網絡里起到至關重要的作用。
因為神經網絡的數學基礎是處處可微的,所以選取的激活函數要能保證數據輸入與輸出也是可微的。
在神經網絡里常用的激活函數有sigmoid、tanh和relu等。
3.3.1 sigmoid激活函數
sigmoid激活函數也被稱為S型函數,它可以將整個實數區間映射到(0,1)區間,因此經常被用來計算概率,它也是在傳統神經網絡中被經常使用的一種激活函數。
sigmoid激活函數由下列公式定義:

sigmoid激活函數曲線如圖3-6所示,其中,x可以是正無窮到負無窮,但是對應的y卻在0~1的區間內,所以,經過sigmoid激活函數輸出的函數都會落在0~1的區間內,即sigmoid激活函數能夠把輸入的值“壓縮”到0~1。

圖3-6 sigmoid激活函數曲線
例如:

運行程序,輸出如下:

可總結出sigmoid激活函數的優缺點如下所述。
sigmoid激活函數的優點:輸出的映射區間(0,1)內單調連續,非常適合用在輸出層,并且比較容易求導。
sigmoid激活函數的缺點:它具有軟飽和性,即當輸入x趨向于無窮的時候,它的導數會趨于0,導致很容易產生梯度消失。
此外,在TensorFlow中,提供了log_sigmoid函數用于對sigmoid激活函數求log,它將整個實數區間映射到了(負無窮,0)。
【例3-1】利用log_sigmoid函數對給定的sigmoid激活函數求log。


運行程序,輸出如下,log_sigmoid函數圖像如圖3-7所示。


圖3-7 log_sigmoid函數圖像
3.3.2 tanh激活函數
tanh激活函數是雙曲正切函數,它將整個實數區間映射到了(-1,1),tanh激活函數也具有軟飽和性。它的輸出以0為中心,tanh激活函數的收斂速度比sigmoid激活函數的收斂速度要快,由于存在軟飽和性,所以tanh激活函數也存在梯度消失的問題。
tanh激活函數由下列公式定義:

【例3-2】繪制tanh激活函數曲線。

運行程序,輸出如下,tanh激活函數曲線如圖3-8所示。



圖3-8 tanh激活函數曲線
由圖3-8可以看出,其x取值也是從正無窮到負無窮,對應的y值變為-1~1,相對于sigmoid激活函數有更廣的值域。但也顯而易見,tanh激活函數與sigmoid激活函數有一樣的缺陷,也是飽和問題,所以在使用tanh激活函數時,要注意輸入值的絕對值不能過大,否則模型無法訓練。
3.3.3 relu激活函數
除了sigmoid激活函數和tanh激活函數,還有一個更為常用的relu激活函數(也稱為Rectifier)。其由以下公式定義:

該式非常簡單,大于0的留下,否則一律為0。relu激活函數應用的廣泛性與它的優勢是分不開的,這種對正向信號的重視,忽略了負向信號的特性,與我們人類神經元細胞對信號的反映極其相似。所以在神經網絡中取得了很好的擬合效果。
另外,由于relu激活函數運算簡單,大大提升了機器的運動效率,也是relu激活函數一個很大的優點。
【例3-3】繪制relu激活函數曲線。

運行程序,輸出如下,relu激活函數曲線圖如圖3-9所示。


圖3-9 relu激活函數曲線圖
與relu激活函數類似的還有softplus激活函數,它們二者的區別在于:softplus激活函數會更加平滑,但計算量很大,而且對于小于0的值保留的相對更多一些。其定義公式為

【例3-4】繪制softplus激活函數曲線。

運行程序,輸出如下,softplus激活函數曲線圖如圖3-10所示。


圖3-10 softplus激活函數曲線圖
雖然,relu激活函數在信號響應上有很多優勢,但這僅僅在正向傳播方面。由于其對負值的全部舍去,因此很容易使模型輸出為全零,從而無法再進行訓練。例如,隨機初始化的w值中有一個值是負值,其對應的正值輸入值特征也就全部被屏蔽了,同理,對應負值輸入值反而被激活了。這顯然不是我們想要的結果。于是在基于relu激活函數的基礎上又演化出了一些變種函數。
·relu6激活函數:定義min(max(features,0),6),也就是說它的取值區間被限定為[0,6]。
【例3-5】繪制relu6激活函數曲線。

運行程序,輸出如下,relu6激活函數曲線圖如圖3-11所示。


圖3-11 relu6激活函數曲線圖
·crelu激活函數:定義為[relu(x),relu(-x)]相對于relu(x),crelu激活函數的輸出會增加一倍。
【例3-6】利用crelu激活函數對輸入數據進行計算。

運行程序,輸出如下:

·leak_relu激活函數:leak_relu激活函數會給x<0一個斜率,而不是將所有x<0都輸出0,默認斜率是0.2,x>0的部分仍然輸出是x,即斜率為1,保持不變。
【例3-7】繪制leak_relu激活函數曲線。


運行程序,輸出如下,leak_relu激活函數曲線圖如圖3-12所示。


圖3-12 leak_relu激活函數曲線圖
3.3.4 dropout激活函數
dropout激活函數會以概率keep_prob來決定神經元是否被抑制。如果被抑制,該神經元則輸出為0;如果不被抑制,該神經元則輸出為輸入的1/keep_prob倍,每個神經元是否會被抑制是相互獨立的。神經元是否被抑制還可以通過noise_shape來調節,當noise_shape[i]=shape(x)[i]時,x中的元素是相互獨立的。如果shape(x)=[k,l,m,n](k表示數據的個數,l表示數據的行數,m表示數據的列數,n表示通道數),當noise_shape=[k,l,l,n]時,表示數據的個數與通道是相互獨立的,但是與數據的行和列是有關聯的,即要么都為0,要么都為輸入的1/keep_prob倍。
【例3-8】利用dropout激活函數對輸入隨機數進行計算。


運行程序,輸出如下:
