Recherche de site Web

Fonction d'activation Softmax avec Python


Softmax est une fonction mathématique qui convertit un vecteur de nombres en un vecteur de probabilités, où les probabilités de chaque valeur sont proportionnelles à l'échelle relative de chaque valeur du vecteur.

L'utilisation la plus courante de la fonction softmax dans l'apprentissage automatique appliqué est son utilisation comme fonction d'activation dans un modèle de réseau neuronal. Plus précisément, le réseau est configuré pour générer N valeurs, une pour chaque classe de la tâche de classification, et la fonction softmax est utilisée pour normaliser les sorties, en les convertissant de valeurs de somme pondérées en probabilités dont la somme est égale à un. Chaque valeur de la sortie de la fonction softmax est interprétée comme la probabilité d'appartenance à chaque classe.

Dans ce tutoriel, vous découvrirez la fonction d'activation softmax utilisée dans les modèles de réseaux de neurones.

Après avoir terminé ce tutoriel, vous saurez :

  • Les fonctions d'activation linéaire et sigmoïde sont inappropriées pour les tâches de classification multi-classes.
  • Softmax peut être considéré comme une version adoucie de la fonction argmax qui renvoie l'index de la plus grande valeur d'une liste.
  • Comment implémenter la fonction softmax à partir de zéro en Python et comment convertir la sortie en étiquette de classe.

Commençons.

Présentation du didacticiel

Ce didacticiel est divisé en trois parties : ils sont:

  1. Prédire les probabilités avec les réseaux de neurones
  2. Max, Argmax et Softmax
  3. Fonction d'activation Softmax

Prédire les probabilités avec les réseaux de neurones

Les modèles de réseaux neuronaux peuvent être utilisés pour modéliser des problèmes de modélisation prédictive de classification.

Les problèmes de classification sont ceux qui impliquent la prédiction d’une étiquette de classe pour une entrée donnée. Une approche standard pour modéliser les problèmes de classification consiste à utiliser un modèle pour prédire la probabilité d’appartenance à une classe. Autrement dit, étant donné un exemple, quelle est la probabilité qu'il appartienne à chacune des étiquettes de classe connues ?

  • Pour un problème de classification binaire, une distribution de probabilité binomiale est utilisée. Ceci est réalisé en utilisant un réseau avec un seul nœud dans la couche de sortie qui prédit la probabilité qu'un exemple appartienne à la classe 1.
  • Pour un problème de classification multiclasse, une probabilité multinomiale est utilisée. Ceci est réalisé en utilisant un réseau avec un nœud pour chaque classe dans la couche de sortie et la somme des probabilités prédites est égale à un.

Un modèle de réseau neuronal nécessite une fonction d'activation dans la couche de sortie du modèle pour effectuer la prédiction.

Il existe différentes fonctions d'activation parmi lesquelles choisir ; regardons-en quelques-uns.

Fonction d'activation linéaire

Une approche pour prédire les probabilités d’appartenance à une classe consiste à utiliser une activation linéaire.

Une fonction d'activation linéaire est simplement la somme des entrées pondérées vers le nœud, requises comme entrée pour toute fonction d'activation. En tant que tel, il est souvent appelé « aucune fonction d'activation » car aucune transformation supplémentaire n'est effectuée.

Rappelons qu'une probabilité ou une vraisemblance est une valeur numérique comprise entre 0 et 1.

Étant donné qu'aucune transformation n'est effectuée sur la somme pondérée de l'entrée, il est possible que la fonction d'activation linéaire génère n'importe quelle valeur numérique. Cela rend la fonction d'activation linéaire inappropriée pour prédire les probabilités dans le cas binomial ou multinomial.

Fonction d'activation sigmoïde

Une autre approche pour prédire les probabilités d’appartenance à une classe consiste à utiliser une fonction d’activation sigmoïde.

