總結4個公式

首先介紹BP1

- BP1:輸出層的delta 也就是?C/?z
根據鏈接法則,?C/?z = ?C/?a * ?a/?z 注意這個*指的是點乘 也就是對應的元素相乘,而不是矩陣乘法 - 對于不同Cost函數 有不同的?C/?a
- 對于不同的a函數 也有不同的?a/?z
- 算完該輸出層的delta 再求該層的BP3和BP4


- ?C/?b=delta
- ?C/?w = delta與前一層的輸出值也就是a進行點乘
為什么:
這是因為根據鏈接法則
?C/?w =?C/?z * ?z/?w
z= wx + b
?z/?w = x 也就是上一層的a
'nabla_b[-1] = delta
nabla_w[-1] = np.dot(delta,activations[-2].transpose()) '
隱藏層的遍歷
- 首先算出該層的delta
- 非輸出層的誤差依賴于其下一層誤差

計算該層delta需要 下一層的W 與 下一層的delta進行點乘
- 然后在計算BP3和BP4


for l in xrange(2,self.num_layers):
z = zs[-l]
sp = sigmoid_prime[z]
delta = np.dot(self.weights[-l+1].transpose(),delta) * sp
nabla_b[-l] = delta
nabla_w[-l]= np.dot(delta,activations[-l-1].transpose())
return(nabla_b,nabla_w)
num_layers:神經網絡的層數
Backpropagation算法總結

def backprop(self,x,y):
activation = x
activations = [x]
zs = []
for b,w in zip(self.biases,self.weights):
z = np.dot(w,activation)+b
zs.append(z)
activation = sigmoid(zs)
activations.append(activation)
#backward pass
delta = self.cost_derivatice(activations[-1],y) * sigmoid_prime(zs[-1])
nabla_b[-1] = delta
nabla_w[-1] = np.dot(delta,activations[-2].transpose())
for l in xrange(2,self.num_layers):
z = zs[-l]
sp = sigmoid_prime[z]
delta = np.dot(self.weights[-l+1].transpose(),delta) * sp
nabla_b[-l] = delta
nabla_w[-l]= np.dot(delta,activations[-l-1].transpose())
return(nabla_b,nabla_w)