博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BP神经网络模型与学习算法
阅读量:4966 次
发布时间:2019-06-12

本文共 2945 字,大约阅读时间需要 9 分钟。

在感知器神经网络模型与线性神经网络模型学习算法中,理想输出与实际输出之差被用来估计神经元连接权值误差。当解决线性不可分问题而引入多级网络后,如何估计网络隐含层神经元的误差就成了一大难题。因为在实际中,无法知道隐含层的任何神经元的理想输出值。1985年Rumelhart、McClelland提出了BP网络的误差反向后传(BP)学习算法,实现了Minsky设想的多层神经网络模型。

BP算法在于利用输出后的误差来估计输出层的直接前导层的误差,再用这个误差估计更前一层的误差,如此一层一层的反传下去,就获得了所有其他各层的误差估计。使用BP算法进行学习的多级肺循环网络称为BP网络,属于前向神经网络类型。虽然这种误差估计本身的精度会随着误差本身“向后传播”而不断降低,但它还是给多层网络的训练提供了比较有效的办法,加之多层前向神经网络能逼近任意非线性函数。

BP神经网络模型

构成BP网络的神经元仍然是神经元。按照BP算法的要求,这些神经元所用的激活函数必须处处可导。一般都使用S型函数。对一个神经元来说,它的网络输入可以表示为:\[net = \overrightarrow x \cdot \overrightarrow \omega\]

其中\(\overrightarrow x\) 表示该神经元所接受的输入,\(\overrightarrow \omega\) 表示神经元对应的连接权值。

该神经元的输出为:\[y = f(net) = \frac{1}{1 + e^{-net}}\]

进一步地,我们可以求y关于net的导数:

