Tensorflow sigmoïde et de la croix de l'entropie vs sigmoid_cross_entropy_with_logits
Lorsque vous essayez d'obtenir la croix de l'entropie avec la fonction d'activation sigmoïde, il existe une différence entre
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)
Mais ils sont quand même avec softmax fonction d'activation.
Voici un exemple de code:
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)
Vous devez vous connecter pour publier un commentaire.
Vous êtes à la confusion de l'entropie croisée pour binaire et multi-classe problèmes.
Multi-classe d'entropie croisée
La formule que vous utilisez est correct et il correspond directement à
tf.nn.softmax_cross_entropy_with_logits
:p
etq
sont censés être des distributions de probabilité sur N classes. En particulier, N 2, comme dans l'exemple suivant:Noter que
q
est le calcul destf.nn.softmax
, c'est à dire des sorties d'une distribution de probabilité. Il est donc encore multi-classe d'entropie croisée de la formule, uniquement pour N = 2.Binaire d'entropie croisée
Cette fois, la formule correcte est
Bien que mathématiquement c'est une partielle cas de la multi-cas de la classe, le sens de
p
etq
est différent. Dans le cas le plus simple, chaquep
etq
est un nombre, correspondant à une probabilité de la classe A.Important: Ne soyez pas confus par la commune
p * -tf.log(q)
partie et de la somme. Précédentp
était un "one-hot" vecteur, maintenant, il est un certain nombre, zéro ou un. De même pourq
- il était une distribution de probabilité, maintenant, c'est un nombre (de probabilité).Si
p
est un vecteur, chaque composant est considéré comme une indépendant de classification binaire. Voir cette réponse qui indique la différence entre softmax et sigmoïde fonctions dans tensorflow. Ainsi, la définitionp = [0, 0, 0, 1, 0]
ne signifie pas un "one-hot" vecteur, mais 5 différentes fonctions, 4 sont à l'extérieur et 1 est en marche. La définitionq = [0.2, 0.2, 0.2, 0.2, 0.2]
signifie que chacun des 5 caractéristiques est sur avec 20% de probabilité.C'est ce qui explique l'utilisation de
sigmoid
fonction avant de l'entropie croisée: son but est d'écraser le logit de[0, 1]
intervalle.La formule ci-dessus tient toujours pour de multiples fonctionnalités indépendantes, et c'est exactement ce que
tf.nn.sigmoid_cross_entropy_with_logits
calcule:Vous devriez voir que les trois dernières tenseurs sont égaux, alors que le
prob1
n'est qu'une partie de l'entropie croisée, de sorte qu'il contient correcte de la valeur seulement quandp
est1
:Maintenant, il devrait être clair que la prise d'une somme de
-p * tf.log(q)
le long deaxis=1
n'a pas de sens dans ce cadre, bien que ce ne serait pas valide formule multi-cas de la classe.p/(1-p)
oùp
est interprété comme une probabilité?logit_q
de la question. Mais vous avez raison, il peut être n'importe quoi. Et vous avez également le droit, en l'appelant "log-odds" serait plus précis, mais les gens disent aussi "log-probabilité", qui signifie la même chosetf.nn.sigmoid_cross_entropy_with_logits
.