更新:
原来的MSE 实现如下:
def mean_squared_error(y_true, y_pred):
if not K.is_tensor(y_pred):
y_pred = K.constant(y_pred)
y_true = K.cast(y_true, y_pred.dtype)
return K.mean(K.square(y_pred - y_true), axis=-1)
我认为正确的最大化损失函数:
def mean_squared_error_max(y_true, y_pred):
if not K.is_tensor(y_pred):
y_pred = K.constant(y_pred)
y_true = K.cast(y_true, y_pred.dtype)
return K.mean(K.square(1 / (y_pred - y_true)), axis=-1)
这样我们总是得到一个正的损失值,就像在 MSE 函数的情况下一样,但效果相反。
更新 2:
最初我写道,由于优化方法的基本概念,简单地否定损失的直观第一个想法将不会给出我们预期的结果(您可以阅读有趣的讨论here)。
在我仔细检查了这两种方法后,在一项特定的学习任务中(注意:我没有进行全面测试),这两种方法都使损失最大化,尽管-loss 方法收敛得更快一些。由于here 描述的可能问题,我不确定它是否总是提供最佳解决方案或任何解决方案。
如果有人有其他经验,请告诉我。
所以如果有人也想试试-loss:
def mean_squared_error(y_true, y_pred):
if not K.is_tensor(y_pred):
y_pred = K.constant(y_pred)
y_true = K.cast(y_true, y_pred.dtype)
return - K.mean(K.square(y_pred - y_true), axis=-1)
其他详情:
OP 写道:
我有一个生成对抗网络,其中判别器得到
用 MSE 最小化,生成器应该最大化。因为
两人都是追求相反目标的对手。
来自 Ibragil 提供的链接:
与此同时,生成器正在创建新的合成图像,它
传递给鉴别器。这样做是希望他们也一样,
将被视为真实的,即使它们是假的。的目标
generator is to generate passable hand-written numbers: to lie without
被抓。鉴别器的目标是识别图像
来自生成器是假的。
所以这是一个不适定问题:
在 GAN 中,我们的最终目标是训练我们的两个对手方 discriminator 和 generator 以尽可能好地相互对抗.这意味着,这两种基础学习算法具有不同的任务,但损失函数可以实现最优解相同即binary_crossentropy,因此模型的任务是尽量减少这种损失。
一个判别器模型的编译方法:
self.discriminator.compile(loss='binary_crossentropy', optimizer=optimizer)
生成器模型的编译方法:
self.generator.compile(loss='binary_crossentropy', optimizer=optimizer)
这就像两个跑步者的目标是尽量减少他们到达终点的时间,即使他们是这项任务的竞争对手。
所以“相反的目标”并不意味着相反的任务,即最小化损失(即最小化跑步者示例中的时间)。
希望对你有帮助。