續(xù)前一節(jié)1.3 淺層神經(jīng)網(wǎng)絡(luò)1
5. 向量化實(shí)現(xiàn)的解釋?zhuān)‥xplanation for vectorized implementation)
本節(jié)課主要對(duì)前一節(jié)課第4節(jié)寫(xiě)出的多樣本神經(jīng)網(wǎng)絡(luò)正向傳播計(jì)算過(guò)程向量化的正確性進(jìn)行證明。具體證明過(guò)程此處不作詳細(xì)說(shuō)明。
6. 激活函數(shù)(Activation functions)
到目前為止,我們一直用sigmoid函數(shù)作為激活函數(shù),但實(shí)際上,有些時(shí)候,其他激活函數(shù)的效果可能更好一些。本節(jié)課就對(duì)可選激活函數(shù)進(jìn)行了簡(jiǎn)單介紹。
在之前的神經(jīng)網(wǎng)絡(luò)和Logistic回歸中使用的sigmoid函數(shù)就是其中一種激活函數(shù)。
在更一般的情況下,我們可以使用不同的函數(shù),記為g(z),那么在前一節(jié)課中的第4節(jié)推導(dǎo)出的a的計(jì)算公式

可以改寫(xiě)為

其中,g可以是非線(xiàn)性函數(shù),不一定是sigmoid函數(shù),在前面的課程學(xué)習(xí)中,我們知道,sigmoid函數(shù)介于0和1之間。有個(gè)激活函數(shù)一般情況下都比sigmoid函數(shù)表現(xiàn)更好一些,這個(gè)函數(shù)就是tanh函數(shù)(tanh function)或者稱(chēng)為雙曲正切函數(shù)(hyperbolic tangent function),它的值介于-1和1之間,公式為:

tanh函數(shù)的圖像如下圖所示:

由于tanh函數(shù)的輸出介于-1和1之間,并且具有類(lèi)似數(shù)據(jù)中心化的效果,激活函數(shù)的平均值更接近于0,這就使得下一層的學(xué)習(xí)更加方便,從而使得tanh函數(shù)在神經(jīng)網(wǎng)絡(luò)中的表現(xiàn)大部分情況下都比sigmoid函數(shù)更好。具體的算法優(yōu)化將在下一部分課程【改善深層神經(jīng)網(wǎng)絡(luò):超參數(shù)調(diào)試、正則化以及優(yōu)化】中講解。
Andrew目前已經(jīng)很少會(huì)使用sigmoid函數(shù),因?yàn)閠anh函數(shù)幾乎在所有場(chǎng)合的表現(xiàn)都更加優(yōu)越。其中,有一種例外情況就是輸出層,因?yàn)橛?xùn)練集中的輸出結(jié)果y的值要么是0,要么是1,那么輸出層的結(jié)果y帽介于0與1之間會(huì)更加合理,這里就不適合使用tanh函數(shù)。sigmoid函數(shù)在二元分類(lèi)場(chǎng)景中使用會(huì)比較合適,即輸出層的激活函數(shù)使用sigmoid函數(shù)比較合理。也就是說(shuō),在神經(jīng)網(wǎng)絡(luò)中,很有可能不同層的激活函數(shù)是不同的,如下圖所示:

sigmoid函數(shù)和tanh函數(shù)都有的一個(gè)缺點(diǎn)是:如果z非常大或者非常小,那么導(dǎo)數(shù)的梯度或者說(shuō)這個(gè)函數(shù)的斜率可能會(huì)很小,即接近于0。這樣就會(huì)拖慢梯度下降算法。
在機(jī)器學(xué)習(xí)里,最受歡迎的一個(gè)函數(shù)是修正線(xiàn)性單元(Rectified Linear Unit,ReLU),它的公式為:

