Як вибрати перехресну ентропію в TensorFlow?


83

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

У тенсорному потоці існує принаймні десяток різних функцій перехресної ентропії :

  • tf.losses.softmax_cross_entropy
  • tf.losses.sparse_softmax_cross_entropy
  • tf.losses.sigmoid_cross_entropy
  • tf.contrib.losses.softmax_cross_entropy
  • tf.contrib.losses.sigmoid_cross_entropy
  • tf.nn.softmax_cross_entropy_with_logits
  • tf.nn.sigmoid_cross_entropy_with_logits
  • ...

Який з них працює лише для двійкової класифікації, а який підходить для багатокласних задач? Коли слід використовувати sigmoidзамість softmax? Чим sparseфункції відрізняються від інших і чому це лише softmax?

Пов'язане (більш математично орієнтоване) обговорення: Які відмінності між усіма цими перехресними ентропійними втратами в Keras та TensorFlow? .


1
Також ми маємо tf.losses.log_loss, насправді це лише для бінарної кроссентропії. Також github.com/tensorflow/tensorflow/issues/2462
mrgloom

Відповіді:


138

Попередні факти

  • У функціональному сенсі сигмоїд є частковим випадком функції softmax , коли кількість класів дорівнює 2. Обидва вони виконують однакову операцію: перетворюють логіти (див. Нижче) на ймовірності.

    У простій двійковій класифікації між ними немає великої різниці, однак у випадку з багатокомпонентною класифікацією sigmoid дозволяє мати справу з невиключними мітками (вони ж багатозначні ), тоді як softmax має справу з ексклюзивними класами (див. Нижче).

  • Логіт (також називається оцінкою) є сире немасштабірованное значення , пов'язане з класом , перед обчисленням ймовірності. З точки зору архітектури нейронної мережі, це означає, що logit - це вихід щільного (повністю пов'язаного) шару.

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

Сімейство сігмоподібних функцій

Як зазначалося раніше, sigmoidфункція втрат призначена для двійкової класифікації. Але функції тензорного потоку є більш загальними і дозволяють робити класифікацію з декількома мітками, коли класи незалежні. Іншими словами, одночасно tf.nn.sigmoid_cross_entropy_with_logitsвирішує Nдвійкові класифікації.

Етикетки повинні бути кодовані одноразово або можуть містити імовірні класи.

tf.losses.sigmoid_cross_entropyкрім того, дозволяє встановлювати ваги партії , тобто робити деякі приклади важливішими за інші. tf.nn.weighted_cross_entropy_with_logitsдозволяє встановлювати ваги класів (пам’ятайте, класифікація є двійковою), тобто робити позитивні помилки більші за негативні. Це корисно, коли дані навчання не збалансовані.

Сімейство функцій Softmax

Ці функції втрат слід використовувати для багаточленової взаємовиключної класифікації, тобто вибрати одну із Nкласів. Також застосовується, коли N = 2.

Етикетки повинні бути кодовані одноразово або можуть містити імовірності класу м'якого рівня: конкретний приклад може належати до класу A із 50% ймовірністю та класу B із 50% ймовірністю. Зауважте, що, строго кажучи, це не означає, що він належить до обох класів, але можна трактувати ймовірності таким чином.

Так само, як і в sigmoidсім'ї, tf.losses.softmax_cross_entropyдозволяє встановлювати ваги партії , тобто робити деякі приклади важливішими за інші. Наскільки мені відомо, станом на tensorflow 1.3 немає вбудованого способу встановлення ваги класу .

[UPD] У Tensorflow 1.5 була введенаv2 версія, а початкові втрати застаріли. Єдина різниця між ними полягає в тому, що в новішій версії зворотне розповсюдження відбувається як у логіни, так і в мітки ( ось обговорення, чому це може бути корисним).softmax_cross_entropy_with_logits

Сімейство з розрідженими функціями

Як і звичайні softmaxвище, ці функції втрат слід використовувати для багаточленової взаємовиключної класифікації, тобто вибрати одну із Nкласів. Різниця полягає в кодуванні міток: класи вказуються як цілі числа (індекс класу), а не одноразові вектори. Очевидно, що це не дозволяє м'які класи, але це може заощадити трохи пам'яті, коли є тисячі або мільйони класів. Однак зверніть увагу, що logitsаргумент все одно повинен містити логіти для кожного класу, отже, він споживає принаймні [batch_size, classes]пам'ять.

Як і вище, tf.lossesверсія має weightsаргумент, який дозволяє встановлювати ваги пакету.

Вибірка сімейства функцій softmax

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

Аргументи weightsі biasesвкажіть окремий повністю зв’язаний шар, який використовується для обчислення логітів для обраного зразка.

Як і вище, labelsвони не кодуються одноразово, але мають форму [batch_size, num_true].

Вибіркові функції підходять лише для тренувань. Під час тестування рекомендується використовувати стандартні softmaxвтрати (рідкісні або одноразові), щоб отримати фактичний розподіл.

Інша альтернативою є втратою tf.nn.nce_loss, яка виконує шум контрастною оцінки (якщо ви зацікавлені, побачити це дуже докладне обговорення ). Я включив цю функцію до сімейства softmax, оскільки NCE гарантує наближення до softmax в межах.


Чи можу я попросити пояснити щодо сигмовидної поперечної ентропії (sigCE)? Якщо він Nодночасно вирішує завдання двійкової класифікації, це N = prod(output.shape), наприклад shape = [batch, examples, channels]; N = (batch * examples * channels)? Якщо tf.lossesочікується "логіт" (вихід мережі), чи слід мені також повертати ймовірності для зручності використання? Ви могли б , можливо , поглянути на stackoverflow.com/questions/53612973 / ...
SumNeuron

5

Однак для версії 1.5 softmax_cross_entropy_with_logits_v2слід використовувати замість цього, використовуючи, наприклад, його аргумент із argument key=...символом

softmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y,
                                    logits=my_prediction, dim=-1, name=None)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.