一、神经元模型
二、感知机与多层网络
三、反向传播算法(BP算法)
1.BP算法的原理
----BP算法是迄今为止最成功的神经网络算法,现实任务中使用神经网络时,大多是在使用BP算法进行训练。BP算法不仅可以用于多层前馈神经网络,还可以用于其他类型的网络,例如训练递归网络。但通常说”BP网络“时,一般是指用BP算法训练的多层前馈神经网络。
----下面我们来看看BP算法究竟是什么样。
2.BP算法的简单代码实现
以上述神经网络为例,实现BP算法,使网络的输出趋近0.01与0.99。
import numpy as np
w = [0, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65]
b = [0, 0.35, 0.65]
l = [0, 5, 10]
def sigmoid(x):
return 1.0/(1 + np.exp(-x))
def bp(w, b, l):
# 1. 前向传播, 计算预测值与误差
net_h1 = w[1]*l[1] + w[2]*l[2] + b[1]
out_h1 = sigmoid(net_h1)
net_h2 = w[3]*l[1] + w[4]*l[2] + b[1]
out_h2 = sigmoid(net_h2)
net_h3 = w[5]*l[1] + w[6]*l[2] + b[1]
out_h3 = sigmoid(net_h3)
net_o1 = w[7]*out_h1 + w[9]*out_h2 + w[11]*out_h3 + b[2]
out_o1 = sigmoid(net_o1)
net_o2 = w[8]*out_h1 + w[10]*out_h2 + w[12]*out_h3 + b[2]
out_o2 = sigmoid(net_o2)
e = 0.5 * (np.square(0.01-out_o1) + np.square(0.99-out_o2))
# 2. 后向传播, 更新权重
eta = 0.5
t1 = -(0.01 - out_o1) * out_o1 * (1 - out_o1)
t2 = -(0.99 - out_o2) * out_o2 * (1 - out_o2)
w[7] = w[7] - eta*t1*out_h1
w[9] = w[9] - eta*t1*out_h2
w[11] = w[11] - eta*t1*out_h3
w[8] = w[8] - eta*t2*out_h1
w[10] = w[10] - eta*t2*out_h2
w[12] = w[12] - eta*t2*out_h3
w[1] = w[1] - eta * (t1*w[7] + t2*w[8]) * out_h1*(1-out_h1) * l[1]
w[2] = w[2] - eta * (t1*w[7] + t2*w[8]) * out_h1*(1-out_h1) * l[2]
w[3] = w[3] - eta * (t1*w[9] + t2*w[10]) * out_h2*(1-out_h2) * l[1]
w[4] = w[4] - eta * (t1*w[9] + t2*w[10]) * out_h2*(1-out_h2) * l[2]
w[5] = w[5] - eta * (t1*w[11] + t2*w[12]) * out_h3*(1-out_h3) * l[1]
w[6] = w[6] - eta * (t1*w[11] + t2*w[12]) * out_h3*(1-out_h3) * l[2]
return out_o1, out_o2, w, e
for i in range(1000): # 迭代次数
out_o1, out_o2, w, e = bp(w, b, l)
print("第{}次迭代:预测结果为({:.6f} {:.6f}), 总误差为{:.6f} 权重系数为{}".format(i+1, out_o1, out_o2, e, w))
print("训练结束!")