BP算法和数学原理

admin 的头像
网络上有很多,不过公式很多不太清楚,这里重新整理一下。这样以后开发程序就可以直接翻译过去了。 BP网络原理
设有一个m层的神经网络,并在输入层加有样本X;设第k层的i神经元的输入总和表示为`U_i^k`,输出`X_i^k`;从第k-1层的第j个神经元到第k层的第i个神经元的权系数为`W_{ij}`各个神经元的激发函数为f,则各个变量的关系可用下面有关数学式表示:
`X_i^k=f(U_i^k)`
`U_i^k=\sum_j W_{ij}X_j^{k-1}`

反向传播算法分二步进行,即正向传播和反向传播。这两个过程的工作简述如下。

1.正向传播

输入的样本从输入层经过隐单元一层一层进行处理,通过所有的隐层之后,则传向输出层;在逐层处理的过程中,每一层神经元的状态只对下一层神经元的状态产生影响。在输出层把现行输出和期望输出进行比较,如果现行输出不等于期望输出,则进入反向传播过程。

2.反向传播

反向传播时,把误差信号按原来正向传播的通路反向传回,并对每个隐层的各个神经元的权系数进行修改,以望误差信号趋向最小。

BP算法

BP算法实质是求取误差函数的最小值问题。这种算法采用非线性规划中的最速下降方法,按误差函数的负梯度方向修改权系数。

为了说明BP算法,首先定义误差函数e。取期望输出和实际输出之差的平方和为误差函数,则有:


`e=1/2\sum_{i}(X_i^m+Y_i)^2` ------- (1)

其中:`Y_i`是输出单元的期望值;它也在这里用作教师信号;
`X_i^m`是实际输出;因为第m层是输出层。


由于BP算法按误差函数e的负梯度方向修改权系数,故权系数`W_{ij}`的修改量`\Delta W_{ij}`,和`e`

`\Delta W_{ij}~= - \frac{del e}{del W_{ij}}`
也可以写为: `\Delta W_{ij}~= -\eta \frac{del e}{del W_{ij}}` 其中 `eta`为学习速率,即步长
接下来我们算`\frac{del e}{del W_{ij}}`


`\frac{del e}{del W_{ij}}=\frac{\del e}{del U_i^k}*frac{U_i^k}{\del W_{ij}}`

由于
`\frac{U_i^k}{del W_{ij}}=\frac{\sum_{l}W_{il}X_l^{k-1}}{\del W_{ij}}=X_j^{k-1}`
所以
`\frac{del e}{del W_{ij}}=\frac{\del e}{del U_i^k}*X_j^{k-1}`
从而有
`\Delta W_{ij} = -\eta \frac{del e}{del W_{ij}}= -\eta \frac{\del e}{del U_i^k}*X_j^{k-1}`


令 `d_i^k=\frac{\del e}{del U_i^k}`
则学习公式为: `\Delta W_{ij} = -\eta d_i^k*X_j^{k-1}` 其中: `\eta` 为学习速率,即步长,一般取0-1间的数。
从上面可知,`d_i^k` 实际仍末给出明显的算法公式
下面求 `d_i^k` 的计算公式。
`d_i^k=\frac{\del e}{del U_i^k}=\frac{\del e}{del X_i^k}*\frac{\del X_i^k}{del U_i^k}`
由前面可以知 `\frac{\del X_i^k}{del U_i^k}=f'(U_i^k)`
为了方便进行求导,取f为连续函数。一般取非线性连续函数,例如Sigmoid函数。当取f为非对称Sigmoid函数时,有:
`f(U_i^k)=frac{1}{1+exp(-U_i^k)}`
则有:
`f'(U_i^k)=f(U_i^k)(1-f(U_i^k))=X_i^k(1-X_i^k) `

如果 `k=m` ,则是输出层,这时有 `Y_i` 是输出期望值,它是常数。由(1)可以知

`\frac{del e}{del X_i^k}=\frac{\del e}{del X_i^m}=(X_i^m-Y_i)`

从而有 `d_i^m=X_i^m(1-X_i^m)(X_i^m-Y_i)`


2.如果 `k lt m` ,则该层是隐层.这时应考虑上一层对它的作用,故有:
`\frac{del e}{X_i^k}=sum_{l}*\frac{del e}{del U_l^{k+1}}*\frac{del U_l^{k+1}}{X_i^k}`

