BP算法推导

2023-05-16

传送门: 传送

这里写图片描述

输出层梯度求解过程

如上图所示,为一个输出层神经元,在计算输出层梯度的时候,我们不用去考虑前一层是如何输入的。所以我们用y来表示,图中的y(n)表示第n个样本在前一层的输出值,这一层的输入值。我们将当前节点定义为j。那么当前节点j的输入值之和为 
这里写图片描述 
这里的m是节点j前一层的输入节点的个数,其中包括一个偏置项b。这里的公式都很像,看公式注意下标。然后节点j的输出要经过激活函数,如图所示我们定义激活函数为这里写图片描述。那么当前节点j的输出值为 
这里写图片描述 
图中还有一个这里写图片描述,这个表示输入样本的真实标签,这是用来度量网络输出和真实样本之间的误差的。此处定义误差 
这里写图片描述 
然后为计算梯度,我们需要有一个损失函数,因为反传其实就是在求损失函数对权值的梯度。 
我们这里使用平方误差作为损失函数,所以损失函数为 
这里写图片描述 
这里的C为全部的输出层神经节点 
好了,把前提说清楚了,就可以开始求梯度了 
这里写图片描述 
这里写图片描述  这样拆分开计算的原理是:链式法则。

然后我们按照上面的一个个把梯度求出来,在最后去把他们乘起来。 
这里写图片描述 
继续 
这里写图片描述 
这里注意下,分子上的求和符号展开后,除了含有这里写图片描述的哪项外,其他所求的导数都为0,,因为对当前权值来说,他们都是常数,常数的导数为0.所以我们能得到   (这里隐含层和输出层是有点不一样的...)
这里写图片描述 
现在把这些都放回原来的公式去 
这里写图片描述 
可以看出来,当前求的梯度和前一层的输入直接相关。一旦有了梯度,我们要做的就是用这个梯度去更新权值,当然不能直接减,太大了,所以加入一个步长这里写图片描述,得到 
这里写图片描述 
最后更新权值 
这里写图片描述

这里要注意,这里写图片描述里我提前加了一个负号,所以,在后面公式中我用的这里写图片描述去更新梯度,但是如果前面没加负号,那么这里应该是减号,因为我们要找的是梯度下降的方向。

隐藏层梯度计算

前面计算了输出层的梯度更新,这里我们要计算隐藏层。 
之所以输出层和隐藏层要分开计算,那是因为隐藏层更加复杂,可以想象一下,隐藏层的节点,会连接下一层的所有节点,那么在梯度反传的时候也要从这些连接的节点去获取梯度。所以隐藏层就不能只求一个节点的梯度了,但是原理还是一样的,也是求损失函数对当前权值的梯度,只是计算过程变得比前面一个复杂了一点点。 
这里写图片描述
这里我重新画了两个节点,左边这个表示隐藏层节点j,右边那个表示输出层节点k,我们刚才计算的就是右边那个,现在我们来计算前面这个。 
别看我这里只画了一个输出层节点k,但是真实情况不一定只有一个,如果有多个,那么当前的节点j一定会和其有链接,那么和其连接的节点就会有梯度反传。 
所以需要重新计算梯度,和输出层不同的是,输出层只需要去考虑一个输出神经元的损失,而隐藏层需要去考虑全部全部输出层节点的损失,如下 
这里写图片描述 
在求输出层的时候,因为权值只和其中的一个e有关,所以上面的累加展开后,只有一项为非零,其他全是0。但是在这里,隐藏层和上面的每个节点都要连接,所以我们这里要对全部的e求导。 
得到 
这里写图片描述 
然后后面的就是差不多的了,一直求梯度求下去、 
这里写图片描述 
这里我直接写出来了,步骤和前面的差不多,自己试着推导下就知道了 
我们直接得到最终的梯度更新 
这里写图片描述 
到这里,梯度更新的推导算是结束了,根据以上公式可以推导出任何一个权值的梯度 
然后我们可以看看这些梯度之间有那些共同点,我把前面推导好的输出层和隐藏层梯度拿下来,如下 
这里写图片描述 
可以发现,每个公式中,最后一项都是所求权值的输入值,导数第二项都是激活函数的导数值,剩下的为传下来的损失。所以在算法实现的时候,往往把前面的损失值和激活函数导数的乘积当作一项整体,这样就可以实现链式计算,方便代码实现。我们把他叫做局部梯度这里写图片描述,如上面两个公式可以改成如下式子(下标kj的是输出层的,下标ji的是隐藏层的): 
这里写图片描述 
然后隐藏层的前半部分式子可以继续合并 
这里写图片描述 
最终得到 
这里写图片描述 
所以不管是求哪个权值的梯度,我们都可以化简为如下形式 
这里写图片描述 
这样算法实现起来就方便多了

python实现

主程序 
这里写图片描述 
定义好输入节点、输出节点、隐藏节点大小、以及学习率等

前向传播 
这里写图片描述 
反向更新 
这里写图片描述

