问题

如何直观地解释 backpropagation 算法?

回答
好的,我们来用一个尽可能直观和详细的方式解释反向传播(Backpropagation)算法。想象一下,我们正在教一个孩子学习识别猫咪的图片。反向传播就是帮助这个“学习过程”找到方向的秘诀。

1. 机器学习的“大脑”:神经网络

首先,我们需要了解神经网络是什么。你可以把它想象成一个模仿我们大脑神经元连接方式的计算模型。

神经元 (Neuron): 就像我们大脑里的一个思考单元。它接收来自其他神经元的信号,经过一些计算后,再将自己的信号传递给下一个神经元。
连接 (Connection): 就像神经元之间的“电线”,传递信号。每条连接都有一个“权重”(Weight),这个权重决定了信号传递过来时会被放大多少或减弱多少。
层 (Layer): 神经元被组织成不同的层。
输入层 (Input Layer): 接收最原始的数据,比如猫咪图片的像素点颜色值。
隐藏层 (Hidden Layers): 在输入层和输出层之间,进行复杂的计算和特征提取。可以有一层或多层。
输出层 (Output Layer): 给出最终的预测结果,比如“是猫咪”或者“不是猫咪”。

2. 学习的目标:让神经网络“猜对”

我们的目标是训练这个神经网络,让它在看到一张猫咪的图片时,能够准确地输出“是猫咪”。就像教孩子认猫一样,我们希望他看到猫咪就能说出“猫”。

3. 训练的过程:一步步优化

训练的过程就像是反复地给神经网络“看”图片,然后“告诉”它是否猜对了。

步骤 1:前向传播 (Forward Propagation) 第一次“猜”

1. 输入数据: 我们把一张猫咪的图片(分解成像素值)喂给输入层。
2. 信号传递: 每个输入层的神经元会把它的值乘以连接的权重,然后传递给下一层(隐藏层)的神经元。
3. 激活函数 (Activation Function): 每个隐藏层的神经元接收到所有来自前一层神经元的信号(乘以权重后的总和)后,会通过一个叫做“激活函数”的数学函数。这个函数的作用是引入非线性,让神经网络能够学习更复杂的模式,就像我们的大脑不是简单地把信息加起来一样。常见的激活函数有 ReLU、Sigmoid、Tanh 等。
4. 层层传递: 这个过程一层一层地重复,直到信号到达输出层。
5. 输出结果: 输出层也会有一个激活函数,然后给出它的“预测”结果。比如,它可能输出 0.7,表示它认为这张图片是猫咪的概率是 70%。

步骤 2:计算误差 (Calculating the Error) “猜得怎么样?”

我们知道这张图片 确实 是猫咪(我们给它喂的是猫咪图片),所以正确的输出应该是 1(代表“是猫咪”)。但神经网络第一次“猜”可能只是 0.7。

这时候,我们需要计算一个叫做“损失函数” (Loss Function) 的东西来衡量它猜得有多“差”。损失函数就是计算神经网络的“预测值”和“真实值”之间的差距有多大。

损失函数举例: 均方误差 (Mean Squared Error, MSE) 是一个常见的例子。它的计算方式是: `(真实值 预测值)²`。
如果预测是 0.7,真实值是 1,那么误差就是 `(1 0.7)² = 0.3² = 0.09`。这个误差值越小,说明神经网络猜得越准。

步骤 3:反向传播 (Backpropagation) “哪里出了错?该怎么调整?”

现在,我们知道了神经网络“猜错了”,并且知道错的“程度”。但我们怎么让它下次猜得更好呢?这就需要反向传播出场了。

反向传播的核心思想是:把输出层的误差,一层一层地“传回去”,找出每一层、每一个连接(权重)对这个误差“贡献”了多少,然后根据这个“贡献度”来调整权重。

想象一下,你有一个由很多齿轮组成的机器。你发现最终输出的那个东西不对劲,你想知道是哪个齿轮出了问题,以及需要怎么转动它才能修正。反向传播就是找出这个问题齿轮(权重)的方法。

具体怎么做呢?

1. 从输出层开始:
我们知道输出层的预测值和真实值之间的误差。
我们还知道输出层使用的激活函数。
反向传播会利用“链式法则”(Calculus Chain Rule)来计算: 输出层的误差是由输出层神经元的“加权总和”引起的,而这个加权总和又是由上一层(最后一个隐藏层)的输出以及连接它们的权重引起的。
目标: 计算 “误差关于权重” 的导数(Gradient)。导数在这里表示:如果我们稍微改变一个权重,误差会怎么变化。

