【问题标题】:Minimization and maximization at the same time in PyTorch在 PyTorch 中同时进行最小化和最大化
【发布时间】:2020-07-29 01:54:41
【问题描述】:

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

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

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

  1. 采取措施最小化 C 的成本函数
  2. 再次使用相同的输入运行网络以再次获得成本(和中间输出)
  3. 相对于 A 和 B 迈出一步。

我确信他们必须是使用 PyTorch 执行此操作的更好方法(可能使用一些 detach 操作),可能无需再次运行网络。任何帮助表示赞赏。

【问题讨论】:

    标签: pytorch


    【解决方案1】:

    是的,可以不通过网络两次,这既浪费资源又在数学上是错误的,因为权重已经改变,所以丢失了,所以你会引入延迟这样做,这可能很有趣,但不是什么你正在努力实现。

    首先,如您所说,创建两个优化器。计算损失,然后调用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()
    

    注意:我没有在数学上检查结果是否正确,但我认为它是正确的。

    【讨论】:

    • 为什么要使用 2 个优化器?
    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多