我正在尝试理解PyTorch的反向传播是如何工作的,使用了以下代码。
结果是tensor(0.3679)
,符合预期,这是1 / x
,即log(x)
对x
的导数,其中x = numpy.e
。然而,如果我不重新赋值x
,再次运行最后三行,即执行
y = torch.log(x)y.backward()print(x.grad)
那么我会得到tensor(0.7358)
,这是之前结果的两倍。为什么会发生这种情况?
回答:
梯度会一直累积直到被清除。从文档中(强调是我的):
这个函数会在叶节点累积梯度 – 你可能需要在调用它之前将它们清零。
这种清零可以通过x.grad.zero_()
来完成,或者在使用torch.optim.Optimizer
时,使用optim.zero_grad()
。