BP神经网络模型与学习算法

在感知器神经网络模型与线性神经网络模型学习算法中,理想输出与实际输出之差被用来估计神经元连接权值误差。当解决线性不可分问题而引入多级网络后,如何估计网络隐含层神经元的误差就成了一大难题。因为在实际中,无法知道隐含层的任何神经元的理想输出值。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}\]

  1. 利用网络期望输出向量 \(\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)) \]

  1. 利用隐含层到输出曾的连接权值\(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)) \]

  1. 利用输出层各神经元的 \(\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 + \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
\sum^q_{o=1}(d_o(k) - y_o(k))^2$$
9. 判断网络误差是否满足要求,当 \(E < \varepsilon\) 或学习次数大于设定的最大次数M,则算法结束。否则,随机选取下一个学习样本及对应年的期望输出,返回到第三步,进入下一轮的学习过程。

posted @ 2017-03-17 15:36  Ant°  阅读(1605)  评论(0编辑  收藏  举报