相信很多小伙伴在学习深度学习的过程中,都无法逃避BP(Back Propagation)
反向传播算法的学习,确实如此,BP算法是ML、DL的经典算法之一,想深入研究深度学习,那就有必要去深入了解BP算法了。
接下来将是简洁而详细的手推过程。此处假设你对BP已经有了神经网络的基本概念,并且最好已经看过BP算法。看完这篇文章后,能够帮助你弄懂BP算法的具体流程,以及BP算法的数学推导过程。
神经网络BP算法例子
神经网络FP、BP的推算过程:(原理不难,对上号代公式即可)
基于
numpy
的BP反向传播算法
代码实现
"""
**利用numpy实现BP算法
@author: <Colynn Johnson>
@direct: https://www.bilibili.com/video/BV1yx411f7LF?p=2
@date: 2020-9-6
"""
import numpy as np
#已知标签
target_o1 = 0.01
target_o2 = 0.99
#随机初始化w、b
w = [0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65]
b = [0.35, 0.65]
X = [5, 10]
#定义sigmoid函数
def sigmoid(z):
return 1.0 / (1+np.e**(-z))
#定义Bp函数
def f(w, b, x):
#FP过程
out_h1 = sigmoid(w[0]*x[0] + w[1]*x[1] + b[0])
out_h2 = sigmoid(w[2]*x[0] + w[3]*x[1] + b[0])
out_h3 = sigmoid(w[4]*x[0] + w[5]*x[1] + b[0])
out_o1 = sigmoid(w[6]*out_h1 + w[8]*out_h2 + w[10]*out_h3 + b[1])
out_o2 = sigmoid(w[7]*out_h1 + w[9]*out_h2 + w[11]*out_h3 + b[1])
#BP过程
#求E_total/net_o[i]的偏导, i=1,2
partial_derivate1 = -(target_o1-out_o1)*out_o1*(1-out_o1)
partial_derivate2 = -(target_o2-out_o2)*out_o2*(1-out_o2)
w[6] = w[6] - 0.5*partial_derivate1*out_h1
w[8] = w[8] - 0.5*partial_derivate1*out_h2
w[10] = w[10] - 0.5*partial_derivate1*out_h3
w[7] = w[7] - 0.5*partial_derivate2*out_h1
w[9] = w[9] - 0.5*partial_derivate2*out_h2
w[11] = w[11] - 0.5*partial_derivate2*out_h3
#下面求w[0]到w[5]其实跟上面原理一样,不同的是每个w[i]的偏导都与out_o1和out_o2有关
#稍微细心一点推算即可
w[0] = w[0] - 0.5*(partial_derivate1*w[6] + partial_derivate2*w[7])*out_h1*(1-out_h1)*x[0]
w[1] = w[1] - 0.5*(partial_derivate1*w[6] + partial_derivate2*w[7])*out_h1*(1-out_h1)*x[1]
w[2] = w[2] - 0.5*(partial_derivate1*w[8] + partial_derivate2*w[9])*out_h2*(1-out_h2)*x[0]
w[3] = w[3] - 0.5*(partial_derivate1*w[8] + partial_derivate2*w[9])*out_h2*(1-out_h2)*x[1]
w[4] = w[4] - 0.5*(partial_derivate1*w[10] + partial_derivate2*w[11])*out_h3*(1-out_h3)*x[0]
w[5] = w[5] - 0.5*(partial_derivate1*w[10] + partial_derivate2*w[11])*out_h3*(1-out_h3)*x[1]
print("-"*20)
print(w)
print("-"*20)
return w
if __name__ == '__main__':
for i in range(1000):
print('第%d个'%i)
w = f(w, b, X)
ToDo: 将w、b可视化。