【深度学习】4-1 误差反向传播法 - 计算图链式法则反向传播

news2024/10/7 18:27:29

上一章中神经网络的学习是通过数值微分计算的神经网络的权重参数的梯度。数值微分虽然简单,也容易实现,但缺点是计算上比较费时间。本章将学习一个能够高效计算权重参数的梯度的方法一一误差反向传播法
误差反向传播法能够高效计算权重参数的梯度的方法

要正确理解误差反向传播法,一般有两种方法:一种是基于数学式,另一种是基于计算图

计算图

计算图将计算过程用图形表示出来。这里说的图形是数据结构图,通过多个节点和边表示(连接节点的直线称为“边”)。

下面看一个用计算图解解决的简单问题,

问题1: 你在超市买了2个100元一个的苹果,消费税是10%,计算支付金额。
在这里插入图片描述

问题2: 你在超市买了2个苹果、3个橘子。其中,苹果每个100元橘子每个150元。消费税是10%,请计算支付金额。
计算图如下:
在这里插入图片描述

综上,用计算图解题的情况下,需要按如下流程进行
1.构建计算图。
2.在计算图上,从左向右进行计算

“从左向右进行计算”是一种正方向上的传播,简称为正向传播(forward propagation),如果是在计算图上从右向左进行传播,则称为反向传播(backward propagation)。反向传播将在接下来的导数计算中发挥重要作用。

局部计算
计算图的特征是可以通过传递“局部计算”获得最终结果。
局部计算是指,无论全局发生了什么都能只根据与自已相关的信息输出接下来的结果。

看下面这个例子:
比如,在超市买了2个苹果其他很多东西。
在这里插入图片描述

这里的重点是,各个节点处的计算都是局部计算。这意味着,例如苹果和其他很多东西的求和运算(4000 + 200 = 4200)并不关心4000这个数字是如何计算而来的,只要把两个数字相加就可以了。
也就是说,各个节点公只需进行与自己有关的计算(在这个例子中是对输入的两个数字进行加法运算),不用考虑全局。

为何用计算图解题
计算图的优点到底是什么?一个优点就在于局部计算。无论全局是多么复杂的计算,都可以通局部计算使各个节点致力于简单的计算,从而简化问题。
另一个优点是用计算图可以将中间的计算结果全部保存起来

实际上,使用计算图最大的原因是,可以通过反向传播高效计算导数
在这里插入图片描述
如上图所示,反向传播使用与正方向相反的箭头(粗线)表示。反向传播传递“局部导数”,将导数的值写在箭头的下方。在这个例子中,反向传播从右向左传递导数的值(1 → 1.1 → 2.2)。从这个结果中可知,“支付金额关于苹果的价格的导数”的值是 2.2。这意味着,如果苹果的价格上涨 1 元,最终的支付金额会增加 2.2 元(严格地讲,如果苹果的价格增加某个微小值,则最终的支付金额将增加那个微小值的 2.2 倍)

链式法则

传递局部导数的原理,是基于链式法则(chain rule)的。本节将介绍链式法则,并阐明它是如何对应计算图上的反向传播的。

计算图的反向传播

如前所述,“支付金额关于苹果的价格的导数”的值可以通过计算图的反向传播求出来。先来看一下结果,如下图所示,可以通过计算图的反向传播求导数

话不多说,先来看一个使用计算图的反向传播的例子。假设存在y=f(x)的计算,这个计算的反向传播如图
在这里插入图片描述

如图所示,反向传播的计算顺序是,将信号E乘以节点的局部导数,然后将结果传递给下一个节点。这里所说的局部导数是指正向传播中y=f(x)的导数。把这个局部导数乘以上游传过来的值(本例中为E)然后传递给前面的节点。
(如何求函数的导数 数学方法)
这就是反向传播的计算顺序。那么这是如何实现的呢?可以从链式法则的原理进行解释。下面就来介绍链式法则。

什么是链式法则
介绍链式法则时,要先从复合函数说起。复合函数是由多个函数构成的函数。比如,z = (x+y)²是由下面两个式子构成的:
z = t²
t = x + y

链式法则是关于复合函数的导数的性质,定义如下:
如果某个函数由复合函数表示,则该复合函数的导数可以用构点合函数的各个函数的导数的乘积表示。

以上面的函数为例子,z关于t的导数可以用z关于t的导数t关于x的导数的乘积表示,如下:
在这里插入图片描述

