Яка різниця між sparse_softmax_cross_entropy_with_logits та softmax_cross_entropy_with_logits?


111

Нещодавно я натрапив на tf.nn.sparse_softmax_cross_entropy_with_logits і не можу зрозуміти, у чому різниця порівняно з tf.nn.softmax_cross_entropy_with_logits .

Єдина відмінність у тому, що навчальні вектори yповинні бути кодировані гарячими при використанні sparse_softmax_cross_entropy_with_logits?

Читаючи API, я не зміг знайти жодної іншої різниці порівняно з softmax_cross_entropy_with_logits. Але навіщо нам тоді потрібна додаткова функція?

Чи не повинно бути softmax_cross_entropy_with_logitsтаких самих результатів, як sparse_softmax_cross_entropy_with_logitsякщо б вони забезпечені однокольоровими кодованими навчальними даними / векторами?


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

1
Дивіться також це питання , в якому обговорюються всі функції крос-ентропії в tensorflow (виявляється, їх багато).
Максим

Відповіді:


175

Наявність двох різних функцій - це зручність , оскільки вони дають однаковий результат.

Різниця проста:

  • Бо sparse_softmax_cross_entropy_with_logitsмітки повинні мати форму [batch_size] та dtype int32 або int64. Кожна мітка є цілим діапазоном [0, num_classes-1].
  • Бо softmax_cross_entropy_with_logitsмітки повинні мати форму [batch_size, num_classes] та тип float32 або float64.

Етикетки, які використовуються, softmax_cross_entropy_with_logits- це одна гаряча версія міток, яка використовується в sparse_softmax_cross_entropy_with_logits.

Ще одна крихітна різниця полягає в тому, що при використанні sparse_softmax_cross_entropy_with_logitsви можете надати -1 як мітку, щоб втратити 0цю мітку.


15
Чи правильно -1? Як зазначено в документації: "Кожен запис міток повинен бути індексом у [0, num_classes). Інші значення піднять виняток, коли ця опція запускається на процесорі, і поверне NaN для відповідних рядків втрати та градієнта в GPU."
користувач1761806

1
[0, num_classes) = [0, num_classes-1]
Karthik C

24

Я просто хотів би додати 2 речі до прийнятої відповіді, які ви також можете знайти в документації TF.

Перший:

tf.nn.softmax_cross_entropy_with_logits

ПРИМІТКА. Хоча класи взаємовиключні, їх ймовірності не повинні бути. Все, що потрібно - це те, що кожен рядок міток є дійсним розподілом ймовірностей. Якщо їх немає, обчислення градієнта буде неправильним.

Друге:

tf.nn.sparse_softmax_cross_entropy_with_logits

ПРИМІТКА. Для цієї операції ймовірність заданої мітки вважається виключною. Тобто, м'які класи заборонені, і вектор міток повинен містити єдиний конкретний індекс для справжнього класу для кожного рядка логітів (кожен запис minibatch).


4
Що нам використовувати, якщо заняття не є взаємовиключними. Я маю на увазі, чи поєднуємо ми кілька категоричних позначок?
Хайро

Я також це читав. Отже, це означає, що ми застосовуємо ймовірність класу на перехресну ентропію, а не сприймаємо її як вектореодин.
Shamane Siriwardhana

@Hayro - Ви маєте на увазі, що не можете зробити одне гаряче кодування? Я думаю, вам доведеться подивитися на іншу модель. Це згадувало щось на кшталт "було б доцільніше побудувати 4 класичних класифікаторів двійкових логістичних регресій". Для початку переконайтеся, що ви можете розділити класи.
Ешлі

21

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

Ви можете перевірити це за допомогою наступної програми:

import tensorflow as tf
from random import randint

dims = 8
pos  = randint(0, dims - 1)

logits = tf.random_uniform([dims], maxval=3, dtype=tf.float32)
labels = tf.one_hot(pos, dims)

res1 = tf.nn.softmax_cross_entropy_with_logits(       logits=logits, labels=labels)
res2 = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=tf.constant(pos))

with tf.Session() as sess:
    a, b = sess.run([res1, res2])
    print a, b
    print a == b

Тут я створюю випадковий logitsвектор довжини dimsі генерую однокольорові кодовані мітки (де елемент вpos - 1, а інші - 0).

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

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