当前位置: 首页 > news >正文

深度学习-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.总结

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

相关文章:

  • [数据集][目标检测]RSNA肺炎检测数据集VOC+YOLO格式6012张1类别
  • 手机号脱敏
  • 【前缀“选区-” bat脚本】
  • 汽车IVI中控开发入门及进阶(二十二):video decoder视频解码芯片
  • 深度学习入门-第3章-神经网络
  • 数据结构:链式队列
  • C++ Primer 第五版 第15章 面向对象程序设计
  • 结账和反结账
  • 【学习笔记】Windows GDI绘图(九)Graphics详解(中)
  • JVM 指针压缩
  • 超越Devin!姚班带队,他们创大模型编程新世界纪录
  • Python3 元组
  • 制造企业如何通过PLM系统实现BOM管理的飞跃
  • AI的绘画工具有哪些?
  • 批量归一化(BN)和层归一化(LN)的区别
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • android图片蒙层
  • Apache的80端口被占用以及访问时报错403
  • download使用浅析
  • JavaScript中的对象个人分享
  • MD5加密原理解析及OC版原理实现
  • mongodb--安装和初步使用教程
  • use Google search engine
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 基于遗传算法的优化问题求解
  • 深入浏览器事件循环的本质
  • 实现菜单下拉伸展折叠效果demo
  • 使用 QuickBI 搭建酷炫可视化分析
  • 手写一个CommonJS打包工具(一)
  • 我与Jetbrains的这些年
  • 小而合理的前端理论:rscss和rsjs
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • Hibernate主键生成策略及选择
  • ​configparser --- 配置文件解析器​
  • ​ubuntu下安装kvm虚拟机
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​字​节​一​面​
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #{}和${}的区别是什么 -- java面试
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (ibm)Java 语言的 XPath API
  • (Java)【深基9.例1】选举学生会
  • (pojstep1.1.2)2654(直叙式模拟)
  • (八)Flask之app.route装饰器函数的参数
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)程序员疫苗:代码注入
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .NET BackgroundWorker
  • .NET C# 使用 iText 生成PDF
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory