首页 > 解决方案 > pytorch - loss.backward() 和 optimizer.step() 之间的连接

问题描述

optimizer和之间的显式联系在哪里loss

优化器如何知道在没有这样的调用的情况下从哪里获得损失的梯度optimizer.step(loss)

-更多上下文-

当我最小化损失时,我不必将梯度传递给优化器。

loss.backward() # Back Propagation
optimizer.step() # Gardient Descent

标签: machine-learningneural-networkpytorchgradient-descent

解决方案


在不深入研究 pytorch 的内部结构的情况下,我可以提供一个简单的答案:

回想一下,在初始化时,optimizer您明确告诉它应该更新模型的哪些参数(张量)。一旦调用损失,梯度就会由张量本身“存储”(它们具有 agrad和 arequires_grad属性) 。backward()在计算模型中所有张量的梯度后,调用optimizer.step()使优化器迭代它应该更新的所有参数(张量)并使用它们内部存储grad的值来更新它们的值。

有关计算图的更多信息和存储在 pytorch 张量中的附加“grad”信息可以在这个答案中找到。

优化器引用参数有时会导致麻烦,例如,在初始化优化器后将模型移动到 GPU 时。确保在构建优化器之前完成了模型的设置。有关更多详细信息,请参阅此答案


推荐阅读