【问题标题】:How to do backprop in Pytorch (autograd.backward(loss) vs loss.backward()) and where to set requires_grad=True?如何在 Pytorch 中进行反向传播(autograd.backward(loss) vs loss.backward())以及在哪里设置 requires_grad=True?
【发布时间】:2019-03-13 14:56:16
【问题描述】:

我已经使用 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?

【问题讨论】:

    标签: neural-network deep-learning pytorch backpropagation


    【解决方案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

    更新 cmets 中的后续内容:回答张量在向后传递时会发生什么取决于变量是否位于“输出”和叶变量之间的计算路径上。如果不是,那么反向传播应该计算什么并不完全清楚——毕竟,整个目的是计算参数的梯度,即叶变量。如果张量在该路径上,则通常会自动计算所有梯度。如需更深入的讨论,请参阅 this questionthis tutorial from the docs

    【讨论】:

    • 谢谢!很好的解释。还有一个问题,当你在网络内部定义自己的Tensor变量时,需要设置requires_grad=True还是像预制层的参数一样默认为True?
    • 谢谢!很好的解释。还有一个问题,当你在网络内部定义自己的Tensor变量时,需要设置requires_grad=True还是像预制层的参数一样默认为True?
    猜你喜欢
    • 2019-01-15
    • 1970-01-01
    • 2020-05-06
    • 2021-07-04
    • 2017-10-05
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多