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


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 і генератор повинен отримати максимізацію. Тому що обидва - опоненти, які переслідують протилежну мету.

За посиланням, наданим Ibragil:

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


Отже, це неправильна проблема:

У GAN наша кінцева мета - навчити наших двох контрагентів дискримінатора та генератора якнайкраще працювати одна проти одної. Це означає, що два алгоритми базового навчання мають різні завдання, але функція втрат, завдяки якій вони можуть досягти оптимального рішення , однакова, тобто binary_crossentropyзавдання моделей полягають у тому, щоб мінімізувати це втрачене.

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

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

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

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

Це так само, як мета двох бігунів, щоб мінімізувати їх час досягнення фінішу, навіть щоб вони були конкурентами у цьому завданні.

Отже, "протилежна мета" не означає протилежну задачу, тобто мінімізацію втрат (тобто мінімізацію часу в прикладі бігуна).

Я сподіваюся, що це допомагає.


5

Питання мені не дуже зрозуміле. Я припускаю, що ви хочете отримати максимізацію, а не мінімізувати, використовуючи критерій MSE.

Ви можете реалізувати власну власну функцію втрат, яка обчислює -MSE; перевертаючи знак втрати і тим самим досягаючи відвороту в напрямку градієнта спуску.

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

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

Ще один варіант - просто поставити негативний крок навчання - але я не впевнений, що Керас дозволяє вам це зробити. Варто спробувати.


Ви забули негативний знак у своїй функції?
Емма

Справді маю. Щойно відредагував відповідь.
Мано
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.