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