ОНОВЛЕННЯ:
Початкова реалізація 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)
Це так само, як мета двох бігунів, щоб мінімізувати їх час досягнення фінішу, навіть щоб вони були конкурентами у цьому завданні.
Отже, "протилежна мета" не означає протилежну задачу, тобто мінімізацію втрат (тобто мінімізацію часу в прикладі бігуна).
Я сподіваюся, що це допомагає.