深入浅出pytorch求导机制

pytorch求导机制

1、backward

创建两个矩阵
x:2×3
a:3×2
requires_grad:表示该矩阵可进行求导,相当于一个变量了,默认为false

x = torch.tensor([[1.0, 2.0, 3.], [2., 3., 4.]], requires_grad=True)
a = torch.tensor([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
  • torck.mul(x,y):
    x 点乘 y
    x和y形状要相同
  • torch.mm(x,y):
    x 叉乘 y
    x的列和y的行要一致
y = torch.mm(x, a)

在这里插入图片描述
表示矩阵y对其中的可求导参数(这里是x)进行求导
y.backward():传入的参数 应为 于y相同维度的张量

y.backward(torch.ones_like(y))

x.grad即表示 y 对 x 求导后 的结果

x.grad

在这里插入图片描述
将梯度清零,否则梯度会累加

x.grad.data.zero_()

2、torch.autograd.grad

torch.autograd.grad(outputs, inputs, grad_outputs=None, retain_graph=None, create_graph=False)
功能:求取梯度
outputs:用于求导的张量,如 loss
inputs:需要梯度的张量
create_graph:创建导数计算图,用于高阶求导
retain_graph:保存计算图
grad_outputs:多梯度权重

x_grad = torch.autograd.grad(outputs=y, inputs=x, grad_outputs=torch.ones_like(y))

在这里插入图片描述

3、区别

  • torch.autograd.grad(): 第一个参数 目标函数 第二个参数 待求解的自变量参数,返回值为 求导结果的tensor
  • backward():不需要传入参数,只需要直接调用他 由目标函数tensor调用,无返回值,求导结果在 待求解自变量的grad属性中。

4、连续求导

例如:求 y=x ^ 2 对 x 的一阶偏导和二阶偏导。
import torch

x = torch.tensor([6.], requires_grad=True)
y = x ** 2
grad_1 = torch.autograd.grad(y, x, create_graph=True)  # grad_1 = dy/dx = 2x = 2 * 6 = 12
grad_2 = torch.autograd.grad(grad_1[0], x)             # grad_2 = d(dy/dx)/dx = d(2x)/dx = 2
print(grad_1)
print(grad_2)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_51799151/article/details/123882469