参考:
https://www.bilibili.com/video/BV16t411Q7TM?p=6&spm_id_from=pageDriver
一、BP神经网络结构与原理
定义:
重要公式:
采用误差平方和作为损失函数,基于反向传播算法推导:非常重要!
#前向计算
for b,w in zip(self,biases,self.weight):
z = np.dot(w,activation)+b
zs.append(z)
activation = sigmoid(z)
activation.append(activation)
#反向传播
delta = self.cost_derivations[-1],y * \ sigmoid_prime(zs[-1])
nabla_b[-1] = delta
nabla_w[-1] = np.dot(delta,activation[-2].transpose())
#计算从倒数第二层至第二层的误差
for l in range(2,self.num_layers):
z = zs[-l]
sp = sigmoid_prime(z)
delta = np.dot(self.weight[-l+1]).transpose(),data)*sp
nabla_b[-l] = delta
nabla_w[-l] = np.dot(delta,activation[-l-1].transpose())
梯度下降算法⼯作的⽅式就是重复计算梯度∇C,然后沿着相反的⽅向移动,沿着⼭⾕“滚落”。
随机梯度下降通过随机选取⼩量的m个训练输⼊来⼯作。我们将这些随机的训练输⼊标记为X1,X2,...,Xm,并把它们称为⼀个⼩批量数据(mini-batch)。
net.weights[1]是⼀个存储着连接第⼆层和第三层神经元权重的Numpy矩阵。
复杂的算法≤简单的学习算法+好的训练数据
反向传播的核⼼是⼀个对代价函数C关于任何权重w(或者偏置b)的偏导数∂C/∂w的表达式。这个表达式告诉我们在改变权重和偏置时,代价函数变化的快慢。
反向传播算法:
1.输⼊x:为输⼊层设置对应的激活值a1。
2.前向传播:对每个l= 2,3,...,L计算相应的zl=wlal−1+bl和al=σ(zl)
3.输出层误差δL:计算向量δL=∇aC⊙σ′(zL)
4.反向误差传播:对每个l=L−1,L−2,...,2,计算δl= ((wl+1)Tδl+1)⊙σ′(zl)5.输出:代价函数的梯度由∂C∂wljk=al−1kδlj和∂C∂blj=δlj得出