BP神经网络原理介绍
BP神经网络算法(Back-Propagation Neural Network)
一、BP神经网络算法原理是什么?
人类大脑是有多个相互链接的神经元组成,通过视觉、触觉、嗅觉等输入信号,经过人类大脑神经元的多次处理,我们人类可以做出某种判定(或反应),受人类大脑神经元的启发,我们提出了神经网络算法模型。 如下图所示: 输入层x(x1~xn)相当于我们的感知信号(视觉、嗅觉、触觉等)。 隐含层就是神经元的处理。 经过神经元的处理得到某种判定(反应)就是结果输出层。
在介绍BP神经网络实例之前,理解一下神经网络得灵魂_激活函数。
二、激活函数
1.激活函数作用
激活函数作用:在于如何来激活输入信号得总和,对于下图感知机来说: 如上图感知机,输入x1,x2,偏置值b,来计算信号总和a通过阈值计算预测值。 a=w1+w2+b y=h(a) 感知机的激活函数**(阶跃函数)**:以阈值为界,一旦输入超出阈值,就切换输出。 在神经网络中,激活函数都是非线性函数(如果激活函数是线性函数,无论如何加深层数,效果都将等同“无隐含层的神经网路”),最常用的非线性激活函数有:sigmoid函数,如果不懂激活该函数作用请参考:深度学习之魂之神经网络激活函数。
三、BP神经网络异或实例分析
1.问题:
相同为0不同为1。 例如: 输入:【0,0】、【0,1】、【1,0】、【1,1】经过异或判定,输出0或1;
2.分析:
通过BP神经网络实现首先明确输入参数2个。偏置值参数1个。则输入层参数共3个,假设隐藏层有4个,输出层只有一个,输入层与隐藏层权值为V【V0-V3】,隐藏层与输出层权值W[W0-W3]。通过权值可以计算y0-y3,如下图所示: 如上图所示,每个输入层和隐藏层都有一个权重,则共有12个权重值V,和4和权重值W。则输出O可表示为:
3.代码
import numpy as np
# import matplotlib.pyplot as plt
# 导入数据
X = np.array([[1, 0, 0],
[1, 0, 1],
[1, 1, 0],
[1, 1, 1]
])
# 标签
Y = np.array([[0, 1, 1, 0]])
# 输入层和隐藏层权值V、隐藏层和输出层之间的权值W初始化,取值范围-1到1
V = np.random.random((3, 4)) * 2 - 1
W = np.random.random((4, 1)) * 2 - 1
print(V, W)
# 学习率设置
lr = 0.11
# 定义sigmoid激活函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
#定义sigmoid函数导数
def dsigmoid(x):
return x * (1 - x)
#设置更新权值,更新权值理论推导可参照《神经网络导论》
def update():
global X, Y, W, V, lr
L1 = sigmoid(np.dot(X, V)) # 隐藏层的输出(4,4)
L2 = sigmoid(np.dot(L1, W)) # 输出层输出(4,1)
L2_delta = (Y.T - L2) * dsigmoid(L2)
L1_delta = L2_delta.dot(W.T) * dsigmoid(L1)
W_C = lr * L1.dot(L2_delta)
V_C = lr * X.T.dot(L1_delta)
W = W + W_C
V = V + V_C
for i in range(20000):
update() # 更新权值
if i % 500 == 0:
L1 = sigmoid(np.dot(X, V)) # 隐藏层输出(4,4)
L2 = sigmoid(np.dot(L1, W)) # 输出层输出(4,1)
print('Error:', np.mean(np.abs(Y.T - L2)))
L1 = sigmoid(np.dot(X, V)) # 隐藏层输出(4,4)
L2 = sigmoid(np.dot(L1, W)) # 输出层输出(4,1)
print(L2)
运行结果:
该处使用的url网络请求的数据。
总结
学习了BP神经网络的后向反馈机制,通过实例更加清晰神经网络使用,神经网络推到还需进一步了解。
|