1.視頻網站:mooc慕課https://mooc.study.163.com/university/deeplearning_ai#/c
2.詳細筆記網站(中文):http://www.ai-start.com/dl2017/
3.github課件+作業+答案:https://github.com/stormstone/deeplearning.ai
3.8 激活函數的導數 Derivatives of activation functions
在神經網絡中使用反向傳播的時候,就需要計算激活函數的斜率或者導數。本節會介紹如何計算激活函數的斜率。
1。sigmod函數
g(x)函數在z處的斜率,求導過程如下:
d d z g ( z ) = 1 1 + e − z ( 1 − 1 1 + e − z ) = g ( z ) ( 1 − g ( z ) ) \frac {d}{dz}g(z)=\frac 1{1+e^{-z}}(1 - \frac1{1+e^{-z}})=g(z)(1-g(z)) d z d g ( z ) = 1 + e − z 1 ( 1 − 1 + e − z 1 ) = g ( z ) ( 1 − g ( z ) )
我們代入z值,來看看這個結果是否合理。
如果z比較大,例如z=10,g ( z ) ≈ 1 g(z) \approx 1 g ( z ) ≈ 1 ,所以斜率d d z g ( z ) ≈ 0 \frac {d}{dz}g(z) \approx 0 d z d g ( z ) ≈ 0
同理如果z比較小,例如z=-10,g ( z ) ≈ 0 g(z) \approx 0 g ( z ) ≈ 0 ,所以斜率d d z g ( z ) ≈ 0 \frac {d}{dz}g(z) \approx 0 d z d g ( z ) ≈ 0
如果z=0,那麼g ( z ) = 1 2 g(z)=\frac 12 g ( z ) = 2 1 ,所以斜率d d z g ( z ) = 1 4 \frac {d}{dz}g(z) = \frac 14 d z d g ( z ) = 4 1
從曲線圖中可以得知,上面的結果是正確的。
符號約定
導數用g ′ ( z ) g'(z) g ′ ( z ) 表示,所以g ′ ( z ) = d d z g ( z ) g'(z)=\frac {d}{dz}g(z) g ′ ( z ) = d z d g ( z )
結論,sigmod函數的導數公式爲:
在NN中,a = g ( z ) a=g(z) a = g ( z ) ,g ′ ( z ) = a ( 1 − a ) g'(z)=a(1-a) g ′ ( z ) = a ( 1 − a )
這個公式的優點是,如果你已經計算出a,那你就能很快計算出導數(斜率)g ′ ( z ) g'(z) g ′ ( z ) 。
2。tanh函數
tanh函數導數爲
g ′ ( z ) = d d z g ( z ) = 1 − ( t a n h ( z ) ) 2 g'(z)=\frac {d}{dz}g(z)=1-(tanh(z))^2 g ′ ( z ) = d z d g ( z ) = 1 − ( t a n h ( z ) ) 2
證明
z比較大,如z=10,t a n h ( z ) ≈ 1 tanh(z) \approx 1 t a n h ( z ) ≈ 1 ,所以斜率g ′ ( z ) ≈ 0 g'(z)\approx0 g ′ ( z ) ≈ 0
z比較小,如z=-10,t a n h ( z ) ≈ − 1 tanh(z) \approx -1 t a n h ( z ) ≈ − 1 ,所以斜率g ′ ( z ) ≈ 0 g'(z)\approx0 g ′ ( z ) ≈ 0
z=0,t a n h ( z ) = 0 tanh(z) =0 t a n h ( z ) = 0 ,所以斜率g ′ ( z ) = 1 g'(z)=1 g ′ ( z ) = 1
與tanh函數曲線圖相符合。
結論,tanh函數的導數公式爲:
a = g ( z ) a=g(z) a = g ( z ) ,g ′ ( z ) = 1 − a 2 g'(z)=1-a^2 g ′ ( z ) = 1 − a 2
3。Relu函數
Relu函數導數爲
顯然,公式也是與圖像中的斜率相符合的。
在軟件中實現Relu算法,如果z正好爲0,可以令其導數爲1或者爲0,對於下降算法而言,這無關緊要。
4。帶泄漏的Relu函數Leaky Relu
Leaky Relu函數的導數爲
在軟件中實現Relu算法,如果z正好爲0,可以令其導數爲1或者爲0.01。
掌握好以上的公式,你就可以計算出這些激活函數的斜率(導數)。
3.9 神經網絡的梯度下降法 Gradient descent for neural networks
本節將介紹NN梯度下降法或者說反向傳播的具體實現。
對於單隱藏層的NN4個 正向計算公式 如下
Z [ 1 ] = W [ 1 ] A [ 0 ] + b [ 1 ] Z^{[1]}=W^{[1]}A^{[0]}+b^{[1]} Z [ 1 ] = W [ 1 ] A [ 0 ] + b [ 1 ]
A [ 1 ] = g [ 1 ] ( Z [ 1 ] ) A^{[1]}=g^{[1]}(Z^{[1]}) A [ 1 ] = g [ 1 ] ( Z [ 1 ] )
Z [ 2 ] = W [ 2 ] A [ 1 ] + b [ 2 ] Z^{[2]}=W^{[2]}A^{[1]}+b^{[2]} Z [ 2 ] = W [ 2 ] A [ 1 ] + b [ 2 ]
A [ 2 ] = g [ 2 ] ( Z [ 2 ] ) A^{[2]}=g^{[2]}(Z^{[2]}) A [ 2 ] = g [ 2 ] ( Z [ 2 ] )
g [ 1 ] g^{[1]} g [ 1 ] 選用tanh函數,g [ 2 ] g^{[2]} g [ 2 ] 選用σ \sigma σ 函數。
公式中包含了W [ 1 ] W^{[1]} W [ 1 ] ,W [ 2 ] W^{[2]} W [ 2 ] ,b [ 1 ] b^{[1]} b [ 1 ] ,b [ 2 ] b^{[2]} b [ 2 ] 這些參數。
我們用n[0] 表示輸入特徵個數,n[1] 表示隱藏層單元個數,n[2] 表示輸出層單元個數,而本例中n[2] =1。
所以
矩陣W [ 1 ] W^{[1]} W [ 1 ] 的維度是(n[1] ,n[0] )。
矩陣b [ 1 ] b^{[1]} b [ 1 ] 的維度是(n[1] ,1),它是個列向量。
矩陣W [ 2 ] W^{[2]} W [ 2 ] 的維度是(n[2] ,n[1] )。
矩陣b [ 2 ] b^{[2]} b [ 2 ] 的維度是(n[2] ,1)。
二分類NN網絡的 成本函數公式 如下,它是損失函數的平均值
J ( W [ 1 ] , b [ 1 ] , W [ 2 ] , b [ 2 ] ) = 1 m ∑ i = 1 m L ( y ^ , y ) J(W^{[1]},b^{[1]},W^{[2]},b^{[2]})=\frac 1m \sum_{i=1}^mL(\hat y,y) J ( W [ 1 ] , b [ 1 ] , W [ 2 ] , b [ 2 ] ) = m 1 ∑ i = 1 m L ( y ^ , y )
這裏的損失函數和之前邏輯迴歸完全一樣。
如果要訓練參數,你的算法需要梯度下降。在訓練NN時候,初始化參數不是爲零,而是隨機初始化參數很重要。
當你參數初始化成某些值後,每次梯度下降循環都會計算預測值y ^ ( i ) \hat y^{(i)} y ^ ( i ) ,i=1…m。
然後再計算成本函數對參數的導數 :d W [ 1 ] = d J d W [ 1 ] dW^{[1]}=\frac{dJ}{dW^{[1]}} d W [ 1 ] = d W [ 1 ] d J ,d b [ 1 ] = d J d b [ 1 ] db^{[1]}=\frac{dJ}{db^{[1]}} d b [ 1 ] = d b [ 1 ] d J ,d W [ 2 ] = d J d W [ 2 ] dW^{[2]}=\frac{dJ}{dW^{[2]}} d W [ 2 ] = d W [ 2 ] d J ,d b [ 2 ] = d J d b [ 2 ] db^{[2]}=\frac{dJ}{db^{[2]}} d b [ 2 ] = d b [ 2 ] d J
最後,參數會更新爲
W [ 1 ] = W [ 1 ] − α d W [ 1 ] W^{[1]}=W^{[1]}-\alpha dW^{[1]} W [ 1 ] = W [ 1 ] − α d W [ 1 ]
b [ 1 ] = b [ 1 ] − α d b [ 1 ] b^{[1]}=b^{[1]}-\alpha db^{[1]} b [ 1 ] = b [ 1 ] − α d b [ 1 ]
W [ 2 ] = W [ 2 ] − α d W [ 2 ] W^{[2]}=W^{[2]}-\alpha dW^{[2]} W [ 2 ] = W [ 2 ] − α d W [ 2 ]
b [ 2 ] = b [ 2 ] − α d b [ 2 ] b^{[2]}=b^{[2]}-\alpha db^{[2]} b [ 2 ] = b [ 2 ] − α d b [ 2 ]
α \alpha α 是學習率。
以上就是梯度下降算法的一次迭代計算過程。你會重複很多次這樣的過程,直到參數看上去在收斂。
前面幾節已經詳細介紹過如何通過向量化計算預測值y ^ \hat y y ^ 。現在來看看如何計算偏導d W [ 1 ] dW^{[1]} d W [ 1 ] ,d b [ 1 ] db^{[1]} d b [ 1 ] ,d W [ 2 ] dW^{[2]} d W [ 2 ] ,d b [ 2 ] db^{[2]} d b [ 2 ] 。
按照反向傳播過程,6個計算公式如下
(1)d Z [ 2 ] = A [ 2 ] − Y dZ^{[2]}=A^{[2]}-Y d Z [ 2 ] = A [ 2 ] − Y
(2)d W [ 2 ] = 1 m d Z [ 2 ] A [ 1 ] T dW^{[2]}=\frac 1mdZ^{[2]}A^{[1]T} d W [ 2 ] = m 1 d Z [ 2 ] A [ 1 ] T
(3)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 1mnp.sum(dZ^{[2]},axis=1,keepdims=True) d b [ 2 ] = m 1 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 ) ,這是對矩陣的一個維度求和。axis=1表示水平求和;keepdims=True防止輸入秩爲1的數組 ,確保輸出維度是(n[2] ,1),其實本例中這裏是一個實數,因爲n[2] =1,二分類輸出預測值只可能是1個,非0即1。
(4)d Z [ 1 ] = W [ 2 ] T d Z [ 2 ] ∗ g [ 1 ] ′ ( Z [ 1 ] ) dZ^{[1]}=W^{[2]T}dZ^{[2]}*g^{[1]'}(Z^{[1]}) d Z [ 1 ] = W [ 2 ] T d Z [ 2 ] ∗ g [ 1 ] ′ ( Z [ 1 ] ) ,g [ 1 ] ′ g^{[1]'} g [ 1 ] ′ 是隱藏層激活函數的導數;符號*表示逐個元素乘積。W [ 2 ] T d Z [ 2 ] W^{[2]T}dZ^{[2]} W [ 2 ] T d Z [ 2 ] 是n[1] x m矩陣;逐個元素導數g [ 1 ] ′ ( Z [ 1 ] ) g^{[1]'}(Z^{[1]}) g [ 1 ] ′ ( Z [ 1 ] ) 也是n[1] x m矩陣。
(5)d W [ 1 ] = 1 m d Z [ 1 ] A [ 0 ] T dW^{[1]}=\frac 1mdZ^{[1]}A^{[0]T} d W [ 1 ] = m 1 d Z [ 1 ] A [ 0 ] T
(6)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 1mnp.sum(dZ^{[1]},axis=1,keepdims=True) d b [ 1 ] = m 1 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 ) ,這裏輸出的是(n[1] ,1)維度的向量。
矩陣Y是1 x m維度,所有樣本標籤值橫向堆疊起來。Y = [ y ( 1 ) y ( 2 ) . . . . . . y ( m ) ] Y=[y^{(1)}y^{(2)}......y^{(m)}] Y = [ y ( 1 ) y ( 2 ) . . . . . . y ( m ) ] 。
我們也可以用reshape替代keepdims=True,這個在前面 已經介紹過。
這裏只是直接給出了反向傳播的公式,在下一節中會介紹如何推導出這6個公式。