Это правильный способ вычислить градиенты двух потерь от двух разных NN в pytorch? - PullRequest
2 голосов
/ 30 мая 2020

У меня есть NN, определенный в pytorch, и я создал два экземпляра этого net как self.actor_critic_r1 и self.actor_critic_r2. Я подсчитываю потери каждого net, т.е. loss1 и loss2, суммирую и вычисляю градации следующим образом:

loss_r1 = value_loss_r1 + action_loss_r1 - dist_entropy_r1 * args.entropy_coef
loss_r2 = value_loss_r2 + action_loss_r2 - dist_entropy_r2 * args.entropy_coef
self.optimizer_r1.zero_grad()
self.optimizer_r2.zero_grad()
loss = loss_r1 + loss_r2
loss.backward()
self.optimizer_r1.step()
self.optimizer_r2.step()
clip_grad_norm_(self.actor_critic_r1.parameters(), args.max_grad_norm)
clip_grad_norm_(self.actor_critic_r2.parameters(), args.max_grad_norm)

В качестве альтернативы, должен ли я обновлять потерю индивидуально, как это ,

self.optimizer_r1.zero_grad()
(value_loss_r1 + action_loss_r1 - dist_entropy_r1 * args.entropy_coef).backward()
self.optimizer_r1.step()
clip_grad_norm_(self.actor_critic_r1.parameters(), args.max_grad_norm)
self.optimizer_r2.zero_grad()
(value_loss_r2 + action_loss_r2 - dist_entropy_r2 * args.entropy_coef).backward()
self.optimizer_r2.step()
clip_grad_norm_(self.actor_critic_r2.parameters(), args.max_grad_norm)

Я не уверен, что это правильный подход для обновления сети с множественными потерями, пожалуйста, предоставьте свое предложение.

1 Ответ

1 голос
/ 30 мая 2020

Это должен быть суммированный подход. Если нет взаимодействия, то градиент «неправильной» потери в любом случае будет равен нулю для «неправильного» оптимизатора, и если есть - это взаимодействие, вы, вероятно, захотите оптимизировать для этого взаимодействия.

Только если вы знаете, что есть взаимодействие, но не хотите его оптимизировать, следует использовать подход №2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...