百科问答小站 logo
百科问答小站 font logo



如何直观地解释 backpropagation 算法? 第1页

  

user avatar   frombeijingwithlove 网友的相关建议: 
      

更新于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   du-ke 网友的相关建议: 
      

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

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

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

回答完毕。


user avatar   evanhoo 网友的相关建议: 
      

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   wang-gu-30 网友的相关建议: 
      

直接上干货,

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   ren-min-you-dian-chu-ban-she-19 网友的相关建议: 
      

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在未来发挥更大的作用。

关联阅读

========

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

一键三连,感恩有你~




  

相关话题

  从今年校招来看,机器学习等算法岗位应届生超多,竞争激烈,未来 3-5 年机器学习相关就业会达到饱和吗? 
  transformer 为什么使用 layer normalization,而不是其他的归一化方法? 
  如何评价深度学习相关顶级期刊论文难复现的问题? 
  全连接层的作用是什么? 
  如何看待NVIDIA 即将开源的DLA? 
  2019 秋招的 AI 岗位竞争激烈吗? 
  如何评价Momenta ImageNet 2017夺冠架构SENet? 
  如何看待 TI7 上与 Dendi solo 的 OpenAI? 
  算法工程师的落地能力具体指的是什么? 
  如何看待旷视科技新产品监视学生上课? 

前一个讨论
学医的吃脏器比如卤煮是什么感受?
下一个讨论
程序员到底有多累、多辛苦?





© 2024-05-18 - tinynew.org. All Rights Reserved.
© 2024-05-18 - tinynew.org. 保留所有权利