Вариант 1 правильный. При отсоединении тензора история / график вычислений теряется, и градиенты не будут распространяться на входы / для вычислений, выполняемых перед отсоединением.
Это также можно увидеть в этом игрушечном эксперименте.
In [14]: import torch
In [15]: x = torch.rand(10,10).requires_grad_()
In [16]: y = x**2
In [19]: z = torch.sum(y)
In [20]: z.backward()
In [23]: x.grad is not None
Out[23]: True
Использование detach
In [26]: x = torch.rand(10,10).requires_grad_()
In [27]: y = x**2
In [28]: z = torch.sum(y)
In [29]: z_ = z.detach()
In [30]: z_.backward()
# this gives error
Это потому, что когда вы вызываете detach, он возвращает новый тензор со скопированными значениями и информация о предыдущих вычислениях теряется.