在以下上下文中 "grad attribute" 有何不同?

What makes the difference in "grad attribute" in the following context?

考虑以下两种情况

with torch.no_grad():
  params = params - learning_rate * params.grad

with torch.no_grad():
  params -= learning_rate * params.grad

在第二种情况下 .backward() 是 运行 顺利而在第一种情况下它给出

RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn

这是什么原因,因为 x-= ax = x - a 互换使用很正常?

注意 x -= ax = x - a cannot be used interchangeably:后者创建一个新的张量赋值给变量x,而前者执行一个到位操作。

因此与

with torch.no_grad():
  params -= learning_rate * params.grad

优化循环中一切正常,而在

with torch.no_grad():
  params = params - learning_rate * params.grad

变量 params 覆盖 new 张量。由于这个新张量是在 torch.no_grad() 上下文中创建的,这意味着这个新张量具有 params.requires_grad=False,因此没有 .grad 属性。因此在下一次迭代中火炬将抱怨 params.grad 不存在。