动手学深度学习6 自动求导

自动求导

  • 1. 自动求导
  • 2. 自动求导实现
  • QA
    • 1. ppt上隐式构造和显示构造为什么看起来差不多?
    • 2. 需要正向反向都算一遍吗
    • 3. 为什么pytorch会默认累积梯度
    • 4. 为什么是0246, x^2对x求导这样理解吗?
    • 5. 为什么深度学习中一般对标量求导而不是对矩阵或者向量
    • 6.多个loss函数分别反向的时候是需要累加梯度的
    • 7. 为什么获取.grad前需要backward
    • 8. 求导的过程一般来说是不是都是有向图,可以用树状结构来表示,有其他环状的图结构吗
    • 9. pytorch或mxnet框架可以实现矢量的求导

视频: https://www.bilibili.com/video/BV1KA411N7Px/?spm_id_from=autoNext&vd_source=eb04c9a33e87ceba9c9a2e5f09752ef8
课件: https://zh-v2.d2l.ai/chapter_preliminaries/autograd.html
课上PPT: https://courses.d2l.ai/zh-v2/assets/pdfs/part-0_7.pdf
从入门到放弃说的就是这两节课~~~

1. 自动求导

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
自动求导是怎么做出来的–计算图–等价于链式法则求导的过程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
反向传播,内存复杂度O(n),存储正向计算的所有中间结果,也是深度神经网络非常耗gpu资源的原因。
在这里插入图片描述
正向累积需要对每一层计算梯度,计算复杂度太高【每一层应该也有很多变量】

2. 自动求导实现

1. 示例 y = 2 X T X y=2X^TX y=2XTX 关于列向量x求导。

y=sum(x) , 导数是全为1的向量
在这里插入图片描述

import torchx = torch.arange(4.0)
print(x)
# 设置一个地方 保存梯度 不会在每次对一个参数求导时都分配新的内存
# 一个标量函数关于向量x的梯度是向量,并且与x具有相同的形状
# x = torch.arange(4.0, requires_grad=True)  # 定义后再调梯度或者定义向量的时候就指定requires_grad参数,效果是一样的
x.requires_grad_(True)
print(x.grad)  # 访问梯度--等价于y关于x的导数存放在这里 默认值是None 
# 计算y 标量
y = 2 * torch.dot(x, x)
print(y) # torch会记住所有操作 grad_fn=<MulBackward0> 隐式构建计算图,有求梯度的函数grad_fn存放在这里 告知系统y是从x计算过来的
# 调用反向传播函数 计算y关于x每个分量的梯度 梯度与x同形状
y.backward()  # 求导
print(x.grad) # 访问梯度--导数
# 函数y=2x^Tx 关于x的梯度应为4x
print(x.grad == 4*x)
# 计算x的另一个函数,此时可以认为是另一层网络了,上一层的计算已经结束 梯度的值需要清零
# 在默认情况下,PyTorch会累积梯度,我们需要清除之前的值
x.grad.zero_() # pytorch下划线表示重新写入内容 zero-置零
y = x.sum() # 求向量的sum函数 梯度等于全1
y.backward()
print(x.grad) # 在梯度不清零的情况下直接求导,梯度会在原来的值上做累加求和 [0.,4.,8.,12.]+[1.,1.,1.,1.]=[1.,5.,9.,13.]
tensor([0., 1., 2., 3.])
None
tensor(28., grad_fn=<MulBackward0>) 
tensor([ 0.,  4.,  8., 12.])
tensor([True, True, True, True])
tensor([ 1.,  5.,  9., 13.])

2. 非标量变量的反向传播

假设y也是一个向量,向量对向量的求导是一个矩阵。深度学习中很少对向量求导,一般是对标量求导。对y向量做求和–是标量后再求导。
在这里插入图片描述

x.grad.zero_()
y = x * x
y.sum().backward()
print(x.grad)
x.grad == 2 * x
tensor([0., 2., 4., 6.])
tensor([True, True, True, True])

