如何在 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。
我使用 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" 和叶变量之间的计算路径上,或不。如果不是,则不完全清楚反向传播应该计算什么——毕竟,整个目的是计算参数的梯度,即叶变量。如果张量在该路径上,则通常会自动计算所有梯度。有关更详尽的讨论,请参阅