現(xiàn)在機(jī)器學(xué)習(xí)中,一般輸出層的激活函數(shù)用sigmoid函數(shù),其他層全部默認(rèn)使用ReLU。在不確定神經(jīng)網(wǎng)絡(luò)隱藏層使用哪一種激活函數(shù)時(shí),默認(rèn)直接選擇使用ReLU即可。但還是有一部分人隱藏層的激活函數(shù)使用的是tanh函數(shù)。
ReLU的一個(gè)缺點(diǎn)是:當(dāng)z為負(fù)數(shù)時(shí),導(dǎo)數(shù)等于0,在實(shí)踐過(guò)程中這個(gè)沒(méi)有問(wèn)題。但ReLU還有另一個(gè)版本,叫做帶泄漏的ReLU(Leaky ReLU),這個(gè)函數(shù)值在z為負(fù)數(shù)時(shí)不為0,而是一個(gè)很平緩的斜率。這個(gè)函數(shù)通常比ReLU表現(xiàn)更好,但實(shí)際應(yīng)用并不多。
如果ReLU和帶泄漏的ReLU一定要選一個(gè),Andrew建議使用ReLU。
這兩個(gè)函數(shù)的優(yōu)點(diǎn)是:對(duì)于很多z空間,激活函數(shù)的導(dǎo)數(shù)或者叫斜率與0相差很大,這樣神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)速度會(huì)比使用tanh激活函數(shù)或者sigmoid激活函數(shù)快得多。主要原因是:ReLU減少了函數(shù)導(dǎo)數(shù)或者斜率趨向于0的概率,這樣就能避免學(xué)習(xí)速度在導(dǎo)數(shù)為0時(shí)的明顯下降。
理論上說(shuō),z的一半范圍的取值都會(huì)使得ReLU的斜率為0,但在實(shí)踐中,有足夠多的隱藏單元令z大于0,所以對(duì)大多數(shù)的訓(xùn)練樣本來(lái)說(shuō),學(xué)習(xí)速度還是很快的。下圖為ReLU和帶泄漏的ReLU的圖像:

下面對(duì)本節(jié)課的學(xué)習(xí)內(nèi)容簡(jiǎn)單總結(jié)一下:
- sigmoid函數(shù)只用于二元分類(lèi)的輸出層,其他情況都不要使用,或者幾乎從來(lái)不用;
- tanh函數(shù)一般情況下都比sigmoid函數(shù)表現(xiàn)更好;
- ReLU是最常用的默認(rèn)激活函數(shù);
- 帶泄漏的ReLU也可以嘗試應(yīng)用一下,看下實(shí)際的應(yīng)用效果,它的公式一般是:a=max(0.01z,z),其中,常數(shù)0.01也可以自己進(jìn)行調(diào)整,或者改成學(xué)習(xí)率參數(shù)都可以,比較下不同取值的表現(xiàn)。

深度學(xué)習(xí)的其中一個(gè)特點(diǎn)是在建立神經(jīng)網(wǎng)絡(luò)時(shí),經(jīng)常有很多不同的選擇,比如隱藏單元數(shù)、激活函數(shù)、如何初始化權(quán)重等,而這些內(nèi)容的選擇,并沒(méi)有一個(gè)準(zhǔn)則來(lái)確定究竟什么樣的參數(shù)組合更適合解決你的問(wèn)題,在Andrew的這門(mén)課中,他將介紹哪些是熱門(mén)選擇,哪些用的比較少。對(duì)于不確定哪種激活函數(shù)最有效時(shí),可以先試試,在保留交叉驗(yàn)證數(shù)據(jù)集或開(kāi)發(fā)集上跑跑試試,哪個(gè)參數(shù)效果更好就用哪個(gè)。這樣才能夠構(gòu)建一個(gè)更適合要解決的問(wèn)題特性的神經(jīng)網(wǎng)絡(luò)架構(gòu)。
7. 為什么需要非線(xiàn)性激活函數(shù)?(Why do you need non-linear activation fucntions)
上一節(jié)課我們介紹了多種熱門(mén)的激活函數(shù),那么為什么神經(jīng)網(wǎng)絡(luò)需要非線(xiàn)性的激活函數(shù)呢?本節(jié)課就對(duì)這個(gè)問(wèn)題給出了解答。
事實(shí)證明,要讓神經(jīng)網(wǎng)絡(luò)能夠計(jì)算出有趣的函數(shù),就必須使用非線(xiàn)性激活函數(shù)。
神經(jīng)網(wǎng)絡(luò)正向傳播的方程為:

我們?yōu)槭裁床蝗サ艉瘮?shù)g,然后令a[1]=z[1],或者令g(z)=z呢?這種函數(shù)被稱(chēng)為線(xiàn)性激活函數(shù),或者更學(xué)術(shù)一點(diǎn)的稱(chēng)為恒等激活函數(shù),因?yàn)樗鼈冎苯訉⑤斎胼敵隽恕?/p>
為了說(shuō)明問(wèn)題,假設(shè)

則將a[1]的定義帶入a[2],得到如下方程:

從上述方程可以看出,如果使用線(xiàn)性激活函數(shù)(恒等激活函數(shù)),那么,神經(jīng)網(wǎng)絡(luò)只是把輸入線(xiàn)性組合再輸出。在后續(xù)會(huì)講到的深度網(wǎng)絡(luò)中,有很多神經(jīng)網(wǎng)絡(luò)和隱藏層,如果使用線(xiàn)性激活函數(shù)或不使用激活函數(shù),那么神經(jīng)網(wǎng)絡(luò)中有多少層,一直做得都只是計(jì)算線(xiàn)性激活函數(shù)。這樣的話(huà),還不如直接去掉所有隱藏層。
此外,如果在雙層神經(jīng)網(wǎng)絡(luò)中,隱藏層全部使用線(xiàn)性激活函數(shù),輸出層使用sigmoid激活函數(shù),則這個(gè)雙層神經(jīng)網(wǎng)絡(luò)的效果與Logistic回歸的效果是一樣的。

