La fonction Softmax

Introduction

Définition

Dans le problème de la classification d’images, le réseau de neurones associe à chaque image plusieurs valeurs dans \(\mathbb{R}\). Ces paramètres indiquent une sorte de score pour chaque catégorie étudiée. Il est cependant difficile d’interpréter les valeurs obtenues. On peut cependant intuiter qu’une valeur supérieure aux autres correspond à une catégorie plus probable, mais que dire des nombres négatifs ou nuls ? Il existe une fonction très répandue dans le monde de l’apprentissage : la fonction Softmax qui permet de transformer toute série de valeurs en une série de probabilités. Nous donnons sa définition ci-après pour des valeurs \(X=(x_j)_{0\le j<n}\) en entrée :

\[Softmax\left(X\right)= [ \exp(x_0), \ldots, \exp(x_i), \ldots, \exp(x_{n-1}) ] . \frac{1}{\sum_{j=0}^{n-1}{\exp(x_j)}}\]

Remarques :

  • Les valeurs en sortie de la fonction Softmax sont positives (propriété de la fonction exponentielle).

  • Les valeurs en sortie sont inférieures ou égale à 1 (le dénominateur étant supérieur ou égal au numérateur)

  • La somme des valeurs en sortie de la fonction Softmax est égale à 1.

Par conséquent, nous pouvons énoncer la propriété suivante :

La fonction Softmax associe à une série de valeurs quelconques une distribution de probabilités.

Voici un exemple de calcul dans le tableau ci-dessous :

\[\begin{split}\begin{array}{c|c|c|c}& Input & exp(x_i) & Total & exp(x_i)/Total\\ \hline x_0 & -1 & 0,368 & & 1,59\% \\ x_1 & 1 & 2,718 & 23,172 & 11,73\% \\ x_2 & 3 & 20,08 & & 86,68\% \\ \hline \end{array}\end{split}\]

Propriétés

Propriété 1

La fonction Softmax présente certains avantages :

  • qu’elle que soit le signe des valeurs en entrée,

  • qu’elle que soit l’ordre de grandeur des valeurs d’entrée (autours de 1/100 ou d’un million),

  • qu’elle que soit l’écart de grandeur entre les différents paramètres,

la fonction Softmax construit toujours une distribution de probabilités.

Propriété 2

La fonction exponentielle est une fonction croissante. Ainsi, plus une valeur d’entrée est grande par rapport aux autres, plus la probabilité associée à sa catégorie augmente, les autres probabilités se voyant diminuer. Prenons un exemple sur un cas simple :

\[\begin{split}\begin{array}{c|c|c} Input & exp(x_i) & Total & Prob_i\\ \hline -1 & 0,368 & & 1,59\% \\ 1 & 2,718 & 23,172 & 11,73\% \\ 3 & 20,08 & & 86,68\% \\ \hline \end{array}\end{split}\]

Si la deuxième valeur en entrée passe à 2, nous obtenons une nouvelle série de probabilités :

\[\begin{split}\begin{array}{c|c|c} Input & exp(x_i) & Total & Prob_i\\ \hline -1 & 0,368 & & 1,32\% \\ \textbf{2} & 7,389 & 27,842 & 26,54\% \\ 3 & 20,08 & & 72,14\% \\ \hline \end{array}\end{split}\]

En passant de 1 à 2, la probabilité augmente de 11,75% à 26,54%. Les deux autres probabilités dont les valeurs d’entrée sont inchangées diminuent, il y a eu une forme de rééquilibrage. Lorsque l’on utilise la fonction Softmax, on peut voir les valeurs d’entrée comme des intensités. Plus l’intensité est importante, plus la probabilité associée est importante. Ainsi la Softmax s’adapte et construit intelligemment une liste de probabilités cohérentes.

Propriété 3

Nous pouvons énoncer une proprété importante de la fonction Softmax :

Les probabilités issues de la fonction Softmax sont invariantes par ajout d’une constante.

Cette propriété vient de la définition de la fonction Softmax, en effet, en posant \({x^\prime}_i=x_i+c\), nous avons pour la i-ème valeur en sortie :

\[Softmax_i\left(X^\prime\right)=\frac{\exp(x_i+c)}{\sum_{j}{\exp(x_j+c)}}=\ \frac{\exp{\left(x_i\right)}.\exp(c)}{\sum_{j}{\exp{\left(x_j\right)}.\exp(c)}}=\ Softmax_i\left(X\right)\]

