Я пытаюсь реализовать алгоритм actor-criti c в pytorch . Поэтому я хочу иметь две модели и обучать их по отдельности, а именно:
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). Я использую это для определения дельты. Затем я определяю оба убытка, где дельта действует как константа (градиент не должен распространяться, поэтому я его отключаю)
Этот код выполняется, но оптимизатор не обновляет веса. Как ни странно, иногда они обновляют либо критика c, либо актера (я понятия не имею, почему), но никогда оба. Я думаю, что это странно, потому что я видел другие учебники, где такие вещи сделаны, например, учебник GAN , но он не работает для меня.
Я был бы признателен, если кто-то может дай мне руководство.