神经网络之BP算法【图文并茂】

神经网络之BP算法(图说神经网络+BP算法理论推导+例子运用+代码)

最近在学习《Deep Learning》这本书,书中在前馈神经网络、全连接神经网络以及卷积神经网络等内容中,都有提到反向传播算法,这一算法可以说是神经网络中求解参数比较核心的部分了。为了更好地理解神经网络工作的原理,认识反向传播在神经网络中的运算机制,在综合《Deep Learning》书中的有关部分并且学习了b站讲解神经网络的相关视频及一些有关于BP算法的博客文章之后,笔者将自己的理解写下来,希望能为初学者理解反向传播算法起到一定的帮助。

关于反向传播算法,我们首先需要清楚它的应用途径;其次,做一些神经网络知识的前期储备;之后,学习BP算法的工作原理;最后,认识到BP算法的局限性,了解改进方法。因此,本文从这4个点来讲解,划分为6部分:

1、 反向传播算法应用领域

反向传播算法应用较为广泛,从字面意思理解,与前向传播相互对应。在简单的神经网络中,反向传播算法,可以理解为最优化损失函数过程,求解每个参与运算的参数的梯度的方法。在前馈神经网络中,反向传播从求解损失函数偏导过程中,步步向前求解每一层的参数梯度。在卷积神经网络中,反向传播可以求解全连接层的参数梯度。在循环神经网络中,反向传播算法可以求解每一个时刻t或者状态t的参数梯度(在RNN\LSTM\GRU中,反向传播更多是BPTT)。笔者如今对于BP的理解,认为是在优化损失函数或者目标函数过程中,求解参与运算的参数的梯度方法,是一种比较普遍的说法。

2、准备知识–反向传播(BP)算法应用于神经网络

反向传播(BP)算法在深度学习中,应用广泛。这里仅以前馈神经网络中的BP算法作为介绍。神经网络是一个由输入层、隐藏层、输出层三部分组成的网络,如图(1):数据从输入层,经过权重值和偏置项的线性变换处理,再通过激活层,得到隐藏层的输出,也即下一层的输入;隐藏层到输出层之间是,经过权重值和偏置项的线性变换,之后通过激活层,得到输出层。
神经网络之BP算法【图文并茂】_第1张图片
图表示一个网络层为2的前馈神经网络:一个隐藏层,一个输出层;隐藏单元为5,记输入层到隐藏层的权重值为W,偏置项为b1,激活函数为g1,隐藏层到输出层的权重值为V,偏置项为b2,激活函数为g2,则图2的模型即为:
在这里插入图片描述
图是一个比较简单的神经网络,通常,我们见到的神经网络,是具有多个隐藏层的网络,如图3:这是一个隐藏层个数为N个,每层隐藏单元数为5的神经网络。(PS:隐藏层设计,可以考虑层数设计和隐藏单元设计,可根据自己的需要自行设计。)
神经网络之BP算法【图文并茂】_第2张图片
从输入层到隐藏层再到输出层,这一向前传递的过程,我们称之为前向传播。前向传播过程,往往是我们设定模型的过程,也可以理解为设定数学表达式或者列方程的过程。

3、BP算法原理及其实施步骤

BP算法的核心思想:使用梯度下降来搜索可能的权向量的假设空间,以找到最佳的拟合样例的权向量。具体而言,即利用损失函数,每次向损失函数负梯度方向移动,直到损失函数取得最小值。

或者说,反向传播算法,是根据损失函数,求出损失函数关于每一层的权值及偏置项的偏导数,也称为梯度,用该值更新初始的权值和偏置项,一直更新到损失函数取得最小值或是设置的迭代次数完成为止。以此来计算神经网络中的最佳的参数。

由此,正式介绍BP算法前,我们需要知道前向传播过程,确定网络的设计。为此先设定一个只有一层的神经网络,作为讲解,如图所示:
神经网络之BP算法【图文并茂】_第3张图片
设定:从输入层数据为X,输入层到隐藏层参数为w,b1,隐藏层到输出层参数为v,b2,激活函数用为g1,g2。于是模型设定为:

