当前位置:首页 » 操作系统 » bp反向传播算法

bp反向传播算法

发布时间: 2024-12-12 05:52:13

1. bp神经网络算法介绍

BP神经网络算法介绍:一种基于反向传播的多层前馈神经网络学习算法。
BP神经网络算法,全称为反向传播神经网络算法,是一种在多层前馈神经网络中应用的学习算法。其核心是通过反向传播的方式,调整神经网络的参数,使得网络能够学习到输入与输出之间的映射关系。这种算法广泛应用于模式识别、图像处理、语音识别等领域。其主要分为两个阶段:前向传播和反向传播。
在前向传播阶段,输入数据从输入层进入神经网络,经过各层的处理后,得到输出层的结果。这个过程主要涉及到神经网络的权重和偏置等参数。在反向传播阶段,根据输出层的结果与真实结果的误差,计算损失函数对权重的梯度,并更新权重和偏置。通过这种方式,神经网络能够不断地调整参数,以减小预测误差。反向传播过程中,利用梯度下降法或其他优化算法来更新参数,使得网络的性能逐渐优化。
BP神经网络算法的主要优点是具有很强的非线性映射能力和自学习能力。通过调整网络结构和参数,可以处理复杂的非线性问题。此外,该算法具有良好的通用性,可以应用于各种领域。然而,BP神经网络也存在一些缺点,如训练时间长、容易陷入局部最小值等。因此在实际应用中,需要针对具体问题对算法进行优化和改进。
BP神经网络算法的核心是反向传播和梯度下降法。通过不断地调整神经网络的参数,使网络逐渐适应输入与输出之间的映射关系。在实际应用中,需要根据具体问题选择合适的网络结构和学习率等参数,以保证算法的性能和效果。此外还需要注意防止过拟合和欠拟合等问题保证神经网络的泛化能力。

2. 一文彻底搞懂BP算法:原理推导+数据演示+项目实战(上篇)

反向传播算法(Backpropagation Algorithm,简称BP算法)是深度学习的重要思想基础,对于初学者来说也是必须要掌握的基础知识!本文希望以一个清晰的脉络和详细的说明,来让读者彻底明白BP算法的原理和计算过程。

全文分为上下两篇,上篇主要介绍BP算法的原理(即公式的推导),介绍完原理之后,我们会将一些具体的数据带入一个简单的三层神经网络中,去完整的体验一遍BP算法的计算过程;下篇是一个项目实战,我们将带着读者一起亲手实现一个BP神经网络(不使用任何第三方的深度学习框架)来解决一个具体的问题。

图 1 所示是一个简单的三层(两个隐藏层,一个输出层)神经网络结构,假设我们使用这个神经网络来解决二分类问题,我们给这个网络一个输入样本 ,通过前向运算得到输出 。输出值 的值域为 ,例如 的值越接近0,代表该样本是"0"类的可能性越大,反之是"1"类的可能性大。

为了便于理解后续的内容,我们需要先搞清楚前向传播的计算过程,以图1所示的内容为例:

输入的样本为:

第一层网络的参数为:

第二层网络的参数为:

第三层网络的参数为:

第一层隐藏层有三个神经元: 、 和 。该层的输入为:

以 神经元为例,则其输入为:

同理有:

假设我们选择函数 作为该层的激活函数(图1中的激活函数都标了一个下标,一般情况下,同一层的激活函数都是一样的,不同层可以选择不同的激活函数),那么该层的输出为: 、 和 。

第二层隐藏层有两个神经元: 和 。该层的输入为:

即第二层的输入是第一层的输出乘以第二层的权重,再加上第二层的偏置。因此得到和的输入分别为:

该层的输出分别为: 和 。

输出层只有一个神经元 :。该层的输入为:

即:

因为该网络要解决的是一个二分类问题,所以输出层的激活函数也可以使用一个Sigmoid型函数,神经网络最后的输出为: 。

在1.1节里,我们已经了解了数据沿着神经网络前向传播的过程,这一节我们来介绍更重要的反向传播的计算过程。假设我们使用随机梯度下降的方式来学习神经网络的参数,损失函数定义为 ,其中 是该样本的真实类标。使用梯度下降进行参数的学习,我们必须计算出损失函数关于神经网络中各层参数(权重 和偏置 )的偏导数。

假设我们要对第 层隐藏层的参数 和 求偏导数,即求 和 。假设 代表第 层神经元的输入,即 ,其中 为前一层神经元的输出,则根据链式法则有:

因此,我们只需要计算偏导数 、 和 。

前面说过,第k层神经元的输入为: ,因此可以得到:

上式中, 代表第 层神经元的权重矩阵 的第 行, 代表第 层神经元的权重矩阵 的第 行中的第 列。