在什么情况下需要对y做求和呢?

3. 分离计算

在某层网络需要把参数固定的时候,会用到这个功能
在PyTorch中,y.detach()是一个用于从计算图中分离张量的方法。计算图是PyTorch用于自动微分的关键概念,用于构建和跟踪张量之间的操作。在计算图中,张量的计算历史被记录下来,以便在反向传播时计算梯度。但有时我们希望从计算图中分离出某个张量,使其不再与原始的计算历史关联。这在某些情况下是很有用的,例如当我们只关心使用该张量进行正向传播的结果,并且不需要计算梯度时。
当调用y.detach()时,将返回一个与y相同数据但不再与计算图关联的新张量。这意味着对返回的张量进行操作不会对原始计算图产生任何影响,也不会计算任何梯度。该方法可用于将张量作为输入传递给不允许梯度传播的函数或模型。

在这里插入图片描述

x.grad.zero_()
y = x * x
u = y.detach()  # 把y看成一个常数赋给u u与x无关,是一个常数
print(u)
z = u * x  # z对x的导数 
z.sum().backward()
print(x.grad)
print(u == x.grad)# u是常数不是x的函数,y还是x的函数,还是可以对y求x的导数
x.grad.zero_()
y.sum().backward()
print(x.grad)
print(x.grad == 2*x)
tensor([0., 1., 4., 9.])
tensor([0., 1., 4., 9.])
tensor([True, True, True, True])
tensor([0., 2., 4., 6.])
tensor([True, True, True, True])

4. Python控制流的梯度计算

在这里插入图片描述
当用一个很复杂的python控制流的时候,依然可以求导。
不论中间的控制流怎么复杂,可以看成一个整体,认为d=f(a)=k*a, 导数为k,
k=d/a

def f(a):b = a * 2while b.norm() < 1000:b = b * 2if b.sum() > 0:c = belse:c = 100 * breturn ca = torch.randn(size=(), requires_grad=True) # torch.randn()是一个用于生成服从标准正态分布(均值为0,标准差为1)的随机数的函数
d = f(a)
d.backward()
print(a)
print(d)
print(a.grad)
print(d/a)
print(a.grad == d/a) # 为什么这两个值相等 不论中间的控制流怎么复杂,可以看成一个整体,认为d=f(a)=k*a, 导数为k,k=d/a
tensor(0.5429, requires_grad=True)
tensor(1111.8456, grad_fn=<MulBackward0>)
tensor(2048.)
tensor(2048., grad_fn=<DivBackward0>)
tensor(True)

在这里插入图片描述
pytorch隐式构造的好处,控制流的使用更好一些,但是慢一些。

QA

1. ppt上隐式构造和显示构造为什么看起来差不多?

主要区别:显示构造:先写出整个计算,再去给值
数学和python代码实现上很不一样,实际使用,正向显示构造很不方便

2. 需要正向反向都算一遍吗

神经网络求梯度: 正着算一遍【算出函数y的值】,反着算一遍【自动求导】

3. 为什么pytorch会默认累积梯度

设计理念。通常有大批量时候,算一次算不出来梯度,就把大批量分成小批量,然后就需要累积梯度。
weight在不同模型使用的时候,累加是有好处的。

4. 为什么是0246, x^2对x求导这样理解吗?

x * x 导数是2x, 【0,1,2,3】*2=【0,2,4,6】

5. 为什么深度学习中一般对标量求导而不是对矩阵或者向量

因为loss【精度等】通常是一个标量,如果loss是向量,向量关于矩阵的loss是矩阵,神经网络展开会变成很高维的张量,无法计算。

6.多个loss函数分别反向的时候是需要累加梯度的

为什么pytorch默认累加梯度的原因

7. 为什么获取.grad前需要backward

计算梯度是一个很贵的事情,会占用很多资源,不调用backward是不会自动计算梯度的,需要手动调用。

