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:ymyim=δimF(yi,xi)=−logP(yi|xi)yim=Z⋅P(ym)
- Fonction de distribution:∑mP(ym)=1
- Fonction de partition: estime le nombre d'étiquettesZ
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
Loss(P,Q)=∑x|P(x)−Q(x)|⋅∣∣∣logP(x)Q(x)∣∣∣=∑x∣∣∣(P(x)−Q(x))⋅logP(x)Q(x)∣∣∣
Où est la pseudo-distribution cible et est la pseudo-distribution prédite (mais la fonction est symétrique et n'a donc aucune importance)
P(x)Q(x)
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
def abs_KL_div(y_true, y_pred):
y_true = K.clip(y_true, K.epsilon(), None)
y_pred = K.clip(y_pred, K.epsilon(), None)
return K.sum( K.abs( (y_true- y_pred) * (K.log(y_true / y_pred))), axis=-1)