\[\begin{align}f'(net) & = \frac{e^{-net}}{(1 + e^{-net})^2} \\& = \frac{1 + e^{-net} - 1}{(1 + e^{-net})^2} \\& = \frac{1}{1 + e^{-net}} - \frac{1}{(1 + e^{-net})^2} \\& = y(1 - y) \end{align}\]

显然地 我们可以注意到\[\lim_{net \to + \infty}\frac{1}{1 + e^{-net}} = 1 \\ \lim_{net \to - \infty}\frac{1}{(1 + e^{-net})^2} = 0\]

根据S型激活函数可知,y的值域为(0, 1), 从而,f'(net)的值域为(0, 0.25),而且是在y=0.5时,f'(x)有最大值。

BP网络的标准学习算法

标准BP算法是基于梯度下降法的学习算法,学习过程是通过调整权值和阈值,使删除期望值和神经网络实际输出值的均方误差区域最小而实现的,但是它只用到均方误差函数对权值和阈值的一阶导数(梯度)的信息,使得算法存在收敛速度缓慢、容易陷入局部极小等缺陷。

定义:

  • 输入向量\(\overrightarrow x\)
  • 隐含层输入向量 \(\overrightarrow{hi}\)
  • 隐含层输出向量 \(\overrightarrow{ho}\)
  • 输出层输入向量 \(\overrightarrow{yi}\)
  • 输出层输出向量 \(\overrightarrow{yo}\)
  • 期望输出向量 \(\overrightarrow d\)
  • 输入层与隐含层的连接权值 \(\omega_{ih}\)
  • 隐含层与输出层的连接权值 \(\omega_{ho}\)
  • 隐含层各神经元的阈值 \(b_h\)
  • 输出层各神经元的阈值 \(b_o\)
  • 样本数据个数 \(k\)
  • 激活函数 \(f(\cdot)\)

BP标准算法具体实现步骤如下:

  1. 网络初始化,给\(w_{ih}\) \(w_{ho}\) \(b_h\) \(b_o\) 分别赋一个区间(-1, 1)内的随机数,并设定误差函数为
    \[e = \frac{1}{2} \sum^q_{o =1}(d_o(k) - y_o(k))^2\]给定计算精度值\(\varepsilon\) 和最大学习次数M
  2. 随机选取第k个输入样本\(\overrightarrow{ x(k)}\) 以及对应的期望输出 \(\overrightarrow{d(k)}\)
  3. 计算隐含层各神经元的输入\(hi_h(k)\) ,然后用输入以及激活函数计算隐含层各神经元的输出\(ho_h(k)\)
    \[\begin{align}& hi_h(k) = \sum^n_i w_{ih}x_i(k) - b_h \\& ho_h(k) = f(hi_h(k)) \\& yi_o(k) = \sum^p_hw_{ho}ho_h(k) - b_o\\& yo_o(k) = f(yi_o(k)) \end{align}\]
  4. 利用网络期望输出向量 \(\overrightarrow{d(k)}\) 网络的实际输出 \(yo_o(k)\) ,计算误差函数对输出层各神经元的偏导数 \(\delta_o(k)\)
    \[\delta_o(k) = \left( d_o(k) - yo_o(k) \right)yo_o(k)(1-yo_o(k))\]
  5. 利用隐含层到输出曾的连接权值\(w_{ho}(k)\) 、输出层的 \(\delta_o(k)\) 和隐含层的输出 \(ho_h(k)\) 计算误差函数对隐含层各神经元的偏导数 \(\delta_h(k)\)
    \[\delta_h(k) = \left[ \sum^q_{o=1} \delta_o(k) w_{ho}\right]ho_h(k)(1-ho_h(k))\]
  6. 利用输出层各神经元的 \(\delta_o(k)\) 和隐含层各神经元的输出 \(ho_h(k)\) 来修正连接权值 \(w_{ho}(k)\) 和阈值 \(b_o(k)\) :
    \[w^{N+1}_{ho}(k) = w^N_{ho}(k) + \eta \delta_o(k)ho_h(k) \\ b^{N+1}_o(k) = b_o^N(k) + \eta \delta_o(k)\]
    N为调整前,N+1为调整后,\(\eta\) 为学习率, 在(0, 1) 之间取值。
  7. 使用隐含层各神经元的\(\delta_h(k)\) 和输入层各神经元的输入\(x_i(k)\) 修正连接权和阈值\[w^{N+1}_{ih} = w^N_{ih} + \eta \delta_h(k)x_i(k) \\ b_h^{N+1}(k) = b^{N+1}_{h}(k) + \eta \delta_h(k)\]
  8. 计算全局误差E \[E = \frac{1}{2m} \sum^m_{k=1} \sum^q_{o=1}(d_o(k) - y_o(k))^2\]
  9. 判断网络误差是否满足要求,当 \(E < \varepsilon\) 或学习次数大于设定的最大次数M,则算法结束。否则,随机选取下一个学习样本及对应年的期望输出,返回到第三步,进入下一轮的学习过程。

转载于:https://www.cnblogs.com/gscienty/p/6566568.html

你可能感兴趣的文章
Boosting(提升方法)之AdaBoost
查看>>
Binding object to winForm controller through VS2010 Designer(通过VS2010设计器将对象绑定到winForm控件上)...
查看>>
Spring Boot实战笔记(二)-- Spring常用配置(Scope、Spring EL和资源调用)
查看>>
SwaggerUI+SpringMVC——构建RestFul API的可视化界面
查看>>
springmvc怎么在启动时自己执行一个线程
查看>>
C# 通知机制 IObserver<T> 和 IObservable<T>
查看>>
Code of Conduct by jsFoundation
查看>>
C#小练习ⅲ
查看>>
电源防反接保护电路
查看>>
arraylist
查看>>
zoj 1649 Rescue (BFS)(转载)
查看>>
2124: 等差子序列 - BZOJ
查看>>
字符串匹配算法综述
查看>>
Linux centosVMware shell 管道符和作业控制、shell变量、环境变量配置文件
查看>>
【设计模式】工厂模式
查看>>
两个表格中数据不用是一一对应关系--来筛选不同数据,或者相同数据
查看>>
客户数据库出现大量cache buffer chains latch
查看>>
機械の総合病院 [MISSION LEVEL: C]
查看>>
实战练习细节(分行/拼接字符串/字符串转int/weak和copy)
查看>>
Strict Standards: Only variables should be passed by reference
查看>>