总结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)