Попередні факти
У функціональному сенсі сигмоїд є частковим випадком функції 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 в межах.
tf.losses.log_loss
, насправді це лише для бінарної кроссентропії. Також github.com/tensorflow/tensorflow/issues/2462