更新:
原始的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写道:
我有一个生成对抗网络,其中鉴别器通过均方误差最小化,生成器应该最大化。因为两者都是追求相反目标的对手。
来自Ibragil提供的链接:
与此同时,生成器正在创建新的合成图像,并将其传递给鉴别器。它这样做是希望它们也被认为是真实的,尽管它们是虚假的。生成器的目标是生成可以通过的手写数字:在不被发现的情况下说谎。鉴别器的目标是识别来自生成器的图像为假。
因此,这是一个不适定问题:
在GAN中,我们的最终目标是训练两个对手——鉴别器和生成器,使它们相互竞争时表现尽可能好。这意味着两个基本学习算法有不同的任务,但是可以实现最优解的损失函数是相同的,即binary_crossentropy,因此模型的任务是最小化该损失。
一个鉴别器模型的编译方法:
self.discriminator.compile(loss='binary_crossentropy', optimizer=optimizer)
一个生成器模型的编译方法:
self.generator.compile(loss='binary_crossentropy', optimizer=optimizer)
这就像两个赛跑者的目标一样,尽管他们是竞争对手,但都希望缩短到达终点的时间。
因此,“相反的目标”并不意味着相反的任务,即最小化损失(例如在赛跑者的例子中缩短时间)。
希望这可以帮助您。