BP神经网络

这篇博客中,我将会与大家分享最基本的BP神经网络的工作原理——主要包括网络的结构、参数的更新方法(反向传播)、网络优缺点等。BP神经网络是最基本的一种神经网络,难度小但我们能够见微知著得了解大型网络的训练过程。

模型的架构

反向传播模型也称B-P模型,是一种用于前向多层的反向传播学习算法。

具体而言:

  • 它可以对组成前向多层网络的各人工神经元之间的连接权值进行不断的修改,从而使该前向多层网络能够将输入它的信息变换成所期望的输出信息,因此是可学习的
  • 在修改各人工神经元的连接权值时,所依据的是该网络的实际输出与其期望的输出之差,将这一差值反向一层一层的向回传播,因此称作反向传播

首先从整体对BP神经网络有一定的认识:

BP神经网络能够实现多输入——多输出的任务。

对于每一个节点来说,其是由若干前继节点加权求和$+$激活得到的。具体让我们来对一个神经元进行观察:

从这幅图中我们能够看出当且节点得到的输入为
$$
o = f(\sum_j x_jw_j)
$$
当然,你也可以加入偏置项(bias),使得网络有更好的拟合效果:
$$
o = f(\sum_j x_jw_j + b_j)
$$
公式中 $f$ 为激活函数,是一个非线性映射。常用的函数有 $Relu$ 及其变种,$Sigmoid$ 函数等等。在这里我们以 $Sigmoid$ 为例。
$$
Sigmoid:\quad \sigma(t) = \frac{1}{1+e^{-t}}
$$
考虑为什么一定要进行非线性映射?

倘若不进行非线性映射,则无论网络有多深,输出结果永远是输入的线性组合,但我们欲解决的问题是线性的情况少之又少。因此非线性映射(激活)能够让我们的网络有着更强的拟合能力。

在经过若干层映射后,我们得到预测的输出 $\hat{y_1}, \hat{y_2}, \dots ,\hat{y_n}$,定义与真实值 $y_1,y_2,\dots,y_n$ 之间的误差函数:
$$
e=E(\overrightarrow{w})=\frac12 \sum_i(\hat{y_i}-y_i)^2
$$
而我们的目的就是调整 $\overrightarrow{w}=(w1,w2,\dots,w_m)^T$ 的值使得误差 $e$ 尽可能小

原理部分到此就结束了。实质上就是每一层数据经过加权并激活后传入到下一层。而具体如何更新参数,接下来我们将会讲到。


参数的更新

更新方法我们采用最朴素也最通用的——梯度下降法

梯度下降法简单来说就是:对某一变量,其更新方向应该是沿着误差梯度方向的反方向——也就是梯度下降方向去更新。这样能够减小我们的误差值。而梯度方向我们可以用偏导求出。

让我们来看一个很简单的例子:

列出各个节点的关系式:
$$
\begin{array}{ll}
O_1=x_1&O_2=x_2
\\ I_3=W_{13}O_1+W_{23}O_2&O_3=f(I_3)
\\ I_4=W_{34}O_3&O_4=f(I_4)
\\ I_5=W_{35}O_3&O_5=f(I_5)
\\ y_1=O_4&y_2=O_5
\end{array}
$$
定义误差函数 $e$ :
$$
e = \frac12 [(\hat{y_1} - y_1)^2 + (\hat{y_2} - y_2)^2]
$$

求偏导:
$$
\begin{gathered}
\frac{\partial e}{\partial W_{13}}=\frac{\partial e}{\partial I_3}\cdot\frac{\partial I_3}{\partial W_{13}}=\frac{\partial e}{\partial I_3}O_1=\delta_3 x_1
\\ \frac{\partial e}{\partial W_{23}}=\frac{\partial e}{\partial I_3}\cdot\frac{\partial I_3}{\partial W_{23}}=\frac{\partial e}{\partial I_3}O_2=\delta_3 x_2
\\ \frac{\partial e}{\partial W_{34}}=\frac{\partial e}{\partial I_4}\cdot\frac{\partial I_4}{\partial W_{34}}=\frac{\partial e}{\partial I_4}O_3 =\delta_4 O_3
\\ \frac{\partial e}{\partial W_{35}}=\frac{\partial e}{\partial I_5}\cdot\frac{\partial I_5}{\partial W_{55}}=\frac{\partial e}{\partial I_5}O_3 =\delta_5 O_3
\end{gathered}
$$
所以我们接下来的任务就是求 $\delta_3, \delta_4,\delta_5$
$$
\begin{gathered}
\delta_4=\frac{\partial e}{\partial I_4}=(\hat{y_1}-y_1)f’(I_4)
\\ \delta_5=\frac{\partial e}{\partial I_5}=(\hat{y_2}-y_2)f’(I_5)
\\ \delta_3=\frac{\partial e}{\partial I_3}=(\delta_4W_{34}+\delta_5 W_{35})f’(I_3)
\end{gathered}
$$
注意激活函数也要求导!

观察结果,能够发现 $\delta_3$ 的值依赖于 $\delta_4,\delta_5$——当且节点计算要依赖于后一层节点的计算——这也就是反向传播的很好表现。

接下来通过设置学习率 $\alpha$,对参数进行更新即可:
$$
W_{k}^{(t+1)} = W_{k}^{(t)} - \alpha \frac{\partial e}{\partial I_k}
$$
即沿着梯度下降的方向走一段距离,使得误差减小。我们完成了对参数的一次更新。接下来不断给出新的一组输入与输出,再更新参数,直至 $e < \epsilon$ 停止。


前馈网络的表征能力

  • 布尔函数:任何布尔函数可以用两层网络准确表示。隐层单元数随输入数增加呈指数增长。

  • 连续函数:每个有界连续函数可以用两层网络以任意小的误差逼近。隐层使用Sigmoid函数

  • 任意函数:任意函数可以用三层网络以任意精度逼近。输出层线性单元,隐层Sigmoid单元


BP网络的优缺点

优点:

  • 理论基础牢固,推导过程严谨,物理概念清晰,通用性好等。

  • 所以,它是目前用来训练前向多层网络较好的算法。

缺点:

  • 该学习算法的收敛速度慢

  • 网络中隐节点个数的选取尚无理论上的指导

  • 从数学角度看,B-P算法是一种梯度最速下降法,这就可能出现局部极小的问题。当出现局部极小时,从表面上看,误差符合要求,但这时所得到的解并不一定是问题的真正解。

再知道原理后,大家已经基本具备了从底层构建BP神经网络的所有知识。如果你进一步学习了梯度下降算法,那么你完全有能力手搓一个神经网络。Why not have a try?

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
Runtime Display
  • Copyrights © 2023-2024 Lucas
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信