2. 逐层向前传递(反向地):
一旦我们计算出输出层权重对最终误差的贡献(导数),我们就可以根据这个信息调整输出层到最后一个隐藏层之间的权重。
然后,我们将误差的“信息”(或者说是误差的“梯度”)“传递”到上一个隐藏层。
对于每个隐藏层,我们重复这个过程:
接收来自下一层(更靠近输出层那一层)的误差信息。
利用该层神经元的激活函数。
计算该层权重对误差的“贡献”(导数)。
根据导数调整该层的权重。
将误差信息传递给更前一层。

核心数学原理:链式法则

链式法则在这里扮演着至关重要的角色。它允许我们将一个复杂的、多层嵌套的函数(整个神经网络的计算过程)的导数,分解成一系列简单的导数相乘。

假设我们的损失函数是 `L`,输出层神经元的加权总和是 `z_out`,输出层的激活函数是 `a_out = f(z_out)`,那么误差就是 `L(a_out, y_true)`,其中 `y_true` 是真实值。

反向传播要计算的是 `∂L/∂w`,其中 `w` 是某个权重。通过链式法则,我们可以写成:

`∂L/∂w = (∂L/∂a_out) (∂a_out/∂z_out) (∂z_out/∂w)`

`∂L/∂a_out`: 损失函数关于输出层输出的导数。这告诉我们输出层的输出变化一点点,整个损失会怎么变。
`∂a_out/∂z_out`: 输出层激活函数关于其输入的导数。这告诉我们激活函数本身如何响应其输入的变化。
`∂z_out/∂w`: 输出层的加权总和关于权重的导数。这个最简单,因为 `z_out` 是 `w input` 的线性组合,所以 `∂z_out/∂w` 就是该权重连接的输入值。

通过将这些导数相乘,我们就能得到误差关于特定权重的导数。对于隐藏层的权重,这个链条会更长,但原理是相同的。

步骤 4:更新权重 (Weight Update) “微调,再微调”

有了每个权重的导数(也就是误差对权重的敏感度),我们就可以更新权重了。

更新规则: `新权重 = 旧权重 学习率 导数`
学习率 (Learning Rate): 这是一个超参数(由我们设定),它决定了每次更新权重的“步长”有多大。学习率太小,训练会很慢;学习率太大,可能会错过最佳权重,导致训练不稳定。

步骤 5:重复!重复!重复!

我们将这张猫咪图片(或者其他图片)经过前向传播、计算误差、反向传播、更新权重。然后,再用下一张图片重复这个过程。

通过成千上万甚至数百万次的重复,神经网络的权重会逐渐被调整到最佳状态,使得它在看到猫咪图片时,前向传播的结果越来越接近“是猫咪”(例如,输出值接近 1),而误差也越来越小。

总结一下反向传播的直观理解:

1. “猜”一次 (Forward Pass): 喂数据,让神经网络跑一圈,得出预测结果。
2. “算账” (Calculate Loss): 看看预测结果和真实答案差了多少。
3. “追责” (Backpropagate Error):
从结果的“错误”出发,像剥洋葱一样,一层一层往回“追溯”每一处计算(特别是权重)对这个错误“贡献”了多少。
这个“追溯”过程利用了数学的“链式法则”,计算出“误差对权重的导数”。
4. “调整” (Update Weights):
根据“谁贡献的错误多,谁就多调整”的原则,利用导数(以及学习率)来微调各个连接的权重。
目标是让下一次的“猜”能更接近真实答案。
5. “循环往复” (Iterate): 重复以上过程,直到神经网络“猜”得足够好为止。

反向传播算法就像是一个非常高效的“学习指导员”,它能精确地告诉神经网络的每一个连接点该如何调整自己的“发力程度”,以最小化最终的错误。这个算法是现代深度学习能够成功的基石。

网友意见

user avatar

更新于2016年10月7日:

国庆回来发现这答案有200多赞了,并且有带疑问的评论,有必要更新补充一下……

当初回答这个问题是因为2015年4月的时候,这个问题下的答案大都是“不就是链式求导法则嘛”这种一句话答案。我觉得这种答案对于提问题的人来说没有任何帮助,题主想要的是个直观的答案,所以就去搜了个直观的答案放在这里并注明了转载,然后就放在这里了。现在回过头来看看也不是很负责任。

首先说这个图解的优点:先形象说明了forward-propagation,然后说明了error backward-propagation,最后根据误差和梯度更新权重。没错这是backprop,又非常直观,但是从前的backprop了。

