我正在尝试在pytorch中实现the following algorithm in this book, section 13.5。
这将需要两个独立的神经网络(在此问题中,model1
和model2
)。一个人的损失仅取决于其自身的输出(通过delta(用w参数化),另一个)(取决于其输出)(通过ln(pi)),并且取决于另一个人的输出[同样,通过ln(pi)]。德尔塔]。
我想分别更新每个人
假设以下模型实现nn.Module
:
model1 = Mynet1()
model2 = Mynet2()
val1 = model1(input1)
val2 = model2(input2)
self.optimizer1 = optim.Adam(model1.parameters(), lr1)
self.optimizer2 = optim.Adam(model2.parameters(), lr2)
loss1 = f(val1)
loss2 = f(val1, val2)#THIS IS THE INTERESTING PART
optim1.zero_grad()
loss1.backward
optim1.step()
optim2.zero_grad()
loss2.backward
optim2.step()
我知道向后对loss1进行应用,然后逐步优化它会更新model1
的参数。
我的问题是在loss2
,model2
,optimizer2
上激活它们时会发生什么,其中损失2取决于model1
和{ {1}} ?
如何使model2
更新不影响loss2
参数?
答案 0 :(得分:2)
由于optim2
仅具有model2的参数,因此只有在执行model2
时,它才会更新optim2.step()
。
但是,loss2.backward()
将同时为model1和model2的参数计算梯度,如果您随后执行optim1.step()
,则会更新model1的参数。如果不想为model1的参数计算梯度,则可以执行val1.detach()
将其与计算图分离。