基本概念
1、神经元
在这个模型中,神经元接收到来自n个其他神经元传递来的信号,这些输入信号通过带权的连接进行传递,神经元接收到总输入值,再与阈值进行比较,然后通过“**函数”处理以产生神经元输出。
2、**函数
为什么神经网络模型要使用**函数:
(1)引入非线性因素,解决非线性问题。
(2)可知输出范围,有限的输出范围使得网络对于一些比较大的输入也会比较稳定,这也是为什么早期的**函数都以此类函数为主,如Sigmoid、TanH。
**函数的性质要求:
(1)可微性:BP神经网络的优化方法是基于梯度的,所以必须要求**函数可微
(2)单调性:即导数符号不变。单调性使得在**函数处的梯度方向不会经常改变,从而让训练更容易收敛。
常见**函数如下:
(1)ReLu函数
该函数是工程上使用较多的**函数,其定义为:
y={0(x≤0)x(x>0)
(2)sigmoid函数
f(x)=1+e−x1
其图像如下:
Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,可以用作输出层。求导容易,求导结果为f(x)(1−f(x)),其最大的局限性在于:当x达到一定值时,其导数值等于0,容易产生梯度消失,导致训练出现问题。
(3)tanh函数
tanh(x)=1+e−2x1−e−2x
其图像如下:
相比Sigmoid函数,其输出以0为中心而且收敛速度快。但他和sigmoid一样,也存在梯度消失问题。
神经网络模型
回顾感知机模型 ,感知机模型也可以理解为一个简单的神经网络模型,由两层神经元组成,如下图所示:
需要注意的是,感知机只有输出层神经元进行**函数处理,即只拥有一层功能神经元,其学习能力非常有限。
在感知机模型 中也提到过,感知机只能解决简单的二分类问题,如:“与”,“非”,“或”;不能解决异或问题,为了解决非线性问题,需要考虑使用多层功能神经元。如下图所示:
那么如何训练得到这个神经网络的参数,我们使用误差逆传播(BP)算法进行学习,学习得到的神经网络称为BP神经网络。
给定训练集D={(x1,y1),(x2,y2),…,(xm,ym)},xi∈Rd,yi∈Rl ,即输入数据有d个属性,输出l维实值向量。隐层神经元个数是q。输出层第j个神经元的阈值用θj表示,隐层第h个神经元的阈值用γh表示。**函数采用sigmoid函数。
对训练样本(xk,yk),假定神经网络的输出为y^=(y^1k,y^2k,…,y^lk),所以有:
y^jk=f(βj−θj)
则网络在(xk,yk)上的均方误差为:
Ek=21j=1∑l(y^jk−yjk)2
我们的目标是最小化这个误差函数。
待求参数:
(1)输入层到隐藏层有d×q个参数。
(2) 隐藏层到输出层有q×l个参数。
(3)隐层q个神经元的阈值。
(4)输出层l个神经元的阈值。
BP神经网络基于梯度下降策略,以目标的负梯度方向对参数进行调整。不断优化参数。
(1)求△whj
对误差函数Ek,给定学习了η,有:
△whj=−η∂whj∂Ek
根据链式求导法则:
∂whj∂Ek=∂y^jk∂Ek⋅∂βj∂y^jk⋅∂whj∂βj
由βj=∑h=1qwhjbh得:
∂whj∂βj=bh
sigmoid函数求导结果如下:
f′(x)=f(x)(1−f(x))
定义gi:
gi=−∂y^jk∂Ek⋅∂βj∂y^jk=−(y^jk−yjk)f′(βj−θj)=−(y^jk−yjk)f(βj−θj)(1−f(βj−θj))=y^jk(1−y^jk)(yjk−y^jk)
称gj为输出神经元得梯度
所以:
△whj=ηgjbh
(2)求△θj
Δθj=−η∂θj∂Ek
∂θj∂Ek=∂y^jk∂Ek⋅∂θj∂y^jk=∂y^jk∂Ek⋅∂θj∂[f(βj−θj)]=∂y^jk∂Ek⋅f′(βj−θj)×(−1)=∂y^jk∂Ek⋅f(βj−θj)×[1−f(βj−θj)]×(−1)=∂y^jk∂Ek⋅y^jk(1−y^jk)×(−1)=∂y^jk∂[21j=1∑l(y^jk−yjk)2]⋅y^jk(1−y^jk)×(−1)=21×2(y^jk−yjk)×1⋅y^jk(1−y^jk)×(−1)=(yjk−y^jk)y^jk(1−y^jk)=gj
所以:
Δθj=−ηgj
(3)求Δvih
因为
Δvih=−η∂vih∂Ek
所以:
∂vih∂Ek=j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅∂bh∂βj⋅∂αh∂bh⋅∂vih∂αh=j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅∂bh∂βj⋅∂αh∂bh⋅xi=j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅∂bh∂βj⋅f′(αh−γh)⋅xi=j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅whj⋅f′(αh−γh)⋅xi=j=1∑l(−gj)⋅whj⋅f′(αh−γh)⋅xi=−f′(αh−γh)⋅j=1∑lgj⋅whj⋅xi=−bh(1−bh)⋅j=1∑lgj⋅whj⋅xi=−eh⋅xi
称eh=∑j=1l∂y^jk∂Ek⋅∂βj∂y^jk⋅∂bh∂βj⋅∂αh∂bh为隐层神经元得梯度项
所以:
Δvih=−η∂vih∂Ek=ηehxi
(4)求Δγh
因为:
Δγh=−η∂γh∂Ek
所以:
∂γh∂Ek=j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅∂bh∂βj⋅∂γh∂bh=j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅∂bh∂βj⋅f′(αh−γh)⋅(−1)=−j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅whj⋅f′(αh−γh)=−j=1∑l∂y^jk∂Ek⋅∂βj∂y^jk⋅whj⋅bh(1−bh)=j=1∑lgj⋅whj⋅bh(1−bh)=eh
所以:
Δγh=−η∂γh∂Ek=−ηeh
注:学习了η∈(0,1) 控制每一轮迭代中得更新步长,太大容易震荡太小收敛速度很慢。
误差逆传播算法如下:
输入:训练集D={(xk,yk)}k=1m ,学习率 η
输出:连接全与阈值确定的多层前馈神经网络。
过程:
-
在(0,1)范围内随机初始神经网络中得所有连接权和阈值
-
repeat:
for all (xk,yk) do
根据当前参数计算当前得样本输出yk^
计算输出神经元梯度项 gj
计算隐层神经元得梯度项eh
根据求导的最终结果:
△whj=ηgjbhΔθj=−ηgjΔvih=ηehxiΔγh=−ηeh
更新权值whj,vih 与阈值θj,γh
end for
util 达到条件
这个过程中,需要注意BP算法的目标是要最小化训练集D上的累计误差:
E=m1k=1∑mEk
最小化并非累积误差为0,若累积误差为0,会导致过拟合现象;因此通常采用“正则化”的策略,即在误差目标函数中增加一项用于描述网络复杂度的部分,例如连接权与阈值的平方和;则误差目标函数可以改为:
E=λm1k=1∑mEk+(1−λ)i∑wi2
其中 λ∈(0,1),其作用是对经验误差与网络复杂度这两项进行折中。 由上式可知,误差E是连接权和阀值的函数,此时,神经网络可以看做一个参数寻优的过程,即在参数空间中寻找一组最优的参数使得误差最小。