Что логитов, 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
? Мы можем использовать кросс-энтропия потерь для измерения ошибок.
мы можем вычислить потерю кросс-энтропии по строке и посмотреть результаты. Ниже мы видим, что обучающий экземпляр 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