我在pytorch中定义了一个NN,并且我已经创建了该网络的两个实例,分别是self.actor_critic_r1
和self.actor_critic_r2
。我计算每个净额的损失,即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)
我不确定这是否是更新具有多重损失的网络的正确方法,请提供您的建议。
它应该是求和方法。如果没有相互作用,那么对于"错误"优化器来说,"错误"损失的梯度无论如何都将为零,如果存在相互作用,您可能希望针对该相互作用进行优化。
只有当您知道存在相互作用但您不想对其进行优化时,才应该使用方法 #2。