Pour tester cette propriété, reprenons l’exemple précédent :

\[\begin{split}\begin{array}{c|c|c} Input & exp(x_i) & Total & Prob_i\\ \hline -1 & 0,368 & & 1,59\% \\ 1 & 2,718 & 23,172 & 11,73\% \\ 3 & 20,08 & & 86,68\% \\ \hline \end{array}\end{split}\]

En décalant de 10 les valeurs d’entrée, nous remarquons que les probabilités obtenues restent inchangées :

\[\begin{split}\begin{array}{c|c|c} Input & exp(x_i) & Total & Prob_i\\ \hline 9 & 8103,1 & & 1,59\% \\ 11 & 59874,1 & 510390,6 & 11,73\% \\ 13 & 442413,4 & & 86,68\% \\ \hline \end{array}\end{split}\]

Remarque

Peut-être pensez-vous qu’une formule plus simple comme :

\[S(X)=[ x_0, \ldots, x_i, \ldots, x_{n-1} ] . \frac{1}{\sum_{j=0}^{n-1} x_j}\]

aurait largement suffi pour construire une liste de valeurs de somme égale à 1. Mais en pratique, des problèmes persistent :

  • Avec cette formule simplifiée, les valeurs en entrée doivent être positives sinon on pourrait obtenir des probabilités négatives, ce qui est impossible.

  • Avec cette formule simplifiée, il faut être sûr que les valeurs d’entrée soient toutes non nulles sinon on obtient une division par zéro. Il n’est pas facile de gérer cette contrainte. En comparaison, la fonction Softmax associe à une série de valeurs nulles des probabilités équiprobables.

  • Avec la formule simplifiée, les valeurs (1,1,2) donnent les probabilités en sortie de 25%, 25% et 50%. Les valeurs (100,100,101) produisent des résultats proches de l’équiprobabilité. Une constante additive présente dans les valeurs d’entrée influence donc beaucoup les probabilités construites. En comparaison, la fonction Softmax ne souffre pas de ce défaut. Ainsi, la fonction Softmax réjecte tout biais dans les valeurs d’entrée, ce qui est pratique car les valeurs en entrée ne sont pas forcément centrées sur 0.

Si la formule simplifiée semble plus facile à mettre en œuvre au premier abord, son utilisation s’avère bien plus contraignante.

Pour le tenseur d’entrée suivant, calculez les probabilités obtenues en sortie grâce à l’application de la fonction Softmax. Donnez les valeurs en pourcent avec 2 chiffres :

\(x_i\)

Probabilités

\(ln(1)\)

\(ln(1)\)

\(ln(3)\)

Si une valeur d’entrée \(x_i\) diminue et que les autres restent identiques, alors sa probabilité augmente.

Les probabilités associées aux valeurs [2,8,9] sont les mêmes que celles associées aux valeurs [4,16,18].

Des valeurs en entrée [1,1,1,1] donnent des probabilités équiprobables.

Si une valeur d’entrée \(x_i\) double, alors sa probabilité associée double aussi.

La fonction Softmax peut gérer des entrées avec des valeurs négatives.

Si toutes les valeurs d’entrée sont strictement négatives, alors l’évaluation de la fonction Softmax produit une erreur d’exécution.

Les probabilités associées aux valeurs [2,8,9] sont les mêmes que celles associées aux valeurs [12,18,19].

Si une valeur d’entrée reste constante et que toutes les autres valeurs diminuent, alors sa probabilité augmente.

Instabilité numérique

Cette partie est réservée aux curieux, elle peut être sautée pour ceux qui sont en retard.

La fonction Softmax peut être sujette à des instabilités numériques. Pour rappel, voici la formule donnant la i-ème composante de la fonction Softmax :

\[Softmax_i (X)=\frac{\exp(x_i)}{\sum_{j}{\exp(x_j)}}\]

La première source de problème provient des exponentielles présentes dans la fonction. Car avec une fonction exponentielle, les grandeurs peuvent grimper vite, très vite. Or, les calculs dans le réseau sont faits en Float32 pouvant au maximum représenter la valeur \(3.402823\mbox{E}\texttt{+} 38\). Ainsi, il suffit qu’une entrée de la fonction Softmax soit supérieure à \(ln(3.402823\mbox{E}\texttt{+}38)\sim 88.72\) pour que le résultat de l’exponentielle soit égal à +∞. La suite des calculs sera forcément erronée. Voici un exemple :

