这是有关PyTorch autograd.grad和后退功能的问题。
我有两个张量a
,b
经过优化(即需要梯度)。
我定义了loss1, loss2 = f(a,b), g(a,b)
。尽管这是两个独立的函数f
和g
,但是出于计算效率的考虑,我必须将它们两个都作为fg(a,b)
一起计算,并返回一个元组(loss1, loss2)
。
我需要使用opt_a
和opt_b
(优化程序)通过以下渐变来逐步执行a
和b
:
a.grad
应该等于d(loss1
)/ d(a
)
b.grad
应该等于d(loss2
)/ d(b
)
如何获得这些渐变?我知道我可以运行autograd.grad(loss1, a)
和autograd.grad(loss2, b)
来获取真实的渐变并将其手动设置为*.grad
,但是我想在loss1
和{{ 1}}。
我想使用向后方法,因为在我的情况下,a和b实际上是两个神经网络的参数列表(我不想手动设置loss2
)时,它是简洁的代码。
是否可以使用param.grad = ... for param in model1.parameters()
来做到这一点?
我的尝试
我尝试了以下方法的多个有序变体(但是它们都不起作用,因为渐变至少会为一个变量添加):
.backward()
此命令的不同阶导致梯度(d({loss1, loss2 = fg(...)
opt1.zero_grad()
loss1.backward(retain_graph=True)
opt1.step()
opt2.zero_grad()
loss2.backward()
opt2.step()
)/ d(loss1+loss2
)的累加,或者导致一个优化器将a的值步进,然后我可以'由于就地更改了操作,因此不运行a
。