pytorch:来自两个网络的损失如何表现?
pytorch: How does loss behave when coming from two networks?
我正在尝试在 pytorch 中实现 the following algorithm in this book, section 13.5。
这需要两个独立的神经网络(在这个问题中,model1
和 model2
)。一个人的损失仅取决于它自己的输出 [通过 delta](由 w 参数化),另一个(由 theta 参数化),既取决于它自己的输出 [通过 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
上激活相同内容时会发生什么,其中 loss 2 取决于 [=11] 的输出=] 和 model2
?
如何使 loss2
更新不影响 model1
参数?
因为 optim2
只有 model2 的参数,所以如果您像正在做的那样 optim2.step()
它只会更新 model2
。
但是,loss2.backward()
将计算模型 1 和模型 2 的参数的梯度,如果您在 optim1.step()
之后计算梯度,它将更新模型 1 的参数。如果你不想为 model1 的参数计算梯度,你可以做 val1.detach()
将它从计算图中分离出来。
我正在尝试在 pytorch 中实现 the following algorithm in this book, section 13.5。
这需要两个独立的神经网络(在这个问题中,model1
和 model2
)。一个人的损失仅取决于它自己的输出 [通过 delta](由 w 参数化),另一个(由 theta 参数化),既取决于它自己的输出 [通过 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
上激活相同内容时会发生什么,其中 loss 2 取决于 [=11] 的输出=] 和 model2
?
如何使 loss2
更新不影响 model1
参数?
因为 optim2
只有 model2 的参数,所以如果您像正在做的那样 optim2.step()
它只会更新 model2
。
但是,loss2.backward()
将计算模型 1 和模型 2 的参数的梯度,如果您在 optim1.step()
之后计算梯度,它将更新模型 1 的参数。如果你不想为 model1 的参数计算梯度,你可以做 val1.detach()
将它从计算图中分离出来。