反向传播算法(Backpropagation)—-Gradient Descent的推导过程[通俗易懂]

反向传播算法(Backpropagation)—-Gradient Descent的推导过程[通俗易懂]BP算法是适用于多层神经网络的一种算法,它是建立在梯度下降法的基础上的,本文着重推导怎样利用梯度下降法来minimiseLossFunction。

大家好,又见面了,我是你们的朋友全栈君。

BP算法是适用于多层神经网络的一种算法,它是建立在梯度下降法的基础上的。本文着重推导怎样利用梯度下降法来minimise Loss Function。

给出多层神经网络的示意图:
在这里插入图片描述

1.定义Loss Function

假设有一组数据样本 x 1 x^{1} x1 x 2 x^{2} x2,… ,每一个x都有很多个特征,输入x,会得到一个输出y,每一个输出都对应一个损失函数L,将所有L加起来就是total loss。
那么每一个L该如何定义呢?这里还是采用了交叉熵,如下所示:
在这里插入图片描述
这里的 y i y^{i} yi是真实输出, y ^ y\hat{} y^是y target,是人为定义的。最终Total Loss的表达式如下:
在这里插入图片描述

2.Gradient Descent

L对应了一个参数,即Network parameters θ(w1,w2…b1,b2…),那么Gradient Descent就是求出参数 θ ∗ \theta^{*} θ来minimise Loss Function,即:
在这里插入图片描述
梯度下降的具体步骤为:
图源:李宏毅机器学习讲稿

3.求偏微分

从上图可以看出,这里难点主要是求偏微分,由于L是所有损失之和,因此我们只需要对其中一个损失求偏微分,最后再求和即可。
先抽取一个简单的神经元来解释:在这里插入图片描述
先理一理各个变量之间的关系:我们要求的是Total Loss对参数w的偏导,而Total Loss是一个个小的l累加得到的,因此,我们只需要求得 ∂ l ∂ w \frac{\partial l}{\partial w} wl,而 l = − y ^ l n y l=-\hat{y}lny l=y^lny,其中 y ^ \hat{y} y^是人为定义的,跟w没有关系,因此我们只需要知道 ∂ y ∂ w \frac{\partial y}{\partial w} wy。l跟z有关系,根据链式求导法则,我们需要求 ∂ l ∂ z \frac{\partial l}{\partial z} zl ∂ z ∂ w \frac{\partial z}{\partial w} wz,其中 ∂ z ∂ w \frac{\partial z}{\partial w} wz的求解较为容易,如下图所示:
在这里插入图片描述
∂ l ∂ z \frac{\partial l}{\partial z} zl是一个难点,因为我们并不知道后面到底有多少层,也不知道情况到底有多复杂,我们不妨先取一种最简单的情况,如下所示:
在这里插入图片描述

4.反向传播

在第一张图里面,我们经过正向传播很容易求出了 ∂ z ∂ w \frac{\partial z}{\partial w} wz,而对于 ∂ l ∂ z \frac{\partial l}{\partial z} zl,则并不是那么好求。上图其实就是运用了反向传播的思想, 对于上图中 ∂ l ∂ z \frac{\partial l}{\partial z} zl最后的表达式,我们可以换一种结构,如下所示:
在这里插入图片描述
l对两个z的偏导我们假设是已知的,并且在这里是作为输入,三角形结构可以理解为一个乘法运算电路,其放大系数为 σ ′ ( z ) \sigma {}'(z) σ(z)。但是在实际情况中,l对两个z的偏导是未知的。假设神经网络最终的结构就是如上图所示,那么我们的问题已经解决了:
在这里插入图片描述
其中:
在这里插入图片描述
但是假如该神经元不是最后一层,我们又该如何呢?比如又多了一层,如下所示:
在这里插入图片描述
那么我们只要知道 ∂ l ∂ z a \frac{\partial l}{\partial z_{a}} zal ∂ l ∂ z b \frac{\partial l}{\partial z_{b}} zbl,我们同样可以算出 ∂ l ∂ z ′ \frac{\partial l}{\partial z{}’} zl以及 ∂ l ∂ z ′ ′ \frac{\partial l}{\partial z{}”} zl,原理跟上面类似,如下所示:
在这里插入图片描述
∂ l ∂ z b \frac{\partial l}{\partial z_{b}} zbl同样是l先对y求导,y再对 z b z_{b} zb求导。

