Как правильно тренировать несколько моделей одновременно - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь реализовать алгоритм 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 , но он не работает для меня.

Я был бы признателен, если кто-то может дай мне руководство.

...