如何使用就地操作破坏 PyTorch autograd
How to break PyTorch autograd with in-place ops
我试图更好地理解就地操作在 PyTorch autograd 中的作用。
我的理解是它们可能会导致问题,因为它们可能会覆盖在向后步骤中所需的值。
我正在尝试构建一个示例,在该示例中,就地操作会破坏自动微分,我的想法是在反向传播过程中覆盖一些在计算其他张量后所需的值。
我正在使用赋值作为就地操作(我试过 +=
结果相同),我用这种方式仔细检查它是就地操作:
x = torch.arange(5, dtype=torch.float, requires_grad=True)
y = x
y[3] = -1
print(x)
打印:
tensor([ 0., 1., 2., -1., 4.], grad_fn=<CopySlices>)
这是我尝试打破 autograd 的尝试:
- 没有就地操作:
x = torch.arange(5, dtype=torch.float, requires_grad=True)
out1 = x ** 2
out2 = out1 / 10
# out1[3] += 100
out2.sum().backward()
print(x.grad)
这会打印
tensor([0.0000, 0.2000, 0.4000, 0.6000, 0.8000])
- 使用就地操作:
x = torch.arange(5, dtype=torch.float, requires_grad=True)
out1 = x ** 2
out2 = out1 / 10
out1[3] = 0
out2.sum().backward()
print(x.grad)
这会打印:
tensor([0.0000, 0.2000, 0.4000, 0.6000, 0.8000])
我期待获得不同的毕业生。
- 项目分配是做什么的?我不明白
grad_fn=<CopySlices>
.
- 为什么它 return 相同的毕业生?
- 是否有破坏 autograd 的就地操作的工作示例?
- 是否有非向后兼容的 PyTorch 操作列表?
破坏 autograd 的就地操作的工作示例:
x = torch.ones(5, requires_grad=True)
x2 = (x + 1).sqrt()
z = (x2 - 10)
x2[0] = -1
z.sum().backward()
加薪:
RuntimeError: one of the variables needed for gradient computation has been modified by an in-place operation: [torch.FloatTensor [5]], which is output 0 of SqrtBackward, is at version 1; expected version 0 instead. Hint: enable anomaly detection to find the operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True).
我试图更好地理解就地操作在 PyTorch autograd 中的作用。 我的理解是它们可能会导致问题,因为它们可能会覆盖在向后步骤中所需的值。
我正在尝试构建一个示例,在该示例中,就地操作会破坏自动微分,我的想法是在反向传播过程中覆盖一些在计算其他张量后所需的值。
我正在使用赋值作为就地操作(我试过 +=
结果相同),我用这种方式仔细检查它是就地操作:
x = torch.arange(5, dtype=torch.float, requires_grad=True)
y = x
y[3] = -1
print(x)
打印:
tensor([ 0., 1., 2., -1., 4.], grad_fn=<CopySlices>)
这是我尝试打破 autograd 的尝试:
- 没有就地操作:
x = torch.arange(5, dtype=torch.float, requires_grad=True)
out1 = x ** 2
out2 = out1 / 10
# out1[3] += 100
out2.sum().backward()
print(x.grad)
这会打印
tensor([0.0000, 0.2000, 0.4000, 0.6000, 0.8000])
- 使用就地操作:
x = torch.arange(5, dtype=torch.float, requires_grad=True)
out1 = x ** 2
out2 = out1 / 10
out1[3] = 0
out2.sum().backward()
print(x.grad)
这会打印:
tensor([0.0000, 0.2000, 0.4000, 0.6000, 0.8000])
我期待获得不同的毕业生。
- 项目分配是做什么的?我不明白
grad_fn=<CopySlices>
. - 为什么它 return 相同的毕业生?
- 是否有破坏 autograd 的就地操作的工作示例?
- 是否有非向后兼容的 PyTorch 操作列表?
破坏 autograd 的就地操作的工作示例:
x = torch.ones(5, requires_grad=True)
x2 = (x + 1).sqrt()
z = (x2 - 10)
x2[0] = -1
z.sum().backward()
加薪:
RuntimeError: one of the variables needed for gradient computation has been modified by an in-place operation: [torch.FloatTensor [5]], which is output 0 of SqrtBackward, is at version 1; expected version 0 instead. Hint: enable anomaly detection to find the operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True).