最大化keras模型的MSE

Maximize the MSE of a keras model

我有一个生成对抗网络,其中鉴别器通过 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 实现如下所示:

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 写道:

I have a generative adversarial networks, where the discriminator gets minimized with the MSE and the generator should get maximized. Because both are opponents who pursue the opposite goal.

来自 Ibragil 提供的link:

Meanwhile, the generator is creating new, synthetic images that it passes to the discriminator. It does so in the hopes that they, too, will be deemed authentic, even though they are fake. The goal of the generator is to generate passable hand-written digits: to lie without being caught. The goal of the discriminator is to identify images coming from the generator as fake.


所以这是一个病态问题:

GAN 中,我们的最终目标是训练我们的两个对手 discriminatorgenerator 互相表现尽可能好。这意味着,这两个基础学习算法有不同的任务,但是它们可以获得最优解的损失函数是相同的,即binary_crossentropy,所以模型的任务是尽量减少这种损失。

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

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

一个生成器模型的编译方法:

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

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

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

希望对您有所帮助。

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

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

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

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

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