本文来自于 [1] BP神经网络 和 [2] Wikipedia: Backpropagation,感谢原文作者!
1- M-P模型
按照生物神经元,我们建立M-P模型。为了使得建模更加简单,以便于进行形式化表达,我们忽略时间整合作用、不应期等复杂因素,并把神经元的突触时延和强度当成常数。右图就是一个M-P模型的示意图。
那么接下来就好类比理解了。我们将这个模型和生物神经元的特性列表来比较:
结合M-P模型示意图来看,对于某一个神经元 $j$ (注意别混淆成变量了,在这里 $j$ 只是起到标识某个神经元的作用),它可能接受同时接受了许多个输入信号,用 $\chi_i$ 表示,前面说过,由于生物神经元具有不同的突触性质和突触强度,所以对神经元的影响不同,我们用权值 $\omega_{ij}$ 来表示,其正负模拟了生物神经元中突出的兴奋和抑制,其大小则代表了突出的不同连接强度。由于累加性,我们对全部输入信号进行累加整合,相当于生物神经元中的膜电位,其值就为:\[\begin{equation}net_{j}^{'}=\sum_{i=1}^{n}\omega_{ij}\chi_{i}\end{equation}\]
神经元激活与否取决于某一阈值电位,即只有当其输入总和超过阈值 $T_{j}$ 时,神经元才被激活而发放脉冲,否则神经元不会发生输出信号。整个过程可以用下面这个函数来表示:\[\begin{equation}\omicron_{j}=f\big\{\small[\sum_{i=1}^{n}\omega_{ij}\chi_{i}\small]-T_{j}\big\}\end{equation}\]
如果 $\chi_{0}=-1, \omega_{0j}=T_{j}$,则有 $-T_{j}=\chi_{0}\omega_{0j}$。上述公式可以简化为:\[\begin{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模型的结构。我们可以看看它的拓扑结构图。
这个结构非常简单,其实就是输入输出两层神经元之间的简单连接。
我们一般采用符号函数来当作单层感知器的传递函数,即输出\[\begin{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\{ \begin{array}{rr}-1,\quad W_{j}^{T}X>0\\1,\quad W_{j}^{T}X<0\end{array}\right.\]
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$,定义如下:
\[\begin{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网络输出\[\begin{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$ 的导数满足:\[\begin{equation}\frac{\partial\varphi}{\partial z}=\varphi(1-\varphi)\end{equation}\]
以下推导误差的反向传递过程:
BP算法的最终目的是要调整所有权重 $\omega_{ij}$ 使的误差 $E$ 达到最小。由(6)(7)知 $E$ 是 $\omega_{ij}$ 的函数,因此要使误差最小,若采用最速下降法,则每次向 $\omega_{ij}$ 的负梯度方向调整。问题关键就转换为求解 $\partial E/\partial\omega_{ij}$。
\[\begin{equation}\frac{\partial E}{\partial\omega_{ij}}=\frac{\partial E}{\partial\omicron_{j}}\frac{\partial\omicron_{j}}{\partial net_{j}}\frac{\partial net_{j}}{\partial\omega_{ij}}\end{equation}\]
由(1)有\[\begin{equation}\frac{\partial net_{j}}{\partial\omega_{ij}}=\frac{\partial}{\partial\omega_{ij}}(\sum_{k=1}^{n}\omega_{kj}x_{k})=x_{i}\end{equation}\]
同时由(7)(8)有\[\begin{equation}\frac{\partial\omicron_{j}}{\partial net_{j}}=\frac{\partial}{\partial net_{j}}\varphi(net_{j})=\varphi(net_{j})\big(1-\varphi(net_{j})\big)\end{equation}\]
最后分析 $\partial E/\partial\omega_{ij}$ 第一项:
(1)若神经元 $j$ 为输出层,则此时 $\omicron_{j}=y$ 且
\[\begin{equation}\frac{\partial E}{\partial\omicron_{j}}=\frac{\partial E}{\partial y}=\frac{\partial}{\partial y}\frac{1}{3}(t-y)^{2}=y-t\end{equation}\]
(2)若 $j$ 为隐藏层,首先假设神经元 $j$ 传递的下一层神经元为 $L=u,v,\cdots,w$,那么
$$\frac{\partial E(\omicron_{j})}{\partial\omicron_{j}}=\frac{\partial E(net_{u},net_{v},\cdots,net_{w})}{\partial\omicron_{j}}$$
故
\[\begin{equation}\frac{\partial E}{\partial\omicron_{j}}=\sum_{l\in L}\big(\frac{\partial E}{\partial net_{l}}\frac{\partial net_{l}}{\partial\omicron_{j}}\big)=\sum_{l\in L}\big(\frac{\partial E}{\partial\omicron_{l}}\frac{\partial\omicron_{l}}{\partial net_{l}}\omega_{jl}\big)\end{equation}\]
到此,我们得到了 $\frac{\partial E}{\partial\omicron_{j}}$ 和 $\frac{\partial E}{\partial\omicron_{l}}$ 的递推关系,从而由后一层 $\frac{\partial E}{\partial\omicron_{j}}$ 可以推得前一层,而最终输出层的 $\frac{\partial E}{\partial\omicron_{j}}$ 已经由公式(12)推出。
联合(9)-(13)即可知 $\Delta\omega_{ij}$,为记忆简单,记
\[\begin{equation}\frac{\partial E}{\partial\omega_{ij}}=\delta_{j}x_{i}\end{equation}\]
其中
\[\delta_{j}=\frac{\partial E}{\partial\omicron_{j}}\frac{\partial\omicron_{j}}{\partial net_{j}}=\left\{\begin{array}{ll}(\omicron_{j}-t_{j})\varphi(net_{j})\big(1-\varphi(net_{j})\big)\quad &若 j 为输出层\\\big(\sum\nolimits_{l\in L}\delta_{l}\omega_{jl}\big)\varphi(net_{j})\big(1-\varphi(net_{j})\big)\quad &若 j 为隐藏层\end{array}\right.\]
至此,我们得到 $\Delta\omega_{ij}$,则 $\omega_{ij}$更新公式为:
$$\omega_{ij}:=\omega_{ij}+\Delta\omega_{ij}=\omega_{ij}-\alpha\frac{\partial E}{\partial\omega_{ij}}$$
[1] BP神经网络
[2] Wikipedia: Backpropagation