深度学习-06-手动进行反向传播

深度学习-06-手动进行反向传播


本文是《深度学习入门2-自製框架》 的学习笔记,记录自己学习心得,以及对重点知识的理解。如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动,也是鼓励更多优秀作品问世。

当前笔记内容主要为:步骤6 手动进行反向传播 章节的相关理解。

书籍总共分为5个阶段,每个阶段分很多步骤,最终是一步一步实现一个深度学习框架。例如前两个阶段为:

第 1 阶段共包括 10 个步骤 。 在这个阶段,将创建自动微分的机制
第 2 阶段,从步骤11-24,该阶段的主要目标是扩展当前的 DeZero ,使它能够执行更复杂的计算 ,使它能 够处理接收多个输入的函数和返回多个输出的函数


1.Variable 类的功能

Variable 类在原有的基础上,除了data普通值外,应该增加一个grad 的值,用于记录导数值。grad 也是numpy ndarray 类型。为啥是ndarray ,我们上一节讲的是对x 一维的,但是我们后面可能会设计到多维度,每个维度都需要进行求导,所以这里定义的是一个ndarray ,这样就可以表示向量或者矩阵。

class Variable:def __init__(self, data):self.data = dataself.grad = None   #存储梯度,导数值

2.Function 类的功能


Function 类我们在原有的定义前向计算,表示复合函数的基础上定义一个反向传播方法,并且函数定义一个数据域input, 用以记录每次执行是的输入变量。有了input变量后,每次调用backward 方法后,向函数输入的 Variable 实例就可以作为 self.input使用。

class Function:def __call__(self, input):x = input.datay = self.forward(x)output = Variable(y)self.input = input  # input 保存每次输入的变量return outputdef forward(self, x):raise NotImplementedError()  # 使用Function  这个方法forward 方法的人 , 这个方法应该通过继承采实现def backward(self, gy):raise NotImplementedError()
3.Square 类和Exp 类的功能扩展


按照最新的Function类,为Square 和Exp 类增加反向传播功能

class Square(Function):def forward(self, x):y = x ** 2return ydef backward(self, gy):x= self.input.datagx = 2 * x * gy     #方法的参数 gy 是 一个 ndarray 实例 , 它是从输出传播而来的导数 。return gxclass Exp(Function):def forward(self, x):y = np.exp(x)return ydef backward(self, gy):x = self.input.datagx = np.exp(x) * gyreturn gx
4.反向传播的实现

尝试对函数进行推演,正向计算,图:    
    

    A = Square()B = Exp()C = Square()x = Variable(np.array(0.5))a = A(x)b = B(a)y = C(b)


    
    
反向计算导数图:


    

   

    y.grad = np.array(1.0)b.grad = C.backward(y.grad)a.grad = B.backward(b.grad)x.grad = A.backward(a.grad)print(x.grad)
5.项目代码


项目全部代码如下:

'''
step06.py
手动实现反向传播'''import numpy as npclass Variable:def __init__(self, data):self.data = dataself.grad = Noneclass Function:def __call__(self, input):x = input.datay = self.forward(x)output = Variable(y)self.input = inputreturn outputdef forward(self, x):raise NotImplementedError()  # 使用Function  这个方法forward 方法的人 , 这个方法应该通过继承采实现def backward(self, gy):raise NotImplementedError()class Square(Function):def forward(self, x):y = x ** 2return ydef backward(self, gy):x= self.input.datagx = 2 * x * gy     #方法的参数 gy 是 一个 ndarray 实例 , 它是从输出传播而来的导数 。return gxclass Exp(Function):def forward(self, x):y = np.exp(x)return ydef backward(self, gy):x = self.input.datagx = np.exp(x) * gyreturn gxif __name__ == '__main__':A = Square()B = Exp()C = Square()x = Variable(np.array(0.5))a = A(x)b = B(a)y = C(b)y.grad = np.array(1.0)b.grad = C.backward(y.grad)a.grad = B.backward(b.grad)x.grad = A.backward(a.grad)print(x.grad)

执行结果:3.297442541400256


问题分析:代码里面的 为啥计算梯度的时候,乘以gy?

如果没有理解,可以看下链式法则,这里只有乘以 gy 才把其他的连乘结果带到下一个微分计算里面。
深入理解下链式法则,就懂了这里为啥每个backward 函数乘以一个入参gy 


6.总结

本节实现了反向传播,计算微分的计算,当前是手动实现的,后面改造成自动化计算。

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

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

相关文章

CentOS镜像源配置

CentOS镜像源配置 1. 基础镜像源配置 1.1 简介 CentOS,是基于Red Hat Linux提供的可自由使用源代码的企业级Linux发行版本;是一个稳定,可预测,可管理和可复制的免费企业级计算平台。 下载地址: https://mirrors.aliyun.com/ce…

【网关】工业智能网关-02

一 公司简介 保定飞凌嵌入式技术有限公司始于2006年,是一家专注嵌入式核心控制系统研发、设计和生产的高新技术企业,是国内最早专业从事嵌入式技术的企业之一。 经过十几年的发展与积累,公司拥有业内一流的软硬件研发团队,在北京…

执行shell脚本时为什么要写成./test.sh,而不是test.sh?

一定要写成 ./test.sh,而不是 test.sh 运行其它二进制的程序也一样! 直接写 test.sh,linux 系统会去 PATH (系统环境)里寻找有没有叫 test.sh 的! 而只有 /bin, /sbin, /usr/bin,/usr/sbin 这…

SuperMap GIS基础产品FAQ集锦(20240603)