输入层到隐藏层:
在这里插入图片描述

隐藏层到输出层:
在这里插入图片描述
模型:
在这里插入图片描述
损失函数:
在这里插入图片描述
其中:
神经网络之BP算法【图文并茂】_第4张图片
以上述的模型设定为例,下面介绍BP算法步骤,通过BP算法的步骤,了解反向传播,是如何实现模型的参数更新。

实施步骤:

1)初始化网络中的权值和偏置项,分别记为
在这里插入图片描述
2)激活前向传播,得到各层输出和损失函数的期望值
在这里插入图片描述
其中,y表示真实值,y^表示预测值,1/2表示对总的误差值取平均,所以一般情况下,输出单元多少维,误差值求平均就除以多少;本模型设定中,输出值为2维列数据,故用误差值除以2。一般情况下,损失函数的期望值表示为:
在这里插入图片描述
这是一组n维数据的输出,若是有m组这样的数据,损失函数的期望值为:
在这里插入图片描述
若真实值与输出值表示为y和y^上式可表示为:
在这里插入图片描述
一般情况下,输出数据为1维或是2维,输出的数据有多组。

3)根据损失函数,计算输出单元的误差项和隐藏单元的误差项

输出单元的误差项,即计算损失函数关于输出单元的梯度值或偏导数,根据链式法则有:
神经网络之BP算法【图文并茂】_第5张图片
隐藏单元的误差项,即计算损失函数关于隐藏单元的梯度值或偏导数,根据链式法则有:
神经网络之BP算法【图文并茂】_第6张图片
PS: 对于复合函数中的向量或矩阵求偏导,复合函数内部函数的偏导总是左乘;对于复合函数中的标量求偏导,复合函数内部函数的偏导左乘或者右乘都可以。

4) 更新神经网路中的权值和偏置项

输出单元参数更新:
在这里插入图片描述
隐藏单元参数更新:
在这里插入图片描述
其中,\eta表示学习率,k=1,2,…,n表示更新次数或迭代次数,k=1表示第一次更新,以此类推。此处可能和别处博客不太一样,但实质是一样的,此处的’+‘或者’-'主要取决于损失函数.

如何定义损失函数或者定义参数更新均可,但参数的更新一定是向参数的负梯度方向。

5) 重复步骤2-4,直到损失函数小于事先给定的阈值或迭代次数用完为止,输出此时的参数即为目前最佳参数。

这便是BP算法的一个具体步骤,下面我们详细介绍BP算法步骤中的每一步:

步骤1)初始化参数值(输出单元权值、偏置项和隐藏单元权值、偏置项均为模型的参数),是为激活前向传播,得到每一层元素的输出值,进而得到损失函数的值。参数初始化,可以自己设定,也可以选择随机生成;一般情况下,自己写代码或者调用tensorflow或keras时,都是随机生成参数。因为初始参数对最终的参数影响不大,只会影响迭代的次数。

步骤2)在步骤1的基础上,激活前向传播,得到net_{1},h,net_{2},\hat{y}的值,进而得到的值;其中的计算,根据前面模型设定中的公式计算。计算这些值是为计算步骤3中的误差项。

步骤3)计算各项误差,即计算参数关于损失函数的梯度或偏导数,之所以称之为误差,是因为损失函数本身为真实值与预测值之间的差异。计算参数的偏导数,根据的是微积分中的链式法则。具体推导如下:

输出单元的误差项:输出单元v与损失函数E,不是直接相关,而是通过复合函数的形式关联,以设定的模型为例:
神经网络之BP算法【图文并茂】_第7张图片
其中E(v,b{2})表示损失函数化为与参数v,b2相关的表达式。

根据链式法则,输出单元v与损失函数E的误差项为:
神经网络之BP算法【图文并茂】_第8张图片