backprop的发展路线大概是,1974年有个Harvard博士生Paul Werbos首次提出了backprop,不过没人理他,1986年Rumelhart和Hinton一起重新发现了backprop,并且有效训练了一些浅层网络,一下子开始有了名气。那个时候的backprop从现在看来并不是个很清晰的概念,把梯度和更新一块打包了,从这点看来和我贴出来的图是一回事。如果有看过mitchell机器学习教材的同学可能也会觉得下面的图眼熟。

随着神经网络的继续发展,到了深度学习大行其道的今天,更新权值的思路其实变得更简单粗暴了。概括一下就是,把原来打包式的做法拆开成了1)求梯度;2)梯度下降。所以现在我们再提到backprop,一般只是指第一步:求梯度。这就是为什么好多答案直接说就是个链式法则,因为确实就是链式法则。

不过个人觉得还是有可以直观理解的一些点:

1)链式法则的直观理解的,之所以可以链式法则,是因为梯度直观上理解就是一阶近似,所以梯度可以理解成某个变量或某个中间变量对输出影响的敏感度的系数,这种理解在一维情况下的直观帮助可能并不是很大,但是到了高维情况,当链式法则从乘法变成了Jacobian矩阵乘法的时候,这个理解起来就形象多了。神经网络中的链式法则恰好都几乎是高维的。

2)Computational graph。最高票答案和

@龚禹pangolulu

的答案中都有提到,就不赘述,其实就是计算代数中的一个最基础办法,从计算机的角度来看还有点动态规划的意思。其优点是表达式给定的情况下对复合函数中所有变量进行快速求导,这正好是神经网络尤其是深度学习的场景。现在主流深度学习框架里的求导也都是基于Computational Graph,比如theano,torch和tensorflow,Caffe也可以看做是computaiona graph,只不过node是layer。

总结:图中的确实是backprop,但不是深度学习中的backprop,不过backward的大体思想是一样的,毕竟误差没法从前往后计算啊。

=========== update: 2016.10.7 ===========

原答案:

这大概是题主想要的吧(多图):

源地址:

http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html
user avatar

各位知友好:我们CS231n翻译团队今天完成了斯坦福深度学习课程:CS231n针对视觉识别的卷积神经网络的官方课程讲义:

CS231n课程笔记翻译:反向传播笔记 - 智能单元 - 知乎专栏

该讲义详细、完整和直观地对反向传播进行了解释,欢迎知友们阅读和批评指正。

回答完毕。

user avatar

BackPropagation算法是多层神经网络的训练中举足轻重的算法。

简单的理解,它的确就是复合函数的链式法则,但其在实际运算中的意义比链式法则要大的多。

要回答题主这个问题“如何直观的解释back propagation算法?” 需要先直观理解多层神经网络的训练。

机器学习可以看做是数理统计的一个应用,在数理统计中一个常见的任务就是拟合,也就是给定一些样本点,用合适的曲线揭示这些样本点随着自变量的变化关系。

深度学习同样也是为了这个目的,只不过此时,样本点不再限定为(x, y)点对,而可以是由向量、矩阵等等组成的广义点对(X,Y)。而此时,(X,Y)之间的关系也变得十分复杂,不太可能用一个简单函数表示。然而,人们发现可以用多层神经网络来表示这样的关系,而多层神经网络的本质就是一个多层复合的函数。借用网上找到的一幅图[1],来直观描绘一下这种复合关系。

其对应的表达式如下:

上面式中的Wij就是相邻两层神经元之间的权值,它们就是深度学习需要学习的参数,也就相当于直线拟合y=k*x+b中的待求参数k和b。

和直线拟合一样,深度学习的训练也有一个目标函数,这个目标函数定义了什么样的参数才算一组“好参数”,不过在机器学习中,一般是采用成本函数(cost function),然后,训练目标就是通过调整每一个权值Wij来使得cost达到最小。cost函数也可以看成是由所有待求权值Wij为自变量的复合函数,而且基本上是非凸的,即含有许多局部最小值。但实际中发现,采用我们常用的梯度下降法就可以有效的求解最小化cost函数的问题。

梯度下降法需要给定一个初始点,并求出该点的梯度向量,然后以负梯度方向为搜索方向,以一定的步长进行搜索,从而确定下一个迭代点,再计算该新的梯度方向,如此重复直到cost收敛。那么如何计算梯度呢?

假设我们把cost函数表示为

, 那么它的梯度向量[2]就等于

, 其中

表示正交单位向量。为此,我们需求出cost函数H对每一个权值Wij的偏导数。而BP算法正是用来求解这种多层复合函数的所有变量的偏导数的利器

