Максимизируйте MSE модели keras

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, а генератор должен максимизироваться. Потому что оба являются противниками, преследующими противоположную цель.
Эмма
Хорошо, ваш вопрос был довольно обманчивым. Пожалуйста, обновите это, чтобы быть ясным.
Geeocode
@Geeocode я сделал, спасибо. Как вы думаете, решение от Марко с отрицательным знаком является правильным?
Эмма
Смотрите мое обновление в считанные минуты
Geeocode

Ответы:

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)


Дополнительные детали:

ОП написал:

У меня есть генеративные состязательные сети, где дискриминатор сводится к минимуму с помощью MSE, а генератор должен максимизироваться. Потому что оба являются противниками, преследующими противоположную цель.

По ссылке, предоставленной Ибрагилом:

Тем временем генератор создает новые синтетические изображения, которые он передает дискриминатору. Это делается в надежде, что они тоже будут считаться подлинными, даже если они являются поддельными. Цель генератора - генерировать проходимые рукописные цифры: лгать, не быть пойманным. Цель дискриминатора состоит в том, чтобы идентифицировать изображения, поступающие от генератора, как поддельные.


Так что это некорректная проблема:

В GAN наша конечная цель - научить наших двух контрагентов дискриминатора и генератора работать как можно лучше друг против друга. Это означает, что два базовых алгоритма обучения имеют разные задачи, но функция потерь, с которой они могут достичь оптимального решения, одинакова, т.е.binary_crossentropy , поэтому задачи на основе имеющихся моделей являются минимизация этого утраченным.

Дискриминатор модели метод компиляции:

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

Генератор модели метод компиляции:

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

Это то же самое, что и цель двух бегунов - минимизировать время достижения финиша, даже если они являются конкурентами в этой задаче.

Таким образом, «противоположная цель» не означает противоположную задачу, то есть минимизацию потерь (т.е. минимизацию времени в примере бегуна).

Я надеюсь, что это помогает.

Geeocode
источник
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 позволяет вам это делать. Стоит попробовать.

Mano
источник
Вы забыли отрицательный знак в вашей функции?
Эмма
Действительно, у меня есть. Только что отредактировал ответ.
Мано