BP神经网络

基础不牢,地动山摇。

我在上一篇博客中详细介绍了感知机模型的原理和推导过程,在学习的过程中,我们发现单层感知机模型存在着许多不足,包括:① 模型仅在特征空间线性可分时才能收敛;② 对同样的数据集,感知机模型存在无穷多个解;③ 模型结构简单,并不能表达复杂的函数。这些缺点的存在,使得单层感知机模型“不堪大用”。在实际任务中,我们在更多情况下使用的是如下图所示的多层感知机模型,多层感知机在输入层和输出层之间加入了一个或多个隐藏层,并且每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接,这样的结构也被称为“多层前馈神经网络”。其中输入层负责接收外界输入,但并不对输入进行加工,输入层的神经元没有激活函数;隐藏层和输出层的神经元带有激活函数,它们负责对输入进行加工,最终结果由输出层神经元输出。神经网络的学习过程,就是根据训练集来调整神经元之间相互连接的权值和偏置,换言之,神经网络“学”到的东西,就蕴含在这些权值和偏置中

1. BP神经网络

多层网络的学习能力比单层感知机强得多,欲训练多层网络,简单感知机学习规则显然不够了,需要更强大的学习算法。误差逆传播(error BackPropagation,简称BP)算法就是其中最杰出的代表,它是迄今为止最成功的神经网络学习算法。我们通常所说的BP神经网络,一般就是指用BP算法训练的多层前馈神经网络。让我们以下图中简单的三层神经网络为例,看看BP算法是如何更新参数的。假设所给的训练集D中有m个样本,每个样本有d维特征和l个标签,那么训练集D可以表示为:

D=\left \{ (\boldsymbol{x}_{1},\boldsymbol{y}_{1}),(\boldsymbol{x}_{2},\boldsymbol{y}_{2}),\cdots,(\boldsymbol{x}_{m},\boldsymbol{y}_{m}) \right \}

样本的特征空间和样本的标签空间分别表示为:

\left \{ \boldsymbol{x}_{1},\boldsymbol{x}_{2},\cdots,\boldsymbol{x}_{m} \right \}=\begin{pmatrix} x_{11} & x_{21}& \cdots& x_{m1}\\ x_{12}& x_{22}& \cdots& x_{m2}\\ \vdots& \vdots& \ddots & \vdots\\ x_{1d}& x_{2d}& \cdots & x_{md}\end{pmatrix}    ,    \left \{ \boldsymbol{y}_{1},\boldsymbol{y}_{2},\cdots,\boldsymbol{y}_{m} \right \}=\begin{pmatrix} y_{11} & y_{21}& \cdots& y_{m1}\\ y_{12}& y_{22}& \cdots& y_{m2}\\ \vdots& \vdots& \ddots & \vdots\\ y_{1l}& y_{2l}& \cdots & y_{ml}\end{pmatrix}

让我们从训练集中任取一个样本\left ( \boldsymbol{x},\boldsymbol{y} \right ),其中\boldsymbol{x}=(x_{1},x_{2},\cdots,x_{d})^{T}\boldsymbol{y}=(y_{1},y_{2},\cdots,y_{l})^{T},以这个样本为例进行推导。推导过程中需要用到的一些符号表示已经在下图中标出(如果看不懂的话,今晚复习到两点!!!)。另设隐藏层和输出层的激活函数为Sigmoid函数,损失函数使用均方误差,学习率为\eta,其他相关细节会在推导过程中进行说明。

前向传播过程:

① 输入层:共有d个神经元,与样本特征数相同,可接收d个输入

② 隐藏层第h个神经元的输入:z_{h}=v_{ih}\cdot x_{1}+\cdots+v_{ih}\cdot x_{i}+\cdots+v_{dh}\cdot x_{d}+b_{ih}

③ 隐藏层第h个神经元的输出:\alpha_{h}=s(z_{h})=Sigmoid(z_{h})

④ 输出层第j个神经元的输入:\beta_{j}=w_{1j}\cdot \alpha_{1}+w_{2j}\cdot \alpha_{2}+\cdots+w_{hj}\cdot \alpha_{h}+\cdots+w_{qj}\cdot \alpha_{q}+b_{2j}

⑤ 输出层第j个神经元的输出:\hat{y_{j}}=s(\beta_{h})=Sigmoid(\beta_{h})
⑥ 网络在这个样本上的均方误差:E=\frac{1}{2}\sum_{j=1}^{l}(\hat{y_{j}}-y_{j})^{2}

