正在阅读:

Python机器学习神经网络算法理论(BP)

2.jpg

概述

人工神经网络算法是以人的神经细胞为启发经过数学转换得到的算法。它不止有一个版本,其中最著名的算法是1980年提出的误差逆传播法(BackPropagation)。神经网络算法在深度学习中的使用非常的广泛,是即SVM算法之后的又一优秀的机器学习算法,所以这篇文章就大概讲一下多层前馈神经网络(Multilayer Feed-Forword Neural Network),BP算法就被使用在多层前馈神经网络上。

人工神经网络非常的强大,其算法也是妙不可言,本篇文章主要讲一下其基本思想和算法,一点一点的学习,帮助新手入门理解什么是人工神经网络。

M-P神经元模型

我们首先介绍一下M-P神经元模型,简单的说他就是我们按照生物的神经元建立的一个模型,我们先看一张生物学中的神经元图片。

1.png

学过生物学的同学应该都知道,人体的神经元具有一下等几个特性:

 1、每个神经元都是一个多输入单输出的信息处理单元;

 2、神经元输入包括兴奋输入和抑制性输入两种类型;

 3、神经元具有空间整合特性和阈值特性;

 ······

我们就按照神经元的一些特性来构造我出我们的M-P模型,让其能够像神经元一样进行信息的传递。看下面我们构建的M-P模型:

timg.jpg

他的形状是不是长得特别像一个神经元。解释一下上面字母的意思,其中χn代表第n的输入值,ωij代表每个神经元的连接权重,∑是数学中计算符号,f代表激活函数,此处应该有个阈值θ(也叫做偏量),οj代表输出。

从图中我们看到,每个神经元模型中都有n个输入,每个连接线上面都有权重,其计算方法为∑χiωij 当其求和之后得出结果之后会与其阈值进行比较,然后输入激活函数得到输出值οj,总的计算输出过程如下:

典型激活函数

常用的典型激活函数有两类,一类是阶跃函数,另一类是Sigmoid函数。看下面的两类函数图像:

blob.png

阶跃函数

阶跃函数,它将输入值映射为输出值“0”或者“1”,显然“1”对应于神经元兴奋,“0”代表抑制兴奋,然而阶跃函数有不连续、不光滑等不好的性质,所以经常使用Sigmoid函数。

blob.png

Sigmoid函数

Sigmoid函数它把可能在较大变化范围内的输入挤压到(0,1)之间输出,所以有时也叫他挤压函数。

感知机(Perceptron)

感知机由两层神经元构成(输入层和输出层),是最简单的神经网络结构,看下面感知机模型:

blob.png

两个输入神经元的感知机网络结构模型

上图中只是一个最简单的感知机模型。感知机的输入层接收外界输入信号后传递给输出层,输出层就是M-P神经元。通过计算得出y输出。有的同学可能会问,初始的ω1、ω2和θ1是多少?这个其实在第一次训练的时候是人为给出的,其值在(0,1)之间,通过学习,他可以自己调整这三个值。给定训练集(X,y),其权重ω和阈值θ可以自己调整,若已知当前感知机的输出为yi其学习过程非常简单,如下:

其阈值θ的调整规则和权重ω的规则相同。从式子中可以看出,若感知机对训练数样例预测正确,即yi=y,则感知机不发生变化,否则则根据错误程度进行调整。

需要注意的是,感知机只有输出层进行激活函数处理,即只有一层功能神经元,其学习能力是非常有限的,如果想学习更加复杂的东西我们就要在感知机的基础上进行延伸,我们在其输入层和输出层之间加上了隐藏层,也就是我们下面要说的多层神经网络结构。

多层前馈神经网络

做了那么多铺垫,终于轮到我们的主角出场了。多层前馈神经网络便是在感知机的基础上加上隐藏层,形成多才能的人工神经网络结构,其结构看下图:

Image.png

其最左边是输入层(input layer),中间是隐藏层(hidden layer),最右边是输出层(output layout),这个结构叫做两层的神经网络(输入层不算),因为隐藏层和输出层的结构是相似的,都是M-P神经元。其结构有一下几个特点:

1、其每层都是由单元(units)组成,也就是上面的圆圈,每个单元也可以被称作神经结点;

2、输入层是由训练记得实特征向量传入;

3、隐藏层的个数可以是任意的,但输入层和输出层都只有一次层。

4、经过连接点的权重(weight)传入下一层(和感知机类似),一层的输出是下一次层的输入。

5、一层中的数据加权求和然后根据非线性方程(激活函数)化输出。

