BP神经网络详解

2021年5月31日 149点热度 2人点赞 0条评论

BP神经网络一般指用BP算法训练的多层前馈神经网络。前馈网络的目标是近似某个函数$f^*$。例如,对于分类器,$y=f^*(\mathbf{x})$将输入$\mathbf{x}$映射到一个类别$y$。前馈网络定义了一个映射$\mathbf{y}=f(\mathbf{x};\mathbf{\theta})$,并且学习参数$\theta$的值,使它能够得到最佳的函数近似。

这种模型被称为是前向(feedforward)的,是因为信息流过$\mathbf{x}$的函数,流经用于定义$f$的中间计算过程,最终到达输出$\mathbf{y}$。在模型的输出和模型本身之间没有反馈(feedback)连接。而BP神经网络基于前馈神经网络而增加了反馈调节机制。

为了更好地理解BP神经网络,我们先了解一下BP神经网络的组成单元——神经元。

M-P神经元模型

神经网络中最基本的单元是神经元模型(neuron)。在生物神经网络的原始机制中,每个神经元通常都有多个树突(dendrite),一个轴突(axon)和一个细胞体(cell body),树突短而多分支,轴突长而只有一个;在功能上,树突用于传入其它神经元传递的神经冲动,而轴突用于将神经冲动传出到其它神经元,当树突或细胞体传入的神经冲动使得神经元兴奋时,该神经元就会通过轴突向其它神经元传递兴奋。神经元的生物学结构如下图所示:

1.png

一直沿用至今的“M-P神经元模型”正是对这一结构进行了抽象,也称“阈值逻辑单元“,其中树突对应于输入部分,每个神经元收到n个其他神经元传递过来的输入信号,这些信号通过带权重的连接传递给细胞体,这些权重又称为连接权(connection weight)。细胞体分为两部分,前一部分计算总输入值(即输入信号的加权和,或者说累积电平),后一部分先计算总输入值与该神经元阈值的差值,然后通过激活函数(activation function)的处理,产生输出从轴突传送给其它神经元。M-P神经元模型如下图所示:

2.png

与线性分类十分相似,神经元模型最理想的激活函数也是阶跃函数,即将神经元输入值与阈值的差值映射为输出值1或0,若差值大于零输出1,对应兴奋;若差值小于零则输出0,对应抑制。但阶跃函数不连续,不光滑,故在M-P神经元模型中,也采用Sigmoid函数来近似, Sigmoid函数将较大范围内变化的输入值挤压到 (0,1) 输出值范围内,所以也称为挤压函数(squashing function)。

3.png

其实一个神经元的作用,就是对输入$\mathbf{x}$做了一次非线性变换输出了$y$,可以用公式表示如下:
$$
y=f(\mathbf{\omega \cdot \mathbf{x}}-\theta)
$$
其中,$\mathbf{\omega \cdot \mathbf{x}}-\theta$做了一次放射变换,可以理解为提取了一些特征,而激活函数$f$给这个神经元赋予了非线性拟合的能力。因此,激活函数往往是一些容易求导的非线性函数。

将多个神经元按一定的层次结构连接起来,就得到了神经网络。常用的神经网络称为“多层前馈神经网络”(multi-layer feedforward neural network),该结构满足以下几个特点:

  • 每层神经元与下一层神经元之间完全互连

  • 神经元之间不存在同层连接

  • 神经元之间不存在跨层连接

7.png

一般而言,前馈网络可以分为输入层、隐藏层和输出层。

信息的前向传播(Feed Forward)

前向传播基本是每一个深度学习模型都具有的特点,从输入层到隐藏层到输出层,一层一层地计算所有神经元输出值的过程。

基于随机梯度下降的反向传播(Back Propagation)算法

接下来就是BP神经网络区别于一般的前馈神经网络的地方——BP算法。也就是基于随机梯度下降的反向传播算法。

前面的”信息的前向传播“讲的是已知各个神经元的参数后,如何得到神经网络的输出。但是怎么得到各个神经元的参数,也就是如何进行学习呢?BP算法解决的是这个问题。

这一部分是BO神经网络的核心,我们举一个例子来加以说明。

