BP神经网络
最近打算学习卷积神经网络,发现关于BP算法都已经忘了,再来梳理一遍。
反向BP神经网络
- 正向传播
输入的样本从输入层经过隐单元一层一层进行处理,通过所有的隐层之后,则传向输出层;在逐层处理的过程中,每一层神经元的状态只对下一层神经元的状态产生影响。在输出层把现行输出和期望输出进行比较,如果现行输出不等于期望输出,则进入反向传播过程。 - 反向传播
反向传播时,把误差信号按原来正向传播的通路反向传回,并对每个隐层的各个神经元的权系数进行修改,以望误差信号趋向最小。
其实反向传播的核心计算就是,梯度下降+链式求导。
BP神经网络的算法流程
在反向传播算法应用于前馈多层网络时,采用Sigmoid为激发函数时,可用下列步骤对网络的权系数 Wij 进行递归求取。注意对于每层有n个神经元的时候,即有i=1,2,…,n;j=1,2,…,n。对于第k层的第i个神经元,则有n个权系数 Wi1,Wi2,…,Win ,另外取多—个 Win+1 用于表示阀值 θi ;并且在输入样本X时,取 x=(X1,X2,…,Xn,1) 。
对权系数 Wij 置初值,对各层的权系数 Wij 置一个较小的非零随机数,但其中 Wi,n+1=−θ 。
输入一个样本 X=(x1,x2,…,xn,1) ,以及对应期望输出 Y=(Y1,Y2,…,Yn) 。
计算各层的输出。对于第k层第i个神经元的输出 Xki ,有:
Uki=∑j=1n+1WijXk−1j,Xk−1n+1=1,wi,n+1=−θ
Xki=f(Uki)- 求各层的学习误差
dki
,对于输出层有k=m,有
dmi=Xmi(1−Xmi)(Xmi−Yi)
对于其他各层,有
dki=Xki(1−Xki)∑lWlidk+1l - 修正权值系数和阈值
θ
Wij(t+1)=Wij(t)−ηdkiXk−1j
为了加快收敛速度,一般考虑上一次的权值系数,并以它作为本次修正的依据之一,修正后如下
Wij(t+1)=Wij(t)−ηdkiXk−1j+α∇Wij(t) - 求出了各层的各个权值系数之后,可按指定的指标判断是否满足要求。如果满足要求则算法结束,如果未满足要求则返回3继续执行。
若修改了激发函数,则需要重新计算误差和权值阈值修改的公式,以上步骤中的推导,主要是对第5步中的权值阈值修改,这个公式的推导详见http://www.cnblogs.com/wengzilin/archive/2013/04/24/3041019.html
- 一般激活函数会使用sigmoid或者tanh。