神经网络介绍资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
神经网络简介
神经网络简介:
人工神经网络是以工程技术手段来模拟人脑神经元网络的结构和特征的系统。利用人工神经网络可以构成各种不同拓扑结构的神经网络,他是生物神经网络的一种模拟和近似。神经网络的主要连接形式主要有前馈型和反馈型神经网络。常用的前馈型有感知器神经网络、BP 神经网络,常用的反馈型有Hopfield 网络。这里介绍BP (Back Propagation )神经网络,即误差反向传播算法。 原理:
BP (Back Propagation )网络是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP 神经网络模型拓扑结构包括输入层(input )、隐层(hide layer)和输出层(output layer),其中隐层可以是一层也可以是多层。
图:三层神经网络结构图(一个隐层)
任何从输入到输出的连续映射函数都可以用一个三层的非线性网络实现 BP 算法由数据流的前向计算(正向传播)和误差信号的反向传播两个过程构成。正向传播时,传播方向为输入层→隐层→输出层,每层神经元的状态只影响下一层神经元。若在输出层得不到期望的输出,则转向误差信号的反向传播流程。通过这两个过程的交替进行,在权向量空间执行误差函数梯度下降策略,动态迭代搜索一组权向量,使网络误差函数达到最小值,从而完成信息提取和记忆过程。
单个神经元的计算:
设12,...ni x x x 分别代表来自神经元1,2...ni 的输入;
12,...i i ini w w w 则分别表示神经
元1,2...ni 与下一层第j 个神经元的连接强度,即权值;j b 为阈值;()f •为传递函数;j y 为第j 个神经元的输出。若记001,j j x w b ==,于是节点j 的净输入j S 可表示为:0*ni
j ij i i S w x ==∑;净输入j S 通过激活函数()f •后,便得到第j 个神经元的
输出:0
()(*),ni
j j ij i i y f S f w x ===∑
激活函数:
激活函数()f •是单调上升可微函数,除输出层激活函数外,其他层激活函数必须是有界函数,必有一最大值。 BP 网络常用的激活函数有多种。 Log-sigmoid 型:1
(),,0()11x
f x x f x e
α-=
-∞<<+∞<<+,'()()(1())f x f x f x α=- tan-sigmod 型:2()1,,1()11x f x x f x e α-=--∞<<+∞-<<+,2(1())
'()2f x f x α-=
线性激活函数purelin 函数:y x =,输入与输出值可取任意值。
BP 网络通常有一个或多个隐层,该层中的神经元均采用sigmoid 型传递函数,输出层的神经元可以采用线性传递函数,也可用S 形函数。
正向传播:
设 BP 网络的输入层有ni 个节点,隐层有nh 个节点,输出层有no 个节点,输入层与隐层之间的权值为ik w (ik w 为(1)*ni nh +的矩阵),隐层与输出层之间的权值为kj w (kj w 为(1)*nh no +的矩阵),隐层的传递函数为1()f •,输出层的传递函数为2()f •,则隐层节点的输出为(将阈值写入求和项中):
10(*),1,2...ni
k ik i i z f w x k nh
===∑;输出层节点的输出为:
20
(*),1,2...nh j kj k k y f w z j no ===∑由此,BP 网络就完成了ni 维空间向量对no 维空间
的近似映射。
def update(self , inputs):#更新ai[],ah[],a0[]中的元素,所以输入的元素个数必须跟输入层一样,将
三层先填满数据
if len (inputs) != self .ni-1:
raise ValueError ('wrong number of inputs')
for i in range (self .ni-1):#将数据导入初始层
self .ai[i] = inputs[i]
for j in range (self .nh1):#将输入层的数据传递到隐层
sum = 0.0
for i in range (self .ni):
sum = sum + self .ai[i] * self .wi[i][j] self .ah[j] = sigmoid(sum)#调用激活函数
for k in range (self .no):
sum = 0.0
for j in range (self .nh2):
sum = sum + self .ah[j] * self .wo[j][k] self .ao[k] = purelin(sum)
return self.ao[:]#返回输出层的值
反向传播:
误差反向传播的过程实际上就是权值学习的过程。网络权值根据不同的训练模式进行更新。常用的有在线模式和批处理模式。在线模式中的训练样P 本是逐
个处理的,而批处理模式的所有训练样本是成批处理的。
输入P 个学习样本,用12,...p X X X 来表示,第p 个样本输入到网络后计算得
到输出p
j y ,1,2...j no =。采用平方型误差函数,于是得到第p 个样本的误差
p
E : 21
0.5*()no
p p p j j j E t y ==-∑ 式中:p j t 为期望输出。 输出层权值的调整:
用梯度下降法调整
kj
w ,使误差
p
E 变小。梯度下降法原理即是沿着梯度下降
方向目标函数变化最快,梯度为2()'()*p p p kj j j j k kj
E w t y f S z w ∂∇=
=--∂,其中误差信
号2()'()p p yj j j j t y f S δ=-,权值的改变量为负梯度方向
2()'()*p p kj kj j j j k w w t y f S z ηη∆=-∇=-,η为学习率
output_deltas = [0.0] * self .no for k in range (self .no):
error2 = targets[k]-self .ao[k]#输出值与真实值之间的误差
output_deltas[k] = dpurelin(self .ao[k]) * error2#输出层的局部梯度,导数乘以误差,不在隐层就这么定义
for j in range (self .nh2):#更新隐层与输出层之间的权重
for k in range (self .no):
change = output_deltas[k]*self .ah[j]#权值的校正值w 的改变量(若没有冲量,且学习率为1
的时候)
self .wo[j][k] = self .wo[j][k] + N*change + M*self .co[j][k]
self .co[j][k] = change
#print N*change, M*self.co[j][k]
隐层权值的调整:
梯度为211
()'()'()*no
p p p ik j j j kj k i j ik
E w t y f S w f S x w =∂∇=
=--∂∑,其中误差信号
211
()'()'()no
p p zk j j j kj k j t y f S w f S δ==-∑,从而得到隐层各神经元的权值调整公式为: