激活函數的導數(Derivatives of activation functions)
在神經網絡中使用反向傳播的時候,你真的需要計算激活函數的斜率或者導數。
針對以下四種激活,求其導數如下:
1)sigmoid activation function
其具體的求導如下(如果你學過微積分,那麼這個求導對於你來說其實並不難):
公式1:
註:
當z = 10或z=-10 d/dz g(z)≈0
當z= 0 d/dz g(z)=g(z)(1-g(z))=1/4
在神經網絡中
a=g(z);
g(z)'=d/dz g(z)=a(1-a)
2) Tanh activation function
其具體的求導如下:
公式2: g(z)=tanh(z)=(e^z-e^(-z))/(e^z+e^(-z) )
在神經網絡中;
3)Rectified Linear Unit (ReLU)
g(z)=max(0,z)
註:通常在z= 0的時候給定其導數1,0;當然z=0的情況很少
4)Leaky linear unit (Leaky ReLU)
與ReLU類似
註:通常在z=0的時候給定其導數1,0.01;當然z=0的情況很少
神經網絡的梯度下降(Gradient descent for neural networks)
下面會給你實現反向傳播或者說梯度下降算法的方程。
你的單隱層神經網絡會有W^([1]),b^([1]),W^([2]),b^([2])這些參數,
還有個n_x表示輸入特徵的個數,n^([1])表示隱藏單元個數,n^([2])表示輸出單元個數。
在我們的例子中,我們只介紹過的這種情況,那麼參數:
矩陣W^([1])的維度就是(n^([1]),n^([0])),
b^([1])就是n^([1])維向量,可以寫成(n^([1]),1),就是一個的列向量。
矩陣W^([2])的維度就是(n^([2]),n^([1])),
b^([2])的維度就是(n^([2]),1)維度。
你還有一個神經網絡的成本函數,假設你在做二分類任務,那麼你的成本函數等於:
Cost function:
公式2:
loss function和之前做logistic回歸完全一樣。
訓練參數需要做梯度下降,在訓練神經網絡的時候,隨機初始化參數很重要,而不是初始化成全零(對的,如果全部初始化成0,這個就和我們之前說的那個為什麼用非線性激活函數一個道理,其實都沒有什麼意義了,因為大家都是0)。當你參數初始化成某些值後,每次梯度下降都會循環計算以下預測值:
公式3: dW^([1])=dJ/(dW^([1]) ),db^([1])=dJ/(db^([1]) )
公式4: dW^([2])=dJ/(dW^([2]) ),db^([2])=dJ/(db^([2]) )
其中
公式5: W^([1])W^([1])-adW^([1]),b^([1])b^([1])-adb^([1])
公式6: W^([2])W^([2])-adW^([2]),b^([2])b^([2])-adb^([2])
正向傳播方程如下(之前講過):
forward propagation:
(1) z^([1])=W^([1]) x+b^([1])
(2) a^([1])=σ(z^([1]))
(3) z^([2])=W^([2]) a^([1])+b^([2])
(4) a^([2])=g^([2]) (z^([z]))=σ(z^([2]))
反向傳播方程如下:
back propagation:
dW^([1])=1/m dz^([1]) x^T
((db^([1]))┬)┬((n^([1]),1))=1/m np.sum(dz^([1]),axis=1,keepdims=True)
上述是反向傳播的步驟,
註:這些都是針對所有樣本進行過向量化,Y是1×m的矩陣;
這裡np.sum是python的numpy命令,
axis=1表示水平相加求和,
keepdims是防止python輸出那些古怪的秩數(n,),加上這個確保陣矩陣db^([2])這個向量輸出的維度為(n,1)這樣標準的形式。
目前為止,我們計算的都和Logistic回歸十分相似,但當你開始計算反向傳播時,你需要計算,是隱藏層函數的導數,輸出在使用sigmoid函數進行二元分類。
這裡是進行逐個元素乘積,因為W^([2]T) dz^([2])和(z^([1]))這兩個都為(n^([1]),m)矩陣;
還有一種防止python輸出奇怪的秩數,需要顯式地調用reshape把np.sum輸出結果寫成矩陣形式。
以上就是正向傳播的4個方程和反向傳播的6個方程