【问题标题】:Maximize the MSE of a keras model最大化keras模型的MSE
【发布时间】:2020-04-05 19:21:37
【问题描述】:

我有一个生成对抗网络,其中鉴别器通过 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 值中获利的生成器模型?

【问题讨论】:

  • 你为什么要那个?这是一个病态的问题。最大化 MSE 意味着您需要使您的预测进入基础数据类型的边界。但如果你真的想这样做,为优化器提供负学习率应该可以完成这项工作。或者使用 MSE 的倒数作为损失函数。
  • 我有一个生成对抗网络,其中鉴别器通过 MSE 最小化,生成器应该最大化。因为两者都是追求相反目标的对手。
  • 好吧,你的问题很有误导性。请更新清楚。
  • @Geeocode 我做到了,谢谢。你认为 Marco 带负号的解法正确吗?
  • 几分钟后查看我的更新

标签: python tensorflow keras neural-network maximize


【解决方案1】:

更新:

原来的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)

这就像两个跑步者的目标是尽量减少他们到达终点的时间,即使他们是这项任务的竞争对手。

所以“相反的目标”并不意味着相反的任务,即最小化损失(即最小化跑步者示例中的时间)。

希望对你有帮助。

【讨论】:

    【解决方案2】:

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

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

    def negative_mse(y,yhat): 
        return - K.mean(K.sum(K.square(y-yhat)))
    
    model.compile(loss=negative_mse, optimizer='adam')
    

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

    【讨论】:

    • 您是否忘记了函数中的负号?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 2018-08-21
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2017-12-02
    • 2016-12-05
    相关资源
    最近更新 更多