Tout savoir sur l’activation Softmax

Publié par Auguste Hoang le

softmax
Partagez sur les réseaux sociaux !

La fonction d’activation softmax est un élément important dans la conception d’un réseau de neurones. Dans cet article tu vas apprendre :

  • L’intérêt de softmax. ✔
  • D’où sort cette fonction. ✔
  • Comment elle est définie. ✔

L’intérêt des fonctions d’activations

D’abord de manière générale, les fonctions d’activation servent à deux choses :

  • Casser la linéarité entre deux couches successives, si la fonction d’activation portent sur les couches cachées du réseau.
  • Remettre les valeurs d’une couche dans un intervalle donné, si la fonction d’activation est sur la dernière couche.

L’activation softmax sert exclusivement dans le deuxième cas comme on va l’expliquer.

Le cadre d’utilisation de softmax est celui du problème de classification multi-classe. Dans un tel problème, on demande en général que le modèle prédictif renvoie :

  • Soit la classe prédite (identifiée par un numéros par exemple).
  • Soit la liste des probabilités d’appartenance à chaque classe. Le modèle renvoie alors un vecteur de probabilité, c’est-à-dire une vecteur de nombres entre 0 et 1, dont la somme vaut 1.

Si le modèle est un réseau de neurones, alors il est obligé d’être dans le deuxième cas, car c’est un modèle qui doit être dérivable si l’on veut utiliser la méthode du gradient.

La fonction sigmoïde, qui est l’activation la plus standard, ne renvoie pas de vecteur de probabilités, car il n’est pas garanti que la somme des valeurs valent 1. On pourrait quand même utiliser cette activation, mais dans ce cas il y a les inconvénients suivants :

  • L’utilisateur du réseau doit à la main normaliser les valeurs pour obtenir un vecteur de probabilité.
  • Lors de l’apprentissage, le réseau doit lui même apprendre que les valeurs cibles sont des vecteurs de probabilités.
  • Certaines métriques nécessitent que la prédiction donnée par le réseau soit un vecteur de probabilité, comme par exemple l’entropie croisée (ce n’est pas le cas pour la métrique MeanSquareError).

Ainsi la fonction d’activation softmax sert à forcer le réseau de neurones à renvoyer des vecteurs de probabilités. 👍

L’activation Softmax

La définition de softmax

Le principe de softmax est simple : on part d’un vecteur (x_0,x_1,\cdots) avec des coefficients quelconques, et on veut obtenir un vecteur avec des coefficients positifs de somme 1. Il suffit alors :

  • De remplacer chaque x_i par \exp(x_i) pour obtenir un nombre positif.
  • Puis de diviser par la somme des coefficients pour le normaliser le résultat.

Ce qui donne comme formule \mathrm{softmax} (x_0,x_1,\cdots) = (y_0,y_1,\cdots), où les y_i valent :

    \[y_i = \frac{\exp(x_i)} {\sum_{p \geq 0} \exp(x_p) }\]

Illustrons sur un exemple concret. Si par exemple on prend :

    \[x =  (x_1,  x_2,  x_3) = (1,4,-2).\]

Alors pour calculer \mathrm{softmax} (x), il faut calculer :

    \begin{align*}e^{x_1} &= e^{1} = 2.71\cdots \\e^{x_2} &= e^{4} = 54.59\cdots \\ e^{x_3} &= e^{-2} = 0.13\cdots \\ \end{align*}

Ensuite diviser chacun de ces nombre par la somme :

    \[s =  e^{x_1} + e^{x_2} +  e^{x_3} = 74.81\cdots\]


Ce qui donne :

    \begin{align*}\mathrm{softmax}(x)_1 &= e^{x_1}/{s} = 0.047\cdots \\\mathrm{softmax}(x)_2 &= e^{x_2}/{s} = 0.95\cdots \\\mathrm{softmax}(x)_3 &= e^{x_3}/{s} = 0.002\cdots \\\end{align*}

Ainsi \mathrm{softmax}(x) = (0.047\cdots, 0.95\cdots,  0.002\cdots ). Et tu peux vérifier que la somme des coefficients valent bien 1.👌

Lien avec Argmax

D’où vient le nom softmax 🤔 ? Il vient du fait que c’est une approximation de la fonction Argmax en une fonction lisse (smooth en anglais).

La version One-Hot-Encoded de Argmax renvoie renvoie un vecteur de probabilité de type Dirac, c’est-à-dire une valeur à 1 et que des 0 ailleurs. Par exemple sur le vecteur x=(1,4,-2), la version One-Hot-Encoded de son argmax est le vecteur (0,1,0), où la position du 1 est la position du plus grand coefficient de x. L’inconvénient est que cette fonction n’est pas dérivable.

