天天看點

【吳恩達深度學習筆記】1.3 淺層神經網絡Shallow neural networks第一門課 神經網絡和深度學習(Neural Networks and Deep Learning)

第一門課 神經網絡和深度學習(Neural Networks and Deep Learning)

3.1神經網絡概述(Neural Network Overview)

感覺這塊沒啥好記的

3.2 神經網絡的表示(Neural Network Representation)

神經網絡包括

  • 輸入層(input layer):包含輸入特征 x 1 , x 2 , . . . x_1,x_2,... x1​,x2​,...
  • 隐藏層(hidden layer):訓練資料
  • 輸出層(output layer):産生預測值 y 1 , y 2 , . . . y_1,y_2,... y1​,y2​,...

将輸入層的激活值記為 a [ 0 ] a^{[0]} a[0],隐藏層的激活值記為 a [ 1 ] a^{[1]} a[1],第一個結點記為 a 1 [ 1 ] a^{[1]}_{1} a1[1]​,第二個結點記為 a 2 [ 1 ] a^{[1]}_{2} a2[1]​,以此類推,輸出層的 y ^ \hat y y^​取 a [ 2 ] a^{[2]} a[2]。

【吳恩達深度學習筆記】1.3 淺層神經網絡Shallow neural networks第一門課 神經網絡和深度學習(Neural Networks and Deep Learning)

3.3 計算一個神經網絡的輸出(Computing a Neural Network’s output)

給定一個隻有一個隐藏層的兩層神經網絡結構, x x x表示輸入特征, a a a表示每個神經元的輸出, W W W表示特征的權重,上标表示神經網絡的層數(隐藏層為1),小标表示該層的第幾個神經元。

神經網絡的計算

【吳恩達深度學習筆記】1.3 淺層神經網絡Shallow neural networks第一門課 神經網絡和深度學習(Neural Networks and Deep Learning)

隐藏層節點單元的計算:

z 1 [ 1 ] = w 1 [ 1 ] T x + b 1 [ 1 ] , a 1 [ 1 ] = σ ( z 1 [ 1 ] ) z^{[1]}_1=w^{[1]T}_1x+b^{[1]}_1,a^{[1]}_1=\sigma(z^{[1]}_1) z1[1]​=w1[1]T​x+b1[1]​,a1[1]​=σ(z1[1]​)

z 2 [ 1 ] = w 2 [ 1 ] T x + b 2 [ 1 ] , a 2 [ 1 ] = σ ( z 2 [ 1 ] ) z^{[1]}_2=w^{[1]T}_2x+b^{[1]}_2,a^{[1]}_2=\sigma(z^{[1]}_2) z2[1]​=w2[1]T​x+b2[1]​,a2[1]​=σ(z2[1]​)

z 3 [ 1 ] = w 3 [ 1 ] T x + b 3 [ 1 ] , a 3 [ 1 ] = σ ( z 3 [ 1 ] ) z^{[1]}_3=w^{[1]T}_3x+b^{[1]}_3,a^{[1]}_3=\sigma(z^{[1]}_3) z3[1]​=w3[1]T​x+b3[1]​,a3[1]​=σ(z3[1]​)

z 4 [ 1 ] = w 4 [ 1 ] T x + b 4 [ 1 ] , a 4 [ 1 ] = σ ( z 4 [ 1 ] ) z^{[1]}_4=w^{[1]T}_4x+b^{[1]}_4,a^{[1]}_4=\sigma(z^{[1]}_4) z4[1]​=w4[1]T​x+b4[1]​,a4[1]​=σ(z4[1]​)

向量化計算

【吳恩達深度學習筆記】1.3 淺層神經網絡Shallow neural networks第一門課 神經網絡和深度學習(Neural Networks and Deep Learning)

z [ n ] = w [ n ] x + b [ n ] z^{[n]}=w^{[n]}x+b^{[n]} z[n]=w[n]x+b[n]

其中 w w w是一個4X3的矩陣

3.4 多樣本向量化(Vectorizing across multiple examples)

【吳恩達深度學習筆記】1.3 淺層神經網絡Shallow neural networks第一門課 神經網絡和深度學習(Neural Networks and Deep Learning)

a [ 2 ] ( i ) a^{[2](i)} a[2](i)中 [ 2 ] [2] [2]指神經網絡的第二層, ( 2 ) (2) (2)指第 i i i個訓練樣本。

