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

反向传播自动求微分【Pytorch】

PytorchAutograd技术可以帮助我们自动求微分值

1. 微分实例

image-20230402155407309 image-20230402164959934

2. 基本原理

复杂的计算可以被抽象成一张图,一张复杂的计算图可以分成4个部分:

  1. 叶子节点【图的末端,没有信息流经过,但信息流由此出发】
  2. 中间节点【有信息流经过,信息流经过中间节点来到末端输出叶子节点】
  3. 输出节点
  4. 信息流【可以理解为有用信息集合,如上述求关于 x 1 x_1 x1 的微分,此时 x 1 x_1 x1 就说有用的信息】

微分示例中的 x → \overrightarrow{x} x 是叶子节点、 z → \overrightarrow{z} z 是中间节点、 y → \overrightarrow{y} y 是输出节点,三者都是Tensor

Tensor在自动微分方面有三个重要属性👇:

  • requires_grad:布尔值,默认为False,为True时表示此张量需要自动微分
  • grad:存储张量微分值
  • grad_fn:存储张量微分函数

当叶子节点的requires_gradTrue,信息流经过该节点时,所有中间节点的requires_grad属性都会变为True,只要在输出节点调用反向传播函数backward()Pytorch就会自动求出叶子节点的微分值并更新存储在叶子节点的grad属性中。

需要注意的是:只有叶子节点的grad属性能被更新

3. 代码示例

import torch
# x是一维张量且值全为 1
x = torch.ones(2)
print('反向传播前,x的grad属性值:', x.grad)
# 我们后边需要计算 y 关于 x 的微分,因此 x 的 requires_grad 属性设置为 True
x.requires_grad = True
# 张量 x 的每个元素都乘 4 得到张量 z
z = x*4
# y 的值等于 z 的二阶范数
# 所谓二阶范数就是 张量内所有元素平方和再开方,与上述微分例子中一致
y = z.norm()
# y 启动反向传播,执行完毕后就能得到 y 关于张量 x 的微分【存储在 x 的 grad 中】
y.backward()
print('反向传播后,x的grad属性值:', x.grad)
image-20230402163933148

http://www.kler.cn/a/5596.html

相关文章:

  • Java 异常类详细介绍
  • 选择FPGA开发,学历是硬性要求吗?
  • 778-批量删除指定文件夹下指定格式文件(包含子孙文件夹下的)
  • 机器人加装电主轴【铣削、钻孔、打磨、去毛刺】更高效
  • 使用 perf 工具进行性能分析
  • 反射探针.
  • 第06章_索引的数据结构
  • 2010年9月计算机二级JAVA笔试试题及答案
  • c语言实践——通讯录(1)(静态版)
  • 机器学习笔记:层次聚类
  • Leetcode.1641 统计字典序元音字符串的数目
  • 《雪国》像憧憬未曾见过的爱恋,美则美矣
  • TCP和UDP网络编程
  • 接收机中的非线性因素来源与模型
  • fastp软件介绍
  • ChatGPT自我分析
  • 【论文写作】如何表示比较关系, compare to OR compare with?
  • 自定义注解:让代码更加简洁优雅
  • 【SpringSecurity】认证授权框架——SpringSecurity使用方法
  • JavaWeb——过滤器Filter和拦截器Interceptor
  • 谷粒商城笔记+踩坑(18)——购物车
  • 2023年南京晓庄学院五年一贯制专转本软件工程专业考试大纲
  • 一文读懂 mysql 为什么要两阶段提交以及两阶段提交原理
  • 面试官灵魂拷问[二]:SQL 语句中 where 条件后写上 1=1 是什么意思?
  • 02_Python 学习基础
  • 【算法】Raft算法详解