Pytorch:如何针对多个损失优化多个变量?

时间:2020-04-27 02:56:03

标签: optimization pytorch autograd

我希望针对不同的变量计算不同的损失梯度,然后将这些变量放在一起。

这是一个简单的例子,展示了我想要的东西:

backward_with_respect_to

我的问题是我们如何在PyTorch中执行x部分?我只想要x_loss的渐变色x,等等。然后,我希望所有优化程序一起努力(基于yzOn the GitLab server, navigate to the project’s repository directory.的当前值)。

1 个答案:

答案 0 :(得分:0)

我已经写了一个函数来做到这一点。这两个关键组成部分是(1)除了最终调用.for以外,其余所有用户都使用retain_graph=True,以及(2)每次调用.backward()之后保存成绩,并在{ {1}}。

.backward()

在问题所述的示例代码中,.step()的使用方式如下:

def multi_step(losses, optms):
  # optimizers each take a step, with `optms[i]`'s variables being 
  # optimized w.r.t. `losses[i]`.
  grads = [None]*len(losses)
  for i, (loss, optm) in enumerate(zip(losses, optms)):
    retain_graph = i != (len(losses)-1)
    optm.zero_grad()
    loss.backward(retain_graph=retain_graph)
    grads[i] = [ 
          [ 
            p.grad+0 for p in group['params'] 
          ] for group in optm.param_groups
        ]
  for optm, grad in zip(optms, grads):
    for p_group, g_group in zip(optm.param_groups, grad):
      for p, g in zip(p_group['params'], g_group):
        p.grad = g
    optm.step()