在PyTorch中同时最小化和最大化

时间:2018-06-12 04:42:50

标签: pytorch

我想知道如何在PyTorch中为以下数学运算采用梯度步骤(A,B和C是参数重叠的PyTorch模块)

math

这与生成性对抗性网络(GAN)的成本函数有所不同,因此我不能使用现成的GAN示例,并且在尝试根据上述成本调整它们时遇到困难。

我想到的一种方法是构造两个优化器。优化程序opt1具有模块A和B的参数,优化程序opt2具有模块C的参数。然后可以:

  1. 采取措施尽量减少C
  2. 的成本函数
  3. 使用相同的输入再次运行网络 以再次获得成本(和中间输出)
  4. 对A和B采取措施。
  5. 我确信他们必须是使用PyTorch(可能使用一些detach操作)更好的方法,可能不再运行网络。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

是的,有可能无需两次通过网络,这既浪费了资源,又在数学上造成了错误,因为权重发生了变化,因此丢失了,因此您引入了延迟,这样做可能很有趣,但不是您正在努力实现。

首先,按照您所说的创建两个优化器。计算损失,然后调用backward。至此,参数A,B,C的梯度已填充完毕,因此现在您只需调用step方法即可使优化器将损失降到最低,而不是使损失最大化。对于以后,您需要反转叶子参数张量C的梯度符号。

def d(y, x):
    return torch.pow(y.abs(), x + 1)

A = torch.nn.Linear(1,2)
B = torch.nn.Linear(2,3)
C = torch.nn.Linear(2,3)

optimizer1 = torch.optim.Adam((*A.parameters(), *B.parameters()))
optimizer2 = torch.optim.Adam(C.parameters())

x = torch.rand((10, 1))
loss = (d(B(A(x)), x) - d(C(A(x)), x)).sum()

optimizer1.zero_grad()
optimizer2.zero_grad()

loss.backward()
for p in C.parameters(): 
    if p.grad is not None: # In general, C is a NN, with requires_grad=False for some layers
        p.grad.data.mul_(-1) # Update of grad.data not tracked in computation graph

optimizer1.step()
optimizer2.step()

NB:我没有用数学方法检查结果是否正确,但我认为是正确的。