反向传播算法(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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python 6行代码搞定图片批量重命名「建议收藏」

    python 6行代码搞定图片批量重命名「建议收藏」importpandasaspdimportosf1=pd.read_excel(‘花.xlsx’,converters={‘name’:int,’rename’:str})如下图所示,为f1。读取’花.xlsx’文件,以整型的形式读取’nama’,以文本的形式读取’rename’。name为图片原始的命名。rename为图片重命名的结果。filelist…

    2025年9月14日
    9
  • 「机械工程」力矩,转矩,扭矩的理解

    「机械工程」力矩,转矩,扭矩的理解1.力矩定义:力矩在物理学里是指作用力使物体绕着转动轴或支点转动的趋向。力矩的单位是牛顿-米。力矩希腊字母是tau。力矩的概念,起源于阿基米德对杠杆的研究。转动力矩又称为转矩或扭矩。力矩能够使物体改变其旋转运动。推挤或拖拉涉及到作用力,而扭转则涉及到力矩。力矩等于径向矢量与作用力的叉积。力矩在物理学里是指作用力使物体绕着转动轴或支点转动的趋向,是力对物体产生转动作用的物理量。可以分…

    2022年5月15日
    76
  • node配置淘宝镜像_node配置淘宝镜像

    node配置淘宝镜像_node配置淘宝镜像node安装推荐去官网下载最新版本的,官网地址:https://nodejs.org/en/download/依照系统版本下载即可,推荐window系统下载msi格式的。下载下载直接安装下一步下一步。安装成功了以后打开cmdnode-v来检测是否安装成功cnpm安装由于我们被墙的厉害,所以使用npm下载模块时候会发现效率真的很慢,所以推荐淘宝的镜像,安装说明推荐:$npmins

    2022年8月31日
    1
  • shell if语句和test命令

    shell if语句和test命令在shell中if条件判断语句和我们的C、C++、Java等语言是不同的,shell的if语句条件必须用[]括起来,另外[]里外都需要用空格与周围隔开(例如[a==b]),否则报错;另外与if配对的有elseif和else,如果我们要写这两个必须后面跟有东西,否则也会报错,在编程中不跟是可以的:if(a==b)printf("a=b");else{//什么都没有}但是s…

    2022年7月27日
    6
  • Win7迁移基础知识(2):USMT(用户状态迁移工具)

    Win7迁移基础知识(2):USMT(用户状态迁移工具)

    2021年8月20日
    118
  • jenkins 邮件_acs nano投稿后有确认邮件吗

    jenkins 邮件_acs nano投稿后有确认邮件吗前言前面已经实现在jenkins上展示html的测试报告,接下来只差最后一步,把报告发给你的领导,展示你的劳动成果了。安装EmailExtensionPlugin插件jenkins首页-

    2022年7月29日
    8

发表回复

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

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