神经元模型
神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。
神经网络中最基本的成分是神经元模型,即上述定义中的“简单单元”,在生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个“阈值”,那么它就会被激活,即“兴奋”起来,向其他神经元发送化学物质。
M-P神经元模型
M‑P神经元(一个用来模拟生物行为的数学模型):接收n个输入(通常是来自其他神经
元),并给各个输入赋予权重计算加权和,然后和自身特有的阈值进行比较(作减
法),最后经过激活函数(模拟“抑制”和“激活”)处理得到输出(通常是给下一个神经
元)
单个M‑P神经元:感知机( sgn作激活函数)、对数几率回归(sigmoid作激活函数)
多个M‑P神经元:神经网络
感知机
感知机模型:激活函数为sgn(阶跃函数)的神经元
其中, 为样本的特征向量,是感知机模型的输入, 是感知机模型的参数, 为权重,
再从几何角度来说,给定一个线性可分的数据集,感知机的学习目标是求得能对数据
集中的正负样本完全正确划分的超平面,其中 即为超平面方程。
n维空间的超平面( ,其中):
超平面方程不唯一
法向量垂直于超平面
法向量和位移项确定一个唯一超平面
法向量指向的那一半空间为正空间,另一半为负空间
感知机学习策略:随机初始化,将全体训练样本代入模型找出误分类样本,假设此
时误分类样本集合为,对任意一个误分类样本来说,当
时,模型输出值为 ,样本真实标记为 ;反之,当时,模型输出值为,样本真实标记为。综合两种情形可知,以下公式恒成立
所以,给定数据集T,其损失函数可以定义为
显然,此损失函数是非负的。如果没有误分类点,损失函数值是0。而且,误分类点越
少,误分类点离超平面越近,损失函数值就越小。
感知机学习算法:当误分类样本集合固定时,那么可以求得损失函数的梯度为
感知机的学习算法具体采用的是随机梯度下降法,也就是极小化过程中不是一次使中
所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。所以权重
的更新公式为
相应地, 中的某个分量的更新公式即为 ,最终解出来的通常不唯一。
BP神经网络
多层前馈网络:每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不
存在跨层连接。(隐层阈值,输出层阈值)
BP代码示例
import numpy as np
#定义sigmoid函数
def sigmoid(x, deriv = False):
if(deriv == True):
return x*(1-x)
else:
return 1/(1+np.exp(-x))
#定义数据集
#input dataset
X = np.array([[0,0,1],
[0,1,1],
[1,0,1],
[1,1,1]])
#output dataset
y = np.array([[0,1,1,0]]).T
#初始化权重
weight01 = 2*np.random.random((3,4)) - 1
weight12 = 2*np.random.random((4,2)) - 1
weight23 = 2*np.random.random((2,1)) - 1
#初始化偏倚
b1 = 2*np.random.random((1,4)) - 1
b2 = 2*np.random.random((1,2)) - 1
b3 = 2*np.random.random((1,1)) - 1
bias1=np.array([b1[0],b1[0],b1[0],b1[0]])
bias2=np.array([b2[0],b2[0],b2[0],b2[0]])
bias3=np.array([b3[0],b3[0],b3[0],b3[0]])
#开始训练
for j in range(60000):
I0 = X
O0=I0
I1=np.dot(O0,weight01)+bias1
O1=sigmoid(I1)
I2=np.dot(O1,weight12)+bias2
O2=sigmoid(I2)
I3=np.dot(O2,weight23)+bias3
O3=sigmoid(I3)
f3_error = y-O3
f3_delta = f3_error*sigmoid(O3,deriv = True)
f2_error = f3_delta.dot(weight23.T)
f2_delta = f2_error*sigmoid(O2,deriv = True)
f1_error = f2_delta.dot(weight12.T)
f1_delta = f1_error*sigmoid(O1,deriv = True)
weight23 += O2.T.dot(f3_delta) #调整权重
weight12 += O1.T.dot(f2_delta)
weight01 += O0.T.dot(f1_delta)
bias3 += f3_delta #调整偏倚
bias2 += f2_delta
bias1 += f1_delta
print ("outout after Training:")
print (O3)
运行结果:
outout after Training:
[[0.00202759]
[0.99787938]
[0.99788573]
[0.00205667]]