我们以1.1节中的简单神经网络为例,假设我们要计算第一层隐藏层的神经元关于权重矩阵的导数,则有:

因为偏置b是一个常数项,因此偏导数的计算也很简单:

依然以第一层隐藏层的神经元为例,则有:

偏导数 又称为 误差项(error term,也称为“灵敏度”) ,一般用 表示,例如 是第一层神经元的误差项,其值的大小代表了第一层神经元对于最终总误差的影响大小。

根据第一节的前向计算,我们知道第 层的输入与第 层的输出之间的关系为:

又因为 ,根据链式法则,我们可以得到 为:

由上式我们可以看到,第 层神经元的误差项 是由第 层的误差项乘以第 层的权重,再乘以第 层激活函数的导数(梯度)得到的。这就是误差的反向传播。
现在我们已经计算出了偏导数 、 和 ,则 和 可分别表示为:

下面是基于随机梯度下降更新参数的反向传播算法:

单纯的公式推导看起来有些枯燥,下面我们将实际的数据带入图1所示的神经网络中,完整的计算一遍。

我们依然使用如图5所示的简单的神经网络,其中所有参数的初始值如下:

输入的样本为(假设其真实类标为"1"):

第一层网络的参数为:

第二层网络的参数为:

第三层网络的参数为:

假设所有的激活函数均为Logistic函数: 。使用均方误差函数作为损失函数:

为了方便求导,我们将损失函数简化为:

我们首先初始化神经网络的参数,计算第一层神经元:

上图中我们计算出了第一层隐藏层的第一个神经元的输入 和输出 ,同理可以计算第二个和第三个神经元的输入和输出:

接下来是第二层隐藏层的计算,首先我们计算第二层的第一个神经元的输入z₄和输出f₄(z₄):

同样方法可以计算该层的第二个神经元的输入 和输出 :

最后计算输出层的输入 和输出 :

首先计算输出层的误差项 ,我们的误差函数为 ,由于该样本的类标为“1”,而预测值为 ,因此误差为 ,输出层的误差项为:

接着计算第二层隐藏层的误差项,根据误差项的计算公式有:

最后是计算第一层隐藏层的误差项:

3. 读懂反向传播算法(bp算法)

反向传播算法可以说是神经网络最基础也是最重要的知识点。基本上所以的优化算法都是在反向传播算出梯度之后进行改进的。同时,也因为反向传播算法是一个递归的形式,一层一层的向后传播误差即可,很容易实现(这部分听不懂没关系,下面介绍)。不要被反向传播吓到,掌握其核心思想就很容易自己手推出来。

我们知道神经网络都是有一个loss函数的。这个函数根据不同的任务有不同的定义方式,但是这个loss函数的目的就是计算出当前神经网络建模出来输出的数据和理想数据之间的距离。计算出loss之后,根据反向传播算法就可以更新网络中的各种参数以此使loss不断下降,即可使输出的数据更加理想。
所以,现在的任务是,已知一个网络的loss之后,如何根据loss来更新参数呢?具体点即如何更新网络节点中的权重w和偏差b的值呢?

这里我们采用的是全连接神经网络进行说明。
要想把这个过程说清楚,首先需要将神经网络中各个参数用文字表达清楚。定义的就是w和b在网络中的准确位置。

对于 表示的是神经网络中第 层第k个节点到神经网络中第 层第j个节点之间的权重。注意w的下标是首位表示的是节点后层节点的位置,末尾表示是前层节点的位置。理解这样的表达方式在后面的计算中会很好理解。
同理,对于b的表示:

b的表示相比于w要简单一些,符号 表示第l层网络在第j个节点的偏置。无论w还是b的表示,上标都是表示层数。并且 和 表示都是第l层网络第j个节点的参数。所以该节点的输出可以表示为:

神经网络输出之后会经过一个激活函数,这用激活函数用 表示,则经过激活函数输出为:

至此,根据上面符号 、 、 、 。我们可以对于神经网络里面每一个数据准确的表示了。

给定一个损失函数之后,用 表示,说白了反向传播就是求∂C/∂w和∂C/∂b,然后将这个值乘以和对应的w,b进行相减就可以实现一次的参数更新了。为什么这样的操作就可以优化网络,减小loss值呢?

来源于导数的概念和速度相关。∂C/∂w和∂C/∂b相当于loss值C相对于w和v变化的速度。如果∂C/∂w是正的,则增大w,C也会增大,如果希望C减小的话,应该减小w;并且∂C/∂w的绝对值越大,表示w对C的值影响越大,w稍微有一点变化,C就会有大幅变化。如果要优化C变小,w应该对应的减少多少呢?也没有一个确定的答案。这里通过变化的速度和学习率相乘作为一个减小的值。通过多轮迭代。最终是希望c达到最小点。而当函数落入最小值的时候,无论是局部最小还是全局最小,其周围一定是平滑的。所以此时∂C/∂w和∂C/∂b将会变得很小甚至为0,即参数不在更新了。当函数在局部最小点处参数不在更新出现梯度消失的问题时,目前也有各种trick进行解决。不是这里的重点。

