Что логитов, 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)


каковы различия между ними? Документы мне не понятны. Я знаю, что tf.nn.softmax делает. Но не другой. Пример будет очень полезен.

983   5  

5 ответов:

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

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

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)

перекрестная энтропия является суммарной метрикой-it суммы по элементам. Выход 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]))

is по существу эквивалентно полной кросс-энтропийной потере, вычисленной с помощью функции 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".

верны ли эти классификации? Нам нужно измерить против истинных меток из тренировочного набора. Вам понадобится один-горячий кодированный y_true массив, где снова строки являются учебными экземплярами, а столбцы-классами. Ниже я создал пример y_true один горячий массив, где истинная метка для обучающего экземпляра 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() over tf.nn.softmax(); tf.nn.cross_entropy()

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

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

такая нормализация используется для задач многоклассовой классификации. А для задач многоуровневой классификации используется нормализация сигмоиды т. е. tf.НН.sigmoid_cross_entropy_with_logits

Comments

    Ничего не найдено.