gau*_*clb 5 python automatic-differentiation pytorch
看代码片段:
import torch
x = torch.tensor([-1.], requires_grad=True)
y = torch.where(x > 0., x, torch.tensor([2.], requires_grad=True))
y.backward()
print(x.grad)
Run Code Online (Sandbox Code Playgroud)
输出是tensor([0.]),但是
import torch
x = torch.tensor([-1.], requires_grad=True)
if x > 0.:
y = x
else:
y = torch.tensor([2.], requires_grad=True)
y.backward()
print(x.grad)
Run Code Online (Sandbox Code Playgroud)
输出是None.
我很困惑为什么输出torch.where是tensor([0.])?
import torch
a = torch.tensor([[1,2.], [3., 4]])
b = torch.tensor([-1., -1], requires_grad=True)
a[:,0] = b
(a[0, 0] * a[0, 1]).backward()
print(b.grad)
Run Code Online (Sandbox Code Playgroud)
输出是tensor([2., 0.]). (a[0, 0] * a[0, 1])与 没有任何关系b[1],但 的梯度b[1]却0没有关系None。
基于跟踪的 AD,如 pytorch,通过跟踪来工作。您无法跟踪不是由库拦截的函数调用的内容。通过使用这样的语句, andif之间没有任何连接,而 with 、和在表达式树中链接。xywherexy
现在,对于差异:
\n\n0是函数x \xe2\x86\xa6 x > 0 ? x : 2在该点的正确导数-1(因为负数一侧是常数)。x没有任何关系。因此,给定的导数是未定义的,表示为。yelseyxNone(即使在 Python 中你也可以做这样的事情,但这需要更复杂的技术,比如源代码转换。我不认为 pytorch 可以做到这一点。)
\n