BP神经网络

BP神经网络是指误差逆传播算法训练的多层前馈网络。

如下图为两层两层的BP神经网络(只有隐含层和输出层是参与计算和权值调整的节点层)。

  • 图1:两层的BP神经网络

2层神经网络结构示意图 两层bp神经网络_玻尔兹曼机

注:本文中用到的Python及其模块安装教程参见


结构和原理

在“单细胞”的神经网络里,实际上只有一层,即最后的输出层。在上图中有两层,第一层每个节点的输入都是一样的,都是2层神经网络结构示意图 两层bp神经网络_模式识别_02。每个节点的超平面都可以用2层神经网络结构示意图 两层bp神经网络_2层神经网络结构示意图_03来表示。但是,所有的节点最后输出的函数只有1或0两个状态,所以有激活函数为Logistic函数

2层神经网络结构示意图 两层bp神经网络_模式识别_04

2层神经网络结构示意图 两层bp神经网络_人工神经网络_05这个函数其实是2层神经网络结构示意图 两层bp神经网络_人工神经网络_062层神经网络结构示意图 两层bp神经网络_2层神经网络结构示意图_07这两个函数组合变量代换形成的。2层神经网络结构示意图 两层bp神经网络_2层神经网络结构示意图_07在之前的人工神经网络中已经介绍过。2层神经网络结构示意图 两层bp神经网络_人工神经网络_06的图形如下图所示。

  • 图2:2层神经网络结构示意图 两层bp神经网络_人工神经网络_10的图形

2层神经网络结构示意图 两层bp神经网络_人工神经网络_11

在t大于某个值时,函数值就是1,t小于某个值时,函数值就是0。

也可以写成以下的形式:

2层神经网络结构示意图 两层bp神经网络_模式识别_12

其中m是可以调整的参数,m越小曲线越平缓,m越大曲线越立陡,分类边界越明显。具体在每个应用中怎么取m的值要依情况而定,如果需要边界区分非常明显,那就把m的值设置地大一些。例如,m=10时,函数图形如下图。

  • 图3:2层神经网络结构示意图 两层bp神经网络_BP神经网络_13的图形

2层神经网络结构示意图 两层bp神经网络_模式识别_14

所以对于2层神经网络结构示意图 两层bp神经网络_人工神经网络_05函数来说,函数会根据v的输入对应产生1和0两种函数值,而这里面待定的就是w这个矩阵,这就是在网络训练中需要决定的。而每个节点都有函数2层神经网络结构示意图 两层bp神经网络_人工神经网络_05,而且每个节点之间都可能完全不一样。从上面的两层的BP神经网络的图可以看出,前面一层的输出结果作为后面一层节点的输入,最后一层的输出是n个不同的1或0,也就是说这个神经网络最多可以标识2层神经网络结构示意图 两层bp神经网络_玻尔兹曼机_17种不同的分类。


训练过程

这里希望找到一种方法可以让设置好的各个权值能够匹配尽可能多的训练样本的分类情况,和线性回归中希望残差尽量小的思路一致。使用最小二乘法,最小二乘法的思路是,如果把误差表示成样本做自变量的函数,然后用求极值的方法来推导就可以找出这个误差最小情况下的各个系数值了。

  • (一)误差计算。

隐含层节点的输入为:2层神经网络结构示意图 两层bp神经网络_人工神经网络_18
隐含层节点的输出为:2层神经网络结构示意图 两层bp神经网络_人工神经网络_19
输出层节点的输入为:2层神经网络结构示意图 两层bp神经网络_BP神经网络_20
输出层节点的输出为:2层神经网络结构示意图 两层bp神经网络_模式识别_21

注意,这里面的2层神经网络结构示意图 两层bp神经网络_玻尔兹曼机_22都是向量。

误差函数为:2层神经网络结构示意图 两层bp神经网络_模式识别_23

整个网络误差函数为:

2层神经网络结构示意图 两层bp神经网络_人工神经网络_24

这个函数前面的系数2层神经网络结构示意图 两层bp神经网络_人工神经网络_25只是为了之后求导方便,不影响函数的性质。

  • (二)反向传播。

对这个误差函数进行求导求偏微分。

输出层误差偏微分:2层神经网络结构示意图 两层bp神经网络_人工神经网络_26

其中

2层神经网络结构示意图 两层bp神经网络_玻尔兹曼机_27

2层神经网络结构示意图 两层bp神经网络_人工神经网络_28

2层神经网络结构示意图 两层bp神经网络_模式识别_29

那么

2层神经网络结构示意图 两层bp神经网络_玻尔兹曼机_30

误差的梯度

2层神经网络结构示意图 两层bp神经网络_模式识别_31

隐含层误差偏微分:2层神经网络结构示意图 两层bp神经网络_人工神经网络_32

其中

2层神经网络结构示意图 两层bp神经网络_BP神经网络_33

2层神经网络结构示意图 两层bp神经网络_BP神经网络_34

2层神经网络结构示意图 两层bp神经网络_人工神经网络_35

2层神经网络结构示意图 两层bp神经网络_2层神经网络结构示意图_36

2层神经网络结构示意图 两层bp神经网络_玻尔兹曼机_37

2层神经网络结构示意图 两层bp神经网络_模式识别_38

2层神经网络结构示意图 两层bp神经网络_人工神经网络_39

那么

2层神经网络结构示意图 两层bp神经网络_人工神经网络_40

误差的梯度

2层神经网络结构示意图 两层bp神经网络_玻尔兹曼机_41

(三)权值更新。

隐含层更新:

2层神经网络结构示意图 两层bp神经网络_2层神经网络结构示意图_42

输出层更新:

2层神经网络结构示意图 两层bp神经网络_BP神经网络_43


过程解释

首先设置两套w作为两层网络各自的“超平面”的系数,然后输入一次完整的训练过程,就会有一个误差值出现。

接着就是一次一次地进行w的调整。调整的方法是,首先用最小二乘法的方式,找到一个误差和自变量的关系,然后求误差极值。

在最后的2层神经网络结构示意图 两层bp神经网络_玻尔兹曼机_442层神经网络结构示意图 两层bp神经网络_模式识别_45这两个公式里,用的是试探性的方法。2层神经网络结构示意图 两层bp神经网络_模式识别_462层神经网络结构示意图 两层bp神经网络_玻尔兹曼机_47是一种试探的“步长”,第一次分别设置了2层神经网络结构示意图 两层bp神经网络_2层神经网络结构示意图_482层神经网络结构示意图 两层bp神经网络_模式识别_49,如果有误差,就试着往误差小的一边“走一步”,这就是一次一次迭代的目的。最后找到一个误差满足要求的点,把这一点的2层神经网络结构示意图 两层bp神经网络_2层神经网络结构示意图_482层神经网络结构示意图 两层bp神经网络_模式识别_49都记录保存下来,网络就训练完毕了。这种步长试探的思路也叫梯度下降法