ОБНОВИТЬ:
Исходная реализация 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)
Дополнительные детали:
ОП написал:
У меня есть генеративные состязательные сети, где дискриминатор сводится к минимуму с помощью MSE, а генератор должен максимизироваться. Потому что оба являются противниками, преследующими противоположную цель.
По ссылке, предоставленной Ибрагилом:
Тем временем генератор создает новые синтетические изображения, которые он передает дискриминатору. Это делается в надежде, что они тоже будут считаться подлинными, даже если они являются поддельными. Цель генератора - генерировать проходимые рукописные цифры: лгать, не быть пойманным. Цель дискриминатора состоит в том, чтобы идентифицировать изображения, поступающие от генератора, как поддельные.
Так что это некорректная проблема:
В GAN наша конечная цель - научить наших двух контрагентов дискриминатора и генератора работать как можно лучше друг против друга. Это означает, что два базовых алгоритма обучения имеют разные задачи, но функция потерь, с которой они могут достичь оптимального решения, одинакова, т.е.binary_crossentropy
, поэтому задачи на основе имеющихся моделей являются минимизация этого утраченным.
Дискриминатор модели метод компиляции:
self.discriminator.compile(loss='binary_crossentropy', optimizer=optimizer)
Генератор модели метод компиляции:
self.generator.compile(loss='binary_crossentropy', optimizer=optimizer)
Это то же самое, что и цель двух бегунов - минимизировать время достижения финиша, даже если они являются конкурентами в этой задаче.
Таким образом, «противоположная цель» не означает противоположную задачу, то есть минимизацию потерь (т.е. минимизацию времени в примере бегуна).
Я надеюсь, что это помогает.