欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PyTorch中的自动微分

程序员文章站 2022-07-13 11:35:36
...

PyTorch中的自动微分

目标

通过本篇文章的学习,你将对PyTorch中的自动微分过程有一个清晰的认识,本文通过一个示例来解释PyTorch中自动微分的计算。

PyTorch中的自动微分

torch中的torch.autograd模块,提供了实现任意标量值函数自动求导的类和函数。针对一个张量只需要设置参数requires_grad = True,通过相关计算即可输出其在传播过程中的梯度(导数)信息。

如在PyTorch中生成一个矩阵张量 x x x,并且 y = s u m ( x 2 + 4 x + 2 ) y=sum(x^2+4x+2) y=sum(x2+4x+2),计算出 y y y x x x上的导数,实现过程如下:

import torch

x = torch.tensor([[1.0, 2.0], [3.0, 4.0]], requires_grad=True)
# 默认requires_grad=False
y = torch.sum(x**2+4*x+1)
print("x是否可导:", x.requires_grad)
print("y是否可导:", y.requires_grad)
print("x:", x)
print("y:", y)

>>>x是否可导: True
>>>y是否可导: True
>>>x: tensor([[1., 2.],
        [3., 4.]], requires_grad=True)
>>>y: tensor(74., grad_fn=<SumBackward0>)

上面程序中首先使用torch.tensor()函数生成一个矩阵 x x x,并使用参数requires_grad=True来指定矩阵可以求导,然后根据公式 y = s u m ( x 2 + 4 x + 2 ) y=sum(x^2+4x+2) y=sum(x2+4x+2)计算出标量 y y y

从输出的x.requires_grady.requires_grad的结果中可以看出,这两个变量都可以求导的(因为 x x x可以求导,所以计算得到的 y y y也可以求导)。

接下来利用y.backward()来计算 y y y x x x的每个元素上的导数

y.backward()
print(x.grad)

>>>tensor([[ 6.,  8.],
        [10., 12.]])

通过y.backward()即可自动计算出 y y y x x x的每个元素上的导数,然后通过 x x xgrad属性即可获取此时 x x x的梯度,计算得到梯度值等于 2 x + 4 2x+4 2x+4