Я использую Reinforcement Learning для обучения двух сетей, одна - сеть актеров, обозначенная как u, а другая - сеть критики, обозначенная как Q.
Сеть акторов u получает вход,и производит тензор актера.как, ты (ы) -> а.в то время как Q получает тот же вход, плюс тензор актера u, полученный на предыдущем шаге.и производит оценку.Как Q (s, a) -> q
И теперь я делаю обратное распространение в этих двух сетях.Чтобы оптимизировать вас, формула:
ce_optimizer = torch.optim.Adam(tn.critic_e.parameters(), lr=tn.LR_C)
ae_optimizer = torch.optim.Adam(tn.actor_e.parameters(), lr=tn.LR_A)
... # optimize the critic network, which is easy
# optimize the actor network
ae_optimizer.zero_grad()
ce_optimizer.zero_grad() # since we optimized critic network in above part,
a_pred = tn.actor_e(patch, hmap)
q_eval = tn.critic_e(patch, hmap, a_pred)
q_eval.backward(torch.tensor([[1.0]]).to(device))
ae_optimizer.step() # note using optimizer for actor network
Я делаю один прямой процесс для вас, а затем Q, и обратно, что, как только вы получите его оценки, простоиспользуя соответствующий оптимизатор для выполнения операции step ().Правильна ли здесь логика?