【问题标题】:pytorch: How does loss behave when coming from two networks?pytorch:来自两个网络的损失如何表现?
【发布时间】:2019-07-07 17:37:35
【问题描述】:

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

这需要两个独立的神经网络(在这个问题中,model1model2)。一个人的损失仅取决于它自己的输出[通过 delta](由 w 参数化),另一个(由 theta 参数化)既取决于它自己的输出 [通过 ln(pi)],也取决于另一个的输出 [再次,通过delta]。

我想分别更新每一个

假设以下模型实现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 上激活相同功能时会发生什么情况,其中 loss 2 取决于 model1model2 的输出

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

【问题讨论】:

    标签: python machine-learning pytorch backpropagation


    【解决方案1】:

    因为optim2只有model2的参数,它只会更新model2,如果你这样做optim2.step()

    但是,loss2.backward() 将为模型 1 和模型 2 的参数计算梯度,如果您在此之后执行optim1.step(),它将更新模型 1 的参数。如果您不想计算模型 1 的参数的梯度,您可以执行 val1.detach() 将其从计算图中分离。

    【讨论】:

    • 不,一旦分离就无法连接。好像删除了计算 val1 的计算图
    • 为了澄清上述内容,val1.detach() 返回一个新的张量,它不记得在其上执行了哪些步骤。原来的val1 仍将包含所有这些信息。 detach() 不会修改张量。
    • 添加,可以val1.detach_()操作到位
    猜你喜欢
    • 2021-09-29
    • 2020-06-03
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2013-04-28
    • 2022-10-02
    相关资源
    最近更新 更多