帮助解释 GAN 输出,以及如何修复它?

数据挖掘 机器学习 神经网络 训练 生成模型
2022-01-31 18:55:25

经过几次尝试,我训练了一个 GAN 来产生半感知输出。在这个模型中,它几乎立即找到了解决方案并卡在了那里。判别器和生成器的损失都是 0.68(我使用了 BCE 损失),两者的准确率都达到了 50% 左右。生成器的输出乍一看还不错,可以作为真实数据,但经过分析,我发现它仍然不是很好。

我的解决方案是增加鉴别器的能力(增加它的大小)并重新训练。我希望通过扩大它来迫使生成器创建更好的样本。我得到以下输出。

在此处输入图像描述 在此处输入图像描述

似乎随着 GAN 损失的增加,并产生更差的样本,鉴别器可以更容易地挑选出来。

当我检查经过训练的生成器的输出时,我发现它遵循真实数据遵循的一些基本规则,但再次经过仔细审查,它们未能通过真实数据将通过的更复杂的测试。

我的问题是:

  • 我对情节的上述解释是否正确?
  • 对于这次运行,我是否使鉴别器变得强大?我应该增加发电机的功率吗?
  • 我应该研究另一种技术来阻止这种形式的模式崩溃吗?

谢谢

编辑:我使用的架构是 Graph GAN 的一种形式。生成器只是一系列线性层。鉴别器是 3 个 Graph Conv Layers,然后是一些线性层。与本文略有相似我正在做的两件可能非常规的事情:

  • 没有批量标准化,我发现这对训练有非常负面的影响。虽然我可以尝试并坚持下去。
  • 我正在使用 StandardScaler 来缩放我的数据。做出此选择是因为它可以轻松地让您取消缩放数据。这很有用,因为我可以获取生成器的输出并轻松将其转换为原始比例。但是,StandardScaler 不会在 1 和 -1 之间进行缩放,所以我不能使用 tanh 作为生成器的最终激活函数,而是生成器的最后一层只是线性的。

GAN 的输出(一旦重新缩放并且形状已经改变)类似于:

[[ 46.09169   -25.462175   20.705683  -31.696495 ]
 [ 35.10637   -18.956036   15.20579   -24.803787 ]
 [ 10.253135   -5.759581    5.9068713  -6.3003526]]

一个真实的例子是:

[[ 45.6         30.294546   -17.218746   -29.41284   ]
 [  1.8186008    1.7064333    0.5984112    0.19312467]
 [ 44.31433     28.234058   -17.615921   -29.262213  ]]

值得注意的是,矩阵左上角的值将始终为 45.6。我的生成器甚至不能始终如一地产生这个。

1个回答

理论上,我们应该首先将判别器训练到最优。但是,如果它变得太好,那么它每次都会拒绝虚假数据,从而使生成器无法学习。与其他 ML 任务不同,较低的 GAN 损失并不意味着训练正在收敛。较新的 GAN 具有更好的技术来简化训练 GAN,例如 Wasserstein 损失、谱归一化和渐进式增长。