问题描述
backward 方法计算梯度 wrt 到哪些参数?带有 requires_grad 的所有参数都具有 True 值?
有趣的是,在 Pytorch 中
- 计算梯度
和
- 加载基于梯度更新参数的优化器
需要有关感兴趣参数身份的不同信息才能工作。
第一个似乎知道计算梯度的参数。 第二个需要向其提及的参数。请参阅下面的代码。
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 块向后遍历的张量,确保没有不必要的计算