神经元模型

神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。
神经网络中最基本的成分是神经元模型,即上述定义中的“简单单元”,在生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个“阈值”,那么它就会被激活,即“兴奋”起来,向其他神经元发送化学物质。

M-P神经元模型

神经网络中的patch 神经网络中的神经元_神经网络


神经网络中的patch 神经网络中的神经元_神经网络中的patch_02


M‑P神经元(一个用来模拟生物行为的数学模型):接收n个输入(通常是来自其他神经

元),并给各个输入赋予权重计算加权和,然后和自身特有的阈值神经网络中的patch 神经网络中的神经元_深度学习_03进行比较(作减

法),最后经过激活函数(模拟“抑制”和“激活”)处理得到输出(通常是给下一个神经

元)

神经网络中的patch 神经网络中的神经元_神经网络中的patch_04

单个M‑P神经元:感知机( sgn作激活函数)、对数几率回归(sigmoid作激活函数)
多个M‑P神经元:神经网络

感知机

感知机模型:激活函数为sgn(阶跃函数)的神经元

神经网络中的patch 神经网络中的神经元_深度学习_05

其中, 神经网络中的patch 神经网络中的神经元_神经网络中的patch_06为样本的特征向量,是感知机模型的输入, 神经网络中的patch 神经网络中的神经元_神经网络_07 是感知机模型的参数, 神经网络中的patch 神经网络中的神经元_深度学习_08为权重,神经网络中的patch 神经网络中的神经元_深度学习_03

再从几何角度来说,给定一个线性可分的数据集神经网络中的patch 神经网络中的神经元_感知机_10,感知机的学习目标是求得能对数据
神经网络中的patch 神经网络中的神经元_感知机_10中的正负样本完全正确划分的超平面,其中 神经网络中的patch 神经网络中的神经元_神经网络_12 即为超平面方程。
n维空间的超平面(神经网络中的patch 神经网络中的神经元_深度学习_13 ,其中神经网络中的patch 神经网络中的神经元_神经网络中的patch_14):
超平面方程不唯一
法向量神经网络中的patch 神经网络中的神经元_神经网络中的patch_15垂直于超平面
法向量神经网络中的patch 神经网络中的神经元_神经网络中的patch_15和位移项确定一个唯一超平面
法向量神经网络中的patch 神经网络中的神经元_神经网络中的patch_15指向的那一半空间为正空间,另一半为负空间

感知机学习策略:随机初始化神经网络中的patch 神经网络中的神经元_深度学习_18,将全体训练样本代入模型找出误分类样本,假设此
时误分类样本集合为神经网络中的patch 神经网络中的神经元_深度学习_19,对任意一个误分类样本来神经网络中的patch 神经网络中的神经元_机器学习_20说,当
神经网络中的patch 神经网络中的神经元_深度学习_21时,模型输出值为神经网络中的patch 神经网络中的神经元_深度学习_22 ,样本真实标记为 神经网络中的patch 神经网络中的神经元_感知机_23 ;反之,当神经网络中的patch 神经网络中的神经元_神经网络中的patch_24时,模型输出值为神经网络中的patch 神经网络中的神经元_神经网络_25,样本真实标记为神经网络中的patch 神经网络中的神经元_神经网络_26。综合两种情形可知,以下公式恒成立

神经网络中的patch 神经网络中的神经元_神经网络中的patch_27

所以,给定数据集T,其损失函数可以定义为

神经网络中的patch 神经网络中的神经元_神经网络中的patch_28

显然,此损失函数是非负的。如果没有误分类点,损失函数值是0。而且,误分类点越
少,误分类点离超平面越近,损失函数值就越小。

感知机学习算法:当误分类样本集合神经网络中的patch 神经网络中的神经元_神经网络_29固定时,那么可以求得损失函数的梯度神经网络中的patch 神经网络中的神经元_感知机_30

神经网络中的patch 神经网络中的神经元_神经网络中的patch_31

感知机的学习算法具体采用的是随机梯度下降法,也就是极小化过程中不是一次使神经网络中的patch 神经网络中的神经元_神经网络_29
所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。所以权重神经网络中的patch 神经网络中的神经元_神经网络中的patch_15
的更新公式为

神经网络中的patch 神经网络中的神经元_神经网络中的patch_34

相应地, 神经网络中的patch 神经网络中的神经元_神经网络中的patch_15中的某个分量神经网络中的patch 神经网络中的神经元_神经网络中的patch_36的更新公式即为 神经网络中的patch 神经网络中的神经元_机器学习_37,最终解出来的神经网络中的patch 神经网络中的神经元_神经网络中的patch_15通常不唯一。

BP神经网络

多层前馈网络:每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不
存在跨层连接。(隐层阈值神经网络中的patch 神经网络中的神经元_神经网络_39,输出层阈值神经网络中的patch 神经网络中的神经元_机器学习_40

神经网络中的patch 神经网络中的神经元_感知机_41

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]]