L'entropie croisée est couramment utilisée pour quantifier la différence entre deux distributions de probabilité. Dans le contexte de l'apprentissage automatique, c'est une mesure d'erreur pour les problèmes de classification multiclasse catégoriques. Généralement, la distribution "vraie" (celle que votre algorithme d'apprentissage automatique essaie de reproduire) est exprimée en termes d'une distribution un-hot.
Par exemple, supposons que pour une instance d'entraînement spécifique, l'étiquette vraie est B (parmi les étiquettes A, B et C). La distribution un-hot pour cette instance d'entraînement est donc :
Pr(Classe A) Pr(Classe B) Pr(Classe C)
0,0 1,0 0,0
Vous pouvez interpréter la distribution vraie ci-dessus comme signifiant que l'instance d'entraînement a une probabilité de 0% d'être de la classe A, une probabilité de 100% d'être de la classe B, et une probabilité de 0% d'être de la classe C.
Maintenant, supposons que votre algorithme d'apprentissage automatique prédit la distribution de probabilité suivante :
Pr(Classe A) Pr(Classe B) Pr(Classe C)
0,228 0,619 0,153
À quel point la distribution prédite est-elle proche de la distribution vraie ? C'est ce que détermine la perte d'entropie croisée. Utilisez cette formule :
Où p(x)
est la distribution de probabilité vraie (un-hot) et q(x)
est la distribution de probabilité prédite. La somme est sur les trois classes A, B et C. Dans ce cas, la perte est de 0,479 :
H = - (0,0*ln(0,228) + 1,0*ln(0,619) + 0,0*ln(0,153)) = 0,479
Base du logarithme
Remarquez qu'il n'est pas nécessaire d'utiliser la même base de logarithme tant que vous utilisez toujours la même. En fait, la fonction log()
de Python Numpy calcule le logarithme naturel (log base e).
Code Python
Voici l'exemple ci-dessus exprimé en Python en utilisant Numpy :
import numpy as np
p = np.array([0, 1, 0]) # Probabilité vraie (un-hot)
q = np.array([0,228, 0,619, 0,153]) # Probabilité prédite
perte_entropie_croisee = -np.sum(p * np.log(q))
print(perte_entropie_croisee)
# 0,47965000629754095
Voilà à quel point votre prédiction est "fausse" ou "éloignée" de la distribution vraie. Un optimiseur d'apprentissage automatique tentera de minimiser la perte (c'est-à-dire qu'il essaiera de réduire la perte de 0,479 à 0,0).
Unités de perte
Nous voyons dans l'exemple ci-dessus que la perte est de 0,4797. Étant donné que nous utilisons le logarithme naturel (log base e), les unités sont en nats, donc nous disons que la perte est de 0,4797 nats. Si le logarithme était plutôt log base 2, alors les unités seraient en bits. Voir cette page pour plus d'explications.
Plus d'exemples
Pour avoir une meilleure intuition de ce que ces valeurs de perte reflètent, regardons quelques exemples extrêmes.
Encore une fois, supposons que la distribution vraie (un-hot) est :
Pr(Classe A) Pr(Classe B) Pr(Classe C)
0,0 1,0 0,0
Imaginons maintenant que votre algorithme d'apprentissage automatique a fait un excellent travail et prédit la classe B avec une probabilité très élevée :
Pr(Classe A) Pr(Classe B) Pr(Classe C)
0,001 0,998 0,001
Lorsque nous calculons la perte d'entropie croisée, nous pouvons voir que la perte est minuscule, seulement 0,002 :
p = np.array([0, 1, 0])
q = np.array([0,001, 0,998, 0,001])
print(-np.sum(p * np.log(q)))
# 0,0020020026706730793
Dans l'extrême opposé, supposons maintenant que votre algorithme d'apprentissage automatique a très mal fait son travail et a prédit la classe C avec une forte probabilité à la place. La perte résultante de 6,91 reflètera l'erreur plus importante.
Pr(Classe A) Pr(Classe B) Pr(Classe C)
0,001 0,001 0,998
p = np.array([0, 1, 0])
q = np.array([0,001, 0,001, 0,998])
print(-np.sum(p * np.log(q)))
# 6,907755278982137
Enfin, que se passe-t-il entre ces deux extrêmes ? Supposons que votre algorithme d'apprentissage automatique n'arrive pas à se décider et prédit les trois classes avec une probabilité presque égale.
Pr(Classe A) Pr(Classe B) Pr(Classe C)
0,333 0,333 0,334
La perte résultante est 1,10.
p = np.array([0, 1, 0])
q = np.array([0,333, 0,333, 0,334])
print(-np.sum(p * np.log(q)))
# 1,0996127890016931
Intégration dans la descente de gradient
L'entropie croisée est l'une des nombreuses fonctions de perte possibles (une autre populaire est la perte de charnière SVM). Ces fonctions de perte sont généralement écrites sous la forme J(theta) et peuvent être utilisées dans la descente de gradient, qui est un algorithme itératif pour déplacer les paramètres (ou coefficients) vers les valeurs optimales. Dans l'équation ci-dessous, vous remplaceriez J(theta)
par H(p, q)
. Mais notez que vous devez d'abord calculer la dérivée de H(p, q)
par rapport aux paramètres.
Pour répondre directement à vos questions originales :
Est-ce seulement une méthode pour décrire la fonction de perte ?
Exact, l'entropie croisée décrit la perte entre deux distributions de probabilité. C'est l'une des nombreuses fonctions de perte possibles.
Ensuite, nous pouvons utiliser, par exemple, l'algorithme de descente de gradient pour trouver le minimum.
Oui, la fonction de perte d'entropie croisée peut être utilisée dans le cadre de la descente de gradient.
Lecture supplémentaire : l'une de mes autres réponses liée à TensorFlow.
13 votes
Non adapté pour SO. Voici une question similaire sur le site sœur de datascience : datascience.stackexchange.com/questions/9302/…
0 votes
Pour une explication simple et non mathématique, consultez towardsdatascience.com/…