Neural network 如何正确地同时训练多个模型

Neural network 如何正确地同时训练多个模型,neural-network,pytorch,reinforcement-learning,Neural Network,Pytorch,Reinforcement Learning,我正在尝试在pytorch中实现actor-critic算法。因此,我希望有两个模型并分别对其进行培训,即: actor = Net1() critic = Net2() 我的代码如下所示: optim_a = optim.SGD(actor.paramaters(), lr=.1, momentum=.9) optim_c = optim.SGD(critic.paramaters(), lr=.1, momentum=.9) for t in range(hours): optim

我正在尝试在pytorch中实现actor-critic算法。因此,我希望有两个模型并分别对其进行培训,即:

actor = Net1()
critic = Net2()
我的代码如下所示:

optim_a = optim.SGD(actor.paramaters(), lr=.1, momentum=.9)
optim_c = optim.SGD(critic.paramaters(), lr=.1, momentum=.9)
for t in range(hours):
    optim_a.zero_grad()
    optim_c.zero_grad()
    allocation = actor(solar[t], B[t], load_left)
    load = load.detach()
    value = critic(solar[t], B[t], load_left)
    environment_instance = environment(solar[t], B[t], load, G1[t], G2[t])
    R[t], C[t], B[t+1] = environment_instance.step()
    load_left = load_left - allocation
    value_f = critic(solar[t+1], B[t+1], load_left)
    delta = R[t]+gamma*value_f-value
    delta = delta.detach()
    loss_critic = delta*value
    loss_actor = delta*torch.log(allocation)
    loss = loss_actor+loss_critic
    loss.backward()
    optim_a.step()
    optim_c.step()
让我简要解释一下背景(如果有帮助的话)。我正在为使用太阳能的电力系统进行负荷分配。有固定负载和可变负载。环境是一个运行环境的类,也就是说,我给它一些参数,它输出奖励(R)。我用它来定义delta。然后,我定义了这两种损失,其中delta作为一个常数(不应该传播梯度,这就是我分离它的原因)

该代码运行,但优化器没有更新权重。奇怪的是,有时他们会更新评论家或演员(我不知道为什么),但从不同时更新两者。我觉得这很奇怪,因为我看过其他教程,在那里做了类似的事情,例如,但它不适合我


如果有人能给我一些指导,我将不胜感激。

仅凭您提供的代码很难判断。多个模型有点棘手,即使在它们协作时,一个模型也不应该更新另一个模型的参数。我想您已经设置了
retain\u graph=True
来解决这个问题,但在几乎所有情况下,它都是不必要的,使用它只会隐藏一个bug。相反,当在某个(小心的)点跨越模型边界时,您应该
.detach()
一个张量。也许可以让你有一些见解,这看起来和你正在做的事情很相似。是的,我看了一下他们的演员评论算法。他们的神经网络不是完全独立的,所以这不是我想要的。我将尝试detach(),看看是否可以用它来修复它。否则我会回来,并包括确切的代码。谢谢,没用。我将编辑原始问题。它一直在工作。我只是看错了重量更新。类似于这里发生的事情:仅从您提供的代码很难判断。多个模型有点棘手,即使在它们协作时,一个模型也不应该更新另一个模型的参数。我想您已经设置了
retain\u graph=True
来解决这个问题,但在几乎所有情况下,它都是不必要的,使用它只会隐藏一个bug。相反,当在某个(小心的)点跨越模型边界时,您应该
.detach()
一个张量。也许可以让你有一些见解,这看起来和你正在做的事情很相似。是的,我看了一下他们的演员评论算法。他们的神经网络不是完全独立的,所以这不是我想要的。我将尝试detach(),看看是否可以用它来修复它。否则我会回来,并包括确切的代码。谢谢,没用。我将编辑原始问题。它一直在工作。我只是看错了重量更新。类似于这里发生的事情: