Что логитов, softmax и softmax крест энтропии с логитов?

Я проходил через TensorFlow API docs здесь. В документации tensorflow они использовали ключевое слово logits. Что это? Во многих методах в документах API это написано как

tf.nn.softmax(logits, name=None)

если то, что написано-это те logits только Tensors, Почему сохраняя другое имя, как logits?

другое дело, что есть два метода, которые я не мог различить. Они были

tf.nn.softmax(logits, name=None)
tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)

каковы различия между ними? Документы мне не ясны. Я знаю что!--6--> делает. Но не другой. Пример будет очень полезен.

5 ответов


Logits просто означает, что функция работает на выводе unscaled более ранних слоев и что относительный масштаб для понимания единиц является линейным. Это означает, в частности, что сумма входных данных не может равняться 1, что значения не вероятности (у вас может быть вход 5).

tf.nn.softmax производит только результат применения функция softmax к входному тензору. Softmax "сжимает" входы так, что сумма (вход) = 1; это способ нормализации. Форма вывода softmax такая же, как и вход - она просто нормализует значения. Выходы softmax can интерпретироваться как вероятности.

a = tf.constant(np.array([[.1, .3, .5, .9]]))
print s.run(tf.nn.softmax(a))
[[ 0.16838508  0.205666    0.25120102  0.37474789]]

в противоположность tf.nn.softmax_cross_entropy_with_logits вычисляет перекрестную энтропию результата после применения функции softmax (но делает это все вместе более математически осторожным способом). Это похоже на результат:

sm = tf.nn.softmax(x)
ce = cross_entropy(sm)

энтропия крест-сводная метрика - это суммы по элементам. Выход tf.nn.softmax_cross_entropy_with_logits по форме [2,5] тензор имеет форму [2,1] (первый размер рассматривается как пакет).

если вы хотите сделать оптимизацию, чтобы минимизировать перекрестную энтропию, и вы softmaxing после вашего последнего слоя, вы должны использовать tf.nn.softmax_cross_entropy_with_logits вместо того, чтобы делать это самостоятельно, потому что он охватывает численно неустойчивые угловые случаи математически правильно. В противном случае вы в конечном итоге взломаете его, добавив сюда маленькие эпсилоны и там.

(отредактировано 2016-02-07: если у вас есть метки одного класса, где объект может принадлежать только одному классу, теперь вы можете использовать tf.nn.sparse_softmax_cross_entropy_with_logits так, что вы не должны преобразовать ваши ярлыки к плотному ОДН-горячему массиву. Эта функция была добавлена после релиза 0.6.0.)


короткая версия:

Предположим, у вас есть два тензора, где y_hat содержит вычисленные оценки для каждого класса (например, из y = W*x +b) и y_true содержит один-горячие закодированные истинные метки.

y_hat  = ... # Predicted label, e.g. y = tf.matmul(X, W) + b
y_true = ... # True label, one-hot encoded

если вы интерпретируете баллы в y_hat как ненормализованные лог вероятности, то они логитов.

кроме того, общая потеря кросс-энтропии, вычисленная таким образом:

y_hat_softmax = tf.nn.softmax(y_hat)
total_loss = tf.reduce_mean(-tf.reduce_sum(y_true * tf.log(y_hat_softmax), [1]))

это по существу эквивалентно полной потере кросс-энтропии, вычисленной с помощью функции softmax_cross_entropy_with_logits():

total_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true))

версия:

в выходном слое вашей нейронной сети вы, вероятно, вычислите массив, содержащий оценки классов для каждого из ваших учебных экземпляров, например, из вычисления y_hat = W*x + b. Чтобы служить примером, ниже я создал y_hat как массив 2 x 3, где строки соответствуют учебным экземплярам и столбцам соответствуют классам. Итак, здесь есть 2 учебных экземпляра и 3 класса.

import tensorflow as tf
import numpy as np

sess = tf.Session()

# Create example y_hat.
y_hat = tf.convert_to_tensor(np.array([[0.5, 1.5, 0.1],[2.2, 1.3, 1.7]]))
sess.run(y_hat)
# array([[ 0.5,  1.5,  0.1],
#        [ 2.2,  1.3,  1.7]])

обратите внимание, что значения не нормализованы (т. е. строки не складываются до 1). Чтобы нормализовать их, мы можем применить функцию softmax, которая интерпретирует входные данные как ненормализованные лог-вероятности (aka логитов) и выходы нормализовали линейные вероятности.

y_hat_softmax = tf.nn.softmax(y_hat)
sess.run(y_hat_softmax)
# array([[ 0.227863  ,  0.61939586,  0.15274114],
#        [ 0.49674623,  0.20196195,  0.30129182]])

