ng-深度學習-課程筆記-4: 淺層神經網絡(Week3)


1 神經網絡概覽( Neural Networks Overview )

先來快速過一遍如何實現神經網絡。

首先需要輸入特征x,參數w和b,計算出z,然后用激活函數計算出a,在神經網絡中我們要做多次這樣的計算,反復計算z和a,然后用損失函數計算最后的a和y的差異。

可以把很多sigmoid單元堆疊起來構成一個神經網絡。我們用上標方括號表示第幾層,用上標圓括號表示第幾個樣本。

訓練的時候通過反向傳播來計算導數,先計算da,再計算dz,再到dw,db。

 

2 神經網絡表示( Neural Network Representation )

先集中看看只有一層隱藏層的神經網絡。x1, x2, x3是神經網絡的輸入層,中間一層叫隱藏層,最后一個節點的層叫輸出層。

為什么叫隱含層呢?它表示的是,在訓練集中,這些中間節點的真正數值,我們是不知道的。我們能看到輸入和輸出,但是隱藏層的數值我們無法看到。

可以用$a^{[0]}$來表示輸入x, $a^{[0]}$表示的是第0層輸入層的輸出。

相應的,隱藏層的輸出就是$a^{[1]}$,下標則表示該層的第幾個單元,圖中有4個節點則代表有4個隱藏層輸出。

輸出層的輸出就是$a^{[2]}$,表示最后的預測輸出$\;\hat{y}\;$。這和之前提到的邏輯回歸類似,只是這里明確地指出這些值來自哪一層。

在我們的約定中,輸入層稱為第0層,隱藏層稱為第1層,這里的輸出層稱為第2層,這個網絡是兩層的神經網絡,我們不把輸入層看作一個標准的層。

隱藏層中的參數為$w^{[1]}$,$b^{[1]}$。w是一個4*3的矩陣,b是一個4*1的矩陣。4代表隱藏層的單元數量,3代表輸入層的特征數量。

類似的,輸出層的參數為$w^{[2]}$,$b^{[2]}$。它們的shape分別為1*4和1*1。

 

