Comment choisir entropie croisée dans tensorflow?
problèmes de Classification, tels que la régression logistique ou multinomiale régression logistique, optimisation d'une perte d'entropie croisée . Normalement, la couche d'entropie croisée suit la couche softmax , qui produit la distribution de probabilité.
dans tensorflow, il y a au moins une douzaine de différentes fonctions de perte d'entropie croisée :
-
tf.losses.softmax_cross_entropy
-
tf.losses.sparse_softmax_cross_entropy
-
tf.losses.sigmoid_cross_entropy
-
tf.contrib.losses.softmax_cross_entropy
-
tf.contrib.losses.sigmoid_cross_entropy
-
tf.nn.softmax_cross_entropy_with_logits
-
tf.nn.sigmoid_cross_entropy_with_logits
- ...
qui ne fonctionnent que pour la classification binaire et qui conviennent aux problèmes multi-classes?
Quand devez-vous utiliser sigmoid
au lieu de softmax
?
Comment sont sparse
fonctions différentes des autres et pourquoi est-il seulement softmax
?
(plus orienté mathématiques) discussion: cross-entropie de la jungle .
2 réponses
Préliminaire des faits
-
au sens fonctionnel, le sigmoïde est un cas partiel de la fonction softmax , lorsque le nombre de classes est égal à 2. Les deux font la même opération: transformer les logits (voir ci-dessous) en probabilités.
dans la classification binaire simple, il n'y a pas de grande différence entre les deux, cependant en cas de classification multinomiale, sigmoid permet de traiter avec étiquettes non exclusives(A. K. A. multi-labels ), alors que softmax offre avec des classes exclusives (voir ci-dessous).
-
a logit (également appelé un score) est une valeur brute non calculée de associée à une classe , avant le calcul de la probabilité. En termes d'architecture de réseau neuronal, cela signifie qu'une logit est une sortie d'une couche dense (entièrement connectée).
L'appellation Tensorflow est un peu étrange: toutes les fonctions ci-dessous acceptent les logits, pas les probabilités , et appliquent la transformation eux-mêmes (qui est tout simplement plus efficace).
famille des fonctions sigmoïdes
-
tf.nn.sigmoid_cross_entropy_with_logits
-
tf.nn.weighted_cross_entropy_with_logits
-
tf.losses.sigmoid_cross_entropy
-
tf.contrib.losses.sigmoid_cross_entropy
(
comme indiqué plus haut, sigmoid
la fonction de perte est pour la classification binaire.
Mais tensorflow fonctions sont plus générales et permettent de
classification à étiquettes multiples, lorsque les classes sont indépendantes.
En d'autres termes, tf.nn.sigmoid_cross_entropy_with_logits
résout N
classifications binaires à la fois.
les étiquettes doivent être codées une seule fois ou peuvent contenir souple classe probabilités.
tf.losses.sigmoid_cross_entropy
permet en outre de définir le poids en lot ,
c'est à dire faire quelques exemples plus importants que d'autres.
tf.nn.weighted_cross_entropy_with_logits
permet de régler class weights
(rappelez-vous, la classification est binaire), c.-à-d. faire des erreurs positives plus grandes que
erreurs négatifs. Cela est utile lorsque les données de formation sont déséquilibrées.
Softmax fonctions famille
-
tf.nn.softmax_cross_entropy_with_logits
(DÉPRÉCIÉE EN 1.5) -
tf.nn.softmax_cross_entropy_with_logits_v2
-
tf.losses.softmax_cross_entropy
-
tf.contrib.losses.softmax_cross_entropy
(
ces fonctions de perte doivent être utilisées pour la classification multinomiale mutuellement exclusive.,
c'est-à-dire choisir une des classes N
. Également applicable lorsque N = 2
.
les étiquettes doivent être codées une fois ou peuvent contenir des probabilités de classe douce.: un exemple particulier peut appartenir à la classe A avec une probabilité de 50% et la Classe B avec une probabilité de 50%. Notez qu'à strictement parler, cela ne signifie pas que il appartient aux deux classes, mais on peut interpréter les probabilités de cette façon.
comme dans sigmoid
famille", 1519110920" permet
pour régler le dans les poids de lot , c'est à dire faire quelques exemples plus importants que d'autres.
Pour autant que je sache, à partir de tensorflow 1.3, il n'y a pas de manière intégrée pour mettre poids de la classe .
[UPD] Dans tensorflow 1.5, v2
version a été introduit et l'original softmax_cross_entropy_with_logits
perte ai obsolète. La seule différence entre eux est que dans une version plus récente, backpropagation se produit dans les logits et les étiquettes ( voici une discussion pourquoi cela peut être utile).
Sparse fonctions de la famille
-
tf.nn.sparse_softmax_cross_entropy_with_logits
-
tf.losses.sparse_softmax_cross_entropy
-
tf.contrib.losses.sparse_softmax_cross_entropy
(
comme l'ordinaire softmax
ci-dessus, ces fonctions de perte doivent être utilisées pour
classification multinomiale mutuellement exclusive, c'est-à-dire choisir une classe parmi N
.
La différence est dans l'encodage des étiquettes: les classes sont spécifiées comme des entiers (class index),
pas un chaud vecteurs. Évidemment, cela ne permet pas les classes douces, mais il
peut sauver de la mémoire quand il y a des milliers ou des millions de classes.
Cependant, notez que l'argument logits
doit toujours contenir des logits par classe,
ainsi, il consomme au moins [batch_size, classes]
mémoire.
Like ci-dessus, tf.losses
version a un argument weights
qui permet
pour régler les poids du lot.
Échantillonné softmax fonctions de la famille
ces fonctions constituent une autre solution pour traiter les grand nombre de classes. Au lieu de calculer et de comparer une distribution de probabilité exacte, ils calculent estimation des pertes à partir d'un échantillon aléatoire.
les arguments weights
et biases
précisent une couche séparée entièrement connectée qui
est utilisé pour calculer les logits pour un échantillon.
comme ci-dessus, labels
ne sont pas codés une seule fois, mais ont la forme [batch_size, num_true]
.
les fonctions échantillonnées ne sont adapté pour la formation. En temps de test, il est recommandé de
utilisez une perte standard softmax
pour obtenir une distribution réelle.
une autre perte alternative est tf.nn.nce_loss
, qui effectue l'estimation antibruit (si vous êtes intéressé, voir cette discussion très détaillée ). J'ai inclus cette fonction à la famille softmax, parce que NCE garantit l'approximation de softmax dans la limite.
cependant pour la version 1.5, softmax_cross_entropy_with_logits_v2
doit être utilisé à la place, tout en utilisant son argument avec le argument key=...
comme suit>
softmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y,\
logits = my_prediction, dim=-1, name=None)