我正在尝试在pytorch中实现这本书中第13.5节的算法。
这将需要两个独立的神经网络(在本问题中,称为model1
和model2
)。一个网络的损失仅依赖于其自身的输出(通过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)#这是有趣的部分optim1.zero_grad()loss1.backwardoptim1.step()optim2.zero_grad()loss2.backwardoptim2.step()
我理解,对loss1
应用backward
,然后执行其优化器的step
操作,会更新model1
的参数。
我的问题是,当对loss2
、model2
、optimizer2
执行相同的操作时会发生什么,其中loss2依赖于model1
和model2
的输出?
如何使loss2
的更新不影响model1
的参数?
回答:
由于optim2
仅包含model2
的参数,因此如果执行optim2.step()
,它只会更新model2
,正如所做的那样。
然而,loss2.backward()
将计算model1
和model2
的参数的梯度,如果之后执行optim1.step()
,它将更新model1
的参数。如果你不想计算model1
的参数的梯度,你可以使用val1.detach()
将其从计算图中分离出来。