zoukankan      html  css  js  c++  java
  • [转]BP神经网络梯度下降算法

    BP神经网络梯度下降算法

    目录(?)[+]

    菜鸟初学人智相关问题,智商低,艰苦学习中,转文只为保存,其中加上了一些个人注释,便于更简单的理解~新手也可以看,共勉。

     
    转自博客园@编程De: http://www.cnblogs.com/jzhlin/archive/2012/07/28/bp.html
     

    从神经网络的生物模型说起

             我们知道人大脑信息的传递、对外界刺激产生反应都由神经元控制的,人脑就是由上百亿个的这样神经元构成。这些神经元之间并不孤立而且联系很密切,每个神经元平均与几千个神经元相连接,因此构成了人脑的神经网络。刺激在神经网络中的传播是遵循一定的规则的,一个神经元并非每次接到其他神经传递过来的刺激都产生反应。它首先会将与其相邻的神经元传来的刺激进行积累,到一定的时候产生自己的刺激将其传递给一些与它相邻的神经元。这样工作的百亿个的神经元构成了人脑对外界进行的反应。而人脑对外界刺激的学习的机制就是通过调节这些神经元之间联系以及其强度。当然,实际上以上说的是对人脑真正神经工作的一种简化的生物模型,利用这种简化的生物模型可以将它推广至机器学习中来,并把它描述成人工神经网络。BP神经网络就是其中的一种,来看看具体对神经元的分析。

    BP神经网络神经元

    图1  神经网络中神经元示意图

             神经元的积累的刺激是由其他神经元传递过来的刺激量和对应的权重之和,用 X表示这种积累,Y表示某个神经元传递过来的刺激量,W表示链接某个神经元刺激的权重,得到公式:

             Xj = (y1 * W1)+(y2 * W2)+...+(yi * Wi)+...+ (yn * Wn)

             而当 X完成积累后,完成积累的神经元本身对周围的一些神经元传播刺激,将其表示为  yj  得到如下所示:

             yj = f(Xj

             神经元根据积累后 X的结果进行处理后,对外传递刺激 yj 。用 f 函数映射来表示这种处理,将它称之为 激活函数。

    BP神经网络的构成

             分析完单个的神经元后,再来看看它们组成网络后的情形,用图形来说明是最直观的方法,如图2所示:

    BP神经网络

    图2  BP神经网络示意图

             第一区域的来说,它们相当于外界的刺激,是刺激的来源并且将刺激传递给神经元,因此把第一区域命名为输入层。第二区域,表示神经元相互之间传递刺激相当于人脑里面,因此把第二区命名为隐藏层。第三区域,表示神经元经过多层次相互传递后对外界的反应,因此把第三区域命名为输出层。

        简单的描述就是,输入层将刺激传递给隐藏层,隐藏层通过神经元之间联系的强度(权重)和传递规则(激活函数)将刺激传到输出层,输出层整理隐藏层处理的后的刺激产生最终结果。若有正确的结果,那么将正确的结果和产生的结果进行比较,得到误差,再逆推对神经网中的链接权重进行反馈修正,从而来完成学习的过程。这就是BP神经网的反馈机制,也正是BP(Back  Propagation)名字的来源:运用向后反馈的学习机制,来修正神经网中的权重,最终达到输出正确结果的目的!

    BP神经网络的数学推导

             从数学上对BP神经网络模型进行分析,本文第一部分神经网的生物模型中可以得到关于BP神经网络的第一个公式(1):

     

    BP神经网络公式

             对于神经元本身的输出的激活函数,一般来说选取 Sigmoid 函数,那么可以得到第二个公式(2):

    BP神经网络公式

    弱逼补充:为啥选择这个激活函数呢?因为这个函数连续可导,平滑性质好,

    具体看图:

    BP神经网络原理详解

    至于为啥不选择其他同样平滑的函数,who knows...目测是实践中检验出来的。好下面接着看原作者的:

             通过以上两个公式,可以分析出来BP神经网络中输出结果的计算过程。每个神经元收到刺激 yi  然后加权积累(权重 Wji  )完成后产生 x,再通过激活函数产生刺激 y,向下一层与它相连的神经元传递,依次类推最终输出结果。

             我们再来分析如何利用向后反馈机制来修正神经元权重 Wji,这一部分数学推导需要运用到多元微分的数学内容。要修正 Wji  就需要得到误差量。具体来看,首先用 dj  来表示真实的正确结果,并且设误差为 E ,那么( y- d)对应的就是 E 对于 yj 的微分增量,即 y 减去( y- d)后就能得到正确值,得到公式(3):

     

    BP神经网络公式

    接着补充:这里提到了个微分增量,我把数学忘完了。。。

    建议百度百科,这里微分就相当于是E这个错误是和yi的值成函数关系,yi-di就是函数关系,yi是自变量,E是函数的结果,所以这么的一个表示就是微分。。。后面的公示也是同理嘞。

    同时,下面的证明过程中,一定要注意下标呀。j表示的是当前层。i表示的是前一层,记住这个后面就容易理解。

             然后,明确目标,需要知道的是对于权重 Wji 的误差量是多少也就是  BP神经网络推导量   的值。而由公式(1)中知道 Wji 与 x相关, 那么可以推导出公式(4):

    BP神经网络公式

     

             需要求得 Wji 的误差量,转换为需要求  BP神经网络推导量  的值了。它的推导如下:

    BP神经网络公式

     

             其中  BP神经网络推导量  的值,可以通过公式(2)求导得出来:

    BP神经网络公式

     

             所以最终得到的的误差量的值为:

    BP神经网络公式

     

             以上公式需要注意下标:最后一个是 y,前面的都是 y。推到这里可以算是完成了运用神经网络的输出值 yj 和正确值 d 对最后一层隐藏层 Wji 的修正,那么对其他隐藏层呢? 接着往下看。

             上面的推导过程由公式(3)开始,如果我们知道  BP神经网络推导量 (注意是 y,公式(3)中是 y),就可以 同理 推导求出其对应其他隐藏层需要修正的权重值误差量了。推导如下:

     

    BP神经网络公式

             这样所有的误差量的都可以 同理 推导完成!

    这步推到只推出了三个连乘的第一个,后面两个值与那层的变量相关,随意结果只是下标改改。

             最后一步修正 Wji ,就是加上下面变量了,设置一个 l (0 到 1 之间)学习率。

    BP神经网络公式

    为啥要乘上呢l呢,理解是一点点的去减少调整这个误差,设置值太小,慢,设置值太大,步长就大,这l也应该是一个值得考虑的问题。

             至此,BP神经网络反馈部分的数学推导算完成了,可以在自己的草稿纸上画画~

    写在后面:梯度下降有个问题是容易陷入局部最小值的问题。如果这个问题不了解的话,那可以回想回想一个3d平面,有若干坑,如果随机点沿着下降最快的地方去跑,很可能跑到了一个小坑里面,却没有跑到真正的全局最小值的坑里。

    从博文的评论中看到该问作者实现了这个神经网络,但是没有使用这个梯度下降的模型。呵呵,这个就算是理解什么是神经网络,什么是从后面往前推导的过程。下面待学习的就是评论中提到的动量因子模型。

    作者实现实现了动量因子模型,代码:

    http://www.cnblogs.com/jzhlin/archive/2012/07/30/bp_c.html

    http://www.cnblogs.com/jzhlin/archive/2012/08/01/bp_c2.html

    以及还要看的:

    概率神经网络 (PNN)  http://www.cnblogs.com/jzhlin/archive/2012/07/28/bp.html

  • 相关阅读:
    JS === 飞机吐子弹
    React === 几个小问题
    CSS === P标签加了定位,里面文字的问题
    css边框的一些属性
    Spring整合quart初识
    Jenkins部署报weblogic.deploy.api.tools.deployer.DeployerException: Java heap space
    js跳转新窗口
    Idea中运行项目时出现:未结束的字符串解决方案
    Idea中类上有叉的解决方法
    清除eclipse,STS workspace历史记录
  • 原文地址:https://www.cnblogs.com/Crysaty/p/6122136.html
Copyright © 2011-2022 走看看