Я думаю, что человек, который задает вопрос, может быть смущен в нескольких местах. Спасибо за Ваш ответ. Это также очищает мои сомнения по поводу

опытке получить перекрестную энтропию с помощью функции активации сигмоидальной

loss1 = -tf.reduce_sum(p*tf.log(q), 1)loss2 = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(labels=p, logits=logit_q),1)

Но они такие же, когда с функцией активации softmax.

Ниже приведен пример кода:

import tensorflow as tf

sess2 = tf.InteractiveSession()
p = tf.placeholder(tf.float32, shape=[None, 5])
logit_q = tf.placeholder(tf.float32, shape=[None, 5])
q = tf.nn.sigmoid(logit_q)
sess.run(tf.global_variables_initializer())

feed_dict = {p: [[0, 0, 0, 1, 0], [1,0,0,0,0]], logit_q: [[0.2, 0.2, 0.2, 0.2, 0.2], [0.3, 0.3, 0.2, 0.1, 0.1]]}
loss1 = -tf.reduce_sum(p*tf.log(q),1).eval(feed_dict)
loss2 = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(labels=p, logits=logit_q),1).eval(feed_dict)

print(p.eval(feed_dict), "\n", q.eval(feed_dict))
print("\n",loss1, "\n", loss2)

Ответы на вопрос(1)

двоичный а такжемульти-класс проблемы.

Мультиклассовая кросс-энтропия

Формула, которую вы используете, является правильной и соответствуетtf.nn.softmax_cross_entropy_with_logits:

-tf.reduce_sum(p * tf.log(q), axis=1)

p а такжеq как ожидается, будут вероятностные распределения по N классам. В частности, N может быть 2, как в следующем примере:

p = tf.placeholder(tf.float32, shape=[None, 2])
logit_q = tf.placeholder(tf.float32, shape=[None, 2])
q = tf.nn.softmax(logit_q)

feed_dict = {
  p: [[0, 1],
      [1, 0],
      [1, 0]],
  logit_q: [[0.2, 0.8],
            [0.7, 0.3],
            [0.5, 0.5]]
}

prob1 = -tf.reduce_sum(p * tf.log(q), axis=1)
prob2 = tf.nn.softmax_cross_entropy_with_logits(labels=p, logits=logit_q)
print(prob1.eval(feed_dict))  # [ 0.43748799  0.51301527  0.69314718]
print(prob2.eval(feed_dict))  # [ 0.43748799  0.51301527  0.69314718]

Обратите внимание, чтоq вычислительныйtf.nn.softmaxвыводит распределение вероятностей. Так что это все-таки мультиклассовая формула кросс-энтропии, только для N = 2.

Двоичная кросс-энтропия

На этот раз правильная формула

p * -tf.log(q) + (1 - p) * -tf.log(1 - q)

Хотя математически это частный случай мультикласса,смысл изp а такжеq это отличается. В простейшем случае каждыйp а такжеq это число, соответствующее вероятности класса А.

Важный: Не смущайтесь общимp * -tf.log(q) часть и сумма. предыдущийp был горячий вектор, теперь это число, ноль или единица. То же самое дляq - это было распределение вероятностей, теперь это число (вероятность).

Еслиp является вектором, каждый отдельный компонент считаетсянезависимая бинарная классификация, Видетьэтот ответ это обрисовывает в общих чертах различие между функциями softmax и сигмоида в тензорном потоке. Итак, определениеp = [0, 0, 0, 1, 0] не означает «горячий» вектор, но 5 различных функций, 4 из которых выключены, а 1 - включена. Определениеq = [0.2, 0.2, 0.2, 0.2, 0.2] означает, что каждая из 5 функций включена с вероятностью 20%.

Это объясняет использованиеsigmoid функционировать до перекрестной энтропии: его цель - раздавить логит[0, 1] интервал.

Приведенная выше формула все еще справедлива для нескольких независимых функций, и это именно то, чтоtf.nn.sigmoid_cross_entropy_with_logits вычисляет:

p = tf.placeholder(tf.float32, shape=[None, 5])
logit_q = tf.placeholder(tf.float32, shape=[None, 5])
q = tf.nn.sigmoid(logit_q)

feed_dict = {
  p: [[0, 0, 0, 1, 0],
      [1, 0, 0, 0, 0]],
  logit_q: [[0.2, 0.2, 0.2, 0.2, 0.2],
            [0.3, 0.3, 0.2, 0.1, 0.1]]
}

prob1 = -p * tf.log(q)
prob2 = p * -tf.log(q) + (1 - p) * -tf.log(1 - q)
prob3 = p * -tf.log(tf.sigmoid(logit_q)) + (1-p) * -tf.log(1-tf.sigmoid(logit_q))
prob4 = tf.nn.sigmoid_cross_entropy_with_logits(labels=p, logits=logit_q)
print(prob1.eval(feed_dict))
print(prob2.eval(feed_dict))
print(prob3.eval(feed_dict))
print(prob4.eval(feed_dict))

Вы должны увидеть, что последние три тензора равны, аprob1 является только частью кросс-энтропии, поэтому она содержит правильное значение только тогда, когдаp является1:

[[ 0.          0.          0.          0.59813893  0.        ]
 [ 0.55435514  0.          0.          0.          0.        ]]
[[ 0.79813886  0.79813886  0.79813886  0.59813887  0.79813886]
 [ 0.5543552   0.85435522  0.79813886  0.74439669  0.74439669]]
[[ 0.7981388   0.7981388   0.7981388   0.59813893  0.7981388 ]
 [ 0.55435514  0.85435534  0.7981388   0.74439663  0.74439663]]
[[ 0.7981388   0.7981388   0.7981388   0.59813893  0.7981388 ]
 [ 0.55435514  0.85435534  0.7981388   0.74439663  0.74439663]]

Теперь должно быть ясно, что взятие суммы-p * tf.log(q) вдольaxis=1 не имеет смысла в этой настройке, хотя это будет правильная формула в случае нескольких классов.

 Maxim20 февр. 2018 г., 00:07
Логит - логарифмическая вероятность, никогда не утверждается, что это похоже на вероятность.
 LKS20 февр. 2018 г., 16:16
Я думаю, что человек, который задает вопрос, может быть смущен в нескольких местах. Спасибо за Ваш ответ. Это также очищает мои сомнения по поводуtf.nn.sigmoid_cross_entropy_with_logits.
 LKS20 февр. 2018 г., 00:02
logit_q может быть любым от -infinity до + infinity. Думаю, то, как вы делаете логит похожим на вероятность, немного ошибочно?
 LKS20 февр. 2018 г., 16:03
Я не пытаюсь сказать, что есть ошибка. Конечно, вы никогда не утверждаете, что это вероятность. Logit может быть любым числом, но только выбор их значения [0.2,0.8] делает его обманчивым. Кстати, я думаю, что logit обычно интерпретируется как log-odds где odds =p/(1-p) гдеp интерпретируется как вероятность?
 Maxim20 февр. 2018 г., 16:11
Я понимаю, что вы имеете ввиду. Этот выбор просто соответствуетlogit_q из вопроса. Но ты прав, это может быть что угодно. И вы также правы, называя это «log-odds», было бы более точным, но люди также говорят, что «log-вероятность» означает то же самое

Ваш ответ на вопрос