【问题标题】:How to minimize wrt one set of parameters and maximize wrt other set of parameters simultaneously in a training loop in pytorch?如何在pytorch的训练循环中同时最小化一组参数并最大化另一组参数?
【发布时间】:2022-01-05 04:46:07
【问题描述】:

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

【问题讨论】:

  • 你有没有尝试过使用梯度反转或一些类似的想法?如果您还没有尝试过,我可以在答案中解释这一点。
  • 不,我还没有尝试过。非常感谢您的帮助。
  • 基本上,假设我有 f(X,Y),其中 X 是一组变量,Y 是另一组。现在这个 f(X,Y) 不能分解成 f1(X)+f2(Y),否则这将是一件容易的事。我必须最小化 f(X,Y) wrt X 并最大化 wrt Y。

标签: optimization pytorch minimax


【解决方案1】:

可以参考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()

【讨论】:

  • 天哪!这看起来很简单!非常感谢!你是救世主!!!
  • 很高兴!我可以帮忙。如果它有效,请接受答案,这将有助于其他人,因为他们知道它有效:)
猜你喜欢
  • 1970-01-01
  • 2021-01-28
  • 2018-12-28
  • 1970-01-01
  • 2020-10-09
  • 2017-10-18
  • 2021-10-17
  • 2021-12-02
相关资源
最近更新 更多