pytorch自动求导Autograd系列教程(二)

pytorch自动求导Autograd系列教程(二)_第1张图片

前言:前面介绍了pytorch自动求导的一些基本操作和概念,本文续接上一篇,会继续深入介绍pytorch的自动求导相关的注意事项。上一篇文章参见:pytorch自动求导Autograd系列教程(一)

一、求导的另外两种方法

1.1 方法一:通过 torch.autograd.backward()求导

前面介绍的求导的基本公式为:

y.backward(grad_tensors=Noneretain_graph=Nonecreate_graph=False),这三个参数我在前面的文章里面已经说了,

参考前面的第一篇文章,反向求导它等价于:

torch.autograd.backward(tensors,grad_tensors=Noneretain_graph=Nonecreate_graph=False), 这里的tensors参数就相当于是y,

所以:

y.backward() #标量y  等价于

torch.autograd.backward(y)

需要注意的是,这个函数只是提供求导功能,并不返回值,返回的总是None,如下例子:

import torch

x=torch.tensor([1.0,2.0,3.0],requires_grad=True)
y=torch.tensor([4.0,5.0,6.0],requires_grad=True)

z=torch.sum(torch.pow(x,2)+torch.pow(y,3))  # z=x2+y3

torch.autograd.backward([z]) # 求导,等价于z.backward()

print(x.grad)   # 获取求导的结果
print(y.grad)
'''
tensor([2., 4., 6.])
tensor([ 48.,  75., 108.])
'''

注意事项:

(1)该方法只负责求导,返回的总是None,

(2)当向量对向量求导的时候,需要传递参数grad_tensor,这个参数的含义其实和前一篇文章的y.backward()里面的那个是一个含义;

(3)retain_graph=Nonecreate_graph=False 也和前面的含义是一样的

1.2 方法二:通过torch.autograd.grad()来求导

除了前面的两种方法来求导以外,即

y.backward()

torch.autograd.backward(y)  这两种方法

还有一种方法,即通过torch.autograd.grad()来求导,先来看一下这个函数的定义。

def grad(outputs, inputs, grad_outputs=None, retain_graph=None, create_graph=False,
         only_inputs=True, allow_unused=False):
'''
outputs : 函数的因变量,即需要求导的那个函数,在本例子中,为z,当然,他可以是一个tensor,也可以是几个tensor,如[tensor1,tensor2,tensor3...]
inputs : 函数的自变量,在本例中,即对应的是[x,y],他可以是一个tensor,也可以是几个tensor,如[tensor1,tensor2,tensor3...]
grad_output : 这个参数和前面两种方法中的grad_tensors是同样的含义,当出现向量对向量求导的时候需要指定该参数

'''

依然以这个例子而言,来看一下怎么做:

import torch

x=torch.tensor([1.0,2.0,3.0],requires_grad=True)
y=torch.tensor([4.0,5.0,6.0],requires_grad=True)

z=torch.sum(torch.pow(x,2)+torch.pow(y,3))  # z=x2+y3

print(torch.autograd.grad(z,[x,y]))  # 求导,并且返回值
'''
(tensor([2., 4., 6.]), tensor([ 48.,  75., 108.]))
'''

注意事项:

该函数会自动完成求导过程,而且会自动返回对于每一个自变量求导的结果。这是和前面不一样的地方。

你可能感兴趣的:(pytorch)