Les fonctions d'erreur ********************** La réponse en sortie d’un réseau de neurones est généralement assez simple à interpréter, du moins dans ses grandes lignes : - Pour un problème de **régression**, la sortie correspond à la valeur prédite. - Pour un problème de **classification**, le score le plus élevé indique la classe retenue. - Pour un problème de **segmentation d’images**, un masque binaire (0/1) indique les pixels ou voxels retenus. - Pour un problème de **détection**, les coordonnées des rectangles dans l’image indiquent les zones d’intérêt. En revanche, définir une **fonction d’erreur** adéquate à connecter à la sortie du réseau afin de permettre l’apprentissage reste une tâche délicate. À titre d’exemple, plusieurs fonctions de loss sont présentées dans ce chapitre. Mean Squared Error ================== Cette fonction d'erreur calcule la moyenne des carrés des différences entre deux séries de valeurs. Ainsi, la *MSE* entre un vecteur :math:`r` contenant des valeurs de référence et un vecteur :math:`e` contenant les valeurs estimées est définie par : .. math:: \frac{1}{n} \cdot \sum_{i=0}^{n-1} (e_i - r_i)^2 Par exemple, avec *r=[6, 1, 5, 3, 5]* et *e=[10, 1, 2, 3, 5]*, on obtient : .. math:: \begin{array}{c|c|c|c} r & 6 & 1& 5 & 3 & 5 \\ \hline e & 10 & 1& 2 & 3 & 5 \\ \hline |e_i-r_i| & 4 & 0& 3 & 0 & 0 \\ \hline carré & 16 & 0& 9 & 0 & 0 \\ \end{array} Ainsi la somme des carrés est égale à 25. Comme il y a 5 éléments, nous obtenons au final une MSE de 5. .. quiz:: MSE :title: Calcul de l'erreur MSE Pour les valeurs suivantes, calculez l'erreur MSE associée : :quiz:`{"type":"FB","answer":"4"}` [ 1, 2, 3, 4 ] et [ -1, 4, 5, 2 ] Dice ==== Dans un problème de segmentation d’images 2D, la sortie du réseau de neurones est généralement un masque de probabilités, de même dimension que l’image d’entrée. Chaque pixel est associé à une probabilité d’appartenir à l'objet recherché dans l'image. Coefficient de Dice ------------------- Pour simplifier, considérons deux masques binaires 2D, notés *r* (référence) et *e* (estimation), où chaque pixel prend la valeur 0 ou 1. Le coefficient de Dice est défini par : .. math:: \mathrm{Dice}(r, e) = \frac{2 \lvert r \cap e \rvert}{\lvert r \rvert + \lvert e \rvert} .. image:: overlap.png :align: center :scale: 50% La valeur :math:`\mathrm{Dice}(r, e)` mesure le taux de recouvrement (overlap) entre les deux ensembles de pixels. Elle vaut 1 lorsque les deux masques sont identiques, et 0 lorsqu’ils ne se recouvrent pas. Dans le cas de masques probabilistes à valeurs dans [0,1] cette expression peut s’écrire sous la forme suivante : .. math:: \mathrm{Dice}(r, e) = \frac{2 \sum_i r_i.e_i}{\sum_i r_i + \sum_i e_i} Fonction DiceLoss ----------------- Dans le cadre de l’apprentissage automatique, on convertit cette mesure de similarité en une fonction de perte à minimiser, appelée *Dice loss* : .. math:: \mathrm{DiceLoss}(r, e) = 1 - \mathrm{Dice}(r, e) Lorsque les sorties du réseau prennent des valeurs continues dans l’intervalle :math:`[0,1]`, le coefficient de Dice reste bien défini et permet de comparer un masque de probabilités à un masque de référence binaire. Cette fonction d’erreur favorise directement un bon recouvrement global des objets, ce qui la rend particulièrement adaptée aux tâches de segmentation d’images 2D. Softmax & Cross Entropy ======================= Softmax ------- Dans le problème de la classification d'images, le réseau de neurones associe à une image plusieurs valeurs réelles correspondant à une sorte de score pour chaque catégorie étudiée. Il est naturel de supposer qu’une valeur supérieure aux autres correspond à une catégorie plus probable. Mais comment interpréter des valeurs négatives ou nulles ? Pour cela, nous utilisons la fonction *Softmax* qui permet de transformer toute série de valeurs :math:`X=(x_j)_{0\le j 0} r_i \, \ln(e_i) L’entropie croisée est minimale lorsque les deux distributions sont identiques, c’est-à-dire lorsque :math:`r_i = e_i` pour tout :math:`i`. Minimiser la *Cross-Entropy Loss* revient donc à faire tendre la distribution prédite *e* vers la distribution de référence *r*. Encodage one-hot ---------------- Dans le problème de classification, la distribution de référence :math:`r` est souvent encodée en one-hot, c'est-à-dire que la distribution va être nulle partout sauf pour la catégorie :math:`k` correspondant à la bonne classe : .. math:: r = [0,\ldots,0,\underset{k}{1},0,\ldots,0] L'expression de l’entropie croisée se réécrit donc dans ce contexte : .. math:: CrossEntropyLoss(r,e) = - \ln{\left(e_k\right)} Généralement, vous allez trouver dans les librairies deux fonctions pour la *CrossEntropyLoss*, elles sont identiques mais diffèrent par la représentation de l'encodage one-hot : * Si la distribution :math:`r` est encodée sous la forme d'un vecteur de 0 avec une seule valeur 1 * Si la distribution :math:`r` est encodée par le numéro de la catégorie :math:`k` .. quiz:: Entropie :title: Entropie et probabilités :quiz:`{"type":"TF","answer":"T"}` L'entropie d'une distribution de probabilités discrète est toujours positive ou nulle. :quiz:`{"type":"TF","answer":"T"}` L'entropie atteint son maximum avec des probabilités équiprobables. :quiz:`{"type":"TF","answer":"T"}` Avec :math:`k=0` et :math:`e_0=\frac{1}{e}` et :math:`e_1=1-e_0`, alors l'entropie croisée vaut :math:`1`. :quiz:`{"type":"TF","answer":"F"}` L'erreur associée à l'entropie croisée est nulle lorsque les probabilités sont équiprobables. 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. En effet, avec la fonction exponentielle, les valeurs produites peuvent monter très très vite. Or, les calculs dans le réseau sont faits en Float32 dont la valeur représentable maximale est :math:`3.402823\mbox{E}\texttt{+} 38`. Ainsi, il suffit qu’une entrée de la fonction *Softmax* soit supérieure à *88.72* pour que le résultat de l’exponentielle soit égal à *+∞*. La suite des calculs sera forcément erronée. Voici un exemple : .. math:: \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} Pour éviter ce problème, nous allons soustraire à l’ensemble des valeurs :math:`x_i` leur maximum noté *c*. 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 la saturation : .. math:: \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} 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 :math:`m=1,4\mbox{E}\texttt{-}45`. Ainsi, lorsqu’il existe une valeur :math:`x'_i<-103`, nous allons obtenir un résultat nul : .. math:: \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} En soi, ce résultat n’est pas incohérent car la probabilité est quasi nulle. Cependant, nous injectons cette valeur nulle dans la *CrossEntropyLoss* qui applique un logarithme ce qui produit 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* : .. math:: \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 : .. math:: \ln(Softmax_i(X^\prime))=\ {x^\prime}_i-\ln{\left(\sum_{j}\exp{\left({x^\prime}_j\right)}\right)} Les valeurs :math:`\exp({x^\prime}_j)` sont strictement positives et par conséquent le résultat du grand sigma est lui aussi positif strict. Ainsi, le logarithme ne reçoit jamais une valeur nulle ou négative et son évaluation n’est plus problématique. Ainsi, le couple **SoftMax/CrossEntropyLoss** peut être remplacé par un nouveau couple **Log Softmax / Negative Log Likelihood Loss** correspondant à la fonction *Cross Entropy Loss* privée de son logarithme : .. math:: 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.