BP神经网络 [神经网络 2]

本文来自于 [1] BP神经网络 和 [2] Wikipedia: Backpropagation,感谢原文作者!

 

1- M-P模型

 

  按照生物神经元,我们建立M-P模型。为了使得建模更加简单,以便于进行形式化表达,我们忽略时间整合作用、不应期等复杂因素,并把神经元的突触时延和强度当成常数。右图就是一个M-P模型的示意图。

  那么接下来就好类比理解了。我们将这个模型和生物神经元的特性列表来比较:

 

  结合M-P模型示意图来看,对于某一个神经元 $j$ 注意别混淆成变量了,在这里 $j$ 只是起到标识某个神经元的作用),它可能接受同时接受了许多个输入信号,用 $chi_i$ 表示,前面说过,由于生物神经元具有不同的突触性质和突触强度,所以对神经元的影响不同,我们用权值 $omega_{ij}$ 来表示,其正负模拟了生物神经元中突出的兴奋和抑制,其大小则代表了突出的不同连接强度。由于累加性,我们对全部输入信号进行累加整合,相当于生物神经元中的膜电位,其值就为:[egin{equation}net_{j}^{'}=sum_{i=1}^{n}omega_{ij}chi_{i}end{equation}]

  神经元激活与否取决于某一阈值电位,即只有当其输入总和超过阈值 $T_{j}$ 时,神经元才被激活而发放脉冲,否则神经元不会发生输出信号。整个过程可以用下面这个函数来表示:[egin{equation}omicron_{j}=fig{small[sum_{i=1}^{n}omega_{ij}chi_{i}small]-T_{j}ig}end{equation}]

  如果 $chi_{0}=-1, omega_{0j}=T_{j}$,则有 $-T_{j}=chi_{0}omega_{0j}$。上述公式可以简化为:[egin{align}&net_{j}^{'}=W_{j}^{T}X\&omicron_{j}=f(net_{j})=f(W_{j}^{T}X)end{align}]

 

2- 感知器

  在1958年,美国心理学家Frank Rosenblatt提出一种具有单层计算单元的神经网络,称为感知器(Perceptron)。它其实就是基于M-P模型的结构。我们可以看看它的拓扑结构图。

  这个结构非常简单,其实就是输入输出两层神经元之间的简单连接。

  我们一般采用符号函数来当作单层感知器的传递函数,即输出[egin{equation}omicron_{j}=sgn(net_{j}^{'}-T_{j})=sgn(sum_{i=0}^{n}omega_{ij}x_{i})=sgn(W_{j}^{T}X)end{equation}]

公式(5)可以进一步表达为:

[omicron_{j}=left{ egin{array}{rr}-1,quad W_{j}^{T}X>0\1,quad W_{j}^{T}X<0end{array} ight.]

   2.1 单层感知器的局限性

    虽然单层感知器简单而优雅,但它显然不够聪明——它仅对线性问题具有分类能力。什么是线性问题呢?简单来讲,就是用一条直线可分的图形。比如,逻辑“与”和逻辑“或”就是线性问题,我们可以用一条直线来分隔0和1。

    A. 逻辑“与”的真值表和二维样本图如图:

    B. 逻辑“或”的真值表如图:

 

    为什么感知器就可以解决线性问题呢?这是由它的传递函数决定的。这里以两个输入分量 $x_{1}$ 和 $x_{2}$ 组成的二维空间为例,方程$$omega_{1j}x_{1}+omega_{2j}x_{2}-T_{j}=0$$确定的直线就是二维输入样本空间上的一条分界线。

    如果要让它来处理非线性的问题,单层感知器网就无能为力了。例如下面的“异或”,就无法用一条直线来分割开来,因此单层感知器网就没办法实现“异或”的功能。

     仅对线性可分问题具有分类能力,这就是单层感知器的局限所在。显然它能够解决的实际问题是很有限的。也正因为这样,单层感知器在解决实际问题时很少被采用。

 

  2.2 多层感知器的瓶颈

    既然一条直线无法解决分类问题,当然就会有人想到用弯曲的折线来进行样本分类,即多层感知器。其原理就是在输入层和输出层之间加入隐层,,以形成能够将样本正确分类的凸域。多层感知器的拓扑结构如图5所示。

 

    我们可以比较一下单层感知器和多层感知器的分类能力:

    由上图可以看出,随着隐层层数的增多,凸域将可以形成任意的形状,因此可以解决任何复杂的分类问题。实际上,Kolmogorov理论指出:双隐层感知器就足以解决任何复杂的分类问题。

    多层感知器确实是非常理想的分类器,但问题也随之而来:隐层的权值怎么训练?对于各隐层的节点来说,它们并不存在期望输出,所以也无法通过感知器的学习规则来训练多层感知器。因此,多层感知器心有余而力不足,虽然武功高强,但却无力可施。

 

3- BP算法

  3.1 BP网络的拓扑结构

    BP网络实际上就是多层感知器,因此它的拓扑结构和多层感知器的拓扑结构相同。由于单隐层(三层)感知器已经能够解决简单的非线性问题,因此应用最为普遍。三层感知器的拓扑结构如图所示。

  3.2 BP网络的传递函数

    BP网络采用的传递函数是非线性变换函数——Sigmoid函数(又称S函数)。其特点是函数本身及其导数都是连续的,因而在处理上十分方便。为什么要选 择这个函数,等下在介绍BP网络的学习算法的时候会进行进一步的介绍。S函数有单极性S型函数和双极性S型函数两种,单极性S型函数定义如下:$$f(x)=frac{1}{1+e^{-x}}$$

其函数曲线如图所示:

    

    双极性S型函数定义如下:$$f(x)=frac{1-e^{-x}}{1+e^{-x}}$$

    其函数曲线如图所示:

 

  3.3 BP网络的学习算法

    BP网络的学习算法就是BP算法, 以三层感知器为例,当网络输出与期望输出不等时,存在输出误差 $E$,定义如下:

[egin{equation}E=frac{1}{2}(t-y)^{2}=frac{1}{2}sum_{k=1}^{l}(t_{k}-y_{k})^{2}end{equation}]

其中,$t$ 为训练样本的真实输出,$o$ 为BP网络输出。

    对于每个神经节点 $j$,由(3)(4)知BP网络输出[egin{equation}omicron_{j}=varphi(net_{j})=varphi(sum_{k=1}^{n}omega_{kj}x_{k})end{equation}]

同时取激励函数为单极S型,即$$varphi(z)=frac{1}{1+e^{-z}}$$

且函数 $varphi$ 的导数满足:[egin{equation}frac{partialvarphi}{partial z}=varphi(1-varphi)end{equation}]

以下推导误差的反向传递过程:

    BP算法的最终目的是要调整所有权重 $omega_{ij}$ 使的误差 $E$ 达到最小。由(6)(7)知 $E$ 是 $omega_{ij}$ 的函数,因此要使误差最小,若采用最速下降法,则每次向 $omega_{ij}$ 的负梯度方向调整。问题关键就转换为求解 $partial E/partialomega_{ij}$。

[egin{equation}frac{partial E}{partialomega_{ij}}=frac{partial E}{partialomicron_{j}}frac{partialomicron_{j}}{partial net_{j}}frac{partial net_{j}}{partialomega_{ij}}end{equation}]

     由(1)有[egin{equation}frac{partial net_{j}}{partialomega_{ij}}=frac{partial}{partialomega_{ij}}(sum_{k=1}^{n}omega_{kj}x_{k})=x_{i}end{equation}]

    同时由(7)(8)有[egin{equation}frac{partialomicron_{j}}{partial net_{j}}=frac{partial}{partial net_{j}}varphi(net_{j})=varphi(net_{j})ig(1-varphi(net_{j})ig)end{equation}]

最后分析 $partial E/partialomega_{ij}$ 第一项:

  (1)若神经元 $j$ 为输出层,则此时 $omicron_{j}=y$ 且

[egin{equation}frac{partial E}{partialomicron_{j}}=frac{partial E}{partial y}=frac{partial}{partial y}frac{1}{3}(t-y)^{2}=y-tend{equation}]

  (2)若 $j$ 为隐藏层,首先假设神经元 $j$ 传递的下一层神经元为 $L=u,v,cdots,w$,那么

$$frac{partial E(omicron_{j})}{partialomicron_{j}}=frac{partial E(net_{u},net_{v},cdots,net_{w})}{partialomicron_{j}}$$

 故

[egin{equation}frac{partial E}{partialomicron_{j}}=sum_{lin L}ig(frac{partial E}{partial net_{l}}frac{partial net_{l}}{partialomicron_{j}}ig)=sum_{lin L}ig(frac{partial E}{partialomicron_{l}}frac{partialomicron_{l}}{partial net_{l}}omega_{jl}ig)end{equation}]

到此,我们得到了 $frac{partial E}{partialomicron_{j}}$ 和 $frac{partial E}{partialomicron_{l}}$ 的递推关系,从而由后一层 $frac{partial E}{partialomicron_{j}}$ 可以推得前一层,而最终输出层的 $frac{partial E}{partialomicron_{j}}$ 已经由公式(12)推出。

    联合(9)-(13)即可知 $Deltaomega_{ij}$,为记忆简单,记

[egin{equation}frac{partial E}{partialomega_{ij}}=delta_{j}x_{i}end{equation}]

其中

[delta_{j}=frac{partial E}{partialomicron_{j}}frac{partialomicron_{j}}{partial net_{j}}=left{egin{array}{ll}(omicron_{j}-t_{j})varphi(net_{j})ig(1-varphi(net_{j})ig)quad &若 j 为输出层\ig(sum olimits_{lin L}delta_{l}omega_{jl}ig)varphi(net_{j})ig(1-varphi(net_{j})ig)quad &若 j 为隐藏层end{array} ight.]

    至此,我们得到 $Deltaomega_{ij}$,则 $omega_{ij}$更新公式为:

$$omega_{ij}:=omega_{ij}+Deltaomega_{ij}=omega_{ij}-alphafrac{partial E}{partialomega_{ij}}$$


[1] BP神经网络

[2] Wikipedia: Backpropagation

原文地址:https://www.cnblogs.com/freyr/p/4522350.html