Python3 --- 多层向前神经网络NN

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ka_Ka314/article/details/82687299

一、概述

神经网络算法( Neural Network )是机器学习中非常非常重要的算法。这是整个深度学习的核心算法,深度学习就是根据神经网络算法进行的一个延伸。理解这个算法的是怎么工作也能为后续的学习打下一个很好的基础。

二、背景

神经网络是受神经元启发的,对于神经元的研究由来已久,1904年生物学家就已经知晓了神经元的组成结构。

  • 1943年,心理学家McCulloch和数学家Pitts参考了生物神经元的结构,发表了抽象的神经元模型MP。
  • 1949年心理学家Hebb提出了Hebb学习率,认为人脑神经细胞的突触(也就是连接)上的强度上可以变化的。于是计算科学家们开始考虑用调整权值的方法来让机器学习。这为后面的学习算法奠定了基础。
  • 1958年,计算科学家Rosenblatt提出了由两层神经元组成的神经网络。他给它起了一个名字--感知器( Perceptron)。
  • 1986年,Rumelhar和Hinton等人提出了反向传播( Backpropagation ,BP)算法,这是最著名的一个神经网络算法。

三、多层神经网络

多层向前神经网络由三部分组成:输入层(input layer), 隐藏层 (hidden layers), 输入层 (output layers)

 

  • 每层由单元(units)组成,输入层(input layer)是由训练集的实例特征向量传入,经过连接结点的权重(weight)传入下一层,一层的
  • 输出是下一层的输入。
  • 隐藏层的个数可以是任意的,输入层只有一层,输出层也只有一层。
  • 每个单元(unit)也可以被称作神经结点,根据生物学来源定义
  • 以上成为2层的神经网络(输入层不算)
  • 一层中加权的求和,然后根据非线性方程转化输出
  • 作为多层向前神经网络,理论上,如果有足够多的隐藏层(hidden layers) 和足够大的训练集, 可以模拟出任何方程

四、设计神经网络结构

4.1、使用神经网络训练数据之前,必须确定神经网络的层数,以及每层单元的个数。整个训练过程就是调整连接点之间的权重值。
4.2、特征向量在被传入输入层时,通常要先标准化为 0 到 1 之间的数,这是为了加速学习过程。
4.3、离散型变量可以被编码成每一个输入单元对应一个特征值可能赋的值,比如:特征值A可能取三个值(a0, a1, a2), 可以使用3个输入单元来代表A。

  • 如果A=a0, 那么代表a0的单元值就取1, 其他取0;
  • 如果A=a1, 那么代表a1de单元值就取1,其他取0,以此类推

4.4、神经网络即可以用来做分类(classification)问题,也可以解决回归(regression)问题。对于分类问题,如果是2类,可以用一

个输出单元表示(0和1分别代表2类),如果多余2类,每一个类别用一个输出单元表示,所以输入层的单元数量通常等于类别的

数量。

4.5、没有明确的规则来设计最好有多少个隐藏层,根据实验测试和误差,以及准确度来实验并改进

五、设计神经网络结构

如何来预测准确度呢?在SVM的应用篇中,有个方法就是将数据集分为两类,训练集和测试集,利用测试集的数据将模型的预测结果进行对比,得出准确度。这里介绍另一个常用但更科学的方法————交叉验证方法( Cross-Validation )。

这个方法不局限于将数据集分成两份,它可以分成 k 份。用第一份作为训练集,其余作为测试集,得出这一部分的准确度 ( evaluation )。再用第二份作为训练集,其余作为测试集,得出这第二部分的准确度。以此类推,最后取各部分的准确度的平均值。从而可以得到设计多少层最佳。

六、BP算法

BP 算法 ( BackPropagation )是多层神经网络的训练一个核心的算法。目的是更新每个连接点的权重,从而减小预测值( predicted value )与真实值 ( target value )之间的差距。输入一条训练数据就会更新一次权重,反方向(从输出层=>隐藏层=>输入层)来以最小化误差(error)来更新权重(weitht)。

在训练神经网络之前,需要初始化权重( weights )和偏向( bias ),初始化是随机值, -1 到 1 之间,每个单元有一个偏向。

6.1、算法详细介绍

数据集用 D 表示,学习率用 l 表示。对于每一个训练实例 X,都是一样的步骤。

利用上一层的输入,得到本层的输入:(\Theta_{j}为偏向)

I_{j} = \sum_{i}w_{i}_{j}x_{i} + \Theta_{j}

得到输入值后,神经元要怎么做呢?我们先将单个神经元进行展开如图:

得到值后需要进行一个非线性转化,这个转化在神经网络中称为激活函数( Activation function ),这个激活函数是一个 S 函数,图中以 f 表示,它的函数为:

O_{j} = \frac{1}{1 + \varrho^{-I_{j}}}

6.2、更新权重

通过上面的传递规则,可以得到最终的输出,而训练实例中包含实际的值,因此可以得到训练和实际之间的误差。根据误差(error)反向传送。

对于输出层的误差为:

Err_{j} = O_{j}(1 - O_{j})(T_{j} - O_{j})

其中 Oj 表示预测值, Tj 表示真实值。

对隐藏层的误差:

Err_{j} = O_{j}(1 - O_{j})\sum_{k}Err_{k}w_{jk}

更新权重:

\Delta w_{i}_{j} = (l)Err_{j}O_{i}

w_{i}_{j} = w_{i}_{j} + \Delta w_{i}_{j}

这里的l是学习率。偏向更新:

\Delta \Theta _{j} = (l)Err_{j}

\Theta _{j} = \Theta _{j} + \Delta \Theta _{j}

6.3、训练终止条件

怎样才算是一个训练好了的神经网络呢?满足下面一个情况即可:

  • 权重的更新低于某个阈值,这个阈值是可以人工指定的;
  • 预测的错误率低于某个阈值;
  • 达到预设一定的循环次数。

6.4、BP算法举例

假设有一个两层的神经网络,结构,权重和数据集如下:

计算误差和更新权重:

猜你喜欢

转载自blog.csdn.net/Ka_Ka314/article/details/82687299