• 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的导数:

    [egin{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 o + infty}frac{1}{1 + e^{-net}} = 1 lim_{net o - 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)$ $$egin{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) ight)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} ight]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{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,则算法结束。否则,随机选取下一个学习样本及对应年的期望输出,返回到第三步,进入下一轮的学习过程。

  • 相关阅读:
    Linux下使用Eclipse 远程调试
    关于Mysql分区和分表
    Mysql点滴
    父窗口与iFrame之间调用方法和元素
    pl/sql developer安装使用即时客户端
    Java的四大基础特性
    Get与Post的小知识
    ibatis 中 $与#的区别
    Eclipse安装配置Maven
    Git学习
  • 原文地址:https://www.cnblogs.com/gscienty/p/6566568.html
Copyright © 2020-2023  润新知