求出上式中每一个偏导:
神经网络之BP算法【图文并茂】_第9张图片
神经网络之BP算法【图文并茂】_第10张图片
其中,net{2}关于激活函数g{2}求偏导,需要根据具体的激活函数而定,每一层的激活函数可以选择不同的函数,一般情况下,为简单化模型设计和求导方便,会设定为同一个函数。此处假设选择激活函数为sigmoid函数,那么有:
神经网络之BP算法【图文并茂】_第11张图片
PS:因为sigmoid(z)中z是标量,对z求偏导,有:
神经网络之BP算法【图文并茂】_第12张图片
本文定义了z为向量,对于向量就有了式(3-17)的逐元素相乘的式子。

于是,为简化后面的计算,记
在这里插入图片描述
其中,S ^{(k)}表示第k次求损失函数关于net{2}的偏导;*表示逐元素相乘,即两个向量或两个矩阵对应的元素相乘,例如:
在这里插入图片描述
于是,输出单元的误差项为:
神经网络之BP算法【图文并茂】_第13张图片
此处说明:若遇式(3-15)的偏导(对权值求偏导),链式法则处理方式均如式(3-19);若遇式(3-16)的偏导(对偏置项求偏导),链式法则处理方式均如式(3-20)。

隐藏单元的误差项:隐藏单元w与损失函数E,通过复合函数的形式关联,以设定的模型整理为:
神经网络之BP算法【图文并茂】_第14张图片
根据链式法则,隐藏单元w与损失函数E的误差项为:
神经网络之BP算法【图文并茂】_第15张图片
同样的求导法则,得到隐藏单元的误差项为:
神经网络之BP算法【图文并茂】_第16张图片
其中:
神经网络之BP算法【图文并茂】_第17张图片
说明:若遇式(3-25)(对隐藏单元求偏导),链式法则处理如式(3-23);式(3-15)和(3-26)同,故有相同的处理方式;式(3-16)和(3-27)同,故有相同的处理方式。

补充:若有多个隐藏层时,逐步计算隐藏层的权值和偏置项误差,推导的规则同上。例如:一个隐藏层为2,隐藏单元为5的神经网络:
神经网络之BP算法【图文并茂】_第18张图片

实例运用

1、前向运算
神经网络之BP算法【图文并茂】_第19张图片
2、反向传播
神经网络之BP算法【图文并茂】_第20张图片
3、反向传播与参数更新
神经网络之BP算法【图文并茂】_第21张图片
神经网络之BP算法【图文并茂】_第22张图片

BP算法缺陷与改进

BP算法缺陷:

1)局部极小值

对于多层网络,误差曲面可能含有多个不同的局部极小值,梯度下降可能导致陷入局部极小值。

2)权值过多

当隐藏节点过多,层数越多时,权值成倍增长。权值的增长意味着对应的空间维数的增加,过高的维数易导致训练后期的过拟合。

3)容易过拟合

训练的次数过多、空间维数过高均容易过拟合。

BP算法改进:

1)利用动量法改进BP算法

动量法权值调整算法的具体做法是:将上一次权值调整量的一部分迭加到按本次误差计算所得的权值调整量上,作为本次的实际权值调整量,即:
在这里插入图片描述
其中,\bta表示动量系数,\eta表示学习率。

2)自适应调整学习率

调整的基本指导思想是:在学习收敛的情况下,增大\eta以缩短学习时间;当\eta偏大致使不能收敛时,要及时减小它的值,知道收敛为止。此方法适用于设置阈值的情况下。

3)动量-自适应学习速率调整算法

采用动量法,BP算法可以找到更优的解;采用自适应学习速率法时,BP算法可以缩短训练时间。将以上两种方法结合起来,就得到动量-自适应学习率调整算法。

上述2)和3)都适应于设置阈值来停止程序的方法。

致谢:请给小编一点爱心!!!

你可能感兴趣的:(难啃的深度学习,算法,神经网络,深度学习,python,人工智能)