前向传播算法
前向传播(Feedforward)是神经网络中信息从输入层经过隐藏层传递到输出层的过程。在这个过程中,每一层的神经元接收来自前一层神经元的输出作为输入,并通过激活函数处理后输出给下一层,直到到达输出层并生成最终预测结果。
具体来说,前向传播涉及以下几个关键步骤:
1.输入信号:首先,输入数据被馈送到神经网络的输入层。这些输入可以视为特征向量,代表了我们要分析或预测的对象的属性。
2.加权求和:在每一层中,每个神经元将接收到的输入与该层权重矩阵相乘,并加上偏置项。这一操作可以用公式表示为:
3.激活函数应用:得到加权求和的结果之后,会将其传递给一个非线性的激活函数,以生成该层神经元的实际输出。这个过程可以写作:
激活函数的选择取决于任务需求,例如分类问题常用 Sigmoid 或 Softmax 函数,回归问题可能使用线性激活函数,而在隐藏层中 ReLU 函数非常流行因为它的计算效率高且有助于缓解梯度消失的问题。
4.重复上述过程:对于多层神经网络而言,上述两步会在每一层重复执行,直到达到输出层为止。最终输出层产生的结果就是整个网络对输入样本的预测值。
5.输出预测:一旦所有层都完成了它们各自的计算,最后一层即输出层就会给出模型的预测结果。如果是二分类问题,可能会使用 Sigmoid 函数来确保输出位于 [0, 1] 区间内;如果是多分类问题,则通常采用 Softmax 函数来获得类别概率分布。
前向传播的目的
前向传播是神经网络进行预测和分类的基础过程。
在训练阶段,前向传播用于生成预测结果,并与真实标签进行比较以计算损失函数的值。然后,通过反向传播算法将损失函数的梯度信息反向传递回网络,用于更新权重和偏置等参数。
在推理阶段,神经网络仅使用前向传播过程来生成预测结果。此时,输入数据通过网络进行前向传播,直到输出层生成最终的预测结果。
反向传播算法
反向传播(Backpropagation,缩写为BP)是 “误差反向传播” 的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。该算法的核心思想是将输出误差以某种形式通过隐藏层向输入层逐层反转。具体来说,反向传播利用了微积分中的链式法则来高效地计算损失函数相对于网络中每个权重的梯度。这意味着它可以确定每个权重对最终预测误差的影响程度,并据此调整这些权重以减小误差。
在神经网络中,前向传播是指数据从输入层经过一系列变换到达输出层的过程,在此过程中,每一层的激活值都是基于前一层的输出和当前层的权重矩阵计算得出。而反向传播则是指一旦得到了输出层的预测结果,就会比较它与真实标签之间的差异,即计算损失函数;然后,这个误差信息会沿着网络从输出层向后传递到每一层,直到输入层,从而使得每一层都可以根据其对总误差的贡献来调整自身的参数。
反向传播的目的
反向传播的主要目标是训练神经网络通过监督学习做出更优质的预测。为了实现这一目标,反向传播需要解决两个关键问题:
计算权重、偏置等超参数的梯度:这是为了方便使用优化算法更新参数时所必需的信息。通过计算损失函数关于各个权重和偏置的偏导数,可以获得一个指向损失最小化方向的梯度向量。这个梯度告诉了我们如何改变权重才能使损失变得更小。
最小化模型预测误差:更根本的是,反向传播的目标是确定如何调整模型权重和偏差,从而最小化由损失函数衡量的预测误差。随着迭代次数增加,理想情况下,网络应该能够逐渐逼近最优解,即找到一组使得损失尽可能低的权重配置
算法讲解
当询问熟悉BP(Backpropagation)算法的人“如何推导BP算法?”时,常见的回答往往是“那不就是应用链式法则吗?”。虽然这样的回答在技术上是正确的,但它可能无法满足提问者的真正需求——他们通常希望获得一个更加直观、易于理解的解释。确实,BP算法的核心在于利用链式法则来计算梯度,但这只是冰山一角。对于那些寻求深入理解的人来说,更重要的是要能够看到整个过程是如何运作的,以及各个组件之间是如何相互作用的。
为了帮助读者建立更清晰的概念,我们采用图解的方式来说明反向传播的工作原理。值得注意的是,这里展示的图示虽然简化了实际深度学习中的backprop流程(后者涉及到计算图的操作),但其基本思想是一致的:即误差信息必须从输出层开始逆向传递回网络的前端,因为直接从前向后计算误差是不可行的。
接下来,我们将通过两组图像来详细介绍神经网络的前向传播与反向传播过程:
第一组图:来自外部资源的一系列插图,它们以直观的方式描绘了数据流经网络的过程,非常适合视觉学习者。
第二组图:提供了一个具体的实例,逐步演示了前向传播和随后的反向传播步骤,这对于希望通过具体例子加深理解的学习者尤为有用。
无论你是刚刚接触机器学习的新手,还是想要复习巩固知识的老手,本文提供的图文并茂的内容都将有助于你更好地掌握反向传播算法的本质。即使只具备基础的高等数学背景,跟随我们的引导,你也能够轻松地理解这一关键概念,并为后续的学习打下坚实的基础。
通过这种方式,我们不仅强调了理论的重要性,同时也确保了实践上的可操作性,使得每一个对神经网络感兴趣的个体都能够从中受益。
CASE 1
首先拿一个简单的三层神经网络来举例,如下:
每个神经元由两部分组成,第一部分(e)是输入值和权重系数乘积的和,第二部分(f(e))是一个激活函数(非线性函数)的输出, y=f(e)即为某个神经元的输出,如下:
下面是前向传播过程:
到这里为止,神经网络的前向传播已经完成,最后输出的y就是本次前向传播神经网络计算出来的结果(预测结果),但这个预测结果不一定是正确的,要和真实的标签(z)相比较,计算预测结果和真实标签的误差(δ \deltaδ),如下:
下面开始计算每个神经元的误差(δ \deltaδ):
如果传播的错误来自少数神经元,则会添加错误。图如下所示:
下面开始利用反向传播的误差,计算各个神经元(权重)的导数,开始反向传播修改权重(当计算每个神经元的误差信号后,每个神经元输入节点的权重系数可能被修改。以下公式中图片代表神经元激活函数的导数(即修改的权重)。)
系数η影响网络教学速度。
到此为止,整个网络的前向,反向传播和权重更新已经完成,推荐参考上面给出的本教程的链接,如果对纯理论讲解较难接受,没关系,强烈推荐第二组图的例子!!!
CASE 2
首先明确“正向传播”求损失,“反向传播”回传误差。同时神经网络每层的每个神经元都可以根据误差信号修正每层的权重,只要能明确上面两点,那么下面的例子,只要会一点链式求导规则就一定能看懂!
BP算法,也叫δ算法,下面以3层的感知机为例进行举例讲解。
上图的前向传播(网络输出计算)过程如下:(此处为网络的整个误差的计算,误差E计算方法为mse)
上面的计算过程并不难,只要耐心一步步的拆开式子,逐渐分解即可。现在还有两个问题需要解决:
1.误差E有了,怎么调整权重让误差不断减小?
2.E是权重w的函数,如何找到使函数值最小的w
解决上面问题的方法是梯度下降算法(简单图示如下),大家如有不太懂的可先行查阅别的资料,只要能达到理解线性回归梯度下降算法的水平即可,这里不再赘述。
就算上面的所有东西你都看的迷迷糊糊,通过下面的例子,相信绝大多数人也能很轻松的理解BP算法。如图是一个简单的神经网络用来举例:
下面是前向(前馈)运算(激活函数为sigmoid):
下面是反向传播(求网络误差对各个权重参数的梯度),我们先来求最简单的,求误差E对w5的导数。首先明确这是一个“链式求导”过程,要求误差E对w5的导数,需要先求误差E对out o1的导数,再求out o1对net o1的导数,最后再求net o1对w5的导数,经过这个链式法则,我们就可以求出误差E对w5的导数(偏导),如下图所示:
导数(梯度)已经计算出来了,下面就是反向传播与参数更新过程:
上面的图已经很显然了,如果还看不懂真的得去闭门思过了(开玩笑~),耐心看一下上面的几张图,一定能看懂的。
如果要想求误差E对w1的导数,误差E对w1的求导路径不止一条,这会稍微复杂一点,但换汤不换药,计算过程如下所示:
至此,“反向传播算法”及公式推导的过程完毕!
参考文献: