如何在pytorch的训练循环中同时最小化一组参数并同时最大化另一组参数?

How to minimize wrt one set of parameters and maximize wrt other set of parameters simultaneously in a training loop in pytorch?

我有一个损失函数,其中包含两组要学习的参数。一个是矩阵,我想最大化损失,另一个是逻辑回归的参数集,我想最小化损失。 在 pytorch 中,每当我使用 loss.backward() 时,损失都最小化了两组参数,并且 (-loss).backward() 最大化了两者。如何对 pytorch 中的参数集进行极小极大优化? Tensorflow大概有gradient_tape和tape.watch()这个概念。 pytorch 的替代方案是什么?

可以参考https://arxiv.org/abs/1409.7495的梯度反转思路。

但这个想法的关键在于:你有一些损失函数 l(X,Y),其中 X 和 Y 是参数。现在你想更新 X 以最小化损失并更新 Y 以最大化损失,这可以看作是最小化 -l(X,Y).

本质上,您想用 dl/dX 更新参数 X,用 d(-l)/dY = -dl/dy 更新 Y。您可以通过执行反向传播步骤、修改 Y 的梯度并应用更新来完成此操作。在 pytorch 术语中,这将是:

loss = compute_loss()
loss.backward()
# modify gradients of Y
Y.grad.data = -Y.grad.data
optimizer.step()
optimizer.zero_grad()