基于PyTorch的深度学习3——非标量反向传播

以下内容由大语言模型生成:

张量,边代表从输入到输出的操作。当我们对一个标量调用backward()函数时,PyTorch能够直接计算该标量关于参与运算的所有张量的梯度。这是因为导数的概念最开始是针对标量值定义的。

为什么需要传入gradient参数?

当你有一个非标量(即形状不为1的张量)并希望对其求导时,实际上你是在尝试计算这个张量关于某些变量的雅可比矩阵(Jacobian Matrix)。然而,PyTorch并不直接支持这种操作,因为它复杂化了自动微分的流程。为了简化这个问题,PyTorch要求在这种情况下提供一个额外的gradient参数,这个参数同样是一个张量,并且其形状必须与调用backward()的那个张量相同。这个gradient实际上扮演了一个"权重"的角色,用于将多维导数的问题转化为标量导数的问题。

如何理解这个过程?

考虑你的例子:假设你有一个损失向量loss=(y_1, y_2, ..., y_m),你想要根据它来更新一些模型参数。由于loss不是一个标量,你不能直接对它调用backward()。这时,你可以引入一个向量v=(v_1, v_2, ..., v_m),然后将loss与v进行点乘得到一个新的标量loss*v^T(这里v^T表示v的转置,虽然在实际代码中我们不会这样写,这只是为了表达数学概念)。这个新生成的标量可以被用来调用backward()方法,从而触发梯度的计算。

具体来说,这样做实际上是计算了loss的雅可比矩阵与v的乘积。换句话说,原本你需要计算的是雅可比矩阵,但现在通过点乘转换后,你只需计算一个标量关于所需变量的梯度。这使得PyTorch的自动微分机制能够处理这种情况,而不需要直接支持张量对张量的求导。

1)定义叶子节点及计算节点。

python 复制代码
import torch

#定义叶节点张量x,形状为1x2
x=torch.tensor([[2.3]],dtype=torch.float,requires_grad=True)

#初始化Jacobian矩阵
J=torch.zeros(2,2)

#初始化目标张量,形状为1x2
y=torch.zeros(1,2)

#定义y与x之间的映射关系:
#y1=x1**2+3*x2,y2=x2**2+2*x1
y[0,0]=x[0,0]**2+3*x[0,1]
y[0,1]=x[0,1]**2+2*x[0,0]

2)手工计算y对x的梯度

y对x的梯度是一个雅可比矩阵,可以通过手动计算值

python 复制代码
#生成y1对x的梯度
y.backward(torch.Tensor([[1, 0]]),retain_graph=True)
##gradient的作用:传入的gradient张量扮演了一个权重的角色,它决定了每个元素在最终梯度计算中的重要
##本质上,这是将雅可比矩阵乘以这个gradient向量,从而将多维导数的问题简化为一维标量导数的问题。

J[0]=x.grad

#梯度是累加的,故需要对x的梯度清零
x.grad = torch.zeros_like(x.grad)

#生成y2对x的梯度
y.backward(torch.Tensor([[0, 1]]))

J[1]=x.grad
#显示jacobian矩阵的值
print(J)
相关推荐
阿明副业观察13 分钟前
AI视频生成技术全解:生成方法、操作流程与选型指南
大数据·人工智能·ai作画·aigc·ai写作
鬼手点金21 分钟前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
数字融合38 分钟前
透明化视频孪生虚实映射一体化融合技术
人工智能·python·数码相机
杨杨杨大侠1 小时前
从一次请求讲透 A2A:Agent 怎么选、怎么协作、记忆放在哪里
人工智能·agent
后端小肥肠1 小时前
做公众号漫画还在纯手搓?这套工具从选题到复刻任意热门漫画一键搞定
人工智能·aigc·agent
xier_ran1 小时前
【infra之路】AI 编译器学习笔记(二):重拾 C++——移动语义与 LLVM 风格的类型转换
人工智能·笔记·学习
paopaokaka_luck1 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
陈嘿萌1 小时前
ICML 2026|浙大 1D-Fusion:用 Tokenizer 将图像“压”成一维 Token,重构融合表示
图像处理·人工智能·计算机视觉·图像融合·计算机科学与技术·学术研究与理论基础·顶级期刊与会议
看着博客敲代码1 小时前
WorkBuddy 接上 Kali MCP 做自动化渗透:信息收集到初步验证的落地记录
linux·人工智能·安全·网络安全·自动化
szxinmai主板定制专家1 小时前
储能EMS + 协调控制器实战:RK3568/3576/3588+FPGA+AI 故障录波与诊断
人工智能·深度学习·机器学习·fpga开发·rk3588·rk3576·协调控制器