在torch中的torch.autograd模块中,我们可以设置参数requires_grad=True。
它将开始追踪在该变量上的所有操作,后续通过链式法则进行梯度传播。完成计算后,可以调用.backward()
来完成所有梯度计算。此Tensor
的梯度将累积到.grad
属性中。
如果y
是标量,则不需要为backward()
传入任何参数;否则,需要传入一个与y
同形的Tensor权重向量进行加权求和得到一个标量。
我们举例说明自动微分的过程:
x = torch.arange(0.0, 4.0, requires_grad=True)
# 默认requires_grad=False
y = torch.sum(x**3+x**2+3*x+2)
# 因为x是可以求导的,所以y也可以求导
print(x)
print(y)
y.backward() # 通过backward计算y在x上的导数
x.grad # 通过grad查看每一个x下的导数值
结果:
Out[1]: tensor([0., 1., 2., 3.], requires_grad=True)
Out[2]: tensor(76., grad_fn=<SumBackward0>)
Out[3]: tensor([ 3., 8., 19., 36.])
注意:grad在反向传播过程中是累加的,每一次运行反向传播,梯度都会累加之前的梯度,所以一般在反向传播之前需把梯度清零。
x.grad.data.zero_()