我们以求e=(a+b)*(b+1)的偏导[3]为例。

它的复合关系画出图可以表示如下:

在图中,引入了中间变量c,d。

为了求出a=2, b=1时,e的梯度,我们可以先利用偏导数的定义求出不同层之间相邻节点的偏导关系,如下图所示。

利用链式法则我们知道:

以及

链式法则在上图中的意义是什么呢?其实不难发现,

的值等于从a到e的路径上的偏导值的乘积,而

的值等于从b到e的路径1(b-c-e)上的偏导值的乘积加上路径2(b-d-e)上的偏导值的乘积。也就是说,对于上层节点p和下层节点q,要求得

,需要找到从q节点到p节点的所有路径,并且对每条路径,求得该路径上的所有偏导数之乘积,然后将所有路径的 “乘积” 累加起来才能得到

的值。

大家也许已经注意到,这样做是十分冗余的,因为很多路径被重复访问了。比如上图中,a-c-e和b-c-e就都走了路径c-e。对于权值动则数万的深度模型中的神经网络,这样的冗余所导致的计算量是相当大的。

同样是利用链式法则,BP算法则机智地避开了这种冗余,它对于每一个路径只访问一次就能求顶点对所有下层节点的偏导值。

正如反向传播(BP)算法的名字说的那样,BP算法是反向(自上往下)来寻找路径的。

从最上层的节点e开始,初始值为1,以层为单位进行处理。对于e的下一层的所有子节点,将1乘以e到某个节点路径上的偏导值,并将结果“堆放”在该子节点中。等e所在的层按照这样传播完毕后,第二层的每一个节点都“堆放"些值,然后我们针对每个节点,把它里面所有“堆放”的值求和,就得到了顶点e对该节点的偏导。然后将这些第二层的节点各自作为起始顶点,初始值设为顶点e对它们的偏导值,以"层"为单位重复上述传播过程,即可求出顶点e对每一层节点的偏导数。

以上图为例,节点c接受e发送的1*2并堆放起来,节点d接受e发送的1*3并堆放起来,至此第二层完毕,求出各节点总堆放量并继续向下一层发送。节点c向a发送2*1并对堆放起来,节点c向b发送2*1并堆放起来,节点d向b发送3*1并堆放起来,至此第三层完毕,节点a堆放起来的量为2,节点b堆放起来的量为2*1+3*1=5, 即顶点e对b的偏导数为5.

举个不太恰当的例子,如果把上图中的箭头表示欠钱的关系,即c→e表示e欠c的钱。以a, b为例,直接计算e对它们俩的偏导相当于a, b各自去讨薪。a向c讨薪,c说e欠我钱,你向他要。于是a又跨过c去找e。b先向c讨薪,同样又转向e,b又向d讨薪,再次转向e。可以看到,追款之路,充满艰辛,而且还有重复,即a, b 都从c转向e。

而BP算法就是主动还款。e把所欠之钱还给c,d。c,d收到钱,乐呵地把钱转发给了a,b,皆大欢喜。

------------------------------------------------------------------

【参考文献】

[1]

技术向:一文读懂卷积神经网络CNN

[2]

Gradient

[3]

colah.github.io/posts/2

其他推荐网页:

1.

tensorflow.org 的页面

2.

Neural networks and deep learning
user avatar

直接上干货,

Neural networks and deep learning

(深度学习在线书chap2),把这一篇看完然后可以看看torch7的nn里面随便一个层的写法,或者caffe的Backward的实现,这两种框架都是按照layer-by-layer的方法设计的。另外比较灵活的一种方式是通过定义computation graph,通过定义节点上基本操作的梯度,然后利用auto differentiation的思路就可以进行BP了(Tensorflow和MXNet的采用的思路)。

z为没经过激活函数的输出,a是经过激活函数的输出。

定义损失函数(Cost)关于 l 层输出z的偏导为:

则可以得到BP的4个基本方程:

该在线书上有关于前两个公式的证明的推导,仿照着利用chain rule,后两个公式也可以很简单地证明出来。

另外贴一下BP算法和mini-batch SGD的算法:

BP:

----

mini-batch SGD:

BP算法最开始的发现是基于每个权重(weight)或者偏置(bias)的微小改变都能引起输出的改变,于是就进一步产生了用Cost对于这些参数的导数来更新w,b,进而达到改进输出的目的。

