本文就借助伪代码来简述BP神经网络的形成过程

伪代码

我们先来看一下BP神经网络的伪代码

假设数据集中有m个样本

INPUT:训练集 D = {(xi,yi)}(i:1~m)
       学习率 η

在(0,1)内初始化神经元的连接权值和阈值;
REPEAT
    FOR  ALL (xk,yk)IN  D
        根据当前样本的数据计算神经网络输出;
        计算神经网络输出与标签值的误差;
        根据误差计算各个参数的下降梯度;
        根据下降梯度更新参数;
    END
UNTIL    达到迭代次数
OUTPUT = BP神经网络

这个BP神经网络中有2层循环,一次内循环就是一轮训练,一轮训练就会将所有样本都遍历一遍从而产生连接权值和阈值参数,外循环就是需要模型的性能符合我们预期的要求才会停止。

标准BP神经网络针对的是单个样例进行训练,因此如果将整个数据集带到标准BP网络里面的时候,神经网络里面的参数就会迭代得很快,而且也很有可能会有重复的参数迭代,因此我们需要将标准BP网络的误差进行累加,即进行了整个数据集的一次遍历之后的所有累积误差之和就是我们的优化目标,这个网络也是在标准BP网络的基础上进行的改良,叫做累积BP算法,但是这样就会引出新的问题,那就是这个累积误差该怎么找到最小值呢?

局部最优和全局最优

其实这其中的说法就有很多了,我们先来介绍一下局部最优全局最优的概念。

首先确定我们的目标,那就是需要找到下面函数图像中的全局最小点,也就是函数最小值,也是全局最优值

从上图中的函数中我们可以看出,假如说我们找的范围不够大,只在特定区间内进行了查找,那么我们可能就会把红点当作我们的全局最小值,但其实红点并不是全局最小点。

同样的,在模型训练过程中,我们会用梯度下降法,牛顿法等算法查找全局最优点,但是我们并不知道当前算出来的值是不是最小值,它有可能是,也有可能不是,其实这就是找最优解方法的弊端了,按照特定的方法去查找最优解的话肯定会因为规则等原因找到算法认为的最优解,但是这个最优解有可能只是局部的,那该怎么办呢?
于是就有了一些启发式的算法,启发式听起来很高级,其实可以理解成一些推理起来有用,但是并无严谨数学证明的方法,接下来我来介绍一些:

1).模拟退火法。在查找最小值的过程中,算法以特定的概率p接受比当前点更差的点,从而跳出局部最优解;
2).以多组不同的参数初始化神经网络,并且取其中误差最小的解作为最终参数;
3).随机梯度下降。在使用标准梯度下降时,会将随机数据加到计算出来的梯度数值中,这样即使在局部最优点梯度也不为0,从而使得算法有机会跳出局部最优点。

通过上面的办法可以在一定程度上帮助我们找到全局最优点,那么伪代码中描述的“停止条件”就是累积BP网络的累积误差的全局最优点,达到了全局最优点的参数就是我们想要的参数,对应的模型就是我们训练得出的模型。

这里还有一个问题要进行说明一下,那就是为什么不直接记录累积BP网络的累积误差最小值直接进行输出呢?因为模型还有一个欠拟合和过拟合的问题,那么就有可能会有这种情况,那就是累积误差很小,但是模型过拟合或者欠拟合了,这显然是不行的,因此我们就需要记录下训练过程中的参数和输出,并且在外循环进行全局最优点的查找。

matlab code:

gap_x = -5: 0.1: 5;
gap_y = -5: 0.1: 5;
[out_x, out_y] = meshgrid(gap_x, gap_y);
out_z = out_y .* sin(out_x) - out_x .* cos(out_y);
surf(out_x, out_y, out_z);

参考内容

  • 曲面图

  • 周志华. “机器学习.” (2016).