反向传播过程:

BP算法是一个迭代学习算法,在迭代过程中采用广义的感知机学习规则对参数进行更新,任意参数v的更新公式为:v\leftarrow v+\Delta v。此外,BP算法基于梯度下降策略,以误差函数的负梯度方向对参数进行调整(学习率为\eta),所以参数v的更新公式可以进一步写成:

v\leftarrow v+\Delta v=v-\eta\frac{\partial E}{\partial v}

① 让我们以图中隐藏层到输出层的连接权重w_{hj}为例来进行推导w_{hj}的更新公式为:

w_{hj}\leftarrow w_{hj}+\Delta w_{hj}=w_{hj}-\eta \frac{\partial E}{\partial w_{hj}}

注意到w_{hj}先影响到输出层第j个神经元的输入值\beta _{j},再影响到这个神经元的输出值\hat{y_{j}},最后影响到均方误差E,根据链式求导法则:

\frac{\partial E}{\partial w_{hj}}=\frac{\partial E}{\partial \hat{y_{j}}}\cdot \frac{\partial \hat{y_{j}}}{\partial \beta _{j}}\cdot \frac{\partial \beta _{j}}{\partial w_{hj}}

根据前向传播过程中\beta _{j}的计算式,显然有:

\frac{\partial \beta _{j}}{\partial w_{hj}}=\alpha _{h}

由于Sigmoid函数有一个很好的性质:s'(x)=s(x)(1-s(x)),根据前向传播过程中\hat{y_{j}}的计算式,可以得到:

\frac{\partial \hat{y_{j}}}{\partial \beta _{j}}=s'(\beta _{j})=s(\beta_{j})(1-s(\beta_{j}))=\hat{y_{j}}(1-\hat{y_{j}})

根据前向传播过程中均方误差E的计算式,可以得到:

\frac{\partial E}{\partial \hat{y_{j}}}=\hat{y_{j}}-y_{j}

将这些式子代入链式求导法则式,可以得到:

\frac{\partial E}{\partial w_{hj}}=\frac{\partial E}{\partial \hat{y_{j}}}\cdot \frac{\partial \hat{y_{j}}}{\partial \beta _{j}}\cdot \frac{\partial \beta _{j}}{\partial w_{hj}}=\hat{y_{j}}(1-\hat{y_{j}})(\hat{y_{j}}-y_{j})\alpha_{h}

所以,参数w_{hj}的更新公式为:

{\color{DarkRed} w_{hj}\leftarrow w_{hj}+\Delta w_{hj}=w_{hj}-\eta \frac{\partial E}{\partial w_{hj}}=w_{hj}-\eta\cdot\hat{y_{j}}(1-\hat{y_{j}})(\hat{y_{j}}-y_{j})\alpha_{h}}

② 再以输入层到隐藏层的连接权重v_{ih}为例进行推导:v_{ih}的更新公式为:

v_{ih}\leftarrow v_{ih}+\Delta v_{ih}=v_{ih}-\eta\frac{\partial E}{\partial v_{ih}}

注意到,参数v_{ih}先影响到隐藏层第h个神经元的输入值z_{h},再影响到隐藏层第h个神经元的输出值\alpha _{h},再影响到输出层所有的输入值\beta _{1},\cdots,\beta _{j},\cdots,\beta _{l},再影响到各输入值对应的输出值\hat{y_{1}},\cdots,\hat{y_{j}},\cdots,\hat{y_{l}},最后影响到均方误差E,根据链式求导法则:

\tiny \frac{\partial E}{\partial v_{ih}}=\frac{\partial E}{\partial \hat{y_{1}}}\cdot\frac{\partial \hat{y_{1}}}{\partial \beta _{1}}\cdot\frac{\partial \beta_{1}}{\partial \alpha_{h}}\cdot\frac{\partial \alpha _{h}}{\partial z_{h}}\cdot\frac{\partial z_{h}}{\partial v_{ih}}+\cdots+\frac{\partial E}{\partial \hat{y_{j}}}\cdot\frac{\partial \hat{y_{j}}}{\partial \beta _{j}}\cdot\frac{\partial \beta_{j}}{\partial \alpha_{h}}\cdot\frac{\partial \alpha _{h}}{\partial z_{h}}\cdot\frac{\partial z_{h}}{\partial v_{ih}}+\cdots+\frac{\partial E}{\partial \hat{y_{l}}}\cdot\frac{\partial \hat{y_{l}}}{\partial \beta _{l}}\cdot\frac{\partial \beta_{l}}{\partial \alpha_{h}}\cdot\frac{\partial \alpha _{h}}{\partial z_{h}}\cdot\frac{\partial z_{h}}{\partial v_{ih}}
=\frac{\partial \alpha _{h}}{\partial z_{h}}\cdot\frac{\partial z_{h}}{\partial v_{ih}}\cdot\sum_{j=1}^{l}\frac{\partial E}{\partial \hat{y_{j}}}\cdot\frac{\partial \hat{y_{j}}}{\partial \beta _{j}}\cdot\frac{\partial \beta_{j}}{\partial \alpha_{h}}

根据前向传播过程中\alpha _{h}的计算式和Sigmoid函数的求导性质,可以得到:

\frac{\partial \alpha _{h}}{\partial z_{h}}=s'(z_{h})=s(z_{h})(1-s(z_{h}))=\alpha _{h}(1-\alpha_{h})

根据前向传播过程中z_{h}的计算式,显然可得:

\frac{\partial z_{h}}{\partial v_{ih}}=x_{i}

根据前向传播过程中\beta_{j}的计算式,可以得到:

\frac{\partial \beta_{j}}{\partial \alpha_{h}}=w_{hj}

将这些式子代入链式求导法则式,可以得到:

\small \frac{\partial E}{\partial v_{ih}}=\frac{\partial \alpha _{h}}{\partial z_{h}}\cdot\frac{\partial z_{h}}{\partial v_{ih}}\cdot\sum_{j=1}^{l}\frac{\partial E}{\partial \hat{y_{j}}}\cdot\frac{\partial \hat{y_{j}}}{\partial \beta _{j}}\cdot\frac{\partial \beta_{j}}{\partial \alpha_{h}}=x_{i}\cdot\alpha _{h}(1-\alpha_{h})\cdot\sum_{j=1}^{l}\hat{y_{j}}(1-\hat{y_{j}})(\hat{y_{j}}-y_{j})\cdot w_{hj}

所以,参数v_{ih}的更新公式为:

\small {\color{DarkRed} v_{ih}\leftarrow v_{ih}+\Delta v_{ih}=v_{ih}-\eta\frac{\partial E}{\partial v_{ih}}=v_{ih}-\eta \cdot x_{i}\cdot\alpha _{h}(1-\alpha_{h})\cdot\sum_{j=1}^{l}\hat{y_{j}}(1-\hat{y_{j}})(\hat{y_{j}}-y_{j})\cdot w_{hj}}

2. BP神经网络的工作流程

输入:训练集D=\left \{ (\boldsymbol{x}_{1},\boldsymbol{y}_{1}),(\boldsymbol{x}_{2},\boldsymbol{y}_{2}),\cdots,(\boldsymbol{x}_{m},\boldsymbol{y}_{m}) \right \}
          学习率:\small \eta

① 在\left ( 0,1 \right )范围内随机初始化网络中所有的参数(连接权重和偏置);

② 选取一个样本,计算网络前向传播过程的输出,用反向传播过程来更新网络参数;

③ 重复②,直至将训练集中所有样本遍历一遍;

④ 重复②③,直至达到停止条件:训练集上的累积误差降低到可接受范围之内

输出:参数确定的BP神经网络。

3. 一些必要的说明

① 上面介绍并推导的BP算法也被称为“标准BP算法”,它每次更新只针对单个样例,所以参数更新得非常频繁。

② 还有一种“累积BP算法”,它在遍历整个数据集一遍后,才会根据所有训练样本的累积误差对参数进行一次更新。

③ 为了达到同样的累积误差极小点,标准BP算法往往需要比累积BP算法进行更多次数的迭代,但是在数据集非常大时,标准BP算法往往能够更快获得较好的解。

隐藏层的层数并不是多多益善,已有学者证明,只需一个包含足够多神经元的隐藏层,多层前馈神经网络就能以任意精度逼近任意复杂度的连续函数。所以我们在设计BP神经网络时,往往优先考虑增加神经元的数目,而不是增加隐藏层的层数。

参考:

《机器学习》周志华 著

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SongGu1996

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值