这里一种很直接的思路就是直接求Cost关于每个参数的导数(比如 [C(w+dw)-C(w)]/dw 这种数值微分),但是这种方法需要进行参数个数量次的Backward过程,计算代价很大。BP算法的提出就是为了优雅地解决这一问题,它只需要一次Backward就能将误差传到每一个可学的参数(w,b)。

(以上,该在线书的部分搬运,如需进一步阅读,直接戳原网址。以及进一步可参见相关框架的源码和实现细节)

PS:最近才比较深入理解BP,欢迎批评指正。

user avatar

Backpropagation(反向传播)缩写为BP,是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)相结合使用的、目前训练人工神经网络的常见方法。

反向传播算法的基本思想是,学习过程由信号的正向传播和误差的反向传播两个过程组成,输入从输入层输入,经隐层处理以后,传向输出层。如果输出层的实际输出和期望输出不符合,就进入误差的反向传播阶段。

误差反向传播是将输出误差以某种形式通过隐层向输入层反向传播,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,这个误差信号就作为修正各个单元权值的依据,直到输出的误差满足一定条件或者迭代次数达到一定次数。

与机器学习里面最基本也非常有用的算法LMS学习规则一样,反向传播近似最速下降算法,该方法对网络中所有权重计算损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。

反向传播要求对每个输入值想得到的已知输出,来计算损失函数梯度。因此,它通常被认为是一种监督式学习方法,虽然它也用在一些无监督网络(如自动编码器)中。它是多层前馈网络的Delta规则(英语:delta rule)的推广,可以用链式法则对每层迭代计算梯度。反向传播要求人工神经元(英语:artificial neuron)(或“节点”)的激励函数可微。

LMS算法和反向传播之间的区别仅在于计算导数的方式。

对于单层线性网络来说,误差是网络权重的显式线性函数,其相对于权重的导数可以很容易地计算出来。在具有非线性传递函数的多层网络中,网络权重与误差之间的关系更为复杂。为了计算权重的导数,需要使用微积分的链式法则。

《深度学习原理与实践》的书中有这样一个例子。

如图所示,假设神经网络中的一个参数 发生了小幅度的改变,那么这个改变将会影响后续激活值的输出,下一层根据这个激活值继续往后传递该改变。如此一层一层地往后传递,直到损失函数接收到该改变为止。最终这个小幅度的改变影响了整个网络,犹如在水面上划了一下,水波向外扩散影响了整个湖面的平静。

为了知道这个改变的幅度,我们选择从网络的最后一层(输出层)开始,利用损失函数向前求得每一层每一个神经元的误差,从而获得这个参数的梯度(原始的小幅度的改变值)。

由于神经网络的结构模型复杂——多层网络进行排列堆叠,如何合理计算损失函数的梯度是一个严峻的挑战。

梯度下降算法从整体出发,求得网络中参数的梯度后对参数进行更新,而如何求得网络参数的梯度则是反向传播算法需要做的事情。

虽然在神经网络中,求网络参数的梯度不一定使用反向传播算法,并且反向传播算法有收敛慢、容易陷入局部最小解等缺点,但是其易用性、准确率却是其他求解梯度算法无法比拟的。因此在现代神经网络中,反向传播算法被广泛使用。为了便于理解反向传播算法,《深度学习原理与实践》中还举了这样的例子:

现在有一个口述绘画游戏,第1个人看一幅画(输入数据), 描述给第2个人(隐层)……依次类推,到最后一个人(输出)的时候,画出来的画肯定与原画不太像(误差较大)。下面开始反向传播算法,我们把画拿给最后一个人看(计算损失函数), 然后最后一个人告诉前面一个人下次描述时需要注意哪些地方画错了(通过损失计算梯度)……同样依次类推,直到第1个人。

当然该例子可能会与真正的反向传播算法有一定的差别,下面我们来看其数学定义。

假设神经网络模型的参数为 ,那么反向传播算法的精髓是:通过链式求导法则,求出网络模型中的每个参数的导数 和 。

由于神经网络模型结构复杂,随着网络层数和节点数的增加,网络中的参数也会越来越多。为了便于计算机对神经网络中的参数进行跟踪和存储记录,我们可以通过计算图(Computation Graph) 来对反向传播算法进行初步理解。

1. 理解计算图

计算图可以看作一种用来描述计算函数的语言,图中的节点代表函数的操作,边代表函数的输入。如图所示,计算图的函数为:

反向传播算法希望通过链式法则得到式中 的各个参数的梯度: 、 、 。

假设 、 、 输入的数据分别是-5、2、-6,根据链式法则,我们可以得到式中的各个参数的梯度值为:

