Après avoir utilisé TensorFlow pendant un bon bout de temps, j'ai lu quelques tutoriels sur Keras et implémenté quelques exemples. J'ai trouvé plusieurs tutoriels pour les autoencodeurs convolutionnels qui utilisent keras.losses.binary_crossentropy
comme fonction de perte.
Je pensais que binary_crossentropy
devrait not être une fonction de perte multi-classe et utiliserait probablement des étiquettes binaires, mais en fait, Keras (backend de TF Python) appelle tf.nn.sigmoid_cross_entropy_with_logits
, qui est en fait destiné aux tâches de classification avec plusieurs classes indépendantes. qui sont pas mutuellement exclusifs.
D'autre part, mes attentes pour categorical_crossentropy
étaient destinées à des classifications multi-classes où les classes cibles ont une dépendance les unes sur les autres, mais ne sont pas nécessairement codées à chaud.
Cependant, la documentation de Keras indique:
(...) lors de l’utilisation de la perte categorical_crossentropy, vos cibles doivent être au format catégorique (par exemple, si vous avez 10 classes, la cible de chaque échantillon doit être un vecteur à 10 dimensions qui correspond àtous les zéros attendus pour une 1 à l'index correspondant à la classe de l'échantillon).
Si je ne me trompe pas, il ne s’agit que du cas particulier des tâches de classification codées en une seule opération, mais la perte sous-entropique croisée sous-jacente fonctionne également avec des distributions de probabilité ("multi-classes", étiquettes dépendantes)?
De plus, Keras utilise tf.nn.softmax_cross_entropy_with_logits
(backend python TF) pour l’implémentation, qui elle-même states :
REMARQUE: Bien que les classes soient mutuellement exclusives,leurs probabilités ne doivent pas nécessairement être. Tout ce qui est requis est que chaque ligne d'étiquettes constitue une distribution de probabilité valide. S'ils ne le sont pas, le calcul du gradient sera incorrect.
S'il vous plaît, corrigez-moi si je me trompe, mais il me semble que la documentation de Keras est - du moins - pas très "détaillée"?!
Alors, quelle est l'idée derrière la désignation par Keras des fonctions de perte? La documentation est-elle correcte? Si l'entropie croisée binaire s'appuie réellement sur des étiquettes binaires, elle devrait pas fonctionner pour les autoencodeurs, non?! De même, la crossentropie catégorique: ne devrait fonctionner que pour les étiquettes encodées à chaud - si la documentation est correcte?!
Vous avez raison de définir les zones dans lesquelles chacune de ces pertes est applicable:
binary_crossentropy
(et tf.nn.sigmoid_cross_entropy_with_logits
sous le capot) correspond à la classification binaire multi-étiquettes (les étiquettes sont indépendantes).categorical_crossentropy
(et tf.nn.softmax_cross_entropy_with_logits
sous le capot) correspond à la classification multi-class (les classes sont exclusives).Voir aussi l'analyse détaillée dans cette question .
Je ne suis pas sûr de ce que vous voulez dire dans les tutoriels, donc je ne peux pas dire si binary_crossentropy
est un bon ou un mauvais choix pour les autoencodeurs.
Quant à la désignation, elle est tout à fait correcte et raisonnable. Ou pensez-vous que les noms sigmoid
et softmax
sonnent mieux?
Donc, la seule confusion qui reste dans votre question est la documentation categorical_crossentropy
. Notez que tout ce qui a été dit est correct: la perte prend en charge la représentation one-hot. Cette fonction effet fonctionne avec toute distribution de probabilité pour les étiquettes (en plus des vecteurs one-hot) en cas d'arrière-plan tensorflow et pourrait être incluse dans la doc, mais cela ne me semble pas essentiel . De plus, il faut vérifier si les classes logicielles sont prises en charge dans d’autres backends, theeano et CNTK. Rappelez-vous que keras essaie d'être minimaliste et cible les cas d'utilisation les plus populaires, pour que je puisse comprendre la logique.
Vous n'êtes pas sûr que cela réponde à votre question, mais pour la perte en softmax, la couche en sortie doit être une distribution de probabilité (c'est-à-dire, la somme égale à 1), mais pas pour la perte en croix binaire. Aussi simple que cela. (Binaire ne signifie pas qu’il n’ya que 2 classes de sortie, cela signifie simplement que chaque sortie est binaire.)