PyTorch中的自动微分
目标
通过本篇文章的学习,你将对PyTorch中的自动微分过程有一个清晰的认识,本文通过一个示例来解释PyTorch中自动微分的计算。
PyTorch中的自动微分
在torch中的torch.autograd模块,提供了实现任意标量值函数自动求导的类和函数。针对一个张量只需要设置参数requires_grad = True,通过相关计算即可输出其在传播过程中的梯度(导数)信息。
如在PyTorch中生成一个矩阵张量x xx,并且y = s u m ( x 2 + 4 x + 2 ) y=sum(x^2+4x+2)y=sum(x2+4x+2),计算出y yy在x xx上的导数,实现过程如下:
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 xx,并使用参数requires_grad=True来指定矩阵可以求导,然后根据公式y = s u m ( x 2 + 4 x + 2 ) y=sum(x^2+4x+2)y=sum(x2+4x+2)计算出标量y yy。
从输出的x.requires_grad和y.requires_grad的结果中可以看出,这两个变量都可以求导的(因为x xx可以求导,所以计算得到的y yy也可以求导)。
接下来利用y.backward()来计算y yy在x xx的每个元素上的导数
y.backward()
print(x.grad)
>>>tensor([[ 6., 8.],
[10., 12.]])
通过y.backward()即可自动计算出y yy在x xx的每个元素上的导数,然后通过x xx的grad属性即可获取此时x xx的梯度,计算得到梯度值等于2 x + 4 2x+42x+4。
参考资料
- 《PyTorch 深度学习入门与实战(案例视频精讲)》,孙玉林,余本国著. 北京:中国水利水电出版社,2020.7

版权声明:本文为DIPDWC原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。