两种反向传播理解思路的统一

在我学习反向传播算法的时候,我接触了两种不同类型的阐述方式,一种是Michael Nielsen和Andrew Ng的(以下简称N2),他们的推导过程几乎一样。另一种是CS231n中基于链式法则的。这两个虽然我都明白,但是总觉得好像差别有点大,或者说既然他们说的是一个东西,那么肯定能在某一种层次上它们说的能统一在一起。为了寻找它们的统一,下面是我的一些思考。

先从“反向传播”这个名字说起

“反向传播”这个名字我觉得就起的相当不好。容易让人望文生义。接触机器学习这么长时间,反反复复的碰到反向传播,到今天已然觉得名字啥的不重要了,我们学习反向传播学习的是一种求梯度思想方法。我们想求解一个函数对于其中任何一个自变量的梯度,当这个函数的表达式非常的复杂的时候(多层嵌套,多个变元),如何简单的进行求解,“反向传播”这个名词想表达的是这样一个东西。
我猜测之所以会起“反向传播”这个名字,可能是想和“前向传播”这个名字对应起来。而‘前向传播’说的啥?前向传播的本质是当自变量值确定的时候,计算整个函数表达式的值(计算个表达式的值还搞得这么故弄玄虚)。而“反向传播”的本质是求函数的梯度,这两除了名字上形成对仗关系以外没啥别的关系。

反向传播,传播的是啥

好吧,我们假定“反向传播”不是故弄玄虚,而真的是在神经网络结构,逆着“前向传播”的方向传播了点东西,那么这个东西是什么?是“误差”还是“梯度”?
这个问题其实也没那么重要,主要看你哪种图形为基准。如果你是以计算图为基准的话,那么传播的是“梯度”,如果你是以多层感知机为基准的话,那么传播的就是误差。
说道这里我觉得“误差”这个说法不严谨,正确来说这里的误差并不是真正意义上的误差(真值和计算值之间的距离),其实这里的误差,准确的来说是“误差的敏感程度”。
这里Michael Nielsen在他那本深度学习中费了一些笔墨解释这个事情,还拿出了小精灵说事,但是其实他就想说,“梯度体现了误差的敏感程度”,“在这个算法里,我们用误差来代指误差敏感度”。所以本质上来说反向传播的实体是梯度啦。

我们思考问题的时候到底是用“计算图”模型还是用“多层感知机”模型

我们知道反向传播的理论基础就是链式求导法则。如果从纯数学的角度上来看,对我们某一个函数使用链式法则,很自然的就以这个函数表达式的计算过程图形化,这个就是计算图模型。而多层感知机本质上也是一种计算图,只是它为了突出神经元的结果,或者说为了模拟生物神经结构而形成的一种特殊的计算图,可以把神经元看成包含两步运算节点(第一步是计算输入,第二步是计算激励),而如果我们利用计算图模型,我们在一个节点上只会赋予一种操作。
而且我们利用计算图的时候,我们是以损失函数为基准的,直接将损失函数的完整形式计算图化。而多层感知机模型表示的仅仅是hypothesis,相对于损失函数,它的缺少一个真值和预测值求差的一步。这就是为什么Nielsen以及Ng的教程里,第一步都是先求error。
如果“多层感知机”模型加上求error的这一步本质上它和计算图模型是一样的。

那么这两种理解思路能否统一呢?

关于我一开始的疑问——如何将CS231n和N2统一起来——我在花书中并没有找到直接的答案。但是这两中方法书上都介绍了,它是以这样一个方式来组织编排的:

  1. 先给了计算图模型——这个是辅助我们思考的工具
  2. 介绍了链式法则的集中形式——标量形式、矩阵形式、张量形式
  3. 给出了第一版BP算法,它其实就是利用动态规划的方法实现链式法则。之所以能够利用动态规划来实现计算是因为链式法则本身具有这样一种结构——就是某一个自变量上的梯度,只和它的本地梯度与上游传递下来的梯度这两个因素有关(等于这两个部分之积)——这个洞见在CS231n上解释的非常清楚。当然这个版本的算法也做了一些简化假设,就是认为,最后的输出结果是一个标量,中间产生的结果也是标量,全程标量。
  4. 之后在多层感知机的框架下再次给出了一版BP算法(可以看成上述形式在多层感知机模型下的特化)
  5. 最后给出了BP的一般形式。我觉得这个一般形式就是在第一版的基础上将原来的标量换成张量,而且还引入了一些get_operation(),get_omsumers()这样的操作,显得更像一个计算机算法了。

通过上述的分析,如果非要把这N2和CS231n的两种思路统一起来的话,那就基于多层感知机框架的BP算法是基于链式法则BP算法的一种特化形式(因为MLP就是一种特殊的计算图嘛),没了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
神经网络反向传播(Backpropagation)是一种常用的训练神经网络的算法,其主要思想是通过计算神经网络输出误差,并将误差传递回神经网络中进行参数更新,从而不断优化神经网络的性能。 反向传播算法的主要过程如下: 1. 前向传播:将输入数据送入神经网络,按照从输入层到输出层的顺序依次计算每个神经元的输出值。 2. 计算误差:将神经网络输出的结果与真实标签值进行比较,计算输出误差。 3. 反向传播:将输出误差反向传播回神经网络中,计算每个神经元的误差贡献,然后根据误差贡献更新神经元的参数。 4. 重复迭代:不断重复以上步骤,直到神经网络的性能达到预期要求为止。 具体来说,反向传播算法是通过链式法则(Chain Rule)实现误差反向传播的。在网络的每一层中,根据链式法则可以将误差贡献分解为上一层误差贡献和当前层神经元的激活函数对权重的导数乘积的和。然后,根据误差贡献和权重的导数,可以更新当前层的神经元权重和偏置值,从而不断优化神经网络的性能。 理解反向传播算法需要掌握数学知识,包括微积分、矩阵求导、链式法则等。同时,还需要对神经网络模型的结构和参数有一定的了解。通过不断练习和实践,可以逐渐掌握反向传播算法的原理和实现方法,并应用到实际的神经网络模型中进行训练和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值