下图所示为单个神经元模型的计算图展开示例, 为神经元的输出, 和 分别为该神经元的输入, 为求和节点。

从图中可以看出,神经网络的反向传播算法就是利用计算图的原理,从网络的输出层开始,反向计算神经网络中每一个参数的梯度。然后通过梯度下降算法,以一定的学习率根据梯度下降算法的基本公式

对神经网络中的参数进行更新,接着运行一次向前传播算法,得到新的损失值。对上述步骤不断选代,就是整个神经网络训练的过程。

反向传播算法的计算方法跟计算图一样,其核心思想是通过链式求导法则,获得网络中每个参数的梯度。这里不再给出上图中的计算过程。

对于神经网络的学习,如果只强调求解、推导中的数学依据对理解算法是不利的。当然,不理解数学依据更加不利,我们关心的重点不仅仅是数学本身,而更应该关注其最核心的原理,简单的高数求导是建立深度学习的基础!

关于BP算法的详细推导可见《深度学习原理与实践》这本书。

当然,我们也可以把反向传播算法视为一个黑盒子,继续向下看。

2. 反向传播算法流程

利用反向传播算法的4个基本方程,可以很清晰地对反向传播算法流程进行总结。

  • 输入(Input) :输入层输入向量 。
  • 向前传播(Feed Forward) : 计算 。
  • 输出层误差(Output Error) : 根据公式BP1计算误差向量
  • 反向传播误差(Backpropagate Error) : 根据公式BP2逐层反向计算每一层的误差
  • 输出(Output) : 根据公式BP3和BP4输出损失函数的偏置。

在训练阶段,反向传播算法的工作方式就是把数据传入神经网络,然后经过一次向前传播后,得到每一层的输出数据。接着开始从输出层往前计算每一层的误差,直到第一层(输入层)为止。最后根据每一层的误差数据计算每一个损失函数关于偏置和权重参数的偏导,而这个偏导就是网络中参数的变化率。

有了这个变化率之后,我们就可以利用梯度下降算法更新一次网络中的参数。如此循环迭代,利用反向传播算法来求得网络参数的变化率,并用于更新网络的参数,最终使得损失函数收敛到局部最小值,训练阶段结束。

3. 反向传播算法的实现

在实现反向传播算法之前,我们需要定义神经网络的模型架构,即神经网络有多少层、每一层有多少神经元。另外,还需要给出神经网络定义训练的数据和实际的输出。

在下面代码中, network sizes为用于测试的神经网络的模型架构,该网络一共有3层,输入层有3个神经元,隐层有4个神经元,输出层有2个神经元,如图所示。

接着我们根据网络模型的大小,利用高斯分布函数的权重参数 weights 和偏置参数 biases 产生均值为0、方差为1的随机值。(我们这里使用简单的高斯分布即可)

为了方便反向传播算法流程的代码实现,在下面代码中,我们对损失函数、激活函数和激活函数的求导进行了定义。损失函数使用了均方误差

作为该神经网络的损失函数,因此求导后的输入分别为网络的预测值和真实输出值,输出为两者之差,另外,激活函数使用了 Sigmoid函数。

完成了对神经网络模型的架构定义和一些辅助函数之后,剩下的是下面代码中的反向传播算法的核心实现,按照上文中的反向传播算法流程实现。

backprop()函数的输入为x和y, 其中x为(3, 1) 的矩阵,y为(2, 1) 的矩阵。根据反向传播算法的4个基本公式(BP1~BP4) 的计算中需要知道每一层神经元的激活值和加权输入值,因此在进行向前传播时,分别使用activations 记录每一层的激活值和 zs 记录每一层的加权输入值。

接下来是反向传播函数的核心代码,实现4个基本公式。既然是反向传播,那么我们首先从输出层 进行计算,因此先计算输出层的误差,然后计算损失函数关于输出层 中的偏置和权重参数的偏导。最后的循环为 range (2,num_layers) , 意思是从网络的倒数第二层开始,往前计算第 层的损失值,以及损失函数关于第 层的偏置和权重参数的偏导。最后输出一次反向传播后,得到关于损失函数的所有参数的偏导。

详情可见《深度学习原理与实践》第二章人工神经网络 第2.3.3小节 反向传播算法

虽然BP神经网络有三个非常显著的优点:

  1. 非线性映射能力;
  2. 泛化能力;
  3. 容错能力;允许输入样本中带有较大误差甚至个别错误。反应正确规律的知识来自全体样本,个别样本中的误差不能左右对权矩阵的调整。

不过BP神经网络也有着较为明显的缺陷。

