BP神经网络基本原理

BP神经网络是一种单向传播的多层前向网络,具有三层或多层以上的神经网络结构,其中包含输入层、隐含层和输出层的三层网络应用最为普遍。

网络中的上下层之间实现全连接,而每层神经元之间无连接。当一对学习样本提供给网络后,神经元的激活值从输入层经各中间层向输出层传播,在输出层的各神经元获得网络的输入相应。然后,随着减小目标输出与实际误差的方向,从输出层经过各中间层修正各连接权值,最后回到输入层。

BP算法是在建立在梯度下降基础上的,BP算法的知道思想是对网络权值与阈值的修正,使误差函数沿负梯度下方向。

BP算法推算过程

当加入第$k$个输入时,隐蔽层$h$结点的输入加权和为:

\[s_h^k = \sum\limits_i {w_{ih} x_i^k }\]

相应点的输出:

\[y_h^k = F(s_h^k ) = F(\sum\limits_i {w_{ih} x_i^k } )\]

同样,输出层$j$结点的输入加权和为:

\[s_j^k = \sum\limits_h {w_{hj} y_h^k } = \sum\limits_h {w_{hj} F(\sum\limits_i {w_{ih} x_i^k } )}\]

相应点的输出:

\[y_j^k = F(s_j^k ) = F(\sum\limits_h {w_{hj} y_h^k } ) = F[\sum\limits_h {w_{hj} F(\sum\limits_i {w_{ih} x_i^k } )} ]\]

这里,各结点的阈值等效为一个连接的加权$\theta=w_{oh}\text{or} w_{oj}$,这些连接由各结点连到具有固定值-1的偏置结点,其连接加权也是可调的,同其它加权一样参与调节过程。

误差函数为:

\[E(W) = \frac{1}{2}\sum\limits_{k,j} {(T_j^k - y_j^k )^2 } = \frac{1}{2}\sum\limits_{k,j} {\{ T_j^k - F[\sum\limits_h {w_{hj} F(\sum\limits_i {w_{ih} x_i^k } )} ]\} ^2 }\]

为了使误差函数最小,用梯度下降法求得最优的加权,权值先从输出层开始修正,然后依次修正前层权值,因此含有反传的含义。

根据梯度下降法,由隐蔽层到输出层的连接的加权调节量为:

