为什么要使用生成器的输出来训练 GAN 中的判别器?

人工智能 生成对抗网络
2021-11-10 16:56:07

我一直在阅读有关 GAN 的文章,虽然我已经看到了几个出色的实现示例,但在很多情况下,我并不清楚为什么选择这些模式的描述。

在非常高的层次上, GAN 中鉴别器的目的是建立一个可用于训练生成器的损失函数

IE。给定生成器的随机输入,鉴别器应该能够返回结果是“真实”图像的概率。

如果鉴别器是完美的,则概率将始终为零,并且损失函数将没有梯度。

因此,您迭代:

  • 生成随机样本
  • 从生成器生成输出
  • 使用鉴别器评估输出
  • 训练发电机
  • 通过对来自真实分布的样本和生成器的输出进行训练来更新鉴别器以使其更准确。

问题是我不明白的,是上面的第 5 点。

为什么要使用生成器的输出?

我完全理解您需要迭代鉴别器的准确性。

首先,它需要以非零值响应生成器的有效随机输出,慢慢地它需要收敛到正确分类“真实”或“假”图像。

为了实现这一点,我们迭代,用来自真实分布的图像训练生成器,推动它接受“真实”图像。

...以及来自生成器的图像;但我不明白为什么。

实际上,您有一组真实图像(例如 5000 张人脸图片),它们代表您希望 GAN 收敛的潜在空间中的样本(例如,所有人脸图片)。

所以论点是:

随着生成器被迭代训练越来越接近从潜在空间生成图像,鉴别器被迭代训练以从潜在空间识别,就好像它的样本量比你开始的 5000 个(或其他)样本图像大得多一样.

...好吧,但这很愚蠢。

DNN的重点在于,给定一个样本,您可以训练它从样本所代表的潜在空间中识别图像。

我从未见过第一步是“用额外的程序生成的假样本来增加你的样本”的 DNN;这样做的唯一原因是您只能识别输入集中的样本,即。您的网络过度拟合。

所以,作为一个具体的例子,为什么你不能在 ('real' * epoch/iterations + 'noise' * 1 - epoch/iterations) 的样本上增量训练鉴别器,其中 'noise' 只是一个随机输入向量。

然后,您的鉴别器将必然会收敛于识别真实图像,并为生成器提供有意义的梯度。

与此相比,提供发电机的输出有什么好处?

3个回答

判别器与生成器同时训练的主要原因是(至少在理论上)为生成器提供平滑和渐进的学习信号。

如果我们只在输入数据上训练判别器,那么,假设我们的训练算法收敛良好,它应该很快收敛到一个固定的模型。然后生成器可以学会欺骗这个固定的模型,但它可能仍然很容易为人类发现生成器的假货。例如,鉴别器可能已经知道,巧合的是,在您提供的样本中,所有卡车图像的左上角都有一个全白像素。如果它学会了这种模式,生成器就可以通过使用白色像素生成噪声来欺骗它。一旦生成器学会了这种模式,所有的学习都会停止。

相反,假设判别器在真实示例和生成示例的混合上反复重新训练。鉴别器将被迫学习比“左上角的白色像素”更复杂的模式,这将提高其质量,超越样本数据中的原始模式。

反之亦然。如果生成器仅在训练数据上进行训练,它也可能只挑选出最明显的模式。这些模式可能会在网络的权重空间中创建许多局部最小值。然而,如果来自鉴别器的误差信号被馈送到生成器,那么生成器必须适应:实际上,我们是在告诉它“让左上角的像素变白不足以欺骗观察者。找到更复杂的模式”。

鉴别器的工作是区分真实图像和生成的图像。如果它从未真正看到生成的图像,就不可能做到这一点,就像你想要一个网络来区分猫和狗一样,如果你只向它展示狗的照片,它就无法工作。
如果你只在真实图像上训练一个生成器,它会看到的所有标签都是 1。你最终得到的是一个学习如何生成 1 而不管其输入如何的网络,这很容易学习而无需找到任何数据中的基本模式。一旦您添加生成的图像和 0 个标签,它就会被迫学习一些有趣的东西。

事实证明,这实际上是有实际原因的。

实际上,在 GAN 中,生成器往往会收敛于少数“好”的输出,如果你不这样做,就会愚弄鉴别器。在最佳情况下,生成器实际上会发出一个固定的输出,而不管输入向量是否会欺骗判别器。

也就是说,生成器的损失函数不仅仅是为了“愚弄鉴别器”,它实际上是:

  • 愚弄鉴别器。
  • 生成新颖的输出。

您可以编写生成器的损失函数来明确尝试说任何训练批次中的输出应该是不同的,但是通过将输出传递给鉴别器,您可以创建生成器先前预测的历史,有效地应用生成器时的损失度量往往会一遍又一遍地产生相同的输出。

...但这不是魔术,也不是关于判别器学习“好特征”的特征;这是关于应用于生成器的损失。

这被称为“模式崩溃”,引用 Google ML guide on GAN Troubleshooting:

如果生成器开始一遍又一遍地产生相同的输出(或一小组输出),判别器的最佳策略是学习始终拒绝该输出。但是如果下一代鉴别器陷入局部最小值并且没有找到最佳策略,那么下一次生成器迭代就很容易为当前鉴别器找到最合理的输出。

生成器的每次迭代都会针对特定的判别器进行过度优化,而判别器永远不会设法摆脱陷阱。结果,生成器通过一小组输出类型旋转。这种形式的 GAN 失败称为模式崩溃。

另请参阅“Unrolled GANs”和“Wasserstein loss”的附加阅读。

见:https ://developers.google.com/machine-learning/gan/problems