首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

什么是反向传播算法

神经网络的快速发展离不开底层数学算法的演进。反向传播算法作为神经网络中学习的主力,最初是在20世纪70年代引入的,但其重要性直到1986年由一篇着名的论文才得到充分的重视,其作者是DavidRumelhart,GeoffreyHinton和RonaldWilliams。该论文描述了几种神经网络,而其中反向传播比其他早期的学习方法快得多,从而可以使用神经网络来解决以前不能解决的问题。

说到神经网络,大家看到这个图应该不陌生:

其对应的表达式如下:

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

这是典型的三层神经网络的基本构成,LayerL1是输入层,LayerL2是隐含层,LayerL3是隐含层,我们现在手里有一堆数据,输出也是一堆数据,现在要他们在隐含层做某种变换,让你把数据灌进去后得到你期望的输出。如果你的输出和原始输入不一样,那么就是很常见的人工神经网络了,相当于让原始数据通过一个映射来得到我们想要的输出数据,也就是我们今天要讲的话题。和直线拟合一样,深度学习的训练也有一个目标函数,这个目标函数定义了什么样的参数才算一组“好参数”,不过在机器学习中,一般是采用成本函数(cost function),然后,训练目标就是通过调整每一个权值Wij来使得成本达到最小。成本函数也可以看成是由所有待求权值Wij为自变量的复合函数,而且基本上是非凸的,即含有许多局部最小值。成本函数受到网络中的权重和偏见改变而改变,为此,我们需求出成本函数对每一个权值Wij的偏导数。而反向传播是而正是用来求解这种多层复合函数的所有变量的偏导数的利器。简单的理解,它就是复合函数的链式法则,但其在实际运算中的意义比链式法则要大的多。

举例

我们以斯坦福深度学习课程:CS231n针对视觉识别的卷积神经网络的官方课程的一个例子来举例:

输入值w0=2.0,x0=-1, w1=-3, x1=-2, w2=-3,通过它们的复合关系图我们可以算得各个分部分的值已经最终值为0.73。

运用反向传播算法后计算各层偏导数的流程如下:

首先我们把最后的1/x转成f(z)=z的函数形式,对其求导可得1,所以我们从1开始往回推。

反向推一步,输入值为z=1/x=1.37,而根据复合函数的链式法则,需要乘以函数f(z)=f(1/x)的微分值,得到前一步的微分值为-0.53。

同样的链式法则继续反向往前推,得到前一步的微分值同样为-0.53。

继续往前,得到微分值为负数-0.20。

继续往前,得到微分值为正数0.20。

接着往前,可以得到最终的一个参数w2的微分值为0.20。

而w0和x0的微分值分别为-0.20和0.40。

同样w1和x1的微分值也能算得分别为-0.40和-0.60。

代码

使用python来实现反向传播算法非常简单,短短二十多行代码就能实现其算法,代码如下:

从以上例子可以看到,您可以将反向传播算法视为提供了计算所有这些路径的速率因子之和的方法。换句话说,反向传播算法提供了一种非常巧妙的方法可以跟踪权重(和偏差)的微小扰动如何通过网络传播,到达输出,最终影响成本函数的结果。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171230G0E8BK00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券