为什么我能够在 Pytorch 中通过分离来更改张量的值,而计算图不知道它?

Cha*_*ker 2 python pytorch

我可以更改需要 grad 的张量的值,而 autograd 不知道它:

def error_unexpected_way_to_by_pass_safety():
    import torch 
    a = torch.tensor([1,2,3.], requires_grad=True)
    # are detached tensor's leafs? yes they are
    a_detached = a.detach()
    #a.fill_(2) # illegal, warns you that a tensor which requires grads is used in an inplace op (so it won't be recorded in computation graph so it wont take the right derivative of the forward path as this op won't be in it)
    a_detached.fill_(2) # weird that this one is allowed, seems to allow me to bypass the error check from the previous comment...?!
    print(f'a = {a}')
    print(f'a_detached = {a_detached}')
    a.sum().backward()
Run Code Online (Sandbox Code Playgroud)

这不会引发任何错误。不过,我可以在aautograd 不知道的情况下更改需要 grad 的张量的内容。这意味着计算图不知道这个操作(用 2 填充)。这似乎是错误的。任何人都可以阐明发生了什么事吗?

Nat*_*han 5

.detach为您提供相同数据的视图,因此修改分离张量的数据会修改原始张量的数据。你可以这样检查:

a.data_ptr() == a_detached.data_ptr() # True
Run Code Online (Sandbox Code Playgroud)

至于为什么要这样.detach实现(而不是进行防御性副本),这是一个只有 PyTorch 作者知道答案的设计问题。我认为这是为了保存不必要的副本,但是用户需要意识到,如果他们想要就地修改分离的张量,他们必须自己复制张量。

请注意,如果您确实想要,还可以更改非分离张量:

a.data.fill_(2)
Run Code Online (Sandbox Code Playgroud)

PyTorch 并不是试图阻止您“破解”autograd;而是试图阻止您“破解”autograd。用户仍然必须了解如何正确使用张量,以便正确跟踪梯度。