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

时间:2019-03-13 14:56:17

标签: neural-network deep-learning pytorch backpropagation

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

假设我们有一个神经网络的损失函数。为了进行反向传播,我看到了两个不同的版本。像这样的

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

和另一个类似:

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

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

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

例如,我是否需要为网络内部的nn.Linear(hidden_size, output_size)层指定它,还是默认情况下将其自动设置为True?

1 个答案:

答案 0 :(得分:1)

所以只是一个简单的答案: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

更新注释中的后续内容:回答张量向后传递时发生的情况取决于变量是否在“输出”和叶变量之间的计算路径上。如果不是这样,则尚不清楚应由哪个反向执行器计算-毕竟,整个目的是为参数(即叶变量)计算梯度。如果张量在该路径上,则通常将自动计算所有梯度。有关更详尽的讨论,请参见this questionthis tutorial from the docs