PyTorch入门(二):Autograd自动求导机制

PyTorch的autograd包提供了自动求导机制,Tensor类是核心,可在运算过程中追踪操作。当Tensor的requires_grad=True时,可以调用.backward()计算梯度。detach()和.no_grad()用于控制历史记录追踪。本文展示了如何计算导数、执行Jacobian-vector乘积,并解释了如何在特定情况下停止跟踪历史记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

autograd包中是PyTorch中所有神经网络的核心,为Tensors上所有操作自动求导,由框架定义运行,意味着backprop由代码运行的方式定义,并且每个迭代都可以不同。

Tensor
torch.Tensor是所有package的核心类,当设置.requires_gradTrue时,会追踪所有操作。完成计算后,可以调用.backward()并自动计算梯度。该张量的梯度会累积到.grad属性中。

要阻止张量跟踪历史记录,可以调用.detach()将其从计算历史记录中分离出来,并防止将来的计算被跟踪。

要防止跟踪历史记录(和使用内存),您还可以使用torch.no_grad()包装代码块: 在评估模型时这可能特别有用,因为模型可能具有requires_grad = True的可训练参数,但不需要梯度。

Function类对autograd的实现非常重要

TensorFunction相互连接构成一个非循环图,编码完整的计算历史。每个张量都有一个.grad_fn属性,该属性引用一个创建张量的函数(除了用户创建的张量——它们的grad_fn=None)。

如果想计算导数(derivatives),可以在Tensor上调用.backward()。如果该Tensor是一个标量,不需要为.backward()指定任何参数;如果Tensor有多个元素,需要指定一个梯度参数,是一个形状匹配的张量。

创建一个张量并且设置requires_grad=True追踪计算

x = torch.ones(2, 2, requires_grad=True)
print(x)
y = x + 2
print(y)
z = y * y * 3
out = z.mean()
print(z)
print(out)

输出为
在这里插入图片描述
.requires_grad_(...)改变已有张量的requires_grad的标签。默认的标签为False。

a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)

输出为
在这里插入图片描述

Gradients
当out为一个标量时,out.backward()等价于out.backward(torch.tensor(1.))
求梯度d(out)/dx

print(x.grad)

输出为
在这里插入图片描述
一个Jacobian-vector的例子

x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
    y = y * 2
print(y)

输出为
在这里插入图片描述

v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)

print(x.grad)

v相当于给出了每一个对应位置的tensor所占比例,即将对应位置所得到的结果与v中对应位置的数相乘,得到每个位置最终的结果。
输出为
在这里插入图片描述
还可以停止在Tensors上跟踪历史记录,通过torch.no_grad()包装代码块.requires_grad=True:

print(x.requires_grad)
print((x ** 2).requires_grad)

with torch.no_grad():
    print((x ** 2).requires_grad)

输出为
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值