1.3.3 激活函数介绍
激活函數
到目前為止,我們使用的激活函數全部都是σσ函數,然而這并不一定是最好的函數,有時其他可選的函數效果也很好,下面我們來介紹一下其他的函數。
如圖所示,我們在這里使用σσ函數作為激活函數。我們現在使用g(z(x)),作為更一般的可以使用的函數。我們這里介紹一下tanhx,是雙曲正切函數。tanhx,實際上在數學上是σσ函數經過平移之后的結果。tanhx相比于σσ函數更好的一點,就是他介于-1到1之間,平均值為0。而σσ函數的平均值為0.5。這實際上可以讓下層的學習更方便一些。因為tanhx的平均值為0,所以幾乎在任何場景下,他的結果都比σσ函數更好,但是有一個例外是在輸出的預測值y^,因為我們希望輸出的預測值介于0和1之間,而不是-1和1之間。在這里σσ函數要效果好很多。這時我們應該使用σσ函數作為輸出層。
不過這兩個函數也有一個缺點,從圖像中我們可以看到,當z很大或者很小的時候,z的變化量接近于0,這在于我們求梯度的時候效果非常糟糕,會拖慢學習進度。
我們還有一個ReLU函數,為的就是應對這個問題,通常情況下我們都會使ReLU函數作為神經網絡的激活函數,如果你不知道選什么函數作為激活函數,一般就選擇ReLU函數。不過ReLU函數有一個缺點,就是如果z,是負數的時候,那么導數為0。在實踐中使用ReLU函數,相比于tanh函數和σσ函數而言,學習效率會高很多,因為他沒有斜率接近于0的時候。
最后,我們總結一下,如圖所示:
深度學習的一個特點就是在建立神經網絡時,可以有很多不同的選擇,比如隱藏單元、激活函數,還有如何初始化權重。
為什么需要非線性激活函數
為什么神經網絡必須要用非線性的函數呢,我們這里來解釋一下:
如圖所示,如果我們舍去激活函數,或者干脆就讓激活函數就等于z本身,而不做一些非線性處理,在圖的右側我們可以看出,最后的結果是
a[2]=w‘x+b‘a[2]=w‘x+b‘
依舊是線性的。
如果你使用線性激活函數,那么神經網絡不過是把輸入經過線性組合之后再輸出。對于這種情況來說,有激活函數和沒有激活函數都沒有辦法改變線性性,無論是有多少的隱藏層也做不到。不引入非線性性,則永遠只能在線性性里面打轉。
神經網絡的梯度下降法
下面我們介紹一下如何用梯度下降法來處理單隱層神經網絡。
如圖所示,左側是正向傳播的計算流程,右側是反向傳播的計算流程。右側我們有一個語句:
np.sum(dz, axis=1, keepdims=True )這個命令中axis=1表示的是要水平相加求和,keepdims=True表示的是防止python輸出古怪的秩為1的數組,保證輸出的是矩陣。
還有一個公式:
dz=wTdz?g‘(z)dz=wTdz?g‘(z)
其中 g‘(z)g‘(z)表示的是隱藏層激活函數的導數,注意這里我們所不同的是乘號兩邊兩個矩陣逐個元素相乘
輸出層的公式:
dz=A?Ydz=A?Y
假設的是用sigmod函數進行一個二元分類。
總結
以上是生活随笔為你收集整理的1.3.3 激活函数介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.3.2 向量化实现浅层神经网络
- 下一篇: 深层神经网络中的前向传播