最大化Keras模型的MSE


11

我有一个生成式对抗网络,其中通过MSE使鉴别器最小化,并且使生成器最大化。因为两者都是追求相反目标的对手。

generator = Sequential()
generator.add(Dense(units=50, activation='sigmoid', input_shape=(15,)))
generator.add(Dense(units=1, activation='sigmoid'))
generator.compile(loss='mse', optimizer='adam')

generator.train_on_batch(x_data, y_data)

为了获得可以从高MSE值中获利的生成器模型,我必须适应什么?


1
你为什么要那样?这是一个不适的问题。最大化MSE意味着您需要对基础数据类型的边界进行预测。但是,如果您真的想这样做,那么为优化器提供负学习率可能就可以完成任务。或使用MSE的逆函数作为损失函数。
a_guest

1
我有一个生成式对抗网络,其中通过MSE使鉴别器最小化,并且使生成器最大化。因为两者都是追求相反目标的对手。
艾玛(Emma)

好的,您的问题很容易引起误解。请更新以使其清晰。
Geeocode

@Geeocode我做到了,谢谢。您认为Marco带有负号的解决方案是正确的吗?
艾玛(Emma)

请在几分钟内查看我的更新
-Geeocode

Answers:


5

更新:

原始的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: 最初我写的,是直观的第一个想法简单地否定损失将给予我们所期望的,因为的优化方法基本概念的结果(你可以读到一篇有趣的讨论,在这里)。在我仔细检查了两种方法在特定学习任务中的结果之后(注意:我没有进行全面测试),这两种方法都使损失最大化,尽管该-loss方法收敛得更快。由于此处描述的可能问题,我不确定是否总是提供最佳解决方案或任何解决方案。如果有人有其他经验,请告诉我。

因此,如果有人也想尝试一下-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提供的链接中:

同时,生成器正在创建新的合成图像,并将其传递给鉴别器。这样做是为了希望即使它们是假的,它们也将被认为是真实的。生成器的目标是生成可传递的手写数字:说谎而不被抓住。鉴别器的目的是将来自发生器的图像识别为伪造的。


所以这是一个不适的问题:

GAN中,我们的最终目标是训练我们的两个对手,使鉴别器生成器在彼此之间表现得尽可能好。这意味着,这两个基础学习算法具有不同的任务,但是可以实现最优解的损失函数是相同的,binary_crossentropy,因此模型的任务是最大程度地减少这种损失。

一个鉴别模型的编译方法:

self.discriminator.compile(loss='binary_crossentropy', optimizer=optimizer)

一个发电机模型的编译方法:

self.generator.compile(loss='binary_crossentropy', optimizer=optimizer)

就像两个跑步者的目标一样,即使他们在这项任务中是竞争对手,也要尽可能减少到达终点的时间。

因此,“相反的目标”并不意味着相反的任务,即最大程度地减少损失(例如,使跑步者的时间最少)。

希望对您有所帮助。


5

这个问题对我来说不是很清楚。我想您想在使用MSE的标准时最大化而不是最小化。

您可以实现自己的自定义损失函数,该函数计算-MSE;翻转损耗的符号,从而实现梯度下降方向的翻转。

def negative_mse(y,yhat): 
    return - K.mean(K.sum(K.square(y-yhat)))

model.compile(loss=negative_mse, optimizer='adam')

另一种选择是简单地提供否定的学习步骤-但我不确定Keras是否允许您这样做。值得一试。


您是否忘记了功能中的负号?
艾玛(Emma)

的确,我有。刚刚编辑了答案。
马诺
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.