這就說(shuō)明,線(xiàn)性隱層是沒(méi)有任何作用的。多個(gè)線(xiàn)性函數(shù)組合最終還是一個(gè)線(xiàn)性函數(shù),除非引入非線(xiàn)性函數(shù)。
只有一種場(chǎng)景可以在輸出層使用線(xiàn)性激活函數(shù)即g(z)=z,即機(jī)器學(xué)習(xí)的對(duì)象是回歸問(wèn)題。此時(shí),隱藏層要使用其他非線(xiàn)性激活函數(shù),如ReLU、tanh、帶泄漏的ReLU等。
與壓縮有關(guān)的一些非常特殊的情況可能會(huì)在隱藏層中使用線(xiàn)性激活函數(shù)。除此之外,使用線(xiàn)性激活函數(shù)的情況非常少見(jiàn)。
8. 激活函數(shù)的導(dǎo)數(shù)(Derivatives of activation functions)
當(dāng)實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的反向傳播時(shí),需要計(jì)算激活函數(shù)的斜率或者導(dǎo)數(shù)。下面我們來(lái)看看激活函數(shù)的選擇以及如何計(jì)算這些函數(shù)的斜率。
- sigmoid激活函數(shù)導(dǎo)數(shù)計(jì)算過(guò)程
如果激活函數(shù)g(z)是一個(gè)sigmoid函數(shù),即

則g(z)的導(dǎo)數(shù)為:

為了證明上述等式的合理性,我們?nèi)蓚€(gè)極值做一個(gè)驗(yàn)證:
- 當(dāng)z足夠大時(shí),假設(shè)z=10,此時(shí)

而此時(shí)導(dǎo)數(shù)為0,推導(dǎo)過(guò)程如下:

從圖6中我們可以看出,當(dāng)z值足夠大時(shí),g(z)的斜率幾乎是趨近于0的,這與上面的公式推導(dǎo)過(guò)程得出的結(jié)論是一致的。
- 相反的,如果z=-10,從圖6可以看到z很小時(shí),g(z)的值很接近0,此時(shí),g(z)的斜率也很接近于0,斜率或?qū)?shù)的結(jié)果推導(dǎo)過(guò)程如下:

- 當(dāng)z=0時(shí),g(z)=1/2,此時(shí),導(dǎo)數(shù)為:


導(dǎo)數(shù)除了d/dz g(z)這種表示法以外,還可以有另一種表示方法:g'(z)。而g(z)可表示為a,即a=g(z),則sigmoid激活函數(shù)的導(dǎo)數(shù)的另一種表示為:

這種表示法的好處是,如果已知g(z)的斜率,則可根據(jù)上述公式快速計(jì)算得出g'(z)的值,即g(z)的斜率。
- tanh激活函數(shù)導(dǎo)數(shù)計(jì)算過(guò)程
對(duì)tanh激活函數(shù)進(jìn)行求導(dǎo),得到如下公式:

從圖7的tanh激活函數(shù)的圖像中可以看出,當(dāng)z足夠大或者足夠小時(shí),導(dǎo)數(shù)g'(z)的值趨向于0。這里取z的兩個(gè)極值和一個(gè)特殊值,來(lái)驗(yàn)證下導(dǎo)數(shù)公式的正確性:
- 當(dāng)z=10時(shí),tanh(z)的值約等于1,將這個(gè)值代入求導(dǎo)公式g'(z),得到斜率約等于0,這與在圖7中看到的趨勢(shì)是一致的;

- 當(dāng)z=-10時(shí),tanh(z)的值約等于-1,將這個(gè)值代入求導(dǎo)公式g'(z),得到斜率約等于0,這與在圖7中看到的趨勢(shì)是一致的;

- 當(dāng)z=0時(shí),tanh(z)=0,將這個(gè)值代入求導(dǎo)公式g'(z),得到斜率等于1,這與在圖7中看到的趨勢(shì)是一致的;

令a=tanh(z),則

使用上述公式,只要已知a的值,即可快速計(jì)算出對(duì)應(yīng)的導(dǎo)數(shù)或斜率。
- ReLU導(dǎo)數(shù)計(jì)算過(guò)程
ReLU的公式為:g(z)=max(0,z),在坐標(biāo)系中的圖像如圖8所示。