對于矩陣 A , Z , X A,Z,X A,Z,X,水準方向上代表了各個訓練樣本,豎直方向上對應不同的輸入特征,即不同的索引對應于不同的隐藏單元。

3.5 向量化實作的解釋(Justification for vectorized implementation)

對單個樣本的計算 z [ 1 ] ( i ) = W [ 1 ] x [ i ] + b [ 1 ] z^{[1](i)}=W^{[1]}x^{[i]}+b^{[1]} z[1](i)=W[1]x[i]+b[1],當有不同的訓練樣本時,将其堆到矩陣 X X X的各列中。

【吳恩達深度學習筆記】1.3 淺層神經網絡Shallow neural networks第一門課 神經網絡和深度學習(Neural Networks and Deep Learning)

3.6 激活函數(Activation functions)

在神經網絡的前向傳播中的 a [ 1 ] = σ ( z [ 1 ] ) a^{[1]}=\sigma (z^{[1]}) a[1]=σ(z[1])使用到了sigmoid函數,sigmoid函數在這裡被稱為激活函數: a = σ ( z ) = 1 1 + e − z a=\sigma (z)=\frac{1}{1+e^{-z}} a=σ(z)=1+e−z1​

通常情況下我們使用不同的非線性函數 g ( z ) g(z) g(z),tanh函數或者雙曲正切函數是總體上都優于sigmoid函數的激活函數。

a = t a n h ( z ) = e z − e − z e z + e − z a=tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}} a=tanh(z)=ez+e−zez−e−z​

tanh函數的值域在-1到1之間,資料的平均值接近0而不是0.5,這會使下一層的學習更加簡單。sigmoid函數和tanh函數共同的缺點:在z特别大或特别小時導數的梯度或者函數的斜率接近于0,導緻降低梯度下降的速度降低。

在機器學習中有一個很流行的函數:修正線性單元函數(ReLu),在z是正數時導數恒等于1,在z是負數時,導數恒等于0。

a = R e L u ( z ) = m a x ( 0 , z ) a=ReLu(z)=max(0,z) a=ReLu(z)=max(0,z)

激活函數選擇的經驗法則:

  • 若輸出是0、1值(二分類問題),則輸出層選擇sigmoid函數,其餘所有單元選擇ReLu函數
  • 若隐藏層不确定使用哪個激活函數,通常選擇ReLu函數

還有另一版本的ReLu函數Leaky ReLu,當z是負值時函數值不為0,而是微微傾斜,這個函數的激活效果優于ReLu,盡管使用不多。

【吳恩達深度學習筆記】1.3 淺層神經網絡Shallow neural networks第一門課 神經網絡和深度學習(Neural Networks and Deep Learning)

3.7 為什麼需要非線性激活函數?(Why need a nonlinear activation function?)

如果你是用線性激活函數或者叫恒等激勵函數,那麼神經網絡隻是把輸入線性組合再輸出。不能在隐藏層用線性激活函數,可以用ReLU或者tanh或者leaky ReLU或者其他的非線性激活函數,唯一可以用線性激活函數的通常就是輸出層。

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

1.Sigmoid activation function

d d z g ( z ) = d d z g ( 1 1 + e − z ) = 1 1 + e − z ( 1 − 1 1 + e − z ) = g ( z ) ( 1 − g ( z ) ) \frac{d}{dz}g(z)=\frac{d}{dz}g(\frac{1}{1+e^{-z}})=\frac{1}{1+e^{-z}}(1-\frac{1}{1+e^{-z}})=g(z)(1-g(z)) dzd​g(z)=dzd​g(1+e−z1​)=1+e−z1​(1−1+e−z1​)=g(z)(1−g(z))

當 z = ± 10 z=±10 z=±10時, g ( z ) ′ ≈ 0 g(z)'≈0 g(z)′≈0

當 z = 0 z=0 z=0時, g ( z ) ′ = 1 4 g(z)'=\frac{1}{4} g(z)′=41​

在神經網絡中, a = g ( z ) , g ( z ) ′ = a ( 1 − a ) a=g(z),g(z)'=a(1-a) a=g(z),g(z)′=a(1−a)

2.Tanh activation function

d d z g ( z ) = d d z g ( e z − e − z e z + e − z ) = 1 − ( t a n h ( z ) ) 2 \frac{d}{dz}g(z)=\frac{d}{dz}g(\frac{e^z-e^{-z}}{e^z+e^{-z}})=1-(tanh(z))^2 dzd​g(z)=dzd​g(ez+e−zez−e−z​)=1−(tanh(z))2

