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 .

35
demandé sur Maxim 2017-10-31 14:59:49

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

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

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

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.

70
répondu Maxim 2018-02-07 20:56:36

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)
3
répondu Hamidreza 2018-05-23 21:12:52