PyTorch中的自动微分
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_grad
和y.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
x的grad
属性即可获取此时
x
x
x的梯度,计算得到梯度值等于
2
x
+
4
2x+4
2x+4。
上一篇: inverted dropout示例
下一篇: PyTorch_001. 自动微分