Cette fonction est également appelée fonction logistique. Quelle que soit l'entrée, la fonction génère toujours une valeur comprise entre 0 et 1. La forme de la fonction est une forme en S entre 0 et 1 avec la verticale ou le milieu du « S » à 0,5.

Cela permet aux valeurs très grandes données sous forme de somme pondérée de l'entrée d'être émises à 1,0 et aux valeurs très petites ou négatives d'être mappées à 0,0.

L'activation sigmoïde est une fonction d'activation idéale pour un problème de classification binaire où le résultat est interprété comme une distribution de probabilité binomiale.

La fonction d'activation sigmoïde peut également être utilisée comme fonction d'activation pour les problèmes de classification multi-classes où les classes ne s'excluent pas mutuellement. Celles-ci sont souvent appelées classification multi-étiquettes plutôt que classification multi-classes.

La fonction d'activation sigmoïde n'est pas appropriée pour les problèmes de classification multiclasses avec des classes mutuellement exclusives où une distribution de probabilité multinomiale est requise.

Au lieu de cela, une autre activation est requise, appelée fonction softmax.

Max, Argmax et Softmax

Fonction maximale

La fonction mathématique maximum, ou « max », renvoie la plus grande valeur numérique pour une liste de valeurs numériques.

Nous pouvons implémenter cela en utilisant la fonction Python max() ; Par exemple:

# example of the max of a list of numbers
# define data
data = [1, 3, 2]
# calculate the max of the list
result = max(data)
print(result)

L’exécution de l’exemple renvoie la plus grande valeur « 3 » de la liste de nombres.

3

Fonction Argmax

La fonction mathématique argmax, ou « arg max », renvoie l'index de la liste qui contient la plus grande valeur.

Considérez-le comme la version méta de max : un niveau d'indirection au-dessus de max, pointant vers la position dans la liste qui a la valeur max plutôt que la valeur elle-même.

Nous pouvons implémenter cela en utilisant la fonction NumPy argmax() ; Par exemple:

# example of the argmax of a list of numbers
from numpy import argmax
# define data
data = [1, 3, 2]
# calculate the argmax of the list
result = argmax(data)
print(result)

L’exécution de l’exemple renvoie la valeur d’index de liste « 1 » qui pointe vers l’index de tableau [1] qui contient la plus grande valeur de la liste « 3 ».

1

Fonction Softmax

La fonction mathématique softmax, ou « soft max », peut être considérée comme une version probabiliste ou « softer » de la fonction argmax.

Le terme softmax est utilisé car cette fonction d'activation représente une version fluide du modèle d'activation dans lequel l'unité avec la plus grande entrée a une sortie +1 tandis que toutes les autres unités ont une sortie 0.

— Page 238, Réseaux de neurones pour la reconnaissance de formes, 1995.

D'un point de vue probabiliste, si la fonction argmax() renvoie 1 dans la section précédente, elle renvoie 0 pour les deux autres index du tableau, donnant tout le poids à l'index 1 et aucun poids à l'index 0 et à l'index 2. pour la plus grande valeur de la liste [1, 3, 2].

[0, 1, 0]

Et si nous étions moins sûrs et voulions exprimer l'argmax de manière probabiliste, avec des vraisemblances ?

Ceci peut être réalisé en mettant à l'échelle les valeurs de la liste et en les convertissant en probabilités de telle sorte que toutes les valeurs de la liste renvoyée totalisent 1,0.

Ceci peut être réalisé en calculant l'exposant de chaque valeur de la liste et en le divisant par la somme des valeurs des exposants.

  • probabilité=exp(valeur)/somme v dans la liste exp(v)

Par exemple, nous pouvons transformer la première valeur « 1 » de la liste [1, 3, 2] en probabilité comme suit :

  • probabilité=exp(1)/(exp(1) + exp(3) + exp(2))
  • probabilité=exp(1)/(exp(1) + exp(3) + exp(2))
  • probabilité=2,718281828459045/30,19287485057736
  • probabilité=0,09003057317038046

Nous pouvons le démontrer pour chaque valeur de la liste [1, 3, 2] en Python comme suit :