我们训练神经网络作为分类的目的往往是希望最后一一层的输出能够描述数据记录的类别,比如对一个二分类问题,如果用两个输出神经元最为输出层,如果输出才能的第一个神经元输出值大于第二个神经元,我们认为这个数据记录属于第一类,否则属于第二类。这就是我们的预测方式。

多层神经网络是非常的强大的结构,如果有足够多的隐藏层和足够强大的训练集我们可以模拟出任何的方程,在多年之前,计算机的计算能力还不够强大的时候,神经网络发展到了瓶颈期,但如今计算机的性能大幅度提升,已经能够满足我们大量训练数据的要求。

到这可能有些同学会问,如何定义神经网络结构呢?

在使用神经网络训练数据执之前,我们必须确定出网络的层数和每次能神经元的个数其设计方法如下:

输入层:根据训练集的特征值个数而定,每一个输入神经元就是一个特征值。

隐藏层:没有明确的规则,根据实验测试和误差改进层数,通常深度学习(deep learning)都有多层的隐藏层。

输出层:根据我们问题类型而定。比如我么要分的类别又有两种,我们就可以定义一个输出单元,多于两个类别的时候就每一个类别定义一个输出单元。

误差逆传播算法(BackPropagation)

前面说过了,神经网络只是一个结构一,BackPropagation算法是用在这个结构上面的,它是迄今为止最成功的神经网络算法,现实任务中使用神经网络是,大多是使用BP算法进行训练,值得指出的是。BP算法不仅用于多层前馈神经网络,还用于其他类型的神经网络。

算法训练基本流程如下:

输入:训练集、学习率(learning rate)、一个多层前馈神经网络。

输出:有一个训练好神经网络。

1、通过输入训练集,得到预测值;

2、对比神经网络的预测值和真实值,得到误差;

3、反方向(从输出层=>隐藏层=>输入层=>)来以最小化误差来更新每个连接权重(weight);

BP网络的详细训练分解

1、前向传输(Feed-forward)

在训练之前,我们要随机的初始化个神经单元之间的权重和神经单元的阈值(偏向bias),随机初始化在-1到1之间,或者-0.5到0.5之间,之后开始向前传输。

神经网络的训练实由多趟迭代完成的,每一次迭代都使用所有的训练集,而每一次训练网络只使用一条记录,知道满足训练条件为止。

5.png

上图中是一个神经单元简单的计算模型,计算过程根M-P模型类似。因为一层的输出事下一层的输入,详细的计算过程我们就不推导了,我们的输出计算公式如下:

 

上面的公式还是比较简单容易理解的,到此为止我们得到了预测值Οj。下面就进行逆向反馈。

2、逆向反馈(Backpropagation)

逆向反馈都是从输出层开始的,,因为之前我们的权重和偏向都是随机选取的,所以肯定是不准确的,我们就要逆向的来调整网络的参数,即权重和偏向,而调整的依据就是网络的输出层和输出值之间的误差值,通过调整参数来缩小这个差异,最终达到我们期望的预测值。

输出层误差率计算公式:,其中Ej表示第j个结点的误差值,Oj表示第j个结点的输出值,Tj表示正确值。

隐藏层误差率计算公式:,其中Wjk表示当前层的结点j到下一层的结点k的权重值,Ek表示下一层的结点k的误差率。

误差率我们计算完成之后就可以根据这个误差率来修改权重和偏向。权重的更新公式如下:

其中λ是我们前面说的更新率,就是每次迈的步子的大小,这个值是我们设置的一个在(0,1)之间的值,这个值太大了不好,训练收敛的快,但容易陷入局部最优解,太小了也不好,收敛的速度比较慢,需要的时间比较长,但能一步步逼近全局最优解,需要我们去优化。其中Ej表示下一个结点的错误率,Oi代表当前结点的输出值。

权重更新完后我们接着来更新偏向,偏向的更新公式如下:

其中的λ同上面的更新率一样,Ej仍然是错误率,θj是当前的偏向值。

3、训练的终止条件

训练终止条件可以人为规定:

 1、权重的更新低于某个阈值;

 2、预测的错误率低于某个阈值;

 3、达到预设的迭代次数;

结束语

本文中并没有涉及到公式的推导过程,感兴趣的同学可以参考网上的公式推导文章。

本文介绍的神经网络知识仅仅是一些神经网络的基础知识,所有定义均为博主个人理解,若有不当之处欢迎指正。

ps:本文部分图片来源于互联网,若有侵权还请告知。

 

留下脚印,证明你来过。

*

*

流汗坏笑撇嘴大兵流泪发呆抠鼻吓到偷笑得意呲牙亲亲疑问调皮可爱白眼难过愤怒惊讶鼓掌