如何解释生成对抗网络中鉴别器的损失和生成器的损失?

How to interpret the discriminator's loss and the generator's loss in Generative Adversarial Nets?

我正在阅读人们对 DCGAN 的实现,尤其是 this one 在 tensorflow 中。

在那个实现中,作者画出了判别器和生成器的损失,如下图(图片来自https://github.com/carpedm20/DCGAN-tensorflow):

判别器和生成器的损失似乎都没有遵循任何模式。不像一般的神经网络,它的损失随着训练迭代次数的增加而减少。如何解释训练 GAN 时的损失?

不幸的是,正如您所说,对于 GAN,损失非常不直观。大多数情况下,它发生在生成器和鉴别器相互竞争的事实,因此对一个的改进意味着另一个的损失更高,直到另一个对接收到的损失学习得更好,这搞砸了它的竞争对手,等等。

现在应该经常发生的一件事(取决于您的数据和初始化)是鉴别器和生成器损失都收敛到一些永久数字,如下所示: (损失有一点反弹是可以的——这只是模型试图自我改进的证据)

这种损失收敛通常表示 GAN 模型找到了一些最优值,它不能再改进了,这也应该意味着它已经学得足够好了。 (另请注意,数字本身通常信息量不大。)

以下是一些旁注,希望对您有所帮助:

  • 如果损失没有很好地收敛,并不一定意味着模型没有学到任何东西 - 检查生成的示例,有时它们已经足够好了。或者,可以尝试改变学习率和其他参数。
  • 如果模型收敛良好,仍然检查生成的示例 - 有时生成器会发现 one/few 个判别器无法区分真实数据的示例。问题是它总是给出这几个,而不是创造任何新东西,这被称为模式崩溃。通常为您的数据引入一些多样性会有所帮助。
  • 由于原始 GAN 相当不稳定,我建议使用 一些版本 DCGAN 模型,因为它们包含一些特征,例如卷积 层和批量归一化,这应该有助于 收敛的稳定性。 (上图是DCGAN而非vanilla GAN的结果)
  • 这是一些常识,但仍然是:与大多数神经网络结构一样,调整模型,即更改其参数 or/and 架构以适应您的特定 needs/data 可以改进模型或搞砸它。