zoukankan      html  css  js  c++  java
  • BP神经网络模型及梯度下降法

    BP(Back Propagation)网络是1985年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。

    BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。

    BP神经网络模型拓扑结构包括输入层(input)、隐层(hide layer)和输出层(output layer)。一个最简单的三层BP神经网络:




    BP神经网络的学习目的是希望能够学习到一个模型,能够对输入运算后输出一个我们期望的输出。

    后向传播的对象是训练过程中的分类误差,通过从输出层到前一隐含层,再到更前一层的隐含层,逐层向后传递计算出所有层的误差估计。

    在BP神经网络中,只有相邻的神经层的各个单元之间有联系,除了输出层外,每一层都有一个偏置结点:




    上图中隐藏层只画了一层,但其层数并没有限制,传统的神经网络学习经验认为一层就足够好,而最近的深度学习观点认为在一定范围内,层数越多,模型的描述和还原能力越强。

    偏置结点是为了描述训练数据中没有的特征,偏置结点对于下一层的每一个结点的权重的不同而生产不同的偏置,于是可以认为偏置是每一个结点(除输入层外)的属性。

    训练一个BP神经网络,实际上就是在外界输入样本的刺激下不断调整网络的权重和偏置这两个参数,以使网络的输出不断接近期望的输出,BP神经网络的训练过程分两部分:

    • 前向传输,逐层波浪式的传递输出值;
    • 逆向反馈,反向逐层调整权重和偏置;

    BP神经网络层与层之间的关系是通过激活函数来描述的,激活函数相当于生物学中细胞体中的细胞核,是对输入信号的处理单元。激活函数必须满足处处可导的条件,BP中常用的激活函数是Sigmoid。


    前向传输 (Feed-Forward前向反馈)


    BP网络训练开始之前,对网络的权重和偏置值进行初始化,权重取[-1,1]之间的一个随机数,偏置取[0,1]间的一个随机数。神经网络的训练包含多次的迭代过程,每一次迭代(训练)过程都使用训练集的所有样本。

    每一轮训练完成后判断训练样本的分类正确率和最大训练次数是否满足设定条件,如果满足则停止训练,不满足则从前向传输进入到逆向传输阶段。




    逆向反馈(Backpropagation)


    逆向反馈从最后一层即输出层开始,训练神经网络作分类的目的往往是希望最后一层的输出能够描述数据记录的类别,比如对于一个二分类的问题,我们常常用两个神经单元作为输出层,如果输出层的第一个神经单元的输出值比第二个神经单元大,我们认为这个数据记录属于第一类,否则属于第二类。

    逆向反馈是为了调整网络的参数,即权重值和偏置值,而调整的依据就是网络的输出层的输出值与类别之间的差异,通过调整参数来缩小这个差异,这就是神经网络的优化目标。对于输出层:

    其中Ej表示第j个结点的误差值,Oj表示第j个结点的输出值,Tj记录输出值,比如对于2分类问题,我们用01表示类标1,10表示类别2,如果一个记录属于类别1,那么其T1=0,T2=1。

    中间的隐藏层并不直接与数据记录的类别打交道,而是通过下一层的所有结点误差按权重累加,计算公式如下:

    其中Wjk表示当前层的结点j到下一层的结点k的权重值,Ek下一层的结点k的误差率。

    计算完误差率后,就可以利用误差率对权重和偏置进行更新,首先看权重的更新:

    其中λ表示表示学习速率,取值为0到1,学习速率设置得大,训练收敛更快,但容易陷入局部最优解,学习速率设置得比较小的话,收敛速度较慢,但能一步步逼近全局最优解。

    更新完权重后,还有最后一项参数需要更新,即偏置:

    这样就完成了一次神经网络的训练过程,通过不断的使用所有数据记录进行训练,从而得到一个分类模型。不断地迭代,直到满足最大迭代次数或者模型在训练样本集上的预测准确率达到预设要求。

    BP神经网络训练的具体流程:
    1. 网络初始化:给各连接权重赋一个区间为[-1,1]内的随机数,设定误差函数e,设定计算精度和最大学习次数;
    2. 随机选取:随机选取第n个训练样本以及对应的期望输出;
    3. 隐含层计算:计算隐含层各神经元的输入和输出;
    4. 求偏导数:利用网络期望输出和实际输出,计算误差函数对输出层的各神经元的偏导数;
    5. 修正权值:利用输出层各神经元的偏导数和隐含层各神经元的输出来修正链接权值;
    6. 修正权值:利用隐含层各神经元的偏导数和输入层各神经元的输入修正链接权值;
    7. 计算全局误差:在修正过模型的连接权重之后重新计算新的模型的全局误差;
    8. 判断模型合理性:判断当前模型是否满足要求,否则,选择下一个随机学习样本以及对应的期望输出,执行下一次学习;

    BP网络的设计


    在进行BP网络的设计是,一般应从网络的层数、每层中的神经元个数和激活函数、初始值以及学习速率等几个方面来进行考虑,下面是一些选取的原则。

    1.网络的层数

    理论已经证明,具有偏差和至少一个S型隐层加上一个线性输出层的网络,能够逼近任何有理函数,增加层数可以进一步降低误差,提高精度,但同时也是网络 复杂化。另外不能用仅具有非线性激活函数的单层网络来解决问题,因为能用单层网络解决的问题,用自适应线性网络也一定能解决,而且自适应线性网络的 运算速度更快,而对于只能用非线性函数解决的问题,单层精度又不够高,也只有增加层数才能达到期望的结果。

    2.隐层神经元的个数

    网络训练精度的提高,可以通过采用一个隐含层,而增加其神经元个数的方法来获得,这在结构实现上要比增加网络层数简单得多。一般而言,我们用精度和 训练网络的时间来恒量一个神经网络设计的好坏: 
    (1)神经元数太少时,网络不能很好的学习,训练迭代的次数也比较多,训练精度也不高。 
    (2)神经元数太多时,网络的功能越强大,精确度也更高,训练迭代的次数也大,可能会出现过拟合(over fitting)现象。 
    由此,我们得到神经网络隐层神经元个数的选取原则是:在能够解决问题的前提下,再加上一两个神经元,以加快误差下降速度即可。

    3.初始权值的选取

    一般初始权值是取值在(−1,1)之间的随机数。另外威得罗等人在分析了两层网络是如何对一个函数进行训练后,提出选择初始权值量级为s√r的策略, 其中r为输入个数,s为第一层神经元个数。

    4.学习速率

    学习速率一般选取为0.01−0.8,大的学习速率可能导致系统的不稳定,但小的学习速率导致收敛太慢,需要较长的训练时间。对于较复杂的网络, 在误差曲面的不同位置可能需要不同的学习速率,为了减少寻找学习速率的训练次数及时间,比较合适的方法是采用变化的自适应学习速率,使网络在不同的阶段设置不同大小的学习速率。

    5.期望误差的选取

    在设计网络的过程中,期望误差值也应当通过对比训练后确定一个合适的值,这个合适的值是相对于所需要的隐层节点数来确定的。一般情况下,可以同时对两个不同 的期望误差值的网络进行训练,最后通过综合因素来确定其中一个网络。


    梯度下降法

    BP中通过训练误差来逐步调整各层间的输入权重和偏置,这个调整的过程依据的算法一般有两种,一是梯度下降法(Gradient Descent),一是最小二乘法。

    训练误差(损失函数)是关于输入权重和偏置的二次函数,分别对权重和偏置求偏导数,也就是梯度向量,沿着梯度向量的方向,是训练误差增加最快的地方, 而沿着梯度向量相反的方向,梯度减少最快,在这个方向上更容易找到训练误差函数(损失函数)的最小值。

    梯度下降法的直观理解参见下图:


    在山峰附件的某处,要一步一步走向山底,一个好的办法是求解当前位置的梯度,然后沿着梯度的负方向向下走一步,然后继续求解当前位置的梯度,继续沿着梯度的负方向走下去,这样一步一步直到山底,这其中用到的方向就是梯度下降法。

    梯度下降法也有一个问题就是如果初始点的位置选择的不合适,就容易导致找到的一个局部最优解,而不是全局最优解。 

    梯度下降的算法调优

    1. 算法的步长选择。在前面的算法描述中,我提到取步长为1,但是实际上取值取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。步长太大,会导致迭代过快,甚至有可能错过最优解。步长太小,迭代速度太慢,很长时间算法都不能结束。所以算法的步长需要多次运行后才能得到一个较为优的值。

    2. 算法参数的初始值选择。 初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;当然如果损失函数是凸函数则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。

    3.归一化。由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化,也就是对于每个特征x,求出它的期望x¯¯¯x¯和标准差std(x),然后转化为:

          xx¯¯¯std(x)x−x¯std(x)

    这样特征的新期望为0,新方差为1,迭代次数可以大大加快。


    梯度下降法分类

    批量梯度下降法(Batch Gradient Descent)

    批量梯度下降法,是梯度下降法最常用的形式,具体做法也就是在更新参数时使用所有的样本来进行更新。

    随机梯度下降法(Stochastic Gradient Descent)

    随机梯度下降法,其实和批量梯度下降法原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本来求梯度。

    随机梯度下降法由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。对于准确度来说,随机梯度下降法用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。

    小批量梯度下降法(Mini-batch Gradient Descent)

    小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于m个样本,我们采用x个样子来迭代,1<x<m。一般可以取x=10,当然根据样本的数据,可以调整这个x的值。


    梯度下降法和其他无约束优化算法的比较


    在机器学习中的无约束优化算法,除了梯度下降以外,还有前面提到的最小二乘法,此外还有牛顿法和拟牛顿法。

    梯度下降法和最小二乘法相比,梯度下降法需要选择步长,而最小二乘法不需要。梯度下降法是迭代求解,最小二乘法是计算解析解。如果样本量不算很大,且存在解析解,最小二乘法比起梯度下降法要有优势,计算速度很快。但是如果样本量很大,用最小二乘法由于需要求一个超级大的逆矩阵,这时就很难或者很慢才能求解解析解了,使用迭代的梯度下降法比较有优势。

    梯度下降法和牛顿法/拟牛顿法相比,两者都是迭代求解,不过梯度下降法是梯度求解,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。相对而言,使用牛顿法/拟牛顿法收敛更快。但是每次迭代的时间比梯度下降法长。

  • 相关阅读:
    发送http请求时,如果token过期了会返回什么
    遍历某个文件夹下所有的文件
    写出冒泡排序的算法
    sql,学生表(student),id,name ,age ,求前10个年龄最大的
    给一个无序数组,输出这个数组的前n个最大的
    python随机数模块random
    java --String、StringBuffer、StringBuilder
    java内存空间
    第四次寒假作业
    寒假作业3
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9411848.html
Copyright © 2011-2022 走看看