反向传播会影响 variable嘛_包你一看就会,详解深度学习反向传播算法,面试不再慌...

点击上方蓝字,关注并星标,和我一起学技术。

e219562c85a12e5d91a00e6a05398156.png

大家好,今天和大家聊聊深度学习当中的反向传播算法

如果大家对深度学习的发展历史有所了解的话,就会知道正是反向传播算法为深度学习开创了坚固的基石。反向传播算法的提出其实非常非常早,早在上世纪60年代就已经提出了。只是那时候神经网络的理论还没有提出,所以这个算法虽然已经有了,但是一直没有用武之地,直到十多年后,Paul Werbos、David E Rumelhart等多位计算学家将它应用在了神经网络当中,这个算法才真正和深度学习紧密结合在了一起。

反向传播算法其实就解决了一个问题,就是多层次的神经网络如何训练参数的问题。很多同学在理解这个算法上有些吃力,一直搞不清楚计算方法,这里我参考了《深度学习入门》这本书当中的例子,相信会对大家有所启发。

基本概念

正向传播

假设我们现在要采购一些水果,在我们日常的思维当中这应该是一件非常简单的事情,计算一下价格然后给钱就完事了。但实际上这个过程可以抽象成一张计算图,当中是包含了若干步骤的。比如下图:

dbc6c9b2c2a3a9d0c72e3cf36aa89bc0.png

我们看到我们需要先计算苹果和橘子各自的价格,进行累加之后,再乘上消费税,最后得到的才是我们真正的价格。不知道大家看到这张图有没有什么感觉,其实我们的多层神经网络本质上也是这么回事,我也把图贴过来,大家做个对比。

303df30e1cd16493787237d2f4c233ba.png

不论我们构建的深度学习模型有多么复杂,当中有多少设计,但是它终究一定可以抽象成一张类似的计算图。当我们进行模型预测的时候,其实就是根据图当中定义好的计算,从左往右进行,和上面买水果的过程没有本质区别。这样从左往右的计算是为了得到最终模型的预测结果,被我们认为是正向的,所以它被称为正向传播,英文是forward propagation。大家在用各种框架的时候,经常看到大牛的代码里有forward这个函数,就是用来做正向传播,也就是模型预测的。

反向传播

正向传播理解了,反向传播也很好理解,字面意思是方向相反,但是实际上计算方式也略有不同。我们来思考一个问题,我们正向传播是为了计算模型的最终结果,那么我们反向传播是为了什么?当然是为了得到模型当中每一个参数对于结果的影响系数,从而可以根据这个系数调整参数,使得模型的结果更好。

我们同样来看一个例子,假设在上图买水果的例子当中,我们希望知道苹果对于最终价格的导数是多少,我们应该怎么计算?很显然我们需要反向一层一层地往前计算,也就是一层一层地把系数乘起来,其实这里的系数就是每一层的导数。

48e880d0111d129b14eee40c58fa4419.png

我们再来看一个抽象的例子:

17a0552f6d86e1744ec59b7982336563.png

这是神经网络图当中的一个部分,这是一种通用的写法:。在反向传播的时候,我们已经知道了y的梯度是E,那么我们想要知道x的梯度,很简单将它乘上也就是。如果,那么可以知道。

到这里其实简单的反向传播算法的原理已经介绍完了,但是为了避免大家一看就会一做就废的情况发生,我们再深入解读一下链式法则,对算法加深一些映像。

链式法则

其实链式法则并不是反向传播算法的独创,而是高数当中求导的课程里就有。我们要计算一个复杂函数的导数,采取的就是链式求导的方式。这里的神经网络其实本质上就可以看成是一个复杂函数,我们做的就是对一个复杂函数求导。理解了这一点,对于链式法则也就不在话下了。

我们来看两个例子:

8d4de45e26530a4fb9f4a913d7269b56.png

这里的z表示的神经网络的输出,我们写一下z和x以及y的关系,。我们想要求z关于x的导数,应该怎么求?很简单,。

很明显,这里的,所以。

如果x和t之间的不是加法而是乘法呢?

e07b1fcb70580bd3a582c8b7b94d19b0.png

你会发现对于计算过程没有任何影响,只不过结果不一样了而已。没变,,所以最终的结果是。

总结

反向传播算法到这里就算是介绍完了,可能大家还有疑惑,这个算法有什么用呢?我们在实际训练模型的时候究竟反向传播什么呢?

如果大家自己琢磨会觉得很疑惑,但说穿了其实只有一句话,就是我们反向传播的是梯度。我们知道在LR模型当中,我们使用梯度下降法来修正参数的值。在神经网络当中也是一样的,不过我们能直接计算梯度的只有最后一层输出层,它可以根据损失函数来计算梯度。之前的层则无法直接得到,这个时候就需要根据反向传播算法,来将最后一层计算得到的梯度往前传播,这样依次更新每一层。

但是这里也有一个隐患,就是我们一层层把梯度传播到前面的过程当中,很有可能这个梯度越来越大或者是越来越小。越来越大的结果是会引起梯度爆炸,也就是梯度超过了float的范围。梯度越来越小也是同样,也就是梯度太小,小于float的精度则会梯度丢失,使得float同样无法表达。针对这两种情况我们都有办法来避免和解决,不过这个是另外的故事了,这里只是简单提一下,我们会在之后的文章当中详细阐述。

最后做个补充说明,本文当中的图源于《深度学习入门》一书,这本书质量不错,作为入门教材很适合,大家感兴趣可以买一本来看看。

今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、在看、转发)

cc920c04290c6bdc3ada35b2c40e5fe3.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值