Python 这是从两个不同的NN'计算两个损耗梯度的正确方法吗;皮托克在哪里?

Python 这是从两个不同的NN'计算两个损耗梯度的正确方法吗;皮托克在哪里?,python,pytorch,loss-function,Python,Pytorch,Loss Function,我在pytorch中定义了一个NN,我创建了该网络的两个实例,分别为self.actor\u critist\u r1和self.actor\u critist\u 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 -

我在pytorch中定义了一个NN,我创建了该网络的两个实例,分别为
self.actor\u critist\u r1
self.actor\u critist\u 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。

请您简要解释一下,您所说的“错误损失”和“相互作用”是什么意思?@MurtazaBasu Well
loss\u r1
对于
optimizer\u r2
loss\u r1
来说都是“错误的”,相互作用意味着
loss\u r1
实际上依赖于
优化器\u r2
(对于
loss\u r2
优化器\u r1
,反之亦然)在我的例子中,我不希望损失的梯度2对r1有任何影响,反之亦然。我希望这两个网络能够独立更新,而不会相互影响,而是在相同的基础设施内进行更新。不过,我还是需要使用求和法?好的,我明白了,谢谢。最后一个问题是,我一直在使用个人方法,我注意到的是,第二个网络,即self.actor\u critist\u r2,在每次更新后都会逐渐改进,而net-self.actor\u critist\u r1从来没有改进过。这可能是因为同样的原因吗?@MurtazaBasu我不知道对不起。