一、SuperMap iDesktopX 问题1:请教一下,桌面把火星坐标系的数据投影转换为4326坐标系数据如何才能没有偏移呢? 11.1.1 【解决办法】可以使用iDesktopX提供的“电子地图坐标转换”插件实现对火星坐标系数据的纠偏。 问题2:请教…

堆排序pta

UML(Unified Modeling Language)类图是面向对象设计(OOD)中常用的一种图表,用于描述系统中的类、接口、以及它们之间的关系。下面是一个简单的步骤,指导你如何绘制UML类图: 确定类和接口&#…

麦肯锡:ChatGPT等生成式AI应用激增,大中华区增长最快

全球顶级咨询公司麦肯锡(McKinsey & Company)在官网发布了《he state of AI in early 2024:Gen AI adoption spikes and starts to generate value》,一份关于生成式AI应用的调查报告。 麦肯锡对多个国家/地区的1,363位管理者进行了调查…

前端表单校验完成之后,点击确认功能无反应FormInstance, FormRules

**产生原因:可能是在el-form 中添加的ref 前面加了“:”,也可能是ref中的值写错了** FormInstance, FormRules

海外仓平台系统选择指南:中小海外仓如何选到经济实惠的WMS系统

对于中小海外仓来说,选择一套性价比高、功能又比较齐全的系统还是很关键的,这直接关系到海外仓的运转效率和盈利能力。 今天我们就来探讨一下,针对中小海外仓这个群体,要怎么才能选到经济实惠又功能齐全的wms系统。 1、性价比—…

JavaScript错误;调试;“=”,“==”,“===”的区别

try...catch语句 try..catch语句是JavaScript中用来处理异常的一种方式。它允许我们在代码块中尝试执行可能会引发错误的代码,并在发生错误时捕获并处理异常。 下面是try..catch语句的基本语法: try {// 可能会引发错误的代码 } catch (error) {// 处理…

【Microelectronic Systems】

PART1 嵌入式系统概述与玩转mbed 1 嵌入式系统,微控制器,与ARM 1.1什么是嵌入式系统? 微处理器不仅仅存在于通用计算机中,也可以安置在一些不需要计算的设备内部,比如洗衣机,摄像机。微处理器常常可以控制…

vscode快捷键英文单词对照表

今天想改我的vscode快捷键,unfoldall这条跟我其他的ide都不一样,我得挨个记……但是ctrlshiftp一打开快捷键 点击右侧齿轮进行快捷键录制,但是我这次点左边进去查看了一下unfoldall当前是什么 后来看到了……这些oem_5是什么鬼? {…

游戏心理学Day03

心理学的生理基础 第二节人类感觉 一.视觉系统 如果不依赖视觉呈现电子游戏,就无法存在,人眼就像一架照相机,具有收集和汇聚光线的能力 在我们的生活空间里,充满了电磁波,包括光和其他能量,这些光组成了…

kafka(九)——LeaderEpoch和零拷贝

Leader Epoch 基于HW同步数据 流程说明: 集群配置至少写入的副本数为1,min.insync.replicas 1;初始状态下,副本1(Leader)和副本2(Follower)的LEO和HW均为0;生产者向副…

防爆AGV叉车在现代物流行业的应用

AGV 随着机器人技术在中国的快速发展,国内企业开始推出区别于传统叉车的叉车AGV,旨在为企业降本增效,降低人工成本与对人的依赖;同时,也将人工从危险恶劣的环境中解放出来。随着技术的持续提升,叉车AGV已经…

npm run dev 同时运行vue前端项目和node后端项目

将两个项目放到一个目录下 项目拖进vscode中,安装包依赖,修改配置 npm i concurrently "dev": "concurrently \"vite --mode development\" \"nodemon app.js\"" 命令行 npm run dev 运行 没有运行成功排查 …

【第九课】空间数据基础与处理——空间参考处理

一、前言 地图图层中的所有元素都具有特定的地理位置和范围,这使得它们能够定 位到地球表面上相应的位置。精确定位地理要素对于制图和 GIS来说都至关 重要,而要正确地描述要素的位置和形状,需要引入一个用于定义位置的框 架———空间参考。…

数青蛙 ---- 模拟

题目链接 题目: 分析: 题目的意思是: 一次蛙鸣是一个完整的字符串"croak", 给你一个字符串, 让你求出最少的青蛙数目 示例一: 两次完整的"croak", 可以由一只青蛙完成, 所以答案为1 示例二: 第一次蛙鸣还没有结束, 又出现了"c", 说明有第二只青…

RTPS协议之Structure

目录 概览RTPS中的各实体和类RTPS实体和类的属性类型:RTPS Entities属性 HistoryCacheCacheChangeRTPS EntityRTPS ParticipantRTPS EndPointRTPS WriterRTPS Reader和DDS Entities的关联DDS DataWriterDDS DataReader 每个RTPS实体和DDS实体是一对一对应的。Histor…

Docker基础篇之Docker容器数据卷

文章目录 1. Docker配置容器卷配置时的一个建议2. Docker容器卷目录3. Docker容器卷案例 1. Docker配置容器卷配置时的一个建议 Docker挂载主机目录访问如果出现cannot open directory.:Permission dnied 解决方法:在挂载目录后加一个–privilegedtrue 如果是Cento…

ArkTS UI开发规范的常用装饰器

Component 可以装饰struct。结构体(struct)在被装饰后具有基于组件的能力,需要实现build方法来更新UI。Entry 可以装饰struct。组件在被装饰后会作为页面的入口组件,页面加载时将被渲染显示。Preview 可以装饰struct。 如果自定义的组件被Preivew装饰&am…