web-dev-qa-db-fra.com

Comment choisir la perte d'entropie croisée dans le tensorflow?

Des problèmes de classification, tels que la régression logistique ou la régression logistique multinomiale, optimisent une perte entropie croisée . Normalement, la couche d'entropie croisée suit la couche softmax , qui produit une distribution de probabilité.

Dans tensorflow, il existe au moins une douzaine de fonctions de perte d’entropie croisée différentes :

  • 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
  • ...

Quels travaux ne concernent que la classification binaire et lesquels conviennent aux problèmes multi-classes? Quand devriez-vous utiliser sigmoid au lieu de softmax? En quoi les fonctions sparse sont-elles différentes des autres et pourquoi s’agit-il uniquement de softmax?

Discussion connexe (plus orientée vers les mathématiques): jungle à entropie croisée .

74
Maxim

Faits préliminaires

  • Au sens fonctionnel, le sigmoïde est un cas partiel de la fonction softmax , lorsque le nombre de classes est égal à 2. Les deux effectuent 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. Toutefois, dans le cas d'une classification multinomiale, sigmoid permet de traiter les étiquettes non exclusives (alias multi-étiquettes ), tandis que softmax traite des classes exclusives (voir ci-dessous).

  • Un logit (également appelé score) est une valeur brute non mise à l'échelle associée à une classe , avant de calculer la probabilité. En termes d’architecture de réseau neuronal, cela signifie qu’un logit est la sortie d’une couche dense (entièrement connectée).

    La dénomination Tensorflow est un peu étrange: toutes les fonctions ci-dessous acceptent les logits, pas les probabilités , et appliquent la transformation elles-mêmes (ce qui est tout simplement plus efficace).

Famille des fonctions sigmoïdes

Comme indiqué précédemment, la fonction sigmoid loss correspond à la classification binaire. Mais les fonctions tensorflow sont plus générales et permettent de faire une classification multi-étiquettes, 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 étape ou peuvent contenir des probabilités de classe variables.

tf.losses.sigmoid_cross_entropy permet en outre de définir poids en batch , c’est-à-dire que certains exemples sont plus importants que d’autres. tf.nn.weighted_cross_entropy_with_logits permet de définir poids de classe (rappelez-vous, la classification est binaire), c'est-à-dire que les erreurs positives dépassent les erreurs négatives. Ceci est utile lorsque les données d'apprentissage sont déséquilibrées.

Famille de fonctions Softmax

Ces fonctions de perte doivent être utilisées pour une classification multinomiale mutuellement exclusive, c'est-à-dire une classe parmi les classes N. Également applicable lorsque N = 2.

Les étiquettes doivent être codées à chaud ou peuvent contenir des probabilités de classe variables: un exemple particulier peut appartenir à la classe A avec 50% de probabilité et la classe B à 50%. Notez que, à proprement parler, cela ne signifie pas qu'il appartient aux deux classes, mais on peut interpréter les probabilités de cette façon.

Tout comme dans la famille sigmoid, tf.losses.softmax_cross_entropy permet de définir le poids in-batch , c’est-à-dire que certains exemples sont plus importants que d’autres. Pour autant que je sache, à partir de tensorflow 1.3, il n’existe aucun moyen intégré de définir poids de classe .

[UPD] Dans tensorflow 1.5, la version v2a été introduite et la perte de softmax_cross_entropy_with_logits d'origine est devenue obsolète. La seule différence entre eux est que dans une version plus récente, la rétropropagation se produit à la fois dans les logits et les labels ( , voici une discussion sur la raison pour laquelle cela peut être utile).

Famille de fonctions clairsemées

Comme softmax ordinaire ci-dessus, ces fonctions de perte doivent être utilisées pour une classification mutuellement exclusive multinomiale, c'est-à-dire une classe parmi les N classes. La différence réside dans le codage des étiquettes: les classes sont spécifiées sous forme d'entiers (index de classe) et non de vecteurs one-hot. Évidemment, cela n'autorise pas les classes logicielles, mais cela peut économiser de la mémoire lorsqu'il existe des milliers ou des millions de classes. Cependant, notez que l'argument logits doit toujours contenir des logits pour chaque classe. Par conséquent, il utilise au moins [batch_size, classes] mémoire.

Comme ci-dessus, la version tf.losses a un argument weights qui permet de définir les poids dans le lot.

Famille de fonctions softmax échantillonnées

Ces fonctions offrent une autre alternative pour gérer un grand nombre de classes. Au lieu de calculer et de comparer une distribution de probabilité exacte, ils calculent une estimation de la perte à partir d'un échantillon aléatoire.

Les arguments weights et biases spécifient une couche distincte entièrement connectée, utilisée pour calculer les logits pour un échantillon choisi.

Comme ci-dessus, labels ne sont pas encodés à chaud, mais ont la forme [batch_size, num_true].

Les fonctions échantillonnées ne conviennent que pour la formation. En période d’essai, il est recommandé d’utiliser une perte standard softmax (peu abondante ou ponctuelle) pour obtenir une distribution réelle.

Une autre perte est tf.nn.nce_loss, qui exécute estimation avec contraste de bruit (si cela vous intéresse, voyez cette discussion très détaillée ). J'ai inclus cette fonction dans la famille softmax, car NCE garantit une approximation de softmax dans la limite.

119
Maxim

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)
5
Hamidreza