为了好说明,这里定义一个很简单的损失函数C:

接下来就是有意思的阶段了。这里还是利用上一节中∂C/∂w和∂C/∂b的解释。如果我们想要求出∂C/∂w和∂C/∂b的值,即具体的 、 对C影响速率的值,我们找一个中间变量∂C/∂ 。因为我们知道:

我们定义:

当我们知道了 值之后,我们根据 式子可以很容易求出 。
利用导数的链式法则:

很容易推出来不是?同理可以求出:

可以看出通过媒介 很容易求出∂C/∂w和∂C/∂b。那么我们现在来理解一下 到底是什么意思,以及如何求出来每一个l层j节点的 值。

根据定义:

可以看出来 就是 对于C的影响大小(联系之前说的导数和速率的关系)。而 是第 层第 个神经元未进过激活函数之前的输出。所以我们可以理解 为网络中第 层第 个神经元对loss的影响。所以很直观的看法就是我们先求出单个神经元对loss值得影响,然后再计算该神经元内部参数对于loss的影响。

ok,如果我们已经理解了为什么要引入 变量以及如何利用该变量计算具体参数的梯度后,接下来我们就可以看看如何获得 值。反向传播的名字我想也就是通过计算 的方式而来的。是一层一层递归而来的。

既然说是递归的方式,我们来思考一下 和 之间有什么关系,如果找到这个关系之后,我们就可以默认我们如果知道最后一层网络节点的 值,我们就可以获得倒数第二层网络节点的 值,倒数第三层,倒数第四层,……以此推类即可获得整个网络的每个节点的 值。至此我们的反向传播也基本完成了。
所以最重要的有两点:

先看问题1,直接根据求导的链式法则就可以找出两个的关系,具体公式如下,可以多看看手写一下,思路上也很简单。

觉得这样的链式公式还是很直观的,如果不好理解,可以自己画一个神经网络图,连上节点与节点之间的线,标上参数,然后推一下应该就能理解了。
这里的 都表示的未经过激活函数的神经元的输出。 表示激活函数。因为:

所以:

带入上式就可以得出:

至此就找出了 和 之间的关系了。
(还能简化,根据最开始我们定义的 )。

理解起来就是网络中前面一层某一个神经元对于loss的影响与该层的后一层所有的神经元对loss的影响、该神经元的输出大小、该神经元与后一层神经元连接的权重有关系的,并且是一个累加的效应。这样的理解也是非常直观合乎常理的。

现在万事具备,只差问题2了。即假设最后一层网络是L,最后一层 如何计算得出。最后一层的 值就像一个导火索,一旦有了开始,就可以利用我们之前推出来的: 公式进行反向传播了(反向传播还是很形象的不是?)。现在解决这个问题。这个问题就是和损失函数具体怎么定义有关系了。不过我们先不考虑C的具体形式,根据通用的链式法则我们可以得到:

这里需要注意的是最后一层激活函数使用的是哪种。最后一层激活函数在计算某一个神经元的输出时可能会结合其他节点的输出来计算。比如softmax激活函数,其输出的是一个概率值【0,1】。输出大小就是结合输出所有的值。

现在我们来考虑两个具体的损失函数,并且采用之前定义的均方误差损失函数 :

求导为:
因为sigmoid输出的值仅仅和输入的x值有关 。所以 当 时值为0.所以:

根据上面,BP推导有三部曲,先求出 ,再根据 分别求出 、 。总结公式如下:

启动上面反传的导火索是最后一层的 值,计算公式为:

根据最后一层不同类型的激活函数不同对待。

热点内容
python判断文件夹是否为空 发布:2024-12-12 08:23:06 浏览:160
手机百度云加密文件 发布:2024-12-12 08:18:02 浏览:224
加密北京房产证 发布:2024-12-12 08:14:03 浏览:590
安卓项目的后端图片数据存在哪里 发布:2024-12-12 07:56:27 浏览:244
qq上传视频原画 发布:2024-12-12 07:55:49 浏览:784
电脑出现网络服务器没有运行 发布:2024-12-12 07:55:06 浏览:475
编译窗口cmd有哪些命令 发布:2024-12-12 07:55:04 浏览:595
c语言this 发布:2024-12-12 07:54:54 浏览:591
淘客商城源码 发布:2024-12-12 07:54:19 浏览:767
如何将手机加速成5G安卓 发布:2024-12-12 07:44:13 浏览:870