\[\Delta w_{hj} = - \eta \frac{{\partial E}}{{\partial w_{hj} }} = \eta \sum\limits_k {(T_j^k - y_j^k )F'(s_j^k )y_h^k = } \eta \sum\limits_k {\delta _j^k y_h^k }\]

其中$\delta_j^k$为输出结点的误差信号:

\[\delta _j^k = F'(s_j^k )(T_j^k - y_j^k ) = F'(s_j^k )\Delta _j^k \quad\quad (1)\]

\[\Delta _j^k = T_j^k - y_j^k\]

对于输入层到隐蔽层结点连接的加权修正量$\Delta w_{ij}$,必须考虑将$E(W)$对$w_{ih}$求导,因此利用分层链路法,有:

\[\begin{array}{l}\Delta w_{ih} = - \eta \frac{{\partial E}}{{\partial w_{ih} }} = - \eta \sum\limits_k {\frac{{\partial E}}{{\partial y_h^k }}} \cdot \frac{{\partial y_h^k }}{{\partial w_{ih} }} = \eta \sum\limits_{k,j} {\{ (T_j^k - y_j^k )F'(s_j^k )w_{hj} \cdot F'(s_h^k )x_i^k } \} \\ \quad \quad = \eta \sum\limits_{k,j} {\delta _j^k w_{hj} F'(s_h^k )x_i^k } = \eta \sum\limits_k {\delta _h^k x_i^k } \\ \end{array}\]

其中:

\[\delta _h^k = F'(s_h^k )\sum\limits_j {w_{hj} \delta _j^k } = F'(s_h^k )\Delta _h^k \quad\quad (2)\]

\[\Delta _h^k = \sum\limits_j {w_{hj} \delta _j^k }\]

可以看出,式(1)和(2)具有相同的形式,所不同的是其误差值的定义,所以可定义BP算法对任意层的加权修正量的一般形式:

\[\Delta w_{pq} = \eta \sum\limits_{vector\_no\_P} {\delta _o y_{in} }\]

若每加入一个训练对所有加权调节一次,则可写成:

\[\Delta w_{pq} = \eta \delta _o y_{in}\]

其中,下标o和in指相关连接的输出端点和输入端点,$y_{in}$代表输入端点的实际输入,$\delta_o$表示输出端点的误差,具体的含义由具体层决定,对于输出层由式(1)给出,对隐蔽层则由式(2)给出。

输出层$\Delta _j^k = T_j^k - y_j^k $可直接计算,于是误差值$\delta_j^k$很容易得到。对前一隐蔽层没有直接给出目标值,不能直接计算$\Delta _h^k $,而需利用输出层的$ \delta _j^k $来计算:

\[\Delta _h^k = \sum\limits_j {w_{hj} \delta _j^k }\]

因此,算出$\Delta _h^k $后,$ \delta _h^k $也就求出了。

如果前面还有隐蔽层,用$ \delta _h^k $再按上述方法计算$\Delta _1^k $和$\delta _1^k $,以此类推,一直将输出误差$\delta$一层一层推算到第一隐蔽层为止。各层的$\delta$求得后,各层的加权调节量即可按上述公式求得。由于误差$ \delta _j^k $相当于由输出向输入反向传播,所以这种训练算法成为误差反传算法(BP算法)。

BP训练算法实现步骤

准备:训练数据组。设网络有$m$层,$y_j^m$表示第$m$中第$j$个节点的输出,$y_^0$(零层输出)等于$x_j$,即第$j$个输入。$w_{ij}^m$表示从$y_i^{m-1}$到$y_j^m$的连接加权。这里,$m$代表层号,而不是向量的类号。

1.将各加权随机置为小的随机数。可用均匀分布的随机数,以保证网络不被大的加权值所饱和。

2. 从训练数据组中选一数据对$x^k,T^k$, 将输入向量加到输入层$(m=0)$,使得对所有端点$i$:         $y_i^0=x_i^k$, $k$表示向量类号

3. 信号通过网络向前传播,即利用关系式:

\[y_j^m=F(s_j^m)=F(\sum_iw_{ij}^my_i^{m-1})\]

计算从第一层开始的各层内每个节点$i$的输出$y_j^m$,直到输出层的每个节点的输出计算完为止。

4. 计算输出层每个结点的误差值(利用公式(1))

\[\delta_j^m=F'(s_j^m)(T_j^k-y_i^m)=y_j^m(1-y_j^m)(T_j^k-y_j^m),(\text{对Sigmod函数})\]

它是由实际输出和要求目标值之差获得。

5. 计算前面各层结点的误差值(利用公式(2))

\[\delta_j^{m-1}=F'(s_j^{m-1}\sum_iw_{ji}\delta_i^m)\]

这里逐层计算反传误差,直到将每层类每个结点的误差值算出为止。

6. 利用加权修正公式

\[
\Delta w_{ij}^m = \eta \delta _j^m y_i^{m - 1} 
\]

和关系

\[
w_{ij}^{new} = w_{ij}^{old} + \Delta w_{ij} 
\]

修正所有连接权。一般$\eta=0.01--1$,称为训练速率系数。

7. 返回第2步,为下一个输入向量重复上述步骤,直至网络收敛。

 BP神经网络的更多相关文章

  1. BP神经网络原理及python实现

    [废话外传]:终于要讲神经网络了,这个让我踏进机器学习大门,让我读研,改变我人生命运的四个字!话说那么一天,我在乱点百度,看到了这样的内容: 看到这么高大上,这么牛逼的定义,怎么能不让我这个技术宅男心 ...

  2. BP神经网络

    秋招刚结束,这俩月没事就学习下斯坦福大学公开课,想学习一下深度学习(这年头不会DL,都不敢说自己懂机器学习),目前学到了神经网络部分,学习起来有点吃力,把之前学的BP(back-progagation ...

  3. 数据挖掘系列(9)——BP神经网络算法与实践

    神经网络曾经很火,有过一段低迷期,现在因为深度学习的原因继续火起来了.神经网络有很多种:前向传输网络.反向传输网络.递归神经网络.卷积神经网络等.本文介绍基本的反向传输神经网络(Backpropaga ...

  4. BP神经网络推导过程详解

    BP算法是一种最有效的多层神经网络学习方法,其主要特点是信号前向传递,而误差后向传播,通过不断调节网络权重值,使得网络的最终输出与期望输出尽可能接近,以达到训练的目的. 一.多层神经网络结构及其描述 ...

  5. 极简反传(BP)神经网络

    一.两层神经网络(感知机) import numpy as np '''极简两层反传(BP)神经网络''' # 样本 X = np.array([[0,0,1],[0,1,1],[1,0,1],[1, ...

  6. BP神经网络学习笔记_附源代码

    BP神经网络基本原理: 误差逆传播(back propagation, BP)算法是一种计算单个权值变化引起网络性能变化的较为简单的方法.由于BP算法过程包含从输出节点开始,反向地向第一隐含层(即最接 ...

  7. 机器学习(一):梯度下降、神经网络、BP神经网络

    这几天围绕论文A Neural Probability Language Model 看了一些周边资料,如神经网络.梯度下降算法,然后顺便又延伸温习了一下线性代数.概率论以及求导.总的来说,学到不少知 ...

  8. 基于Storm 分布式BP神经网络,将神经网络做成实时分布式架构

    将神经网络做成实时分布式架构: Storm 分布式BP神经网络:    http://bbs.csdn.net/topics/390717623 流式大数据处理的三种框架:Storm,Spark和Sa ...

  9. BP神经网络算法学习

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

随机推荐

  1. Qt根据汉字生成位图,可连续调用,生成的位图不会有杂点

    void MainWindow::drawText(int font_size, QString str, int n){ QPainter p; QSize size(460, font_size) ...

  2. lotusscript基本语法

    LotusScript是一种使用于Lotus Notes客户端程序或者是用于Domino服务器程序代理列表中的脚本语言.相当于用于网页中的脚本语言JavaScript.(JavaScript以可以用于 ...

  3. 使用Select命令创建菜单

    创建文本菜单的一半功夫都花在了创建菜单布局和获取输入的字符上.bash shell提供了一个很容易上手的小工具来自动完成这些工作select命令允许从单个命令行创建菜单,然后在提取输入的答案并自动处理 ...

  4. HTTP refere

    什么是 http refere ? 简言之,放在web浏览器的header上的 当我通过我的主页访问我朋友的网站时,就可以获得refere , 可以获取网页访问流量,也可以防盗链 一般 referer ...

  5. poj1556The Doors

    链接 枚举两点 若不和任何线段相交 建边为dis(i,j) floyd求最短路 #include <iostream> #include<cstdio> #include< ...

  6. 国内外常用的DNS服务器

    国内外常用的DNS服务器 DNS,全称Domain Name System,即域名解析系统,帮助用户在互联网上寻找路径,它在互联网的作用是把域名转换成为网络可以识别的IP地址. 国外DNS服务器地址: ...

  7. JS作用域和预编译(转载 学习中。。。)

    JS在页面加载过程中顺序执行.但是分块预编译.执行. JS在执行前会进行类似”预编译”的操作,而且先预声明变量再预定义函数. 此时注意,是声明,不是定义,如:var a = 1; 在预编译中,只是执行 ...

  8. Javascript模块化编程(一):模块的写法 (转载 学习中。。。。)

    转载地址:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 阮一峰 大神:http://www.ruanyifeng.com/ ...

  9. oracle中修改表名

    <<<备忘>>>   answer1: ALTER TABLE old_table_name RENAME TO new_table_name;(大写为系统命令) ...

  10. 批处理+VBS+注册表实现开机自动启动EXE程序

    批处理+VBS+注册表实现WINDOWS开机自动启动EXE程序 以下都是基于WINDOWS系统. 我们都知道当我们有想某个程序在开机时自动运行,只能有三个方式: 1.做成服务,然后对服务进行配置为自动 ...