GAN 的损失函数的理想值是多少

Vin*_*shi 5 loss neural-network objective-function generative-adversarial-network

最初由 IJ Goodfellow 提出的 GAN 使用以下损失函数,

D_loss = - log[D(X)] - log[1 - D(G(Z))]

G_loss = - log[D(G(Z))]
Run Code Online (Sandbox Code Playgroud)

因此,鉴别器尝试最小化 D_loss,生成器尝试最小化 G_loss,其中 X 和 Z 分别是训练输入和噪声输入。D(.) 和 G(.) 分别是鉴别器和生成器神经网络的映射。

正如原始论文所说,当 GAN 被训练几个步骤时,它会达到一个生成器和判别器都无法改进的点,并且 D(Y) 到处都是 0.5,Y 是判别器的一些输入。在这种情况下,当 GAN 被充分训练到这一点时,

D_loss = - log(0.5) - log(1 - 0.5) = 0.693 + 0.693 = 1.386

G_loss = - log(0.5) = 0.693
Run Code Online (Sandbox Code Playgroud)

那么,为什么我们不能使用 D_loss 和 G_loss 值作为评估 GAN 的指标呢?

如果两个损失函数偏离了这些理想值,那么 GAN 肯定需要训练好或架构需要设计好。正如原始论文中的定理 1 所讨论的,这些是 D_loss 和 G_loss 的最佳值,但为什么不能将它们用作评估指标?

Sol*_*ius 5

我认为这个问题属于交叉验证,但无论如何:

我为此挣扎了很长一段时间,并想知道为什么没有问这个问题。接下来是我目前所处的位置。不确定它是否会帮助你,但这是我的一些直觉。

G 和 D 损失是失败案例的良好指标……
当然,如果 G 损失是一个非常大的数字而 D 为零,那么您的 GAN 中没有发生任何好事。

...但不是很好的性能指标。
我训练了一堆 GAN,除了非常简单的例子外,几乎从未见过“0.5/0.5 案例”。大多数情况下,当输出 D(x) 和 D(G(z))(因此,损失)或多或少稳定时,您会感到高兴。所以不要把这些值当作“黄金标准”。
我缺少的一个关键直觉是 G 和 D 训练的同步。一开始,肯定 G 在生成东西方面确实很糟糕,但 D 在区分它们方面也很糟糕。随着时间的推移,G变得更好,但D也变得更好。所以经过多次 epoch,我们可以认为 D 真的很擅长辨别真假。因此,即使 G 只有 5% 的时间“愚弄”D(即 D(x)=0.95 和 D(G(z))=0.05),那么这也可能意味着 G 实际上相当不错,因为它有时会愚弄很好的鉴别器。
如您所知,除了暂时查看图像质量之外,没有可靠的图像质量指标,但我发现对于我的用例,G 可以生成出色的图像,而仅在少数情况下愚弄 D。
这种同时训练的一个推论是训练开始时发生的事情:您可以让 D(X)=0.5 和 D(G(Z))=0.5,并且仍然让 G 产生几乎随机的图像:只是 D 是还不足以将它们与真实图像区分开来。

我看到你发布这个问题已经有几个月了。如果您在此期间获得了直觉,我会很高兴听到它!

  • 我也通过实验学到了同样的东西。当 GAN 遭受模式崩溃等故障模式时,它会给出最佳损失值,因为 G 正在利用 D,但它并不表明一个 GAN 与另一个 GAN 相比有多好。另外,对于图像质量来说,这些损失值并不是很好的衡量标准,根据我的经验,损失值不一定反映图像质量。为了公平比较 GAN 模型,Frechet 距离测量目前是最先进的,并且在我的实验中效果非常好。 (4认同)