# transform values into probabilities
from math import exp
# calculate each probability
p1 = exp(1) / (exp(1) + exp(3) + exp(2))
p2 = exp(3) / (exp(1) + exp(3) + exp(2))
p3 = exp(2) / (exp(1) + exp(3) + exp(2))
# report probabilities
print(p1, p2, p3)
# report sum of probabilities
print(p1 + p2 + p3)

L’exécution de l’exemple convertit chaque valeur de la liste en probabilité et rapporte les valeurs, puis confirme que la somme de toutes les probabilités est égale à la valeur 1,0.

Nous pouvons voir que la plus grande pondération est accordée à l’indice 1 (67 pour cent), avec moins de poids à l’indice 2 (24 pour cent) et encore moins à l’indice 0 (9 pour cent).

0.09003057317038046 0.6652409557748219 0.24472847105479767
1.0

C'est la fonction softmax.

Nous pouvons l'implémenter comme une fonction qui prend une liste de nombres et renvoie la distribution de probabilité softmax ou multinomiale pour la liste.

L'exemple ci-dessous implémente la fonction et la démontre sur notre petite liste de nombres.

# example of a function for calculating softmax for a list of numbers
from numpy import exp

# calculate the softmax of a vector
def softmax(vector):
	e = exp(vector)
	return e / e.sum()

# define data
data = [1, 3, 2]
# convert list of numbers to a list of probabilities
result = softmax(data)
# report the probabilities
print(result)
# report the sum of the probabilities
print(sum(result))

L’exécution de l’exemple rapporte à peu près les mêmes chiffres avec des différences mineures de précision.

[0.09003057 0.66524096 0.24472847]
1.0

Enfin, nous pouvons utiliser la fonction NumPy softmax() intégrée pour calculer le softmax d'un tableau ou d'une liste de nombres, comme suit :

# example of calculating the softmax for a list of numbers
from scipy.special import softmax
# define data
data = [1, 3, 2]
# calculate softmax
result = softmax(data)
# report the probabilities
print(result)
# report the sum of the probabilities
print(sum(result))

En exécutant l’exemple, encore une fois, nous obtenons des résultats très similaires avec des différences de précision très mineures.

[0.09003057 0.66524096 0.24472847]
0.9999999999999997

Maintenant que nous connaissons la fonction softmax, regardons comment elle est utilisée dans un modèle de réseau neuronal.

Fonction d'activation Softmax

La fonction softmax est utilisée comme fonction d'activation dans la couche de sortie des modèles de réseaux neuronaux qui prédisent une distribution de probabilité multinomiale.

Autrement dit, softmax est utilisé comme fonction d'activation pour les problèmes de classification multi-classes où l'appartenance à une classe est requise sur plus de deux étiquettes de classe.

Chaque fois que nous souhaitons représenter une distribution de probabilité sur une variable discrète avec n valeurs possibles, nous pouvons utiliser la fonction softmax. Cela peut être considéré comme une généralisation de la fonction sigmoïde qui a été utilisée pour représenter une distribution de probabilité sur une variable binaire.

— Page 184, Apprentissage profond, 2016.

La fonction peut être utilisée comme fonction d'activation pour une couche cachée dans un réseau neuronal, bien que cela soit moins courant. Il peut être utilisé lorsque le modèle doit en interne choisir ou pondérer plusieurs entrées différentes au niveau d'un goulot d'étranglement ou d'une couche de concaténation.

Les unités Softmax représentent naturellement une distribution de probabilité sur une variable discrète avec k valeurs possibles, elles peuvent donc être utilisées comme une sorte de commutateur.

— Page 196, Apprentissage profond, 2016.

Dans la bibliothèque d'apprentissage profond Keras avec une tâche de classification à trois classes, l'utilisation de softmax dans la couche de sortie peut ressembler à ceci :

...
model.add(Dense(3, activation='softmax'))

