首页 > 其他分享 >004 自动求微分

004 自动求微分

时间:2023-05-13 11:34:34浏览次数:35  
标签:函数 梯度 微分 自动 计算 004 grad 向量 tensor

1. 一个简单的例子

假设我们想对对列向量x进行求导。

 上面的代码中,requires_grad=True表明x这个东西需要用到梯度; y.backward()执行反向传播,x.grad是x的梯度。

再看一个y=x.sum()的例子:

 在计算这个新的函数的梯度之前,需要将x的梯度清零,使用x.grad.zero_()方法。默认情况下,Pytorch会累计梯度,所以计算新的函数的梯度之前需要将原来的x的梯度清零。 

注意:一个标量函数关于向量x的函数是一个向量,并且这个梯度向量与x有着相同的形状。

 

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

y不是标量时,向量y关于向量x的导数的最自然解释是一个矩阵。 对于高阶和高维的yx,求导的结果可以是一个高阶张量。

然而,虽然这些更奇特的对象确实出现在高级机器学习中(包括深度学习中), 但当调用向量的反向计算时,我们通常会试图计算一批训练样本中每个组成部分的损失函数的导数。 这里,我们的目的不是计算微分矩阵,而是单独计算批量中每个样本的偏导数之和。

 

3. 分离计算

当y是x的函数(y=x*x),z又是x,y的函数(z=y*x)时,我们可以通过下面的例子计算z对x的梯度:

有时,我们希望将某些计算移动到记录的计算图之外。 例如,我们想计算z关于x的梯度,但由于某种原因,希望将y视为一个常数, 并且只考虑到xy被计算后发挥的作用。

这里可以分离y来返回一个新变量u,该变量与y具有相同的值, 但丢弃计算图中如何计算y的任何信息。 换句话说,梯度不会向后流经ux。 因此,下面的反向传播函数计算z=u*x关于x的偏导数,同时将u作为常数处理。

 y.detach()函数返回一个新的张量,这个张量是从当前计算图上分离下来的,但仍指向原变量的内存位置,且这个tensor的requires_grad为False。得到的这个tensor永远也不需要计算其梯度。注意:返回的tensor和原始的tensor共享同一内存。

 

由于记录了y = x * x,我们仍然可以对y进行反向传播,计算y = x * x对x的梯度,即2 * x:

 

4. Python控制流的梯度计算

使用自动微分的一个好处是: 即使构建函数的计算图需要通过Python控制流(例如,条件、循环或任意函数调用),我们仍然可以计算得到的变量的梯度。 在下面的代码中,while循环的迭代次数和if语句的结果都取决于输入a的值。

def f(a):
    b = a * 2
    while b.norm() < 1000:
        b = b * 2
    if b.sum() > 0:
        c = b
    else:
        c = 100 * b
    return c

让我们计算梯度。

a = torch.randn(size=(), requires_grad=True)
d = f(a)
d.backward()

我们现在可以分析上面定义的f函数。 请注意,它在其输入a中是分段线性的。 换言之,对于任何a,存在某个常量标量k,使得f(a)=k*a,其中k的值取决于输入a,因此可以用d/a验证梯度是否正确。

a.grad == d / a

输出结果:

 

 

标签:函数,梯度,微分,自动,计算,004,grad,向量,tensor
From: https://www.cnblogs.com/pkuqcy/p/17396841.html

