Я пытаюсь реализовать Алгоритм обучения актера-критика , который не совпадает с базовым алгоритмом критика актера, он немного изменился.
В любом случае, я использовал оптимизатор Адама и реализовалс pytorch
при первой обратной TD-ошибке для Critic ошибки нет.Тем не менее, я проиграл актеру, произошла ошибка.
--------------------------------------------------------------------------- RuntimeError Traceback (большинствопоследний вызов последним) в 46 # обновление Actor Func 47 optimizer_M.zero_grad () ---> 48 loss.backward () 49 optimizer_M.step () 50
~ \ Anaconda3 \ lib \ site-packages \ torch\ tenor.py в обратном направлении (само, градиент, retain_graph, create_graph) 100 продуктов.По умолчанию False
.101 "" "-> 102 torch.autograd.backward (self, градиент, retain_graph, create_graph) 103 104 def register_hook (self, hook):
~ \ Anaconda3 \ lib \ site-packages \ torch \autograd__init__.py в обратном направлении (тензоры, grad_tensors, retain_graph, create_graph, grad_variables) 88 Variable._execution_engine.run_backward (89 тензоров, grad_tensors, retain_graph, create_graph, ---> 90 allow_unreachable = True) # allow_unreachable flag 91 921016 * RuntimeError: одна из переменных, необходимых для вычисления градиента, была изменена операцией на месте
выше - содержание ошибки
Я пытался найти операцию на месте, но у меня нетЯ не знаю, как обращаться с оптимизатором.
Вот основной код:
for cur_step in range(1):
action = M_Agent(state, flag)
next_state, r = env.step(action)
# calculate TD Error
TD_error = M_Agent.cal_td_error(r, next_state)
# calculate Target
target = torch.FloatTensor([M_Agent.cal_target(TD_error)])
logit = M_Agent.cal_logit()
loss = criterion(logit, target)
# update value Func
optimizer_M.zero_grad()
TD_error.backward()
optimizer_M.step()
# update Actor Func
loss.backward()
optimizer_M.step()
Вот сеть агентов
# Actor-Critic Agent
self.act_pipe = nn.Sequential(nn.Linear(state, 128),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(128, 256),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(256, num_action),
nn.Softmax()
)
self.val_pipe = nn.Sequential(nn.Linear(state, 128),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(128, 256),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(256, 1)
)
def forward(self, state, flag, test=None):
temp_action_prob = self.act_pipe(state)
self.action_prob = self.cal_prob(temp_action_prob, flag)
self.action = self.get_action(self.action_prob)
self.value = self.val_pipe(state)
return self.action
Я хочу обновить каждую сеть соответственно.
и хочу знать, что базовый метод TD Actor-Critic использует ошибку TD для потерь ?? или квадратическую ошибку между r + V(s ') и V (s)?