那假设我们再加一层呢?再加两层呢?再加三层呢?。。。,情况还是一样的,还是先求l对最后一层z的导数,乘以权重相加后最后再乘上 σ ′ ( z ′ ′ , z ′ ′ ′ , . . . ) \sigma {}'(z{}”,z{}”’,…) σ(z,z,...)即可。
最后给一个实例:
在这里插入图片描述
它的反向传播图长这样:
在这里插入图片描述
我们可以很轻松的算出 ∂ l ∂ z 5 \frac{\partial l}{\partial z_{5}} z5l ∂ l ∂ z 6 \frac{\partial l}{\partial z_{6}} z6l,算出这两个之后,根据上面我们找到的关系式,我们也可以轻易算出 ∂ l ∂ z 3 \frac{\partial l}{\partial z_{3}} z3l ∂ l ∂ z 4 \frac{\partial l}{\partial z_{4}} z4l,最后再算出 ∂ l ∂ z 1 \frac{\partial l}{\partial z_{1}} z1l ∂ l ∂ z 2 \frac{\partial l}{\partial z_{2}} z2l。然后 ∂ l ∂ z 1 \frac{\partial l}{\partial z_{1}} z1l ∂ l ∂ z 2 \frac{\partial l}{\partial z_{2}} z2l再分别乘上x1和x2,就是我们最终要找的 ∂ l ∂ w 1 \frac{\partial l}{\partial w_{1}} w1l ∂ l ∂ w 2 \frac{\partial l}{\partial w_{2}} w2l
我们不难发现,这种计算方式很清楚明了地体现了“反向传播”四个字。
好了,目标达成!!
在这里插入图片描述

5.总结

通过Forward Pass我们求得 ∂ z ∂ w = a \frac{\partial z}{\partial w}=a wz=a,然后通过Backward Pass我们求得 ∂ l ∂ z \frac{\partial l}{\partial z} zl,二者相乘,就是 ∂ l ∂ w \frac{\partial l}{\partial w} wl。利用上述方法求得所有参数的值之后,我们就可以用梯度下降法来更新参数,直至找到最优解。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132274.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月11日 上午6:36
下一篇 2022年6月11日 上午6:46


相关推荐

  • CollectGarbage_The Collector

    CollectGarbage_The CollectorCollectgarbage- ItdoeswhatitsaysitdoesDefinitioncollectgarbage([opt[,arg]])Thisfunctionisagenericinterfacetothegarbagecollector.Itperformsdifferentfunctionsaccording

    2025年7月22日
    3
  • 微信网页登录授权详解(前端)

    微信网页登录授权详解(前端)前几天做了一个 H5 页面项目 它是依托于微信服务号的网页 需要包含微信登录 微信支付以及微信订单查询功能 在这里说一下先说一下微信登录授权功能的实现微信登录授权微信登录授权呢 分为静默授权和非静默授权 两个的区别是 scope 属性的属性值不同 scope scopr base 是静默授权也就是不弹出页面 直接获取用户信息 scope scope userinfo 是非静默授权 用户需要同意

    2026年3月18日
    1
  • fopen 打开网址 设置php.ini,[教程] DreamHost修改php.ini来打开allow_url_fopen函数以支持采集…

    fopen 打开网址 设置php.ini,[教程] DreamHost修改php.ini来打开allow_url_fopen函数以支持采集…该楼层疑似违规已被系统折叠隐藏此楼查看此楼有时候发现空间不能采集,考虑一下是不是由于这个原因引起的,可以通过如下方法来尝试解决:1.首先用SSH登录空间2.在网站根目录建立建立cgi-bin文件夹#mkdir~/youdomain.com/cgi-binPS:youdoamin.com是你的域名目录名称或你自定义的目录名称。3.建立php_update.sh文件#vi~/youdom…

    2022年7月21日
    19
  • 【NOIp】NOIp2008

    【NOIp】NOIp2008NOIp2008T1笨小猴标签:STL用一个map存字母到数字(出现次数)的映射由于数据范围很小,可以不用线性筛直接${\sqrt{n}}$即可code1#include<bi

    2022年7月1日
    23
  • JAVA–Map集合详解

    JAVA–Map集合详解特点:该集合存储键(key)值(value)对,一对一对往里存,而且要保证键(key)的唯一性。Map集合和Set集合很像,其实Set集合底层就是使用了Map集合。什么时候使用Map集合:当数据之间存在映射关系时,优先考虑Map集合。Map集合常用共有方法1.添加Vput(Kkey,Vvalue):将指定的值与此映射中的指定键关联…

    2022年5月27日
    43
  • eclipse配置svn的步骤_如何访问svn地址

    eclipse配置svn的步骤_如何访问svn地址   前提是前面已经配置好http访问svn。接下来,就只需要安装ssl,和配置ssl:   1、SSL安装yuminstallmod_sslopenssl 2、生成证书 cd/etc/pki/tls/privateopensslgenrsa-outmysvn.key1024opensslreq-new-keymysvn.key…

    2025年9月1日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号