基础的BP神经网络 ——— **算法简介** 神经网络中最基本的单元就是神经元模型。神经元模型有多个输入,只有一个输出,神经元接受这多个输入,并对其做出响应。如图所示:
x1,x2,x3
都是这个神经元的输入,假设输出表示为y,那么
y=f(x1,x2,x3)
,这里f表示一个激活函数,最常见的激活函数就是之前学习的
Sigmoid
函数:
Sigmoid(x)=11+e−x
。把很多个这样的神经元按照一个组织结构排列起来互相连接就构成了神经网络的模型。
最简单的神经网络就是单层感知机,只有输入层和输出层两个层面。更复杂、有效的模型是多层网络—包含一个或者多个隐藏层。对应的学习算法就是误差逆向传播算法(BP算法)。
给定训练集
D=(x1,y1),(x2,y2),…,(xm,ym),xi∈Rd,yi∈Rl,
假设有一个三层(仅包含一个隐含层)的神经网络模型:
隐含层和输出层都是用sigmoid函数。输入神经元共d个,另外有l个输出神经元和q个隐含层神经元。其中输出层第j个神经元的阈值用
θj
表示,隐含层第h个神经元的权值为
γh
。输入层第i个神经元和隐含层第h个神经元之间的连接权值为
vih
,隐含层第h个神经元与输出层第j个神经元之间的连接权值
whj
;记隐含层第h个神经元接收到的输入为
αh=∑i=1d(vihxi)
,输出层第j个神经元接收到的输入为
βh=∑h=1q(whjbh)
, 其中
bh
是隐含层第h个神经元的输出。对于训练例
(xk,yk)
,假设神经网络的输出为:
Yk=(Yk1,Yk2,……Ykl),
即:
Ykj=f(βj−θj)
神经网络在训练样本
(xk,yk)
上的均方误差为
Ek=12∑j=1l(Ykj−ykj)2
.BP算法基于梯度下降的策略,以目标的负梯度方向对参数进行调整,对于误差
Ek
,给定学习速率η, 对于权重值w,有:
∆whj=−(η⋅∂Ek)(∂whj)
根据网络结构:
(∂Ek)(∂whj)=(∂Ek)(∂Ykj)(∂Ykj)(∂βj)(∂βj)(∂whj)
根据
βj
的定义,显然有:
(∂βj)(∂whj)=bh
。根据
Sigmoid
函数的性质
f′(x)=f(x)(1−f(x))
,有:
gj=−(∂Ek)(∂Ykj)(∂Ykj)(∂βj)=−(Ykj−ykj)f′(βj−θj)=Ykj(1−Ykj)(Ykj−ykj)
和上面的式子结合,得到BP算法中关于
wij
的更新公式
∆whj=ηgjbh.
类似的方法可以得到:
∆θj=−ηgj,
∆vih=ηehxi,
∆γh=−ηeh
。其中的
eh
的具体值为:
eh=(∂Ek)(∂bh)(∂bh)(∂αh)
=−∑j=1l(∂Ek)(∂βj)(∂βj)(∂bh)f′(αh−γh)
=∑j=1lwhjgjf′(αh−γh)=bh(1−bh)∑j=1lwhjgj
BP算法的具体执行步骤:先将输入实例提供给输入层神经元,然后将信号前传,知道产生输出层的结果,然后计算输出层的误差;再将误差逆向传播到隐含层神经元,最后根据隐含层神经元的误差和连接权的阈值进行调整。这个过程循环进行,直到达到停止条件为止。
实验:
在MATLAB下完成了这次相关的试验,用了MATLAB下神经网络的相关函数和使用了UCI的IRIS数据集,随机选择其中的20%作为测试集,其余的作为训练集。得到训练结果表示如图:
神经网络迭代过程中的均方误差变化,可以看到200个epoch之后MSE基本保持不变了,在748个epoch时均方误差达到最小,迭代停止。
实验的数据量较小,所以重复进行了20次,每次分类的准确率:
平均 准确率为0.9933,是非常不错的结果。
结论:
基本的BP神经网络的过程还是比较简明的,更复杂的网络结构也基本上是同理。这里实现的也是最基础的网络结构,得到的分类结果也是比较优秀的,当然这里的数据集也是比较简单的。