PyTorch中同时最小化和最大化

PyTorch中同时最小化和最大化,pytorch,Pytorch,我想知道如何对Pytork中的以下数学运算采取梯度步骤(A、B和C是Pytork模块,其参数不重叠) 这与生成性对抗网络(GAN)的成本函数有些不同,因此我无法使用现成的GAN示例,而我在尝试将它们调整为上述成本时遇到了困难 我想到的一种方法是构造两个优化器。Optimizeropt1具有模块A和B的参数,Optimizeropt2具有模块C的参数。然后可以: 采取步骤最小化C的成本函数 使用相同的输入再次运行网络,以再次获得成本(和中间输出) 对a和B采取步骤 我相信他们一定是一个更好的方法

我想知道如何对Pytork中的以下数学运算采取梯度步骤(A、B和C是Pytork模块,其参数不重叠)

这与生成性对抗网络(GAN)的成本函数有些不同,因此我无法使用现成的GAN示例,而我在尝试将它们调整为上述成本时遇到了困难

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

  • 采取步骤最小化C的成本函数
  • 使用相同的输入再次运行网络,以再次获得成本(和中间输出)
  • 对a和B采取步骤

  • 我相信他们一定是一个更好的方法来使用PyTorch(可能使用一些
    detach
    操作),可能不需要再次运行网络。非常感谢您的帮助。

    是的,您可以不通过网络两次,这既浪费了资源,又在数学上是错误的,因为权重已经改变,所以丢失了,因此您引入了延迟,这可能很有趣,但不是您想要实现的

    首先,如您所说创建两个优化器。计算损失,然后向后调用
    。此时,参数A、B、C的梯度已填充,因此现在您只需调用
    步骤
    方法,以使优化器最小化损失,而不是最大化损失的方法。对于后者,需要反转叶参数张量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()
    
    注:我已经用数学方法检查了结果是否正确,但我认为正确