例如需要的参数过多,而且参数的选择没有有效的方法。确定一个BP神经网络需要知道网络的层数、每一层神经元的个数和权值。

再例如权值可以通过学习得到,如果隐层神经元数量太多会引起过学习,如果隐层神经元个数太少会引起欠学习。此外学习率的选择也是需要考虑。目前来说,对于参数的确定缺少一个简单有效的方法,所以导致算法很不稳定。

并且BP神经网络属于监督学习,对于样本有较大依赖性,网络学习的逼近和推广能力与样本有很大关系,如果样本集合代表性差、样本矛盾多、存在冗余样本,网络就很难达到预期的性能。

最后由于权值是随机给定的,所以BP神经网络具有不可重现性。

目前针对算法的不足,也出现了一些例如动量法、调节学习率法等BP算法的改进。不过backpropagation仍还有许多需要我们探索的部分。

十分期待backpropagation在未来发挥更大的作用。

关联阅读

========

赠人玫瑰,手留余香,不要忘记点赞、收藏、关注 @人民邮电出版社 哦!

一键三连,感恩有你~

类似的话题

  • 回答
    好的,我们来用一个尽可能直观和详细的方式解释反向传播(Backpropagation)算法。想象一下,我们正在教一个孩子学习识别猫咪的图片。反向传播就是帮助这个“学习过程”找到方向的秘诀。 1. 机器学习的“大脑”:神经网络首先,我们需要了解神经网络是什么。你可以把它想象成一个模仿我们大脑神经元连接.............
  • 回答
    想象一下,你正在收集世界上所有的“可能”我们先别急着聊数学,咱们来点接地气的。你有没有过这样的感觉,想把一件事情的所有可能性都揽入怀中,摸个透透彻彻?比如,你想了解所有的“幸福”。你可能会想到阳光下灿烂的笑容,听到一首触动心弦的歌,吃到美味的食物,或者被爱人拥抱。这些都是“幸福”的例子,它们分散在生.............
  • 回答
    好的,我们来试着从不同的角度,用更直观的方式来理解“共轭”这个概念。共轭是一个在很多数学和物理领域都非常重要的概念,但初次接触时可能会觉得有些抽象。我会尽量从大家可能熟悉的点出发,层层递进地解释。核心思想:共轭意味着一种“匹配”或“配对”的关系,它们在一起能“完成”或者“简化”某个过程,或者在某种意.............
  • 回答
    想象一下,在距今两千多年前,有一个帝国,它没有互联网,没有飞机,甚至连现代的电话都没有。但它却能将它的疆域扩张到横跨欧洲、北非和中东,管理着数以亿计的人口,建立起至今仍被奉为圭臬的法律、工程和管理体系。这就是古罗马,一个强大到令人难以置信的文明。我们该如何直观地感受这份强大呢?1. 疆域的压迫感:一.............
  • 回答
    信号中的复数:一双“透视眼”,让你看到波动的“隐秘世界”我们平时看到的信号,比如收音机里的声音、手机里的电话信号,或者是电网里的电流,似乎都是实实在在的、可以用一个数值来描述的。比如,声音的响度、电话信号的强度、电流的大小。然而,在信号处理的专业领域,复数却扮演着一个至关重要的角色。这不禁让人好奇,.............
  • 回答
    光速,这个词听起来就带着一种超越一切的神秘感。我们都知道它是一个极高的数字,但究竟有多快?如何才能真正体会到它?如果我跟你说,光速其实并不遥远,甚至就在我们身边,你信吗?咱们就从最贴近生活的例子聊起。第一步:点亮你的世界——熟悉身边的光速你有没有想过,你看到的太阳,它其实已经是一颗“迟到”了八分钟的.............
  • 回答
    说到汉朝的强大,真不是一句两句能说清楚的。这得从方方面面来看,让你能真切地感受到,那时的中国,是何等的意气风发,威震四方。先说说咱们的老祖宗,是如何把一个国家打造成这般模样。汉朝的强大,首先体现在它统一而又巩固的政权。话说,秦朝虽然统一了天下,但二世而亡,根基不稳。到了汉初,刘邦吸取了秦朝灭亡的教训.............
  • 回答
    好的,咱们今天就来聊一个挺有意思的数学小秘密:为什么前 n 个自然数的立方和,会等于这 n 个自然数之和的平方?别看这句话听着有点绕,其实它的背后藏着一个很巧妙的几何解释,或者说是一个“积木搭积木”的故事。咱们就从最简单的情况开始,一点点地把它说透。从最简单的开始:1 的情况咱们从最简单的情况入手。.............
  • 回答
    群论,听起来是不是有点高大上,仿佛是数学家们才能触及的深奥领域?但其实,你每天都在不自觉地运用它,只是不知道它的名字而已。今天,咱们就来聊聊这个神奇的“群”,让你不仅听懂,还能体会到它背后那份简洁而强大的逻辑。想象一下,我们要做一件事情,就是变换。什么叫变换?最直观的就是你手中的这支笔。你可以: .............
  • 回答
    要直观地感受中国人口的庞大,我们可以从很多方面入手。这不仅仅是一个数字上的概念,更是渗透在我们生活方方面面的真实体验。1. “人山人海”的日常景象:首先,最直接的感受就是每天都在经历的“人山人海”。 交通出行: 想象一下你在北京、上海这样的大城市上下班高峰期乘坐地铁或公交的情景。车厢里挤得几乎没.............
  • 回答
    好的,咱们来好好聊聊这个阿贝尔变换恒等式,争取说得明明白白,让你觉得像是跟一个老朋友唠嗑一样,而不是在看什么冰冷的代码生成。咱们先从名字说起:阿贝尔变换恒等式。听起来是不是有点绕?“阿贝尔”是个名字,一位伟大的数学家。至于“变换”和“恒等式”,你可以先简单理解为:它是一种“换一种方式看问题,但结果不.............
  • 回答
    想象一下,你站在一座连绵起伏的山丘上。这座山丘的高度,可以看作是我们今天要讲的“函数”的值。它在你脚下,是你所在位置的“海拔”。方向导数:顺着某个特定方向“爬坡”或“下山”的速度现在,你想从你当前所在的位置,往某个特定方向走。这个方向可以是正东,可以是东北,也可以是任何一个你指向的角度。 方向导.............
  • 回答
    要深刻理解明朝文官与武将之间地位的巨大差异,我们不妨从几个最直观的层面去感受,仿佛我们身临其境,置身于那个时代的社会肌理之中。这不仅仅是简单的官职高低,更是一种深入骨髓的文化烙印和社会价值取向。一、 “士农工商”的阶层烙印:读书人的天生优越感首先,我们得明白明朝社会那套根深蒂固的“士农工商”等级制度.............
  • 回答
    咱今天就来聊聊“相位”这玩意儿,别被这词儿听着有点绕,其实一点都不神秘。打个比方,相位就像是音乐里的节拍,或者是一段舞蹈里的动作顺序,它告诉你一个事物在周期性变化过程中,它所处的位置和进度。相位是个啥?想象一下,你现在正在跟着一首特别喜欢的歌摇摆身体。这首歌有节奏,有起伏,就像我们生活中的很多事情一.............
  • 回答
    “优雅而又直白地夸赞别人”是一种艺术,它既能让对方感受到你的真诚赞美,又不会显得唐突或虚伪。以下是一些详细的指导,帮助你掌握这一技巧: 核心原则:真诚、具体、适时在深入细节之前,牢记这三个核心原则至关重要: 真诚(Sincerity): 夸赞必须发自内心。如果你内心并没有这种感受,即使说得再好听.............
  • 回答
    .......
  • 回答
    哥们,这事儿确实得拿捏好。直男夸人帅,关键在于你的语气、眼神和整体表达出来的那股“哥们儿之间的欣赏”,而不是那种小心翼翼、含情脉脉的崇拜。要的就是那种“哥们儿觉得你这身打扮或者这人挺有型,特爷们儿”的感觉。首先,别老盯着人家脸看。夸人帅,不是说你把他当成艺术品一样细细品鉴。你可以从整体上入手,比如他.............
  • 回答
    朋友圈最近被这句话刷屏了:“嘴不饶人心地善,心不饶人嘴上甜;心善之人敢直言,嘴甜之人藏谜奸”。这话说得倒是挺有意思,也挺挠人心的,似乎把人际交往的很多情况都给概括了。不过,细细一想,这事儿也不能这么绝对下定论。咱们不妨一点点地拆解开来,看看有没有什么不周全的地方。首先,看看“嘴不饶人心地善”和“心不.............
  • 回答
    .......
  • 回答
    苏联与中国之间关于领土的问题,是一个复杂且敏感的历史话题。要清晰地回答这个问题,需要区分“直接侵占”与“间接影响”以及历史上的不同时期。直接侵占(早期):历史上的确存在过苏联(或其前身俄罗斯帝国)直接侵占中国领土的情况,这主要发生在19世纪,并且是在清朝国力衰弱,对外无力有效管控边疆的时期。 《.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有