pytorch:来自两个网络的损失如何表现?

时间:2019-02-13 19:15:20

标签: python machine-learning pytorch backpropagation

我正在尝试在pytorch中实现the following algorithm in this book, section 13.5

enter image description here

这将需要两个独立的神经网络(在此问题中,model1model2)。一个人的损失仅取决于其自身的输出(通过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的参数。

我的问题是在loss2model2optimizer2上激活它们时会发生什么,其中损失2取决于model1和{ {1}}

如何使model2更新不影响loss2参数?

1 个答案:

答案 0 :(得分:2)

由于optim2仅具有model2的参数,因此只有在执行model2时,它才会更新optim2.step()

但是,loss2.backward()将同时为model1和model2的参数计算梯度,如果您随后执行optim1.step(),则会更新model1的参数。如果不想为model1的参数计算梯度,则可以执行val1.detach()将其与计算图分离。