backward()说明

1.out.backwark()中out是一个标量

此时可以直接使用out.backwark():

import torch
from torch.autograd import Variable

#生成一个内容为[2,3]的张量,Varibale 默认是不要求梯度的,如果要求梯度,
#需要加上requires_grad=True来说明
#这里的Variable是为了设置变量,把a0=2,a1=3设置为两个变量
a = Variable(torch.tensor([2,3]),requires_grad=True)
b = a+3
c = b*3
out=c.mean() #求均值
out.backward()
print("a=",a)
print("out=",out)
print(a.grad)  #求out对a的偏导

结果为

a= tensor([2., 3.], requires_grad=True)
out= tensor(16.5000, grad_fn=<MeanBackward0>)
tensor([1.5000, 1.5000])

 2. out.backward()中的out是一个向量(或者理解成1xN的矩阵)

import torch
from torch.autograd import Variable

#生成一个内容为[2,4]的张量,Varibale 默认是不要求梯度的,如果要求梯度,
#需要加上requires_grad=True来说明
a = Variable(torch.Tensor([[2,4]]),requires_grad=True)
b = torch.zeros(1,2)
b[0,0] = a[0,0]**2+a[0,1]
b[0,1] = a[0,1]**3+a[0,0]
out = 2*b

#括号里面的参数要传入和out维度一样的矩阵
#这个矩阵里面的元素会作为最后加权输出的权重系数
out.backward(torch.FloatTensor([[1,2]]))
print("a=",a)
print("out=",out)
print(a.grad)  #求out对a的偏导

结果为:

a= tensor([[2., 4.]], requires_grad=True)
out= tensor([[ 16., 132.]], grad_fn=<MulBackward0>)
tensor([[12., 194.]])

 

backward()函数是PyTorch框架中自动求梯度功能的一部分,负责执行反向传播算法以计算模型参数的梯度。由于PyTorch的源代码复杂且深度嵌入在C++底层实现中,下面从概念、原理和使用方法三方面进行介绍。 ### 概念 在PyTorch里,backward()函数是实现自动求梯度的关键,其核心作用是执行反向传播算法,进而计算模型参数的梯度,为后续模型参数的优化提供依据[^1]。 ### 原理 所有的operations都定义在torch.nn.Autograd.Function类中,该类有forward和backward两个主要方法,其中backward函数实现梯度的反向传播。每次对tensor的操作会创建一个新的function object,用于计算和记录操作内容。记录的历史存成function的有向无环图(DAG),通过edges确定数据依赖(output依赖input数据)。当调用backward函数时,会按照拓扑序遍历这个DAG图,调用function的backward函数,并把梯度传给下一个function[^2]。 ### 使用方法 backward函数是反向求导数,使用链式法则求导。若对非标量y求导,函数需要额外指定grad_tensors,且grad_tensors的shape必须和y的相同。以下是不同情况的使用示例: #### 对单个标量求导 ```python import torch from torch.autograd import Variable x = Variable(torch.Tensor([16]), requires_grad=True) # 需要求导数 y = x * x y.backward() print(x.grad) ``` 在这个例子中,首先定义了一个需要求导的变量x,接着计算y = x * x,然后调用y.backward()对y关于x求导,最后打印出x的梯度[^3]。 #### 对向量求导 ```python import torch from torch.autograd import Variable # 生成一个内容为[2, 4]的张量,Variable 默认是不要求梯度的,如果要求梯度,需要加上requires_grad=True来说明 a = Variable(torch.Tensor([[2, 4]]), requires_grad=True) b = torch.zeros(1, 2) b[0, 0] = a[0, 0] ** 2 + a[0, 1] b[0, 1] = a[0, 1] ** 3 + a[0, 0] out = 2 * b # 括号里面的参数要传入和out维度一样的矩阵 # 这个矩阵里面的元素会作为最后加权输出的权重系数 out.backward(torch.FloatTensor([[1, 2]])) print("a=", a) print("out=", out) print(a.grad) # 求out对a的偏导 ``` 此例中,定义了一个向量a并要求梯度,经过一系列计算得到out,由于out是向量,调用out.backward()时需传入和out维度相同的矩阵作为加权输出的权重系数,最后打印出a的梯度,即out对a的偏导[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值