经过几次尝试,我训练了一个 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。我的生成器甚至不能始终如一地产生这个。

