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 yyx 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_grady.requires_grad的结果中可以看出,这两个变量都可以求导的(因为x xx可以求导,所以计算得到的y yy也可以求导)。

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

y.backward()
print(x.grad)

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

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

参考资料

  1. 《PyTorch 深度学习入门与实战(案例视频精讲)》,孙玉林,余本国著. 北京:中国水利水电出版社,2020.7
如果文章对你有帮助,欢迎点赞与关注, 谢谢!

在这里插入图片描述


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