给定训练集$D={(x_1,y_1),(x_2,y_2),\cdots,(x_n,y_n)},x_i \in R^d,y_i \in R^l$,即输入示例由$d$个属性描述,输出$l$维实值向量。为了便于讨论,下图给出了一个拥有$d$个输入神经元、$l$个输出神经元、$q$个隐层神经元的前馈神经网络,其中输出层第$j$个神经元的阈值用$\theta_j$表示,隐层第$h$个神经元的阈值用$\gamma_h$表示。输入层第$i$个神经元与隐层第$h$个神经元之间的连接权为$v_{ih}$,隐层第$h$个神经元与输出层第$j$个神经元之间的连接权为$\omega_{hj}$。记隐层第$h$个神经元接收到的输入为$\alpha_h=\sum_{i=1}^{d}v_{ih}x_i$,输出层第$j$个神经元接收到的输入为$\beta_j=\sum_{h=1}^{q}\omega_{hj}b_h$,其中$b_n$为隐层第$h$个神经元的输出。假设隐层和输出层的神经元都使用Sigmoid函数。

8.png

对训练例$(x_k,y_k)$,假定神经网络的输出为$\widehat{y}_{k}=(\widehat{y}_{1}^{k},\widehat{y}_{2}^{k},\cdots,\widehat{y}_{l}^{k})$,即:
$$
\widehat{y}_{j}^{k}=f(\beta_j -\theta_j) \tag{1}
$$
则网络在$(x_k,y_k)$上的均方误差为($1/2$是为了求导方便):
$$
E_k=\frac{1}{2}\sum_{j=1}^{l}(\widehat{y}_{j}^{k}-y_{j}^{k})^2 \tag{2}
$$
BP是一个迭代学习算法,在迭代的每一轮中采用下述方式对任意参数$v$进行更新:
$$
v \leftarrow v+\Delta v \tag{3}
$$
然后我们以隐层到输出层的连接权$\omega_{hj}$为例进行推导。

BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整。对式(2)的误差$E_k$,给定学习率$\eta$,有:
$$
\Delta \omega_{hj}=-\eta \frac{\partial E_k}{\partial \omega_{hj}} \tag{4}
$$
注意到$\omega_{hj}$先影响到第$j$个输出层神经元的输入值$\beta_j$,再影响到其输出值$\widehat{y}_{j}^{k}$

,然后影响到$E_k$,有:
$$
\frac{\partial E_k}{\partial \omega_{hj}}=\frac{\partial E_k}{\partial \widehat{y}_{j}^{k}} \cdot \frac{\partial \widehat{y}_{j}^{k}}{\partial \beta_j} \cdot \frac{\partial \beta_j}{\partial \omega_{hj}}
\tag{5}
$$
根据$\beta_j$的定义,显然有
$$
\frac{\partial \beta_j}{\partial \omega_{hj}}=b_h \tag{6}
$$
而Sigmoid函数的导数有以下性质:
$$
f'(x)=f(x)(1-f(x)) \tag{7}
$$
于是根据式(1)和式(2),有:
$$
\begin{aligned}
g_j &=-\frac{\partial E_k}{\partial \widehat{y}_{j}^{k}} \cdot \frac{\partial \widehat{y}_{j}^{k}}{\partial \beta_j}\\
& =-(\widehat{y}_{j}^{k}-y_{j}^{k})f'(\beta_j -\theta_j)\\
& =f(\beta_j -\theta_j)(1-f(\beta_j -\theta_j))(y_{j}^{k}-\widehat{y}_{j}^{k})\\
& =\widehat{y}_{j}^{k}(1-\widehat{y}_{j}^{k})(y_{j}^{k}-\widehat{y}_{j}^{k})
\end{aligned}
\tag{8}
$$
将式(8)(6)带入式(5),再带入式(4)后得:
$$
\Delta \omega_{hj}=\eta g_jb_h \tag{9}
$$
又因为:
$$
\Delta \theta_j=-\eta \frac{\partial E_k}{\partial \theta_j} \tag{10}
$$

