BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。
一个神经网络的结构示意图如下所示。
一个四层的神经网络
输入层:三个神经元
隐含层1:三个神经元
隐含层2:两个神经元
输出层:两个神经元
网络中突触的权值是固定的,输入信号在网络中一层一层的传播,直到输出端。
根据上面的一个图,前馈过程就是:
zj=∑i=ni=0wijxj
xj=f(zj)
这样一层一层的向前递归下去
反馈阶段是利用训练误差,更新各层神经元权值
先说明下这里反馈阶段更新权值每次是利用一个训练样本数据更新权值
对某一个样本 x ,其各维数据值: x0,x1,x2,...,xn
设该BP神经网络共有 L 层
第 l 层第i个神经元与第j神经元的权值: w(l)ij
第 l 层的神经元数: Sl ,为了方便表示, Sl 从0开始到 Sl 结束
第 l 层第i个神经元的加权和: zli
输出层输出值: y0,y1,...,ySL
输出层期望值(也就是该样本数据的真实值): d0,d1,...,dSL−1
对该样本 x 的输出层第j神经元的训练误差:
这里我们需要求的参数只有 wlij ,下面可以利用梯度下降法或者拟牛顿法进行求解。利用梯度下降法需要计算 E 对 wlij 的导数,来更新 wlij ,而拟牛顿法需要计算其二阶导数。
下面利用梯度下降法进行求解
我们知道需要计算 E 对 wlij 的导数,然而 l 是一个变量,对于 L 层神经网络,其取值范围是 [1,L] ,但是 E 是固定值,是某一个训练样本 x 在输出层各神经元的平方误差。
当 l==L 时,也就是说是隐含层到输出层,需要求的是输出层各神经元的权值矩阵 wL
E 对 wLij 求导,利用链式法则:
∂ej∂yj=−1
∂yj∂z(L)j=f′(z(L)j)
∂z(L)j∂w(L)ij=x(L)i
所以:
在许多论文书籍中往往定义神经元 j 的敏感度
第l层第 j 个神经元的敏感度:
所以:
当 l<=L−1 时,也就是说是隐含层到隐含层,我们需要计算的权值矩阵 w(l) 在隐含层中, l 的取值范围从第一层一直到导数第二层,而对该样本 x 的输出层所有神经元的平方误差 E 是固定的,我们还是用 E 对 wlij 求导,但是这个求导过程比较复杂
当 l=L−1 ,这是倒数第二层,其下一层就是输出层
其网络结构:
请忽略图中明显的不足、错误之处
各参数:
第 L−1 层神经元i到神经元j的权值 wL−1ij
第 L−1 层神经元 j 的加权和: z(L−1)j
z(L−1)j=∑i=SL−1i=0w(L−1)ijx(L−1)i
第 L−1 层神经元 j 的敏感度: δ(L−1)j
第 L−1 层神经元数: SL−1
第 L 层神经元j到神经元k的权值 wLjk
第 L 层神经元 k 的加权和: z(L)k
z(L)k=∑j=SLj=0w(L−1)jkx(L)j
第 L 层神经元 k 的敏感度: δ(L)k
第 L 层神经元数: SL
第 L 层神经元 k 的值: yk ,这个值也就是对x的预测值
yk=f(z(L)k)
第 L 层神经元 k 的预测误差: ek=yk−dk
第 L 层神经元的平方误差:
E 对 wL−1ij 求偏导:
下面分别对上面的链式法则中的各项进行求解
∂z(L−1)j∂w(L−1)ij=x(L−1)i
δ(L−1)j 的求解,根据上面简单网络模型和链式法则进行求解
先看下面的图
<图中不足之处请见谅>
我们需要求 δ(L−1)j=−∂E∂z(L−1)j
利用链式法则需要对 ek,yk,z(L)k,x(L)j,z(L−1)j 求导
我们发现 x(L)j 对该层的所有加权和都产生了影响,加权和又对 yk,(k=0,1,SL) 产生了影响,一直到所有的 ek,(k=0,1,2,...n) ,最后累加到 E ,所以这个求导要分别对 ek,(k=0,1,2,3...,SL) 求导,这里是和的导数,其等于倒数的和。所以:
δ(L−1)j=−∂E∂z(L−1)j=−∑k=SLk=0∂E∂ek
对 ek 进行链式求导法则
δ(L−1)j=−∂E∂z(L−1)j=−∑k=SLk=0∂E∂ek∂ek∂yk∂yk∂z(L)k∂z(L)k∂x(L)j∂x(L)j∂z(L−1)j=−∑k=SLk=0ek(−1)f′(z(L)k)w(L−1)jkf′(z(L−1)j)=f′(z(L−1)j)∑k=SLk=0ekf′(z(L)k)w(L−1)jk=f′(z(L−1)j)∑k=SLk=0δ(L)kw(L−1)jk
利用梯度下降法更新 w(L−1)ij
根据上面可以得出规律,对于 l 层,隐含层之间利用梯度下降法更新权值系数公式:
其中:
η 是学习率
δ(l)j 是第 l 层输出神经元 j 的敏感度
x(l)i 表示第 l 层输入神经元 i 的值
δ(l)j=f′(z(l)j)∑k=Sl+1k=0δ(l+1)kw(l)jk
第 l 层神经元之间的权值系数:
当 l==L 也就是隐含层到输出层:
当 l<=L−1 也就是隐含层之间:
为了防止出现振荡问题,一种改进的权值修正方法:
其中:
α 是动量系数,通常取0.2-0.8
对于上面的式子,在一些书中可能形式不一样
BP伪代码:
参数:隐含层数量,隐含层大小,动量系数,学习率
随机初始化各个权值系数
对每个训练样本数据进行训练:
前馈阶段:
利用输入值,权值系数,进行逐步迭代,直到最后输出层
反馈阶段:
利用训练误差,逐步向后更新权值系数
当到达最大迭代次数的时候停止更新
自己整理,符号表示比较复杂,有上标也有下标,还有中标,如有错误请指出