Lesson1:神經網路和深度學習
阿新 • • 發佈:2018-12-15
能夠使神經網路執行速度加快的幾個Python技巧
- vectorization:避免在神經網路中使用for迴圈
- broadcast:避免在神經網路中使用for迴圈
- 申明變數時,將變數初始化為(m,n)的形式,而不是(m,)形式
import numpy as np
a=np.random.randn(5,1) #正確申明方法
b=np.random.randn(5) #錯誤的申明方法
c=b.reshape(5,1) #糾正錯誤的方法
import numpy as np
np.sum(matrix,axis=1,keepdims=True) #確保將keepdims=True,以防止形成奇怪的陣列shape: (n,)
啟用函式選擇
activation function
- sigmoid activation function
- tanh activation function
- ReLu activation function 和 Leaky ReLu activation function (rectify linear unit) ReLu: a=max(0,z) Leaky ReLu:a = max(0.01z,z)
comparision among activation functions
- 幾乎在任何場景中,tanh都比sigmoid要好
- sigmoid is used only as output active fucntion in binary classification.
- 無論是tanh還是sigmoid,都有一個明顯的缺陷,即當input無窮大或無窮小時,二者的導數都趨於0,這使得gradient descent進展緩慢,針對這一問題,可以採用ReLu或Leaky ReLu作為啟用函式。ReLu中,當input<0時,其導數=0,Leaky ReLu中,當input<0時,其導數=0.01。而當input>0時,二者導數均為1。
- 一般情況下,當你不知道改用哪個active function時,1)首選ReLu,或,Leaky ReLu。或者,2)你可以使用cross-validation的方法,驗證各個active function的優劣。
深層神經網路
所謂深層神經網路,是指有多個hidden layer的神經網路,如下圖所示,分別為logistic regression,1 hidden layer,2 hidden layers,5 hidden layers的神經網路:
深層神經網路的forward propagation和backward propagation
- forward propagation 首先定義深層神經網路的notation: 各層output為:a[i] 各層input為:z[i] 第0層的input,output均為a[0] 各層 hidden layer的啟用函式為:g[i]() 各層的權重w[i] 各層的截距b[i] 上述幾個notation具有如下的關係(forward propagation): a[i] = g[i](z[i]) z[i+1]=w[i+1]a[i]+b[i+1]
- backward propagation 現有一個一層神經網路: 第0層為input:a[0] 第1層為first hidden layer:z[1]=w[1]a[0]+b[1];a[1]=g[1](z[1]); 第2層為output:z[2]=a[2]=w[2]a[1]+b[2];cost function dz[2]=a[2]-y; 現推導backward propagation: 首先明確notation:將cost function記為 L; dw=dL/dw,L在w處的導數; db=dL/db,L在b處的導數; dz=dL/dz,L在z處的導數;其中dz[2]=a[2]-y; 第二層w的導數dw[2]=(dL/dz[2])(dz[2]/dw[2])=(a[2]-y)(a[1])=dz[2]a[1] 第二層b的導數db[2]=(dL/dz[2])(dz[2]/db[2])=a[2]-y=dz[2] 第一層w的導數dw[1]=(dL/dz[2])(dz[2]/da[1])(da[1]/dz[1])(dz[1]/dw[1])=dz[2]w[2]g’[1](z[1])a[0] 第一層b的 導數db[1]=(dL/dz[2])(dz[2]/da[1])(da[1]/dz[1])(dz[1]/db[1])=dz[2]w[2]g’[1](z[1]) note that:上圖右側為backward propagation的矩陣形式。