$$
\begin{aligned}
\frac{\partial E_k}{\partial \theta_j}&=\frac{\partial E_k}{\partial \widehat{y}_{j}^{k}} \cdot \frac{\partial \widehat{y}_{j}^{k}}{\partial \theta_j}\\
&=\frac{\partial E_k}{\partial \widehat{y}_{j}^{k}} \cdot \frac{\partial [f(\beta_j-\theta_j)]}{\partial \theta_j}\\
&=\frac{\partial E_k}{\partial \widehat{y}_{j}^{k}} \cdot f'(\beta_j-\theta_j) \times (-1)\\
&=\frac{\partial E_k}{\partial \widehat{y}_{j}^{k}} \cdot f(\beta_j-\theta_j) \times [1-f(\beta_j-\theta_j)] \times(-1)\\
&=\frac{\partial E_k}{\partial \widehat{y}_{j}^{k}} \cdot \widehat{y}_{j}^{k}(1-\widehat{y}_{j}^{k}) \times(-1) \\
&=\frac{\partial [\frac{1}{2}\sum_{j=1}^{l}(\widehat{y}_{j}^{k}-y_{j}^{k})^2]}{\partial \widehat{y}_{j}^{k}} \cdot \widehat{y}_{j}^{k}(1-\widehat{y}_{j}^{k}) \times(-1)\\
&=\widehat{y}_{j}^{k}(1-\widehat{y}_{j}^{k})(y_{j}^{k}-\widehat{y}_{j}^{k}) \\
&=g_j
\end{aligned}
\tag{11}
$$
将其带入式(10)后可得:
$$
\Delta \theta_j=-\eta g_j \tag{12}
$$
类似可得:
$$
\Delta v_{ih}=\eta e_hx_i \tag{13}
$$

$$
\Delta \gamma_h=-\eta e_h \tag{14}
$$

上述两个式子中
$$
\begin{aligned}
e_h&=-\frac{\partial E_k}{\partial b_n} \cdot \frac{\partial b_n}{\partial \alpha_h}\\
&=-\sum_{j=1}^{l}\frac{\partial E_k}{\partial \beta_j} \cdot \frac{\partial \beta_j}{\partial b_h}f'(\alpha_h-\gamma_h)\\
&=\sum_{j=1}^{l}\omega_{hj}g_jf'(\alpha_h-\gamma_h)\\
&=b_h(1-b_h)\sum_{j=1}^{l}\omega_{hj}g_j
\end{aligned}
\tag{15}
$$
上述就是利用BP算法更新参数的过程。

学习率$\eta \in (0,1)$控制着沿反梯度方向下降的步长,若步长太大则下降太快容易产生震荡,若步长太小则收敛速度太慢,一般地常把η设置为0.1,有时更新权重时会将输出层与隐含层设置为不同的学习率。

BP算法的基本流程如下所示:

输入:训练集$D={(x_k,y_k)}_{k=1}^{m}$;
学习率 $\eta$ .
过程:

  1. 在(0,1)范围内随机初始化网络中的所有连接权和阈值;
  2. repeat
  3.      for all $(x_k,y_k) \in D$ D
  4.          根据当前参数和式(1)计算当前样本的输出$\widehat{y}_{j}^{k}$;
  5.          根据式(8)计算输出层神经元的梯度项$g_j$;
  6.          根据式(15)计算隐层神经元的梯度项$e_h$;
  7.          根据式(9)(12)(13)(14)更新连接权$\omega_{hj},v_{ih}$与阈值$\theta_j,\gamma_h$;
  8.      end for
  9. until达到停止条件
  10. 输出:参数确定的多层前馈神经网络

总结

标准BP神经网络的缺陷:

  1. 容易形成局部极小值而得不到全局最优值;

  2. 训练次数多使得学习效率低,收敛速度慢;

  3. 隐含层的选取缺乏理论的指导;

  4. 训练时学习新样本有遗忘旧样本的趋势;

  5. BP神经网络强大的学习能力常常容易造成过拟合问题。

BP神经网络强大的学习能力常常容易造成过拟合问题,有以下两种策略来缓解BP网络的过拟合问题:

  • 早停:将数据分为训练集与测试集,训练集用于学习,测试集用于评估性能,若在训练过程中,训练集的累积误差降低,而测试集的累积误差升高,则停止训练。
  • 引入正则化(regularization):基本思想是在累积误差函数中增加一个用于描述网络复杂度的部分,例如所有权值与阈值的平方和,其中λ∈(0,1)用于对累积经验误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。

agedcat_xuanzai

这个人很懒,什么都没留下

文章评论