我目前正在以(大约)Wasserstein损失的喀拉斯山脉训练WGAN,如下所示:
def wasserstein_loss(y_true, y_pred):
return K.mean(y_true * y_pred)
但是,这种损失显然可以为负,这对我来说很奇怪。
我为WGAN训练了200个时期,并在下面得到了评论家Wasserstein损失训练曲线。
上述损失由
计算d_loss_valid = critic.train_on_batch(real, np.ones((batch_size, 1)))
d_loss_fake = critic.train_on_batch(fake, -np.ones((batch_size, 1)))
d_loss, _ = 0.5*np.add(d_loss_valid, d_loss_fake)
生成的样本质量很好,所以我认为我正确地训练了WGAN。但是我仍然不明白为什么Wasserstein损失可以是负数,并且该模型仍然有效。根据WGAN的原始论文,Wasserstein损失可以用作GAN的性能指标,那么我们应该如何解释它?我有误会吗?
答案 0 :(得分:1)
Wasserstein损失是对地球运动距离的度量,它是两种概率分布之间的差。在张量流中,它实现为d_loss = tf.reduce_mean(d_fake) - tf.reduce_mean(d_real)
,如果d_fake
在d_real
分布的另一端移动得太远,显然可以给出负数。您可以在情节上看到它,在训练期间,您的真实分布和虚假分布会不断变化,直到它们收敛到零附近为止。因此,作为性能衡量指标,您可以使用它来查看生成器与实际数据之间的距离以及它现在位于哪一侧。
查看分布图:
P.S。这是交叉熵损失,而不是Wasserstein。 如果您尚未阅读this article,也许可以为您提供更多帮助。但是,另一个问题是优化器如何将负损失最小化(降至零)。
答案 1 :(得分:0)
看起来我无法对 Sergeiy Isakov 给出的答案发表评论,因为我没有足够的声誉。我想发表评论,因为我认为该信息不正确。
原则上,Wasserstein 距离不能为负,因为距离度量不能为负。 Wasserstein 距离的实际表达式(对偶形式)涉及所有 1-Lipschitz 函数的上限值(您可以在网上参考)。由于它是最高的,我们总是采用给出最大值的 Lipschitz 函数来获得 Wasserstein 距离。然而,我们使用 WGAN 计算的 Wasserstein 只是一个估计值,并不是真正的 Wasserstein 距离。如果评论家的内部迭代次数较少,则可能没有足够的迭代次数来移动到正值。
思想实验:如果我们假设我们获得的 Wasserstein 估计为负,我们总是可以否定批评函数以使估计为正。这意味着存在一个给出正值的 Lipschitz 函数,它大于给出负值的 Lipschitz 函数。因此,Wasserstein 估计不能为负,因为根据定义,我们需要所有 1-Lipschitz 函数的上限值。