Tout savoir sur l’activation Softmax

Publié par Auguste Hoang le

softmax
Partagez sur les réseaux sociaux !

Bienvenue sur apprendre-le-deep-learning.com ! Si vous ĂȘtes nouveau ici, vous voudrez sans doute lire mon livre "le calcul diffĂ©rentiel pour le Deep Learning". Cliquez ici pour tĂ©lĂ©charger le livre gratuitement ! 🙂

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Ă© 👍.

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".

CatĂ©gories : Deep LearningPython

2 commentaires

Benabou · 6 mars 2024 à 15h33

Super article ! merci !

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

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".