8. 求导的过程一般来说是不是都是有向图,可以用树状结构来表示,有其他环状的图结构吗

循环神经网络可以变成环状结构【逻辑上】,但是计算上还是展开的,在图上表示是展开的,做梯度累加

9. pytorch或mxnet框架可以实现矢量的求导

支持高阶求导,在二阶优化算法可以实现,但是速度很慢。

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

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

相关文章

Go 中 slice 的 In 功能实现探索

文章目录 遍历二分查找map key性能总结 之前在知乎看到一个问题&#xff1a;为什么 Golang 没有像 Python 中 in 一样的功能&#xff1f;于是&#xff0c;搜了下这个问题&#xff0c;发现还是有不少人有这样的疑问。 补充&#xff1a;本文写于 2019 年。GO 现在已经支持泛型&am…

ICCV2023 | PTUnifier+:通过Soft Prompts(软提示)统一医学视觉语言预训练

论文标题&#xff1a;Towards Unifying Medical Vision-and-Language Pre-training via Soft Prompts 代码&#xff1a;https://github.com/zhjohnchan/ptunifier Fusion-encoder type和Dual-encoder type。前者在多模态任务中具有优势&#xff0c;因为模态之间有充分的相互…

游卡:OceanBase在游戏核心业务的规模化降本实践

从 2023 年 9 月测试 OceanBase&#xff0c;到如今 3 个核心业务应用 OceanBase&#xff0c;国内最早卡牌游戏研发者之一的游卡仅用了两个月。是什么原因让游卡放弃游戏行业通用的 MySQL方案&#xff0c;选择升级至 OceanBase&#xff1f;杭州游卡网络技术有限公司&#xff08;…

ConcurrentHashMap介绍

一、ConcurrentHashMap 1.1 存储结构 ConcurrentHashMap是线程安全的HashMap ConcurrentHashMap在JDK1.8中是以CASsynchronized实现的线程安全 CAS&#xff1a;在没有hash冲突时&#xff08;Node要放在数组上时&#xff09; synchronized&#xff1a;在出现hash冲突时&…

element中Table表格控件单选、多选功能进一步优化

目录 一、代码实现1、 父组件2、子组件&#xff08;弹框&#xff09; 二、效果图 一、代码实现 1、 父组件 <template><div><!-- 用户选择嵌套弹框 --><el-dialog :close-on-click-modal"false" :close-on-press-escape"false" tit…

端到端自动驾驶

自动驾驶主要流程&#xff1a;感知->预测->规划 预测是预测周围目标&#xff08;车、行人、动物等&#xff09;的轨迹&#xff0c;规划是规划自车的运动轨迹。 UniAD[CVPR 2023]: 使用transformer架构&#xff0c;统一自动驾驶流程&#xff0c;完成所有检测&#xff0c…

惊心!读写台灯国检结果发布:不合格87.5%都因照度和照度均匀度!

近日&#xff0c;国家市场监管总局正式对外发布“2023年烟花爆竹、羽绒服装等13种产品质量国家监督抽查情况通报”&#xff0c;涉及读写台灯、固定式通用灯具、嵌入式灯具等3类照明产品第二批国抽情况。本次国抽情况显示&#xff0c;包括316家照明相关生产和销售单位所属的361批…

仿三方智能对话分析原始会话窗口

设计效果如下&#xff1a; 设计要求如下&#xff1a; 1、顶部播放条播放时&#xff0c;文字内容自动滚动。 监听audio事件timeupdate&#xff0c;只要播放器在播放就会触发该事件。每行文字有开始时间begin。判断当前时间&#xff08;currentTime&#xff09;<开始时间&am…

JAVA实现向Word模板中插入Base64图片和数据信息

目录 需求一、准备模板文件二、引入Poi-tl、Apache POI依赖三、创建实体类&#xff08;用于保存向Word中写入的数据&#xff09;四、实现Service接口五、Controller层实现 需求 在服务端提前准备好Word模板文件&#xff0c;并在用户请求接口时服务端动态获取图片。数据等信息插…