其中导数可以像下面这样“互相抵消”,

在这里插入图片描述

链式法则和计算图
现在尝试用计算图将链式法则表示出来。
在这里插入图片描述

反向传播的计算顺序是先将节点的输人信号乘以节点的局部导数(偏导数),然后再传递给下一个节点。

反向传播

加法节点的反向传播
首先来考虑加法节点的反向传播。这里以z=x+y为对象,观察它反向传播。z=x+y的导数可由下式(解析性地)计算出来。
在这里插入图片描述

用计算图表示的话,如图:
在这里插入图片描述

加法节点的反向传播将上游的值原封不动地输出到下游

乘法节点的反向传播
接下来,看一下乘法节点的反向传播。这里考虑z=xy。这式子的导数用下面式子表示:
在这里插入图片描述

乘法的反向传播会将上游的值乘以正向传播时的输入信号的“翻转值”后传递给下游。翻转值表示一种翻转关系,如图所示,正向传播时信号是x的话,反向传播时则是y; 正向传播时信号是y的话,反向传播时是x
在这里插入图片描述

加法的反向传播只是将上游的值传给下游不需要正向传播的输入信号了,但是,乘法的反向传播需要正向传播时的输人信号值。因此,实现乘法节点的反向传播时,要保存正向传播的输入信号

苹果的例子
再来思考一下本章最开始举的购买苹果的例子(2 个苹果和消费税)。这里要解的问题是苹果的价格、苹果的个数、消费税这 3 个变量各自如何影响最终支付的金额。这个问题相当于求“支付金额关于苹果的价格的导数”“支付金额关于苹果的个数的导数”“支付金额关于消费税的导数”。用计算图的反向传播来解的话,求解过程下图所示。
在这里插入图片描述
如前所述,乘法节点的反向传播会将输入信号翻转后传给下游。从图的结果可知,苹果的价格的导数是 2.2,苹果的个数的导数是 110,消费税的导数是 200。这可以解释为,如果消费税和苹果的价格增加相同的值,则消费税将对最终价格产生 200 倍大小的影响,苹果的价格将产生 2.2 倍大小的影响。不过,因为这个例子中消费税和苹果的价格的量纲不同,所以才形成了这样的结果(消费税的 1 是 100%,苹果的价格的 1 是 1 元)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/668148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Angular 安装与创建第一项目

1. 下载nodejs 并且安装 https://nodejs.org/en 2. 打开命令窗口,验证是否安装成功 C:\Users\Harry>node -v v18.16.0C:\Users\Harry>npm -v 9.5.1 3. 安装Angular CLI C:\Users\Harry>npm install -g angular/cliadded 239 packages in 9s npm notic…

Python Anaconda创建虚拟环境及Pycharm使用虚拟环境

目录 前言 一、Anaconda与Pycharm 二、conda常用命令 三、Pycharm使用虚拟环境 总结 前言 我们在做开发任务时可能会创建多个项目,这些项目可能会依赖于不同的Python环境。比如有的用到Python3.6、有的用到Python3.7;有的用Pytorch开发、有的用Tens…

SpringBoot整合模板引擎Thymeleaf(4)

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 概述 在之前的教程中,我们介绍了Thymeleaf的基础知识。在此,以案例形式详细介绍Thymeleaf的基本使用。 项目结构 要点概述: 1、在st…

性能优化往往成为 Android 高工的一道分水岭

不论是大厂小厂,对于Android开发者来说,性能优化往往成为了是否真正配得上高级开发的一道分水岭,性能优化也是如今大厂在招聘要求中作出要求,且会高频提问: Android的性能优化,主要从以下几个方面开展&…

论文解读|基于RealSense的三维散乱部件点云分割

原创 | 文 BFT机器人 01 摘要 本文提出了一种针对垃圾拾取系统中点云分割的算法。该算法使用低成本的深度相机RealSense获取点云数据,并对点云数据进行滤波处理和分割,最终将分割后的子块片段独立地连接起来,形成完整的工件模型。通过测试案…

spark 数据倾斜处理

spark优化总结: 一、spark 代码优 六大代码优化: 避免创建重复的RDD 尽可能复用同一个RDD 对多次使用的RDD进行持久化 尽量避免使用shuffle类算子 使用map-side预聚合的shuffle操作 使用高性能的算子 广播大变量 使用Kryo优化序列化性能 优化数据结构 使用高性能的库fa…

