BP神经网络原理详解
转自博客园@编程De: http://www.cnblogs.com/jzhlin/archive/2012/07/28/bp.html
从神经网络的生物模型说起
我们知道人大脑信息的传递、对外界刺激产生反应都由神经元控制的,人脑就是由上百亿个的这样神经元构成。这些神经元之间并不孤立而且联系很密切,每个神经元平均与几千个神经元相连接,因此构成了人脑的神经网络。刺激在神经网络中的传播是遵循一定的规则的,一个神经元并非每次接到其他神经传递过来的刺激都产生反应。它首先会将与其相邻的神经元传来的刺激进行积累,到一定的时候产生自己的刺激将其传递给一些与它相邻的神经元。这样工作的百亿个的神经元构成了人脑对外界进行的反应。而人脑对外界刺激的学习的机制就是通过调节这些神经元之间联系以及其强度。当然,实际上以上说的是对人脑真正神经工作的一种简化的生物模型,利用这种简化的生物模型可以将它推广至机器学习中来,并把它描述成人工神经网络。BP神经网络就是其中的一种,来看看具体对神经元的分析。
图1 神经网络中神经元示意图
神经元的积累的刺激是由其他神经元传递过来的刺激量和对应的权重之和,用 Xj 表示这种积累,Yi 表示某个神经元传递过来的刺激量,Wi 表示链接某个神经元刺激的权重,得到公式:
Xj = (y1 * W1)+(y2 * W2)+...+(yi * Wi)+...+ (yn * Wn)
而当 Xj 完成积累后,完成积累的神经元本身对周围的一些神经元传播刺激,将其表示为 yj 得到如下所示:
yj = f(Xj)
神经元根据积累后 Xj 的结果进行处理后,对外传递刺激 yj 。用 f 函数映射来表示这种处理,将它称之为 激活函数。
BP神经网络的构成
分析完单个的神经元后,再来看看它们组成网络后的情形,用图形来说明是最直观的方法,如图2所示:
图2 BP神经网络示意图
第一区域的来说,它们相当于外界的刺激,是刺激的来源并且将刺激传递给神经元,因此把第一区域命名为输入层。第二区域,表示神经元相互之间传递刺激相当于人脑里面,因此把第二区命名为隐藏层。第三区域,表示神经元经过多层次相互传递后对外界的反应,因此把第三区域命名为输出层。
简单的描述就是,输入层将刺激传递给隐藏层,隐藏层通过神经元之间联系的强度(权重)和传递规则(激活函数)将刺激传到输出层,输出层整理隐藏层处理的后的刺激产生最终结果。若有正确的结果,那么将正确的结果和产生的结果进行比较,得到误差,再逆推对神经网中的链接权重进行反馈修正,从而来完成学习的过程。这就是BP神经网的反馈机制,也正是BP(Back Propagation)名字的来源:运用向后反馈的学习机制,来修正神经网中的权重,最终达到输出正确结果的目的!
BP神经网络的数学推导
从数学上对BP神经网络模型进行分析,本文第一部分神经网的生物模型中可以得到关于BP神经网络的第一个公式(1):
对于神经元本身的输出的激活函数,一般来说选取 Sigmoid 函数,那么可以得到第二个公式(2):
通过以上两个公式,可以分析出来BP神经网络中输出结果的计算过程。每个神经元收到刺激 yi 然后加权积累(权重 Wji )完成后产生 xj ,再通过激活函数产生刺激 yj ,向下一层与它相连的神经元传递,依次类推最终输出结果。
我们再来分析如何利用向后反馈机制来修正神经元权重 Wji,这一部分数学推导需要运用到多元微分的数学内容。要修正 Wji 就需要得到误差量。具体来看,首先用 dj 来表示真实的正确结果,并且设误差为 E ,那么( yj - dj )对应的就是 E 对于 yj 的微分增量,即 yj 减去( yj - dj )后就能得到正确值,得到公式(3):
这个就是对yj求导
然后,明确目标,需要知道的是对于权重 Wji 的误差量是多少也就是 的值。而由公式(1)中知道 Wji 与 xj 相关, 那么可以推导出公式(4):
需要求得 Wji 的误差量,转换为需要求 的值了。它的推导如下:
其中 的值,可以通过公式(2)求导得出来:
所以最终得到的的误差量的值为:
以上公式需要注意下标:最后一个是 yi ,前面的都是 yj 。推到这里可以算是完成了运用神经网络的输出值 yj 和正确值 dj 对最后一层隐藏层 Wji 的修正,那么对其他隐藏层呢? 接着往下看。
上面的推导过程由公式(3)开始,如果我们知道 (注意是 yi ,公式(3)中是 yj ),就可以 同理 推导求出其对应其他隐藏层需要修正的权重值误差量了。推导如下:
这样所有的误差量的都可以 同理 推导完成!
这步推到只推出了三个连乘的第一个,后面两个值与那层的变量相关,随意结果只是下标改改。
最后一步修正 Wji ,就是加上下面变量了,设置一个 l (0 到 1 之间)学习率。
为啥要乘上呢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
BP神经网络原理详解的更多相关文章
- 深度学习之卷积神经网络(CNN)详解与代码实现(一)
卷积神经网络(CNN)详解与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10430073.html 目 ...
- Batchnorm原理详解
Batchnorm原理详解 前言:Batchnorm是深度网络中经常用到的加速神经网络训练,加速收敛速度及稳定性的算法,可以说是目前深度网络必不可少的一部分. 本文旨在用通俗易懂的语言,对深度学习的常 ...
- 【转载】 深度学习之卷积神经网络(CNN)详解与代码实现(一)
原文地址: https://www.cnblogs.com/further-further-further/p/10430073.html ------------------------------ ...
- CRF(条件随机场)与Viterbi(维特比)算法原理详解
摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...
- I2C 基础原理详解
今天来学习下I2C通信~ I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之间的(Inter) 通信方式.如上图所以有很多的周边设备都 ...
- Zigbee组网原理详解
Zigbee组网原理详解 来源:互联网 作者:佚名2015年08月13日 15:57 [导读] 组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点加入网络.其中节点加入网络又包括两个 ...
- 块级格式化上下文(block formatting context)、浮动和绝对定位的工作原理详解
CSS的可视化格式模型中具有一个非常重要地位的概念——定位方案.定位方案用以控制元素的布局,在CSS2.1中,有三种定位方案——普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inli ...
- SSL/TLS 原理详解
本文大部分整理自网络,相关文章请见文后参考. SSL/TLS作为一种互联网安全加密技术,原理较为复杂,枯燥而无味,我也是试图理解之后重新整理,尽量做到层次清晰.正文开始. 1. SSL/TLS概览 1 ...
- 锁之“轻量级锁”原理详解(Lightweight Locking)
大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意. 原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖 ...
随机推荐
- C语言位操作--不用中间变量交换两数值
1.使用加法与减法交换两数值: #define SWAP(a, b) ((&(a) == &(b)) || \ (((a) -= (b)), ((b) += (a)), ((a) = ...
- 我的node+express小例子
启动index.js: var express = require("express"); var path = require("path"); var op ...
- 单引号、双引号、int和char
首先说一下C语言中用单引号和双引号的不同(一直搞不清楚): 单引号代表的是一个整数,而这个整数的值是编译器所采用的字符集中的字符序列对应的值.所以一般'A'和ASCII中的65意义相同.对于双引号定义 ...
- jqGrid 中的editrules来自定义colModel验证规则
editrules editrules是用来设置一些可用于可编辑列的colModel的额外属性的.大多数的时候是用来在提交到服务器之前验证用户的输入合法性的.比如editrules:{edith ...
- vue报错 Module not found: Error: Cannot resolve 'file' or 'directory'
炸了,我好写sell而组件,直接就用了,我的天哪 看你的写了吗,就用: Module not found: Error: Cannot resolve 'file' or 'directory' 页另 ...
- 【紫书】Trees on the level UVA - 122 动态建树及bfs
题意:给你一些字符串,代表某个值被插入树中的位置.让你输出层序遍历. 题解:动态建树. 由于输入复杂,将输入封装成read_input.注意输入函数返回的情况 再将申请新节点封装成newnode(). ...
- 数据恢复:AMDU数据抽取恢复
今天我们通过一则真实的案例来认识oracle 自带工具AMDU,无需将磁盘组mount即可实现数据分析,轻松进行数据恢复.某日,我们收到了一则香港用户ASM破坏案例,请求数据恢复.灾难描述:这则案例是 ...
- Cocos2d比较好的博客
1 .http://blog.csdn.net/bill_man/article/details/7202458 学习笔记 2.http://cocos2d-x.org/ 官网 3.http://ww ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- promise VS future
Future and Promise are the two separate sides of an asynchronous operation. promise is used by the & ...