gpt4 book ai didi

pytorch - 在 PyTorch 中同时进行最小化和最大化

转载 作者:行者123 更新时间:2023-12-04 15:59:50 27 4
gpt4 key购买 nike

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

math

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

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

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

我确信它们一定是使用 PyTorch 执行此操作的更好方法(可能使用一些 detach 操作),可能无需再次运行网络。感谢您的帮助。

最佳答案

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

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

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

关于pytorch - 在 PyTorch 中同时进行最小化和最大化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50809367/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com