Dans la définition de softmax, l’utilisation de \exp a pour rôle de rendre les coefficients positifs, mais il a aussi pour effet de rendre dominant la plus grande valeur x_i par rapport autres. Autrement dit y_i vaut environ 1 lorsque i vaut \mathrm{argmax}_i(x_i) et vaut environ 0 sinon.

Tu peux d’ailleurs voir que \mathrm{softmax} (x) = (0.047\cdots, 0.95\cdots,  0.002\cdots ) est une assez bonne approximation de (0,1,0).👌

Ainsi softmax est une approximation dérivable de la version One-Hot-Encoded de Argmax, autrement dit softmax permet de calculer Argmax de manière « soft ».

Lien avec la fonction sigmoïde

La fonction sigmoïde est généralement utilisée comme activation de la dernière couche pour les problèmes de classification binaire.

Il se trouve, en fait que sigmoïde est la même chose que softmax pour les classifications binaires. En effet, sigmoïde peut s’écrire :

    \[\sigma(x) = \frac{1}{1+e^{-x}} = \frac{ e^{x} }{e^{x}+1}.\]

Ce qui est précisément la première composante de softmax appliquée à (x,0). Tu peux vérifier que :

    \[\mathrm{softmax}(x, 0) = ( \sigma(x), 1-\sigma(x) ) =  ( \sigma(x), \sigma(-x) ).\]

Et plus généralement, je te laisse démontrer que 👍 :

    \[\mathrm{softmax}(x, y) = ( \sigma(x-y),\sigma(y-x) ).\]

Ainsi, on peut voir softmax comme une généralisation de sigmoïde pour les classifications non binaires.

Comment implémenter softmax

La manière naïve d’implémenter la fonction softmax est d’utiliser sa formule. Ce donnerait par exemple le code suivant en python.

1
2
3
4
5
6
7
8
9
10
11
12
13
import math

def softmax(x):
  y = x.copy()    # copie de la liste x
  for i in range(len(x)):
    y[i] = math.exp(x[i])  #calcul de l'exponentielle
   
  sumExp = sum(y)          # Calcul de la somme

  for i in range(len(x)):
    y[i] = y[i]/sumExp     # normalisation

  return y

A première vue, tout semble correcte, mais en pratique cela pose problème 🤨. En effet, lorsqu’on entraîne un réseau de neurones, il arrive que les valeurs soient supérieures à 500, ce qui entraîne que l’exponentiel produit des valeurs infinies 😬.

Cependant, il existe une astuce pour contourner ce problème. En effet, il faut remarquer la fonction softmax est invariante par translation, c’est-à-dire que tout nombre t :

    \[\mathrm{softmax} (X-t) = \mathrm{softmax} (X).\]

Cela vient du fait que \exp(x-t) = \exp(x) \times \exp(-t). Par conséquent pour éviter des valeurs, on peut décaler les valeurs par le maximum de X de sorte que l’exponentiel ne produise pas de valeurs infinies. Ainsi la bonne implémentation de softmax est la suivante :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import math

def softmax(x):
  y = x.copy()    # copie de la liste x
  t = max(y)      # valeur maximale

  for i in range(len(x)):
    y[i] = math.exp(x[i]-t)  # decalage + calcul de l'exponentielle
   
  sumExp = sum(y)            # Calcul de la somme

  for i in range(len(x)):
    y[i] = y[i]/sumExp       # normalisation

  return y

Conclusion

Maintenant tu sais tout sur la fonction softmax 😀. N’hésite pas à dire en commentaire si tu as des questions ou si cet article t’as aidé 👍.

Catégories : Deep LearningPython

2 commentaires

Benabou · 6 mars 2024 à 15h33

Super article ! merci !

Laisser un commentaire

Le guide du calcul différentiel pour le Deep-Learning

En cadeau, recevez par email le guide du calcul différentiel pour apprendre du Deep-Learning.

Merci pour votre demande de recevoir le cadeau ! Vous allez tout de suite recevoir le lien de téléchargement dans votre boîte email. Si vous n'avez pas reçu l'email d'ici quelques minutes, pensez à regarder vos "spams".

Le guide du calcul différentiel pour le Deep-Learning

En cadeau, recevez par email le guide du calcul différentiel pour apprendre du Deep-Learning.

Merci pour votre demande de recevoir le cadeau ! Vous allez tout de suite recevoir le lien de téléchargement dans votre boîte email. Si vous n'avez pas reçu l'email d'ici quelques minutes, pensez à regarder vos "spams".

Le guide du calcul différentiel pour le Deep-Learning

En cadeau, recevez par email le guide du calcul différentiel pour apprendre du Deep-Learning.

Merci pour votre demande de recevoir le cadeau ! Vous allez tout de suite recevoir le lien de téléchargement dans votre boîte email. Si vous n'avez pas reçu l'email d'ici quelques minutes, pensez à regarder vos "spams".