Яка функція втрати для багатокласних завдань з класифікацією на багато міток у нейронних мережах?


64

Я треную нейронну мережу для класифікації набору об'єктів на n-класи. Кожен об'єкт може належати одночасно до декількох класів (багатокласний, багатозначний).

Я читав, що для проблем із класом зазвичай рекомендується використовувати softmax та категоричну перехресну ентропію як функцію втрати замість mse, і я розумію більш-менш чому.

У моїй проблемі мульти-етикетки не було б сенсу використовувати softmax, звичайно, оскільки ймовірність кожного класу повинна бути незалежною від інших. Отже, мій остаточний шар - це просто сигмоподібні одиниці, які розбивають свої входи в діапазон ймовірностей 0..1 для кожного класу.

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

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

Я використовую python і keras для тренувань, якщо це важливо.


1
Я вважаю, що softmax - це "сигмоподібні одиниці, які розбивають свої входи в діапазон ймовірностей 0..1 для кожного класу".
— Hong Ooi

Ви можете використовувати softmax як функцію втрати, а потім використовувати ймовірності для багатозначної оцінки даних.
— balboa

Відповіді:


30

Якщо ви використовуєте кери, просто покладіть сигмоїди на вихідний шар, а бінарну_кросцентропію на функцію витрат.

(y⋅ln⁡(sigmoid(logits))+(1−y)⋅ln⁡(1−sigmoid(logits)))

nclasses

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


Шановний Алоку, чи можете ви пояснити ОП, як вони будуть використовувати цю функцію і чому це має сенс? Як ви побачите в турі , відповіді на посилання не рекомендуються лише на сайті.
— Антуан Вернет


1
Не рекомендується писати власну функцію витрат при використанні перехресної ентропії - це може бути предметом чисельної стабільності. Див. Сторінку github.com/tensorflow/tensorflow/isissue/2462 для обговорення.
— кбросе

Одне - багатозначне, інше - багаторівневе багатошарове. Сигмоїд скорочує ваш вихід між 0 і 1, але в ОП є кілька класів, тому вихід повинен бути, наприклад, 0 - 10. Отже, результати повинні виглядати: [0,5,2,3,1] <--- це не те, що сигмоїд робить.
— міморалія

я повинен tf.round (logits) перед використанням у функції витрат чи я можу безпосередньо використовувати логіти зі прихованого шару до tf.nn.sigmoid ....?
— Чернець

9

ОНОВЛЕННЯ (18.04.18): Стара відповідь все ще виявилася корисною для моєї моделі. Трюк полягає в моделюванні функції розділу та розподілу окремо, використовуючи таким чином силу softmax.

ymyim=δimF(yi,xi)=−log⁡P(yi|xi)yim=Z⋅P(ym) щоб досягти двох властивостей:

  1. ∑mP(ym)=1
  2. Z

max(0.01,output)

На практиці вибір оптимізатора також робить величезну зміну. Мій досвід підходу до факторизації - це найкраще він працює в Ададельті (Adagrad не працює для мене, ще не пробував RMSprop, виступи SGD залежать від параметра).

Z

ОНОВЛЕННЯ : (Випадкова думка) Мабуть, використання процесу Діріхле дозволить включити деякі попередні по кількості міток?

ОНОВЛЕННЯ : Експериментом модифікована дивергенція KL все ще схильна давати багатокласний вихід, а не багатозначний вихід.


(Стара відповідь)

Мій досвід сигмоїдної перехресної ентропії був не дуже приємним. На даний момент я використовую модифіковану KL-дивергенцію. Він приймає форму

Loss(P,Q)=∑x|P(x)−Q(x)|⋅|log⁡P(x)Q(x)|=∑x|(P(x)−Q(x))⋅log⁡P(x)Q(x)|
P(x)Q(x)

∑xP(x)=2

Просочення Кераса

def abs_KL_div(y_true, y_pred):
    y_true = K.clip(y_true, K.epsilon(), None)
    y_pred = K.clip(y_pred, K.epsilon(), None)
    return K.sum( K.abs( (y_true- y_pred) * (K.log(y_true / y_pred))), axis=-1)

на моєму конкретному наборі даних adamбуло набагато краще, ніжrmsprop
— шаді

Якщо ви використовуєте таку втрату для тренувань, як це зробити на етапі тестування? Також використовуйте softmax для прогнозування, але як вибрати поріг для визначення класів, що мають багато міток?
— karl_TUM

1

Я ще не користувався керами. Наприклад, приймаючи каву, ви можете використовувати SigmoidCrossEntropyLossLayerдля проблем з різними етикетками.


1
Хочете пояснити, чому це хороший підхід?
— Firebug

0

Насправді в тензорному потоці ви все ще можете використовувати sigmoid_cross_entropy_meanфункцію обчислення втрат у мульти-ярлику, я це дуже підтверджую


Надайте нам посилання на документацію
— Івелін

0

Я тут новачок, але спробую дати йому це питання. Я шукав те саме, що і ви, і, нарешті, знайшов дуже хороший підручник з класифікації для багатокласового керасу @ http://machinelearningmastery.com/multi-class-classification-tutorial-keras-deep-learning-library/ .

Автор цього підручника використовує категоричну перехресну функцію втрати ентропії, і є інший потік, який може допомогти вам знайти рішення @ тут .


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