深度学习-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,一经查实,立即删除!

相关文章

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

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

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

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

麦肯锡: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、性价比—…

【Microelectronic Systems】

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

vscode快捷键英文单词对照表

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

防爆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…

vivado BD_INTF_NET、BD_INTF_PIN

BD_INTF_NET 描述 接口是一组信号,它们共享一个共同的功能,同时包含 单个信号和多条总线。例如,AXI4Lite主机包含一个 单个信号的数量加上多条总线,这些都是制作 联系通过将这些信号和总线分组到一个接口中,Vivado IP积…

C语言指针用法完善篇

一,指针定义: 1,讲解 指针变量用来记录地址数据,没有记录有效地址的指针变量不可以使用。 定义一个变量A和一个指针B,此时变量A存放在内存1000区间,将变量A赋值给指针变量B,此时指针变量B所接收到的并不是…

彩光大放异彩!《智慧园区以太全光网络建设技术规程》应用案例征集活动结果公布

近日,中国建筑业协会绿色建造与智能建筑分会正式公布了《智慧园区以太全光网络建设技术规程》应用案例征集活动的结果。本次活动旨在推广和应用该规程,进一步推动智慧园区的数字化、智慧化、绿色化建设。众多优秀项目在征集活动中脱颖而出,展示了规程在实际应用中的显著成效。评…

STM32--ESP8266 WiFi模块

前言:此文所述模块为正点原子出版的ATK-ESP8266模块 一、特性参数 ATK-ESP8266 是 ALIENTEK 推出的一款高性能的 UART-WiFi(串口-无线)模块,ATK-ESP8266 板载了正点原子公司自主开发的 ATK-ESP-01 模块。 该模块是 ATK_ESP8266 的…

MySQL表的增删改查初阶(上篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

防火墙技术基础篇:eNSP配置防火墙主备备份的双机热备

防火墙技术基础篇:配置主备备份的双机热备 防火墙双机热备(High Availability, HA)技术是网络安全中的一个关键组成部分,通过它,我们可以确保网络环境的高可靠性和高可用性。下面我们一起来了解防火墙双机热备的基本原…

安装存储器的段描述符并加载GDTR

代码清单 ;代码清单12-1;文件名:c12_mbr.asm;文件说明:硬盘主引导扇区代码;创建日期:2011-5-16 19:54;修改于2022-02-16 11:15;设置堆栈段和栈指针mov ax, csmov ss, axmov sp, 0x7c00;计算GDT所在的逻辑段地址12 mov ax, [c…