由于 `\frac{del e}{del U_l^{k+1}}=d_l^{k+1}`
而且 `\frac{del U_l^{k+1}}{del X_i^k}=\frac{del \sum W_{lj} X_j^k}{del X_i^k}=W_{li}`
故而有 `\frac{del e}{del X_i^k}=sum_{l}*W_{l,i}*d_l^{k+1}`
最后有 `\frac{del e}{del X_i^k}=sum_{l} W_{l,i}*d_l^{k+1}` `d_i^k=sum_{l} \frac{\del e}{del X_i^k}*\frac{\del X_i^k}{del U_i^k}=X_i^k(1-X_i^k) sum_{l} W_{li}*d_l^{k+1}`

从上述过程可知:多层网络的训练方法是把一个样本加到输入层,并根据向前传播的规则:
`x_i^k=f(U_i^k)`
不断一层一层向输出层传递,最终在输出层可以得到输出`X_i^m`。
把 `X_i^m` 和期望输出 `Y_i` 进行比较.如果两者不等,则产生误差信号 `e` ,接着则按下面公式反向传播修改权系数:
`\Delta W_{ij}=- eta d_i^k X_j^{k-1}`
其中
`d_i^m=X_i^m(1-X_i^m)(X_i^m-Y_i)`
`d_i^k=X_i^k(1-X_i^k)sum_{l}W_{l,i} d_l^{k+1}`

上面公式中,求取本层`d_i^k`时,要用到高一层的`d_i^{k+1}`;可见,误差函数的求取是从输出层开始,到输入层的反向传播过程。在这个过程中不断进行递归求误差。

通过多个样本的反复训练,同时向误差渐渐减小的方向对权系数进行修正,以达最终消除误差。从上面公式也可以知道,如果网络的层数较多时,所用的计算量就相当可观,故而收敛速度不快。

为了加快收敛速度,一般考虑上一次的权系数,并以它作为本次修正的依据之一,故而有修正公式:
`Delta W_{ij}(t+1)=-eta d_i^k*X_j^{k+1}+alpha Delta W_{ij}(t)`


三、BP算法的执行步骤

在反向传播算法应用于前馈多层网络时,采用Sigmoid为激发函数时,可用下列步骤对网络的权系数 `W_{ij}` 进行递归求取。注意对于每层有n个神经元的时候,即有i=1,2,…,n;j=1,2,…,n。对于第k层的第i个神经元,则有n个权系数 `W_{i,1},W_{i,2},...,W_{i,n}`,另外取多—个 `W_{i,n+1}`用于表示阀值`theta_i`;并且在输入样本X时,取 `X=(X_1,X_2,...,X_n,1)` 。

算法的执行的步骤如下:

1.对权系数 `W_{i,j}` 置初值。
对各层的权系数 `W_{i,j}` 置一个较小的非零随机数,但其中 `W_{i,n+1}=-theta`。

2.输入一个样本 `X=(X_l,X_2,...,X_n,1)` ,以及对应期望输出 `Y=(Y_1,Y_2,...,Y_n)` 。

3.计算各层的输出

对于第k层第i个神经元的输出 `X_i^k`,有:
`U_i^k=sum_j^{n+1} W_{ij} X_j^{k-1},X_{n+1}^{k-1}=1,W_{i,n+1}=-theta`
`X_i^k=f(U_i^k)`

4.求各层的学习误差 `d_i^k`
对于输出层有 `k=m`,有
`d_i^m=X_i^m (1-X_i^m)(X_i^m-Y_i)
对于其他各层,有
`d_i^k=X_i^k(1-X_i^k) sum_{l} W_{l,i} d_l^{k+1}`

5.修正权系数 `W_{i,j}` 和阀值 `theta`
由前面知:
`W_{i,j}(t+1)=W_{i,j}(t)- eta *d_i^k*X_j^{k-1} `
增加动量项有:
`W_{i,j}(t+1)=W_{i,j}(t)- eta *d_i^k*X_j^{k-1}+alpha \Delta W_{ij}(t) `
其中:
`Delta W_{i,j}(t)=-eta d_i^k*X_j^{k+1}+alpha Delta W_{i,j}(t-1)=W_{i,j}(t)-W_{i,j}(t-1)`

6.当求出了各层各个权系数之后,可按给定品质指标判别是否满足要求。如果满足要求,则算法结束;如果未满足要求,则返回(3)执行。

这个学习过程,对于任一给定的样本 `X^p=(X_1^p,X_2^p,...,X_n^p,1)` 和期望输出 `Y^p=(Y_1^p,Y_2^p,...,Y_n^p)` 都要执行,直到满足所有输入输出要求为止。
0
Your rating: None