pytorch - 在 PyTorch 中同时进行最小化和最大化
问题描述
我想知道如何在 PyTorch 中为以下数学运算采取梯度步骤(A、B 和 C 是参数不重叠的 PyTorch 模块)
这与生成对抗网络 (GAN) 的成本函数有些不同,因此我不能使用现成的 GAN 示例,并且在尝试调整它们以适应上述成本时遇到了困难。
我想到的一种方法是构造两个优化器。优化器opt1
具有模块 A 和 B 的参数,优化器opt2
具有模块 C 的参数。然后可以:
- 采取步骤最小化 C 的成本函数
- 使用相同的输入再次运行网络以再次获得成本(和中间输出)
- 对 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()
注意:我没有在数学上检查结果是否正确,但我认为它是正确的。
推荐阅读
- r - ggalluvial 为每个节点分配不同的颜色
- java - Camel 属性占位符布尔值
- markdown - 将 Markdown 转换为 RTF 并保留标题?
- node.js - 使用 Cloud Functions 将复杂的 Json 写入 Cloud Firestore 的语法?
- asp.net - getexternallogininfo 在没有 MVC 的简单 asp.net 中的方法上返回 null
- video - 在运动补偿技术中,发送方是否可以只发送有关运动的信息?
- node.js - React 和 axios 的 ERR_CONNECTION_REFUSED
- node.js - 计算所有匹配文档中的字段总和 - MongoDB - Mongoose
- socket.io - 构建失败并出现解决错误
- javascript - 在程序编译期间雪花去除反斜杠?