важно полностью понять, что говорит выход softmax. Ниже я показал таблица, которая более четко представляет результат выше. Можно видеть, что, например, вероятность того, что обучающий экземпляр 1 будет "классом 2", равна 0,619. Вероятности классов для каждого экземпляра обучения нормализованы, поэтому сумма каждой строки равна 1,0.

                      Pr(Class 1)  Pr(Class 2)  Pr(Class 3)
                    ,--------------------------------------
Training instance 1 | 0.227863   | 0.61939586 | 0.15274114
Training instance 2 | 0.49674623 | 0.20196195 | 0.30129182

Итак, теперь у нас есть вероятности классов для каждого учебного экземпляра, где мы можем взять argmax() каждой строки для создания окончательной классификации. Сверху мы можем сгенерировать, что учебный экземпляр 1 принадлежит " классу 2" а учебный экземпляр 2 относится к"классу 1".

правильны ли эти классификации? Нам нужно измерить истинные метки из тренировочного набора. Вам понадобится one-hot encoded y_true array, где снова строки являются учебными экземплярами, а столбцы-классами. Ниже я создал пример y_true one-hot array, где истинная метка для обучающего экземпляра 1 - "класс 2", а истинная метка для обучающего экземпляра 2 - "класс 3".

y_true = tf.convert_to_tensor(np.array([[0.0, 1.0, 0.0],[0.0, 0.0, 1.0]]))
sess.run(y_true)
# array([[ 0.,  1.,  0.],
#        [ 0.,  0.,  1.]])

- это распределение вероятности в y_hat_softmax близко к распределению вероятности в y_true? Мы можем использовать кросс-энтропия потерь для измерения ошибок.

Formula for cross-entropy loss

мы можем вычислить потерю кросс-энтропии по строке и посмотреть результаты. Ниже мы видим, что обучающий экземпляр 1 имеет потерю 0.479, в то время как обучающий экземпляр 2 имеет более высокую потерю 1.200. Этот результат имеет смысл, потому что в нашем примере выше, y_hat_softmax показала, что наибольшая вероятность тренировочного экземпляра 1 была для "класса 2", который соответствует тренировочному экземпляру 1 в y_true; однако прогноз для учебного экземпляра 2 показал наибольшую вероятность для "класса 1", который не соответствует истинному классу"класс 3".

loss_per_instance_1 = -tf.reduce_sum(y_true * tf.log(y_hat_softmax), reduction_indices=[1])
sess.run(loss_per_instance_1)
# array([ 0.4790107 ,  1.19967598])

то, что мы действительно хотим, - это полная потеря по всем учебным экземплярам. Таким образом, мы можем вычислить:

total_loss_1 = tf.reduce_mean(-tf.reduce_sum(y_true * tf.log(y_hat_softmax), reduction_indices=[1]))
sess.run(total_loss_1)
# 0.83934333897877944

используя softmax_cross_entropy_with_logits()

вместо этого мы можем вычислить общая потеря перекрестной энтропии с использованием tf.nn.softmax_cross_entropy_with_logits() функция, как показано ниже.

loss_per_instance_2 = tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true)
sess.run(loss_per_instance_2)
# array([ 0.4790107 ,  1.19967598])

total_loss_2 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true))
sess.run(total_loss_2)
# 0.83934333897877922

отметим, что total_loss_1 и total_loss_2 производят по существу эквивалентные результаты с некоторыми небольшими различиями в самых последних цифрах. Однако вы также можете использовать второй подход: он занимает на одну строку меньше кода и накапливает меньше числовой ошибки, потому что softmax выполняется для вас внутри softmax_cross_entropy_with_logits().


tf.nn.softmax вычисляет прямое распространение через слой softmax. Вы используете его во время оценка модели при вычислении вероятностей, которые выводит модель.

tf.nn.softmax_cross_entropy_with_logits вычисляет стоимость слоя softmax. Он используется только во время обучение.

логиты являются ненормализованные лог-вероятности выведите модель (значения, выведенные до применения к ним нормализации softmax).


выше ответы имеют достаточно описания для заданного вопроса.

Добавляющ к этому, Tensorflow оптимизировало деятельность прикладывать функцию активации после этого высчитывая цену используя свою собственную активацию следовать функциями цены. Поэтому хорошей практикой является использование: tf.nn.softmax_cross_entropy() над tf.nn.softmax(); tf.nn.cross_entropy()

вы можете найти заметную разницу между ними в ресурсоемкой модели.


Logit-это функция, которая отображает вероятности [0, 1] в [-inf, +inf]. Tensorflow "with logit": это означает, что вы применяете функцию softmax к номерам logit для его нормализации. Input_vector / logit не нормализован и может масштабироваться из [-inf, inf].

такая нормализация используется для задач многоклассовой классификации. И проблемы параметр multilabel классификации нормализации сигмовидной используется, т. е. ТФ.НН.sigmoid_cross_entropy_with_logits