當 z = ± 10 z=±10 z=±10時, g ( z ) ′ ≈ 0 g(z)'≈0 g(z)′≈0

當 z = 0 z=0 z=0時, g ( z ) ′ = 0 g(z)'=0 g(z)′=0

在神經網絡中, a = g ( z ) , g ( z ) ′ = 1 − a 2 a=g(z),g(z)'=1-a^2 a=g(z),g(z)′=1−a2

3.Rectified linear unit(ReLu)

g ( z ) = m a x ( 0 , z ) g(z)=max(0,z) g(z)=max(0,z)

g ( z ) ′ = { 0 i f   z < 0 1 i f   z > 0 u n d e f i n e d i f   z = 0 g(z)'=\left\{\begin{matrix} 0 & if\space z<0\\ 1 & if\space z>0\\ undefined & if\space z=0 \end{matrix}\right. g(z)′=⎩⎨⎧​01undefined​if z<0if z>0if z=0​

通常在 z = 0 z=0 z=0時給定其導數1,0;當然 z = 0 z=0 z=0的情況很少。

4.Leaky Rectified linear unit(Leaky ReLu)

g ( z ) = m a x ( 0.01 z , z ) g(z)=max(0.01z,z) g(z)=max(0.01z,z)

g ( z ) ′ = { 0.01 i f   z < 0 1 i f   z > 0 u n d e f i n e d i f   z = 0 g(z)'=\left\{\begin{matrix} 0.01 & if\space z<0\\ 1 & if\space z>0\\ undefined & if\space z=0 \end{matrix}\right. g(z)′=⎩⎨⎧​0.011undefined​if z<0if z>0if z=0​

通常在 z = 0 z=0 z=0時給定其導數1,0.01;當然 z = 0 z=0 z=0的情況很少。

3.9 神經網絡的梯度下降(Gradient descent for neural networks)

給定一單層神經網絡,包括參數 W [ 1 ] W^{[1]} W[1], b [ 1 ] b^{[1]} b[1], W [ 2 ] W^{[2]} W[2], b 2 ] b^{2]} b2], n x n_x nx​代表輸入特征的個數, n [ 1 ] n^{[1]} n[1]表示隐藏層單元個數, n [ 2 ] n^{[2]} n[2]表示輸出層單元個數。

矩陣 W [ 1 ] W^{[1]} W[1]次元為 ( n [ 1 ] , n [ 0 ] ) (n^{[1]},n^{[0]}) (n[1],n[0]),矩陣 b [ 1 ] b^{[1]} b[1]次元為 ( n [ 1 ] , 1 ) (n^{[1]},1) (n[1],1),矩陣 W [ 2 ] W^{[2]} W[2]次元為 ( n [ 2 ] , n [ 1 ] ) (n^{[2]},n^{[1]}) (n[2],n[1]),矩陣 b [ 2 ] b^{[2]} b[2]次元為 ( n [ 2 ] , 1 ) (n^{[2]},1) (n[2],1)。 Z [ 1 ] Z^{[1]} Z[1]和 A [ 1 ] A^{[1]} A[1]的次元均為 ( n [ 1 ] , m ) (n^{[1]},m) (n[1],m)。

訓練參數需要做梯度下降,在訓練神經網絡時,要随機初始化參數,而不是初始化為全零。

forword propagation:

z [ 1 ] = W [ 1 ] x + b [ 1 ]     a [ 1 ] = σ ( z [ 1 ] ) z^{[1]}=W^{[1]}x+b^{[1]}\space \space \space a^{[1]}=\sigma(z^{[1]}) z[1]=W[1]x+b[1]   a[1]=σ(z[1])

z [ 2 ] = W [ 2 ] a [ 1 ] + b [ 2 ]     a [ 2 ] = g [ 2 ] ( z [ 2 ] ) = σ ( z [ 2 ] ) z^{[2]}=W^{[2]}a^{[1]}+b^{[2]}\space \space \space a^{[2]}=g^{[2]}(z^{[2]})=\sigma(z^{[2]}) z[2]=W[2]a[1]+b[2]   a[2]=g[2](z[2])=σ(z[2])

back propagation:

d z [ 2 ] = A [ 2 ] − Y , Y = [ y [ 1 ]   y [ 2 ]   . . .   y [ m ] ] dz^{[2]}=A^{[2]}-Y,Y=[y^{[1]}\space y^{[2]}\space ...\space y^{[m]}] dz[2]=A[2]−Y,Y=[y[1] y[2] ... y[m]]

d W [ 2 ] = 1 m d z [ 2 ] A [ 1 ] T dW^{[2]}=\frac{1}{m}dz^{[2]}A^{[1]T} dW[2]=m1​dz[2]A[1]T

d b [ 2 ] = 1 m n p . s u m ( d z [ 2 ] , a x i s = 1 , k e e p d i m s = T r u e ) db^{[2]}=\frac{1}{m}np.sum(dz^{[2]},axis=1,keepdims=True) db[2]=m1​np.sum(dz[2],axis=1,keepdims=True)

d z [ 1 ] = W [ 2 ] T d z [ 2 ] ∗ g [ 1 ] ′ ( z [ 1 ] ) dz^{[1]}=W^{[2]T}dz^{[2]}*g^{[1]'}(z^{[1]}) dz[1]=W[2]Tdz[2]∗g[1]′(z[1])

d W [ 1 ] = 1 m d z [ 1 ] x T dW^{[1]}=\frac{1}{m}dz^{[1]}x^{T} dW[1]=m1​dz[1]xT

d b [ 1 ] = 1 m n p . s u m ( d z [ 1 ] , a x i s = 1 , k e e p d i m s = T r u e ) db^{[1]}=\frac{1}{m}np.sum(dz^{[1]},axis=1,keepdims=True) db[1]=m1​np.sum(dz[1],axis=1,keepdims=True)

其中axis=1在python中表示水準相加求和,keepdims確定矩陣 d b [ 2 ] db^{[2]} db[2]這個向量輸出的次元為 ( n , 1 ) (n,1) (n,1)這樣的标準形式。

3.10(選修)直覺了解反向傳播(Backpropagation intuition)

【吳恩達深度學習筆記】1.3 淺層神經網絡Shallow neural networks第一門課 神經網絡和深度學習(Neural Networks and Deep Learning)

3.11 随機初始化(Random Initialization)

如果在神經網絡中将權重或者參數初始化為0,那麼梯度下降将不起作用。

【吳恩達深度學習筆記】1.3 淺層神經網絡Shallow neural networks第一門課 神經網絡和深度學習(Neural Networks and Deep Learning)

實際中應該把 W [ 1 ] W^{[1]} W[1]設為np.random.randn(2,2)(生成高斯分布),通常再乘一個很小的數,如0.01,這樣把它初始化為很小的随機數。 b b b沒有對稱問題,可以将其初始化為0。隻要随機初始化 W W W就有不同的隐含單元計算不同的東西,就不會存在symmetry breaking problem,相似的 W [ 2 ] W^{[2]} W[2]也是如此。

W [ 1 ] = n p . r a n d o m . r a n d n ( 2 , 2 ) ∗ 0.01 , b [ 1 ] = n p . z e r o s ( ( 2 , 1 ) ) W^{[1]}=np.random.randn(2,2)*0.01,b^{[1]}=np.zeros((2,1)) W[1]=np.random.randn(2,2)∗0.01,b[1]=np.zeros((2,1))

W [ 2 ] = n p . r a n d o m . r a n d n ( 2 , 2 ) ∗ 0.01 , b [ 2 ] = 0 W^{[2]}=np.random.randn(2,2)*0.01,b^{[2]}=0 W[2]=np.random.randn(2,2)∗0.01,b[2]=0

乘0.01而不是100或者1000是因為如果使用sigmoid/tanh為激活函數,初始化值很大的時候 z z z會很大或者很小,梯度下降會很慢,學習速度就會很慢。

錯題筆記

Logistic Regression doesn’t have a hidden layer. If you initialize the weights to zeros, the first example x fed in the logistic regression will output zero but the derivatives of the Logistic Regression depend on the input x (because there’s no hidden layer) which is not zero. So at the second iteration, the weights values follow x’s distribution and are different from each other if x is not a constant vector.

Logistic回歸沒有隐藏層。 如果将權重初始化為零,則Logistic回歸中的第一個示例x将輸出零,但Logistic回歸的導數取決于不是零的輸入x(因為沒有隐藏層)。 是以,在第二次疊代中,如果x不是常量向量,則權值遵循x的分布并且彼此不同。

繼續閱讀