相关文章

  • AIGC:虚拟世界里的自动驾驶,科技推动出行方式变革丨曼孚科技
    今年,消费者对新能源汽车的需求持续走高。5月11日,中国汽车工业协会乘用车市场信息联席会发布了一则数据,截止4月末,新能源汽车产销分别完成229.1万辆与222.2万辆,同比均增长42.8%,市场占有率达27%。这一串数字,印证了新能源汽车市场的强势增速,也体现了消费者对新能源汽车认知的提升。......
  • APP自动化--封包
    常用的导包数据,可以直接封装起来,以便后期使用,可以在project添加名为Package的python软件包,如常用下面的包和APP自动远程的链接信息,可以进行封装fromappium.webdriverimportRemote#导入远程包fromappium.webdriver.common.appiumbyimportAppiumByasBy#引用app......
  • 西门子1500PLC博途程序实例,大型程序fanuc机器人汽车焊装自动生产线程序,程序硬件结构包
    西门子1500PLC博途程序实例,大型程序fanuc机器人汽车焊装自动生产线程序,程序硬件结构包括1台西门子1500PLC程序,2台触摸屏TP1500程序9个智能远程终端ET200SPProfinet连接15个Festo智能模块Profinet通讯10台Fanuc发那科机器人Profinet通讯3台G120变频器Profinet通讯2台智能电能管理......
  • omron欧姆龙NJ/NX程序 全自动锂电池二封机,主站NJ501-1400+威纶
    omron欧姆龙NJ/NX程序全自动锂电池二封机,主站NJ501-1400+威纶通触摸屏。整机采用EtherCAT总线网络节点控制,松下A6总线控制。轴控制全部封装成功能块,可按照使用选择对应的功能,JOG功能,相对定位,绝对定位。扫码通信功能块。E5CC温控器SP,SV,AT等读写温度控制,松下真空表真空压力模拟量......
  • PLC做配方三轴螺丝机程序 配合流水线使用的三轴吸钉式自动锁螺丝机 (就是用流水线到位
    PLC做配方三轴螺丝机程序配合流水线使用的三轴吸钉式自动锁螺丝机(就是用流水线到位信号启动,螺丝机打完再输出信号:)显控触摸屏加三菱FX3GA已经在设备上使用。用PLC做的配方,打螺丝颗数1-10颗最大存储70个产品数据颗数和数据数程序可以改ID:1418656656907646......
  • Linux 服务器下Mysql自动备份 30天滚动存储 每天凌晨2点准时备份
    一、创建备份目录执行命令:在指定路径下创建备份目录cd/mnt/filemkdirdata_backup二、编写shell脚本放在/mnt/file/data_backup里创建.shshell脚本:touchbkmysql.sh打开脚本文件:vim bkmysql.sh脚本文件内容如下所示:login_user表示数据库用户名......
  • 三菱,FX3U,plc程序模板和触摸屏程序模板,适用于运动轴控制,程序可以在自动的时候暂停进行
    三菱,FX3U,plc程序模板和触摸屏程序模板,适用于运动轴控制,程序可以在自动的时候暂停进行手动控制,适用于一些中大型设备,可以防止某个气缸超时时,处于自动模式,能够轻松处理,处理完成后,恢复原来的气缸,解除暂停即可,思路清晰,编程效率大大提高,程序里附带和仪表的无协议通讯,并且附带最常用的手......
  • CentOS5.7 下mysql5.7自动备份数据脚本
    mysql5.7自动备份数据库脚本1.root用户下用cd命令进入到想要的位置创建一个脚文文件://创建脚本命令vimbackup.shvim脚本名.sh#!/bin/bashsource/etc/profile#加载系统环境变量source~/.bash_profile#加载用户环境变量set-onounset......
  • S7-1200PLC运动控制程序-结构化编程控制5轴伺服项目每一功能 具有一个项目都有的功能:
    S7-1200PLC运动控制程序-结构化编程控制5轴伺服项目每一功能具有一个项目都有的功能:自动_手动_单步_暂停后原位置继续运行_轴断电保持_报警功能_气缸运行及报警.2.每个功能块可以无数次重复调用,可以建成库,用时调出即可!3.伺服不光脉冲控制同时使用了速度模式+扭矩模式应用.上位机......
  • web自动化12-捕获异常NoSuchElementException
    在定位元素的时候,经常会遇到各种异常,遇到异常又该如何处理呢?selenium的exceptions模块,了解异常发生的原因。捕获异常1.出现异常代码会被结束中断,为了可以继续运行,可以用try...except...来捕获异常。捕获后可以输出异常原因,以便于分析异常原因2.从上面的截图看报错提示元素不......