【发布时间】:2020-08-20 13:42:53
【问题描述】:
在 PyTorch 中,我想做如下计算:
l1 = f(x.detach(), y)
l1.backward(retain_graph=True)
l2 = -1*f(x, y.detach())
l2.backward()
其中f 是某个函数,x 和y 是需要梯度的张量。请注意,x 和 y 可能都是先前使用共享参数的计算的结果(例如,可能是 x=g(z) 和 y=g(w),其中 g 是 nn.Module)。
问题是l1 和l2 在数字上都是相同的,直到减号,重复计算f(x,y) 两次似乎很浪费。能够计算一次并在结果上应用两次backward 会更好。有没有办法做到这一点?
一种可能性是手动调用autograd.grad 并更新每个nn.Parameter w 的w.grad 字段。但我想知道是否有更直接和更干净的方法来做到这一点,使用 backward 函数。
【问题讨论】:
-
我看不到在这种情况下避免两次计算
f的方法,但您可以通过让l = l1 + l2后跟l.backward()来避免向后调用两次。