\[\begin{split}\begin{array}{c|c|c} x_i & exp(x_i) & exp(x_i) \mbox{ en Float32} \\ \hline 80 & 5,540622\mbox{E}\texttt{+}34 & 5,540622\mbox{E}\texttt{+}34 \\ 89 & 4,489613\mbox{E}\texttt{+}38 & +\inf \\ 90 & 1,220403\mbox{E}\texttt{+}39 & +\inf \\ \hline \end{array}\end{split}\]

Pour éviter le problème de saturation à l’infini, nous allons soustraire à l’ensemble des valeurs \(x_i\) le maximum des \(x_i\) noté c pour obtenir une série de nouvelles valeurs notées \(x'_i\). Ce décalage, suivant les propriétés de la fonction Softmax, ne change pas les valeurs des probabilités. Ainsi, nous évitons, avec cette astuce, toute saturation :

\[\begin{split}\begin{array}{c|c|c|c|c|c} x_i & c & x'_i=x_i-c & exp(x'_i) & Total & Prob_i\\ \hline 80 & & -10 & 4,54\mbox{E}\texttt{-}05 & & 0,003\% \\ 89 & 90 & -1 & 0,367879 & 1,367925 & 26,893\% \\ 90 & & 0 & 1 & & 73,103\% \\ \hline \end{array}\end{split}\]

Une fois cette première astuce utilisée, nous allons rencontrer un autre problème pour les exposants avec une valeur négative forte. En effet, en Float32, le plus petit nombre positif représentable est \(m=1,4\mbox{E}\texttt{-}45\). Ainsi, lorsqu’il existe une valeur \(x_i\) telle que \(x_i < c-ln(m) = c-103\), nous allons obtenir un résultat nul. Voici un exemple :

\[\begin{split}\begin{array}{c|c|c|c|c|c} x_i & c & x'_i=x_i-c & exp(x'_i) & Total & Prob_i\\ \hline 2 & & -108 & 0 & & 0 \% \\ 108 & 110 & -2 & 0,135335 & 1,135335 & 11.92\% \\ 110 & & 0 & 1 & & 88.08\% \\ \hline \end{array}\end{split}\]

En soit, ce résultat n’est pas incohérent car la probabilité est quasi nulle. Cependant, nous injectons ces probabilités dans la fonction d’erreur du réseau et certaines d’entre elles contiennent des fonctions logarithmes qui en recevant une valeur nulle vont produire une erreur d’exécution.

Pour gérer ce problème, nous allons utiliser une deuxième astuce en appliquant directement la fonction ln sur la formule de la fonction Softmax :

\[\ln(Softmax_i(X^\prime))=\ln\left(\frac{\exp({x^\prime}_i)}{\sum_{j}{\exp({x^\prime}_j)}}\right)\]

En développant cette expression, nous obtenons :

\[\ln(Softmax_i(X^\prime))=\ {x^\prime}_i-\ln{\left(\sum_{j}\exp{\left({x^\prime}_j\right)}\right)}\]

Les valeurs \(\exp({x^\prime}_j)\) sont strictement positives et par conséquent le résultat du grand sigma est lui aussi positif strict. Ainsi, le logarithmique ne reçoit jamais une valeur nulle ou négative et son évaluation n’est plus problématique.

Nous verrons plus tard, que la fonction d’erreur utilisée à la suite d’une fonction Softmax est souvent la fonction :

\[Cross\ Entropy\ Loss(p,icat)=\ -\ln(p_{icat})\]

Ainsi, vous pourrez parfois rencontrer dans les réseaux, le remplacement du couple : fonction Softmax + fonction d’erreur Cross Entropy Loss par le couple fonction Log Softmax + fonction d’erreur Negative Log Likelihood Loss correspondant à la fonction Cross Entropy Loss privée de son logarithme :

\[Negative\ Log\ Likelihood\ Loss (X,icat) =- x_{icat}\]

Il ne s’agit pas d’une nouvelle fonction d’erreur ou d’une nouvelle fonction Softmax mais de variantes offrant une meilleure stabilité numérique.