如何在 Pytorch 中进行反向传播(autograd.backward(loss) vs loss.backward())以及在哪里设置 requires_grad=True?

How to do backprop in Pytorch (autograd.backward(loss) vs loss.backward()) and where to set requires_grad=True?

我使用 Pytorch 已经有一段时间了。我有一个关于反向传播的问题如下:

假设我们有一个神经网络的损失函数。对于反向传播,我见过两个不同的版本。一个赞:

optimizer.zero_grad()
autograd.backward(loss)
optimizer.step()

另一个喜欢:

optimizer.zero_grad()
loss.backward()
optimizer.step()

我应该使用哪一个?这两个版本有什么区别吗?

作为最后一个问题,我们是否需要为网络每一层的参数指定 requires_grad=True 以确保在反向传播中计算它们的梯度?

例如,我是否需要为网络中的层 nn.Linear(hidden_size, output_size) 指定它,或者默认情况下它会自动设置为 True?

所以只是一个快速的回答:autograd.backward(loss)loss.backward() 实际上是一样的。看看 tensor.backward()the implementation (因为你的损失只是一个张量),其中 tensor.loss 只是调用 autograd.backward(loss).

关于你的第二个问题:无论何时你使用预制层如nn.Linear,或卷积,或RNN等,它们都依赖nn.Parameter属性来存储参数值.并且,as the docs say,这些默认为 requires_grad=True

评论中的后续更新:要回答张量在向后传递时会发生什么,取决于变量是否在 "output" 和叶变量之间的计算路径上,或不。如果不是,则不完全清楚反向传播应该计算什么——毕竟,整个目的是计算参数的梯度,即叶变量。如果张量在该路径上,则通常会自动计算所有梯度。有关更详尽的讨论,请参阅 and this tutorial from the docs