怎么通过电商数据分析选择好货源?

什么样的货源才算好货源?自然是拿货成本低、销售前景(趋势)好、利润度高、去库存快的。这就需要综合销售、库存、财务、采购等多部门环节的数据进行分析挖掘,最终才能找到符合需求的供货商以及商品清单。在这个过程中,…

vue3引入uview-plus3.0移动组件库

vue3引入uview-plus3.0移动组件库 引入流程 导入插件到项目 项目地址:https://ext.dcloud.net.cn/plugin?nameuview-plus 在main.js引入uview // main.js import uviewPlus from /uni_modules/uview-plus// #ifdef VUE3 import { createSSRApp } from vue expor…

红日ATTCK系列靶场(-)简记

Step 1>》信息收集 nmap 发现80、 3306 nmap -T4 -O 192.168.92.100 访问80端口 dirsearch(御剑)扫描 发现:/phpMyadmin Step 2 》漏洞利用 1.弱口令 http://192.168.92.100/phpMyadmin root/root 登录成功 2.getshell select basedir //查绝对路径 int…

Flink 学习三 Flink 流 process function API

Flink 学习三 Flink 流&process function API 1.Flink 多流操作 1.1.split 分流 (deprecated) 把一个数据流根据数据分成多个数据流 1.2 版本后移除 1.2.分流操作 (使用侧流输出) public class _02_SplitStream {public static void main(String[] args) throws Excep…

Python接口自动化之登录接口测试

01 什么是接口? 接口:检测外部系统与系统之间以及内部各个子系统之间的交互点。 通俗来说,接口就是连接前后端的桥梁,接口测试可以简单理解为脱离了前端的功能测试。一个又一个的接口就对应功能测试内一个又一个的功能。但注意&am…

前端vue入门(纯代码)10

【10.TodoList-自定义事件】 TodoList案例的完整代码请点击此处粉色文字 TodoList案例中的子组件TodoHeader给父组件App传递数据 App.vue文件中需要修改的代码 原本&#xff1a; Todo案例中子给父传递数据【通信】的方法&#xff1a;props <!-- 把App组件里的方法addTodo(…

2023 Nature 健康系统规模的语言模型是通用预测引擎

文章目录 一、论文关键信息二、论文主要内容三、总结与讨论🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、论文关键信息 论文标题:Health system-scale language models are all-purpose prediction engines 期刊信息:2023 Nature 论文地址:h

Armbian 23.05(代号Suni)操作系统已全面上市

Armbian社区通知我们&#xff0c;适用于ARM和RISC-V单板计算机以及其他平台的Armbian 23.05&#xff08;代号Suni&#xff09;操作系统已全面上市。 在Armbian 23.02发布三个月后&#xff0c;Armbian 23.05版本是第一个在完全重构的构建框架上创建的版本&#xff0c;基于即将发…

Flink 学习八 Flink 容错机制 checkpoint savepoint

Flink 学习八 Flink 容错机制 & checkpoint & savepoint https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/concepts/stateful-stream-processing/ 1.容错基础概念 上一节讲述状态后端;Flink是一个 带状态stateful 的数据处理系统,在处理数据的过程…

基于深度学习的高精度蜜蜂检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度蜜蜂检测识别系统可用于日常生活中或野外来检测与定位蜜蜂目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的蜜蜂目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

VUE 2X ClassStyle ⑦

目录 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ V u e j s Vuejs Vuejs C l a s s Class Class与 S t y l e Style Style绑定总结 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持…

初始java String类型

文章目录 初始java String类型理解 next和nextLine的区别new String(); 括号里面可以放什么呢放byte类型的数组放byte类型的数组&#xff0c;索引&#xff0c;长度放char类型的数组放char类型的数组&#xff0c;索引&#xff0c;长度 String 类型对应同一字符串&#xff0c;是否…

boost 异步服务器开发

目录 1、 异步服务器简介 2、异步服务器开发 2.1 会话类 2.1.1 会话类头文件 2.1.2 会话类源文件 2.2 服务类 2.2.1 服务类头文件 2.2.2 服务类源文件 2.3 主函数 3、异步服务器测试 4、当前异步服务器存在的问题及后续优化 1、 异步服务器简介 boost 异步服务器分为…

【Pytest实战】Pytest 如何生成优美的测试报告(allure-pytest)

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…