代码github:bp.py

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BP算法推导 的相关文章

  • 解决逃离塔科夫0.12.9离线版修改商人可回收所有物品的问题

    复制这里的代码替换 xff0c 不会出现问题 span class token string property property 34 sell category 34 span span class token operator span
  • 手把手教你一套完善且高效的k8s离线部署方案

    作者 xff1a 郝建伟 背景 面对更多项目现场交付 xff0c 偶而会遇到客户环境不具备公网条件 xff0c 完全内网部署 xff0c 这就需要有一套完善且高效的离线部署方案 系统资源 编号主机名称IP资源类型CPU内存磁盘01k8s m
  • 好日子1/6啦啦啦

    今天我直接开搞把作业搞定 xff0c 上题目 题目背景 小明在 A 公司工作 xff0c 小红在 B 公司工作 题目描述 这两个公司的员工有一个特点 xff1a 一个公司的员工都是同性 A 公司有 NN 名员工 xff0c 其中有 PP 对
  • 树莓派4B安装PHP7.3 Nginx MySQL 教程

    非原创 感谢作者 https web security cn rapberry pi 4b install php7 3 nginx mysql 在树莓派4B上搭建Web服务器环境 xff1a PHP7 3 43 Nginx 43 Mari
  • 只需几步,U盘就能变“光驱”

    从07年开始 xff0c 移动存储市场就开始猛刮降价风 到现在 xff0c 大容量U盘的价格更是降到了难以想象的地步 xff0c 连8GB产品的价格都到了300元以内 不过虽然容量上去了 xff0c 一般U盘的功能却并没有太多的改变和延伸
  • 由<meta charset=“UTF-8“>引发的血案--常见字符编码解析

    lt meta charset 61 34 UTF 8 34 gt 是什么意思 xff1f 最近要找实习 xff0c 时间有限 xff0c 以后一定把底层原理写个明白 首先解释一下这句代码的意义 xff1a lt meta charset
  • 从HTTP响应头看各家CDN缓存技术

    https segmentfault com a 1190000006673084 从HTTP响应头看各家CDN缓存技术 由于国内各家电信运营商互联互通的壁垒 xff0c CDN作为互联网用户加速的最后一公里 xff0c 扮演了很重要的角色
  • Java NIO Selector详解(含多人聊天室实例)

    一 Java NIO 的核心组件 Java NIO的核心组件包括 xff1a Channel 通道 xff0c Buffer 缓冲区 xff0c Selector 选择器 xff0c 其中Channel和Buffer比较好理解 简单来说 N
  • axios.create()

    lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt meta name 61 34 viewport
  • 【无标题】

    Win11更新后无法使用网络 xff0c 可能是适配器驱动有问题的解决办法 把Win11系统更新后突然无法上网 xff0c 无论是wlan连接还是手机热点都用不了 尝试了网络上找到的多种办法 xff1a 1 使用网络疑难自动解决 xff0c
  • Linux /etc/profile 添加环境变量

    S1 从命令行 sudo vi etc profile S2 按 i 开始编辑 在文件适当位置添加环境变量 xff0c 比如 xff1a export PATH 61 PATH usr local cuda 10 1 bin LD LIBR
  • Kubernetes部署(八):k8s项目交付----(5)持续部署

    一 云计算模型概念 You manage 你管理 Managed by vendor 供应商管理 Applications 开发研发出的业务 Runtimes 运行时环境 xff0c Applications业务运行起来 xff0c 需要依
  • Redis的bind的误区

    Redis的bind的误区 cw hello1的博客 CSDN博客 今天在搭建Redis服务集群的时候 xff0c 发现自己一直以来对Redis中bind 的理解的一个误区 在今天以前 xff0c 我一直认为Redis中的配置文件中的bin
  • 使用find命令在当前目录不包含子目录中查找文件

    Linux中使用find命令在当面目录以及子目录中查找文件 xff0c 这个只需要加一个参数 depth即可 xff0c 然而想要在当前目录不包含子目录就没有一个简单的参数可以实现 xff0c 尤其所要查找的是某一个文件的时候 xff0c
  • NOI2.3.6262 流感传染题解(C++)

    题目 总Time Limit 1000ms Memory Limit 65536kB Description 有一批易感人群住在网格状的宿舍区内 xff0c 宿舍区为n n的矩阵 xff0c 每个格点为一个房间 xff0c 房间里可能住人
  • Ubuntu安装远程桌面软件xrdp

    Ubuntu安装远程桌面软件xrdp linux桌面版在服务器运行 xff0c 通常使用SSH命令访问的方式是比较单一的 xff0c 虽然配置 XShell 43 XManager可以实现打开图形程序 xff0c 但速度较慢 安装xrdp
  • IDEA 使用 SpotBugs 找出你代码中的bug

    SpotBugs 是 Findbugs 的继任者 xff0c 通过静态分析来查找 Java 代码中的 bug 下面我们主要是介绍 SpotBugs 在 idea 中的安装和使用 安装 Idea Preferences Plugins xff
  • Python 面向对象编程入门:从定义类到使用继承和多态

    目录 类的定义 继承 多态 在 Python 中 xff0c 面向对象编程是一种非常重要的编程范式 它允许我们通过创建对象来表示现实世界中的事物 xff0c 并将其组织为类的层次结构 xff0c 使代码更加模块化和易于维护 类的定义 在 P
  • Rust 语言通用代码生成器:莲花,发布冒烟测试版 3, 开始支持 PostgreSQL 数据库,更多功能,更多示例

    Rust 语言通用代码生成器 xff1a 莲花 xff0c 发布冒烟测试版 3 开始支持 PostgreSQL 数据库 xff0c 更多功能 xff0c 更多示例 Rust 语言通用代码生成器 xff1a 莲花 xff0c 已发布冒烟测试版
  • jenkins安装与配置

    一 安装jenkins https www jenkins io doc book installing linux span class token comment red hat centos span span class token

随机推荐