它的導(dǎo)數(shù)計(jì)算公式為:

從導(dǎo)數(shù)計(jì)算公式可以看出當(dāng)z=0時(shí),無(wú)法計(jì)算導(dǎo)數(shù)或者斜率,這在數(shù)學(xué)上可能不是百分之百的正確,但在軟件實(shí)現(xiàn)的過(guò)程中,這個(gè)激活函數(shù)是可行的。我們可以人為設(shè)定當(dāng)z=0時(shí),令導(dǎo)數(shù)為0或者為1。此時(shí),g'就變成激活函數(shù)g(z)的次梯度,這樣梯度下降法仍然有效。在實(shí)際應(yīng)用場(chǎng)景中,z精確問(wèn)0的概率非常小,所以將z=0處的導(dǎo)數(shù)設(shè)成哪個(gè)值都無(wú)所謂。所以在實(shí)踐中,一般定義z的導(dǎo)數(shù)為如下公式:

- 帶泄漏的ReLU導(dǎo)數(shù)計(jì)算過(guò)程
帶泄漏的ReLU的公式為:g(z)=max(0.01z,z),在坐標(biāo)系中的圖像如圖9所示。

它的導(dǎo)數(shù)計(jì)算公式為:

其中,當(dāng)z=0時(shí)的梯度處理方式與ReLU一致,這里不再贅述。
9. 神經(jīng)網(wǎng)絡(luò)的梯度下降法(Gradient descent for neural networks)
在本節(jié)課中,介紹了單隱層神經(jīng)網(wǎng)絡(luò)的反向傳播或者說(shuō)梯度下降算法的具體實(shí)現(xiàn),并說(shuō)明為什么這幾個(gè)特定的方程是精準(zhǔn)的方程。
單隱層神經(jīng)網(wǎng)絡(luò)的參數(shù)包括:w[1]、b[1]、w[2]、b[2],并且神經(jīng)網(wǎng)絡(luò)有nx=n[0]個(gè)輸入特征,n[1]個(gè)隱藏單元,n[2]個(gè)輸出單元,到目前為止,我們接觸到的單隱層神經(jīng)網(wǎng)絡(luò)的n[2]=1。
- 矩陣w[1]的維度為(n[1],n[0]);
- 矩陣b[1]的維度為(n[1],1),就是n[1]維列向量;
- 矩陣w[2]的維度為(n[2],n[1]);
- 矩陣b[1]的維度為(n[2],1),就是n[2]維列向量;
目前還是假設(shè)神經(jīng)網(wǎng)絡(luò)處理的是二元分類(lèi)問(wèn)題,在這種情況下,神經(jīng)網(wǎng)絡(luò)的參數(shù)的成本函數(shù)定義為:

即損失函數(shù)的平均值,L表示當(dāng)神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)出y帽時(shí)的損失函數(shù),因此這里的y帽其實(shí)就是a[2],其基本真值標(biāo)簽等于y。如果是解決二元分類(lèi)問(wèn)題,則損失函數(shù)就可以與之前做得Logistic回歸完全一致。
所以為了訓(xùn)練神經(jīng)網(wǎng)絡(luò)的參數(shù),需要做梯度下降。在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),隨機(jī)初始化參數(shù)很重要,而不是全部初始化為0。當(dāng)參數(shù)初始化成某些值之后,每個(gè)梯度下降循環(huán)都會(huì)計(jì)算預(yù)測(cè)值及導(dǎo)數(shù)。每次迭代都包含三步:
- 計(jì)算i=1到m的預(yù)測(cè)值y帽;
- 計(jì)算導(dǎo)數(shù),包括成本函數(shù)關(guān)于參數(shù)w[i]的導(dǎo)數(shù)和成本函數(shù)關(guān)于參數(shù)b[i]的導(dǎo)數(shù)。

- 梯度下降算法最后會(huì)更新w[i]和b[i]的值,更新公式為:

上述計(jì)算過(guò)程經(jīng)過(guò)不斷迭代,直至參數(shù)開(kāi)始收斂。
在以前的課程中,已經(jīng)討論過(guò)如何計(jì)算預(yù)測(cè)值,如何計(jì)算輸出層以及如何用向量化方式去實(shí)現(xiàn)這些操作,那么,接下來(lái)的關(guān)鍵就在于如何計(jì)算這些偏導(dǎo)項(xiàng)。接下來(lái)將給出計(jì)算偏導(dǎo)項(xiàng)所需要的公式。

10. (選修)直觀理解反向傳播(Backpropagation intuition(Optional))




11. 隨機(jī)初始化(Random Initialization)
初始化權(quán)重為0

隨機(jī)初始化