[UofTCTF 2024]

最近没有比赛&#xff0c;拿个国外刚比完的练练手。只是网站太慢了&#xff0c;点任何一处都得等一分钟。而且pwn的远程都开不了。不过pwn过于简单&#xff0c;连本地都没调&#xff0c;当是个pwn概念吧。 Crypto repeat 题 import os import secretsflag "REDACATED…

限流算法之固定窗口算法

文章目录 原理示例图 优缺点优点缺点 示例代码java 适用场景不推荐原因如下&#xff1a; 原理 固定窗口算法是一种常见的限流算法&#xff0c;它通过在固定长度的时间窗口内限制请求数量来实现限流。这种算法的原理是在每个时间窗口内&#xff0c;对到达的请求进行计数&#x…

【EI会议征稿通知】第七届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2024)

第七届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2024&#xff09; 2024 7th International Conference on Advanced Electronic Materials, Computers and Software Engineering 第七届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2024)将于2024年5月10-1…

C++、QT 数字合成游戏

一、项目介绍 数字合成游戏 基本要求&#xff1a; 1&#xff09;要求游戏界面简洁美观&#xff0c;且符合扫雷的游戏风格。 2&#xff09;需要有游戏操作或者规则说明&#xff0c;方便玩家上手。 3&#xff09;需具有开始游戏&#xff0c;暂停游戏&#xff0c;结束游戏等方便玩…

2024--Django平台开发-订单项目管理(十四)

day14 订单管理系统 1.关于登录 1.1 UI美化 页面美化&#xff0c;用BootStrap 自定义BooStrapForm类实现。 class BootStrapForm:exclude_filed_list []def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# {title:对象,"percent":对象}fo…

市场监管总局发布区块链和分布式记账技术6项标准,中创积极推动区块链产业发展!

近日&#xff0c;市场监管总局&#xff08;国家标准委&#xff09;批准发布一批重要国家标准&#xff0c;涉及生产生活、绿色可持续等多个领域&#xff0c;这些标准将在引领产业发展、促进绿色转型、助力对外贸易、推动城乡建设、提升生活品质等方面发挥重要作用。 其中一项标…

免费三款备受推崇的爬虫软件

在信息爆炸的时代&#xff0c;爬虫软件成为了数据采集、信息挖掘的得力工具。为了解决用户对优秀爬虫软件的需求&#xff0c;本文将专心分享三款备受推崇的爬虫软件&#xff0c;其中特别突出推荐147采集软件&#xff0c;为您开启爬虫软件的奇妙世界。 一、爬虫软件的重要性 爬…

【开源】基于JAVA的教学资源共享平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

【MATLAB】 SSA奇异谱分析信号分解算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 SSA奇异谱分析&#xff08;Singular Spectrum Analysis&#xff09;是一种处理非线性时间序列数据的方法&#xff0c;可以对时间序列进行分析和预测。 它基于构造在时间序列上的特定矩阵的奇异值分解&#…

3Dmax灯光学习(Vray灯光应用)

渲染效果图可以用渲染100哦&#xff0c;最高支持max2024&#xff0c;cr11&#xff0c;vr6.2&#xff0c;支持LUT和Acescg工作流等常用插件&#xff0c;同时森林插件7.43也进行了支持&#xff0c;注册填邀请码【7788】即可免费测试&#xff01; 灯光应用 普通灯光/标准灯光(外景…

RIP基础实验配置

要使用RIP完成以上命令需求 1&#xff0c;首先划分ip地址 有图可见有四个网段需要划分 192.168.1.0/26 192.168.3.0/26 192.168.7.0/26 192.168.5.0/26 给两个骨干网段&#xff0c;给两个环回接口&#xff0c;由下图所示&#xff1a; 其次&#xff0c;规划好ip后在各个接口…