在 Pytorch 中,quantity.backward() 计算量与哪些参数的梯度?

问题描述

backward 方法计算梯度 wrt 到哪些参数?带有 requires_grad 的所有参数都具有 True 值?

有趣的是,在 Pytorch 中

  1. 计算梯度

  1. 加载基于梯度更新参数的优化器

需要有关感兴趣参数身份的不同信息才能工作。

一个似乎知道计算梯度的参数。 第二个需要向其提及的参数。请参阅下面的代码

quantity.backward() 
optim = torch.SGD(model.parameters())
optim.step()

怎么样?

为什么向后不需要model.parameters()?

提及特定的参数子集不是更有效吗?

解决方法

计算 quantity 需要构造一个二排序图,节点是张量或张量上的可微运算(所谓的计算图)。在后台,pytorch 会为您跟踪此图表。当您调用 quantity.backward() 时,您是在要求 pytorch 执行图形的逆遍历,从输出到输入,使用遇到的每个操作的导数而不是操作本身。标记为需要梯度的叶张量累积由向后计算的梯度。

优化器是另一回事:它只是在一组参数上实现优化策略,因此它需要知道您希望它优化哪些参数。因此 quantity.backward() 计算梯度,optim.step() 使用这些梯度执行优化步骤,更新 model 中包含的参数。

至于效率,我没有看到任何支持在向后传递中指定参数的论据(它的语义是什么?)。 如果您想要的是避免在向后模式下遍历图形的某些部分,如果您还记得,pytorch 会自动为您执行此操作:

  • 您可以将叶张量标记为不需要 grad
  • 一个非叶张量 -- 某些操作的输出 f(x1,...xN) -- 需要grad 如果 x1...xN 中至少有一个需要 grad
  • 一个不需要 grad 块向后遍历的张量,确保没有不必要的计算