我正在尝试在 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()
让我简要解释一下背景(如果有帮助的话)。我正在为使用太阳能的电力系统进行load_assigment。有固定负载和可变负载。环境是运行环境的类,也就是说,我给它一些参数并输出奖励(R)。我用它来定义增量。然后,我定义了两个损耗,其中delta充当常数(不应传播梯度,这就是我分离它的原因)
该代码运行,但优化器未更新权重。奇怪的是,有时他们确实更新了评论家或演员(我不知道为什么),但从未同时更新。我认为这很奇怪,因为我已经看过其他完成此类操作的教程,例如GAN tutorial,但对我不起作用。
如果有人能给我一些指导,我将不胜感激。