将 torch.backward() 用于 GAN 生成器时,为啥 Pytorch 中的判别器损失没有变化?

Posted

技术标签:

【中文标题】将 torch.backward() 用于 GAN 生成器时,为啥 Pytorch 中的判别器损失没有变化?【英文标题】:When using torch.backward() for a GANs generator, why doesn't discriminator losses change in Pytorch?将 torch.backward() 用于 GAN 生成器时,为什么 Pytorch 中的判别器损失没有变化? 【发布时间】:2021-06-24 16:56:23 【问题描述】:

我对 GAN 的理解是:

    在训练您的生成器时,您需要先通过判别器进行反向传播,以便遵循链式规则。因此,我们在进行生成器损失计算时不能使用.detach()

    在更新判别器时,由于您的生成器权重更新不会影响判别器权重更新,我们可以.detach()您计算的生成器输出,我的理解告诉我,由于这个生成器不再是计算图的一部分,我们不再在 back prop 期间更新它。

所以当我们更新您的鉴别器损失时:

disc_loss.backward(retain_graph=True) 在每个小批量中,由于.detach() 函数调用,我们不必担心您的生成器会成为管道的一部分。

但是当我们在我们的生成器上工作时呢?是什么阻止了我们的模型根据生成器不断改变我们的鉴别器权重?毕竟这不是我们想要的吗?当被告知假样本是真实的时,鉴别器不应该学习。

为什么这样的模型首先会起作用

【问题讨论】:

【参考方案1】:

backward 不会更新权重,它会更新权重的梯度。更新权重是优化器的责任。实现 GAN 有不同的方法,但通常会有两个优化器,一个负责更新生成器的权重(并重置梯度),另一个负责更新生成器的权重(并重置梯度)鉴别器。在初始化时,每个优化器只提供它将更新的模型的权重。因此,当您调用优化器的 step 方法时,它只会更新这些权重。使用单独的优化器可以防止鉴别器权重被更新,同时最小化生成器的损失函数。

【讨论】:

以上是关于将 torch.backward() 用于 GAN 生成器时,为啥 Pytorch 中的判别器损失没有变化?的主要内容,如果未能解决你的问题,请参考以下文章

NLP中的GAN

TF - GAN入门:TensorFlow 2.0 的轻量级 GAN 库

GAN的数学原理

《生成对抗网络GAN的原理与应用专题》笔记

GAN简介

用于改善质量稳定性和多样性的可增长式GAN