Par définition, l'activation softmax générera une valeur pour chaque nœud de la couche de sortie. Les valeurs de sortie représenteront (ou pourront être interprétées comme) des probabilités et la somme des valeurs est égale à 1,0.

Lors de la modélisation d'un problème de classification multi-classes, les données doivent être préparées. La variable cible contenant les étiquettes de classe est encodée en premier, ce qui signifie qu'un entier est appliqué à chaque étiquette de classe de 0 à N-1, où N est le nombre d'étiquettes de classe.

Les variables cibles codées en étiquette (ou codées en entier) sont ensuite codées à chaud. Il s'agit d'une représentation probabiliste de l'étiquette de classe, un peu comme la sortie softmax. Un vecteur est créé avec une position pour chaque étiquette de classe et la position. Toutes les valeurs sont marquées 0 (impossible) et un 1 (certain) est utilisé pour marquer la position de l'étiquette de classe.

Par exemple, trois étiquettes de classe seront codées en nombre entier comme 0, 1 et 2. Puis codées en vecteurs comme suit :

  • Classe 0 : [1, 0, 0]
  • Classe 1 : [0, 1, 0]
  • Classe 2 : [0, 0, 1]

C'est ce qu'on appelle un encodage à chaud.

Il représente la distribution de probabilité multinomiale attendue pour chaque classe utilisée pour corriger le modèle sous apprentissage supervisé.

La fonction softmax générera une probabilité d'appartenance à une classe pour chaque étiquette de classe et tentera de se rapprocher au mieux de la cible attendue pour une entrée donnée.

Par exemple, si la classe 1 codée en nombre entier était attendue pour un exemple, le vecteur cible serait :

  • [0, 1, 0]

La sortie softmax pourrait ressembler à ceci, ce qui donne le plus de poids à la classe 1 et moins de poids aux autres classes.

  • [0,09003057 0,66524096 0,24472847]

L'erreur entre la distribution de probabilité multinomiale attendue et prédite est souvent calculée à l'aide de l'entropie croisée, et cette erreur est ensuite utilisée pour mettre à jour le modèle. C’est ce qu’on appelle la fonction de perte d’entropie croisée.

Pour en savoir plus sur l'entropie croisée permettant de calculer la différence entre les distributions de probabilité, consultez le didacticiel :

  • Une introduction douce à l'entropie croisée pour l'apprentissage automatique

Nous souhaiterons peut-être reconvertir les probabilités en une étiquette de classe codée en nombre entier.

Ceci peut être réalisé en utilisant la fonction argmax() qui renvoie l'index de la liste avec la plus grande valeur. Étant donné que les étiquettes de classe sont codées en entier de 0 à N-1, l'argmax des probabilités sera toujours l'étiquette de classe codée en entier.

  • entier de classe=argmax([0.09003057 0.66524096 0.24472847])
  • entier de classe=1

Lectures complémentaires

Cette section fournit plus de ressources sur le sujet si vous souhaitez approfondir.

Livres

  • Réseaux de neurones pour la reconnaissance de formes, 1995.
  • Réseaux de neurones : trucs du métier : trucs du métier, 2e édition, 2012.
  • Apprentissage profond, 2016.

Apis

  • API numpy.argmax.
  • API scipy.special.softmax.

Articles

  • Fonction Softmax, Wikipédia.

Résumé

Dans ce tutoriel, vous avez découvert la fonction d'activation softmax utilisée dans les modèles de réseaux de neurones.

Concrètement, vous avez appris :

  • Les fonctions d'activation linéaire et sigmoïde sont inappropriées pour les tâches de classification multi-classes.
  • Softmax peut être considéré comme une version adoucie de la fonction argmax qui renvoie l'index de la plus grande valeur d'une liste.
  • Comment implémenter la fonction softmax à partir de zéro en Python et comment convertir la sortie en étiquette de classe.

Avez-vous des questions ?
Posez vos questions dans les commentaires ci-dessous et je ferai de mon mieux pour y répondre.

Articles connexes