02-05自动微分
2.5 自动微分
1. 一个简单的例子
import torch
x = torch.arange(4.0)
y = 2 * torch.dot(x, x)
y.backward()
x.grad
x.grad.zero_() # 在默认情况下,PyTorch会累积梯度,我们需要清除之前的值
y = x.sum()
y.backward()
x.grad
2. 分离计算
# y是作为x的函数计算的,而z则是作为y和x的函数计算的
x.grad.zero_()
y = x * x
u = y.detach() # 分离y来返回一个新变量u,该变量与y具有相同的值,但丢弃计算图中如何计算y的任何信息。换句话说,梯度不会向后流经u到x
z = u * x
z.sum().backward() # 计算z=u*x关于x的偏导数,同时将u作为常数处理,而不是计算z=x*x*x关于x的偏导数
x.grad == u
x.grad.zero_()
y.sum().backward()
x.grad == 2 * x