J'entraîne un réseau de neurones pour classer un ensemble d'objets dans n-classes. Chaque objet peut appartenir à plusieurs classes à la fois (multi-classes, multi-étiquettes).
J'ai lu que pour les problèmes multi-classes, il est généralement recommandé d'utiliser une entropie croisée catégorique et softmax comme fonction de perte au lieu de mse et je comprends plus ou moins pourquoi.
Pour mon problème de multi-label, il n’aurait pas de sens d’utiliser softmax bien sûr, chaque probabilité de classe devant être indépendante de l’autre. Ma dernière couche est donc constituée uniquement d’appareils sigmoïdes qui réduisent leurs entrées dans une plage de probabilités de 0..1 pour chaque classe.
Maintenant, je ne suis pas sûr de la fonction de perte que je devrais utiliser pour cela. En regardant la définition de crossentropie catégorique, je pense que cela ne s'appliquerait pas bien à ce problème car il ne tiendra compte que de la sortie des neurones qui devrait être 1 et ignore les autres.
L'entropie croisée binaire semble être mieux adaptée, mais je ne la vois jamais mentionnée que pour les problèmes de classification binaire avec un seul neurone en sortie.
J'utilise python et keras pour m'entraîner au cas par cas.
Réponses:
Si vous utilisez keras, mettez simplement sigmoids sur votre couche de sortie et binary_crossentropy sur votre fonction de coût.
Si vous utilisez tensorflow, vous pouvez utiliser sigmoid_cross_entropy_with_logits . Mais dans mon cas, cette fonction de perte directe ne convergeait pas. Donc, j'ai fini par utiliser une perte d'entropie croisée sigmoïde explicite . Vous pouvez créer le vôtre comme dans cet exemple(y⋅ln(sigmoid(logits))+(1−y)⋅ln(1−sigmoid(logits)))
Sigmoid, contrairement à softmax, ne donne pas en sortie la distribution de probabilité autour de , mais des probabilités indépendantes.nclasses
Si, en moyenne, moins de libellés sont attribués à une ligne, vous pouvez utiliser softmax_cross_entropy_with_logits car, avec cette perte, alors que les classes s'excluent mutuellement, leurs probabilités ne doivent pas nécessairement l'ê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.
la source
UPDATE (18/04/18): L'ancienne réponse s'avérait toujours utile sur mon modèle. L'astuce consiste à modéliser la fonction de partition et la distribution séparément, en exploitant ainsi la puissance de softmax.
Considérez que votre vecteur d’observation contient étiquettes. (1 si l'échantillon i contient l'étiquette m, 0 sinon). L’objectif serait donc de modéliser la matrice de manière individuelle. Par conséquent, le modèle évalue . Pensez à développer pour obtenir deux propriétés:y m yim=δim F(yi,xi)=−logP(yi|xi) yim=Z⋅P(ym)
Ensuite, il s’agit de modéliser les deux séparément. La fonction de distribution est mieux modélisée avec une couche softmax , et la fonction de partition peut être modélisée avec une unité linéaire (en pratique, je l'ai écrêtée sur . Une modélisation plus sophistiquée telle qu'une unité de Poisson fonctionnerait probablement mieux). Ensuite, vous pouvez choisir d'appliquer la perte distribuée (KL sur la distribution et MSE sur la partition), ou vous pouvez essayer la perte suivante sur leur produit.max(0.01,output)
En pratique, le choix de l'optimiseur fait également une énorme différence. Mon expérience avec l'approche par factorisation est que cela fonctionne mieux sous Adadelta (Adagrad ne fonctionne pas pour moi, je n'ai pas encore essayé RMSprop, les performances de SGD sont soumises à des paramètres).
Commentaire latéral sur sigmoïde : J'ai certainement essayé sigmoïde + croix croisée et cela n'a pas fonctionné. Le modèle inclinait à prédire le uniquement et n'a pas réussi à saisir la variation de la fonction de distribution. (alias, c'est en quelque sorte assez utile pour modéliser la partition et il peut y avoir une raison mathématique derrière cela)Z
UPDATE : (Pensée aléatoire) Il semble que l’utilisation du processus de Dirichlet permettrait l’intégration de certains éléments antérieurs sur le nombre d’étiquettes?
UPDATE : Par expérience, la divergence KL modifiée est toujours encline à donner une sortie multi-classe plutôt qu'une sortie multi-étiquette.
(Ancienne réponse)
Mon expérience avec l'entropie croisée sigmoïde n'était pas très agréable. Pour le moment, j'utilise une divergence KL modifiée. Il prend la forme
Ils sont appelés pseudo-distributions pour ne pas être normalisés. Vous pouvez donc avoir si vous avez 2 étiquettes pour un échantillon particulier.∑xP(x)=2
Keras impelmentation
la source
adam
était beaucoup mieux quermsprop
Je n'ai pas encore utilisé de keras. Prenant caffe par exemple, vous pouvez utiliser
SigmoidCrossEntropyLossLayer
pour des problèmes multi-étiquettes.la source
En fait, dans tensorsflow, vous pouvez toujours utiliser la
sigmoid_cross_entropy_mean
fonction de calcul de perte en multi-étiquettes, je le confirmela source
Je suis un débutant ici mais je vais essayer de tenter le coup avec cette question. Je cherchais la même chose que vous et, finalement, j'ai trouvé un très bon tutoriel de classification multi-classes de keras @ http://machinelearningmastery.com/multi-class-classification-tutorial-keras-deep-learning-library/ .
L’auteur de ce tutoriel utilise une fonction de perte d’entropie croisée catégorique, et il existe un autre fil qui peut vous aider à trouver la solution @ ici .
la source