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


64

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

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

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

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

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

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


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

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

Відповіді:


30

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

(yln(sigmoid(logits))+(1y)ln(1sigmoid(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)=logP(yi|xi)yim=ZP(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)||logP(x)Q(x)|=x|(P(x)Q(x))logP(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.