3 計算神經網絡的輸出( Computing a Neural Network's Output )

對於每一個神經單元,就是做一個加權和然后使用激活函數,即從x到z,從z得到a。神經網絡不過是重復計算這個步驟很多次。

對於隱藏層四個節點的計算如圖所示,后面的層也是類似地依次計算,最終得到輸出。

 

4 多個例子中的向量化( Vectorizing across multiple examples )

多樣本的輸出計算也就是多次進行單樣本的輸出計算,用向量化的形式可以很好的理解這個過程。

比如,本來x的shape是3*1,w是4*3,得到的z就是4*1,其中4代表4個隱藏層的單元數,1代表1個樣本。

現在X是多個樣本,是3*m,w還是4*3,得到的Z就是4*m,4代表隱藏層的單元數,m代表的是樣本數。

 

5 激活函數( Activation functions )

之前使用的激活函數都是sigmoid函數,我們還可以使用其它激活函數。

tanh( hyperbolic tangent 雙曲正切),函數值介於-1到1之間,實際上這是sigmoid函數平移后的版本。

使用tanh幾乎總比sigmoid表現更好,因為它的平均值為0,可以使得計算結果的平均值接近於0,起到了類似數據中心化的效果,它使得下一層的學習更方便。

ng表示他幾乎不用sigmoid了,tanh幾乎在任何場合都優於sigmoid,不過注意在輸出層還是使用sigmoid,因為它輸出[0,1]更符合概率分布。

sigmoid和tanh都有一個缺點,就是當自變量很大或者很小的時候,函數的導數特別小接近於0,這樣會拖慢梯度下降的迭代,ng這里提到的問題應該就是梯度消失的問題了。

梯度消失是由於神經網絡層數很多的時候,求導多次,導致梯度變得很小很小,這樣前面的層就會學的很慢很慢,最后造成表現不好的結果。

可以用relu( rectified linear unit修正線性單元 ) 來解決這個問題。

選擇激活函數有一些經驗法則:做二分類的時候,sigmoid很適合做輸出層的激活,其它層使用relu。

relu已經變成激活函數的默認選擇了,如果你不確定隱層應該用哪個,就用relu作為激活,雖然人們有時候也會使用tanh。

relu的缺點是當z小於等於0時導數為0,所以有一個leakly relu,z小於等於0時導數不為0,但實踐中很少使用。

現實中導數不會總是等於0,實踐上神經網絡有很多單元,總會有些單元導數不為0,所以通常使用relu,神經網絡的學習會快很多,比tanh和sigmoid快,主要是它不會衰減梯度。

深度學習的其中一個特點就是在建立神經網絡時經常有很多不同的選擇,比如隱層個數,單元個數,激活函數,如何初始化權重,你很難去定下一個准則來確定什么參數最適合你的問題,有時候真的很難。

ng會在接下來這三門課中讓我們了解到他在行業里見到的熱門選擇或冷門選擇,但對於你的應用,事實上很難預先准備知道什么參數最有效。

所以一個建議是你不確定哪個激活函數的話,先試試,在驗證集上跑跑,看看哪個參數效果好就用那個。

這里不會建議你一定要用relu而不用其它的,這對你目前或未來的問題中,可能管用也可能不管用。

 

6 為什么需要非線性激活函數( Why do you need non-linear activation functions )

如果你使用線性激活函數,或者沒有激活函數,無論你的神經網絡有多少層,你一直在做的只是計算線性激活函數。

這樣做不如直接去掉所有隱藏層,因為你在這個過程中只是在做一個w的乘法,$w^{[1]}*w^{[2]}*w^{[3]}*...$,這里的123指的是層數。

在兩層神經網絡,如果你在隱藏層用線性激活,在輸出層用sigmoid,這和沒有隱層的邏輯回歸是一樣的。線性隱層一點意義都沒有,因為線性函數的組合還是線性函數。

除非你引入非線性函數,否則你無法學習到更有趣的函數,層數再多也不行。

一般只有一個地方會用線性函數,就是在線性回歸的輸出層,因為它要預測的是一個實數,負無窮到正無窮。

 

 

7 激活函數的導數( Derivatives of activation functions )

 這一節ng幫我們計算出了幾個常用激活函數的導數,可以直接拿來用,當然可以自行推導驗證一下。

sigmoid:導數為a * ( 1 - a)

tanh:導數為1 - a*a

relu:導數為,z大於等於0時為1,z小於0時為0

 

8 神經網絡的梯度下降( Gradient descent for Neural Networks )

做幾個符號約定,$n^{[0]}$代表特征數,即輸入層的單元個數,$n^{[1]}$代表隱層的單元個數,$n^{[2]}$代表輸出層的單元個數。

$w^{[1]}$代表第0層到第1層的權重,shape為( $n^{[1]}$,$n^{[0]}$ ),$b^{[1]}$的shape為( $n^{[1]}$,1),后面的層以此類推。

根據前面講的內容,可以列出代價函數的式子進行梯度下降的計算,之前講過梯度下降,也講過向量化的實現,所以關鍵在於如何計算偏導,利用前向計算和反向傳播可以得到。

顯然,除了求導的時候需要鏈式求導,其它的都和邏輯回歸中做的東西差不多。

圖中np.sum中參數axis為1代表按行相加(0按列相加),keepdim為True表示最后得到(n, 1)的列向量

 

9 隨機初始化( Random Initizlization )

在神經網絡中隨機初始化很重要(而不是初始化為0),如果全部初始化為0的話,隱層的每個單元學習到的權重w都是一樣的(對稱的),這種情況下多個隱藏單元沒有任何意義,因為它們做的是一樣的事情,而我們需要不同的隱藏單元去計算不同的函數。

所以要隨機初始化,可以用$np.random.randn( (2,2) ) * 0.01$ 和$np.zeros( (2,1) )$初始化w1和b1,通常喜歡把w初始化為很小的隨機數,因為如果用sigmoid或tanh時權值太大會導致梯度特別小,學習緩慢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM