Démantèlement des réseaux de neurones pour comprendre le fonctionnement interne avec les mathématiques et Pytorch
La mise en œuvre de la différenciation softmax nous oblige à parcourir la liste des neurones et à se différencier par rapport à chaque neurone. Par conséquent, deux boucles sont impliquées. Gardez à l’esprit que le but de ces implémentations n’est pas d’être performant, mais plutôt de traduire explicitement les mathématiques et d’arriver aux mêmes résultats obtenus par les méthodes intégrées de Pytorch.
Dans la séquence d’opérations impliquées dans un réseau neuronal, le softmax est généralement suivi de la perte d’entropie croisée. En fait, les deux fonctions sont si étroitement liées que dans Pytorch la méthode cross_entropy combine les deux fonctions en une seule.
Je me souviens de ma première impression quand j’ai vu la formule de la perte d’entropie croisée. C’était proche d’admirer des hiéroglyphes. Après l’avoir déchiffré, j’espère que vous partagerez ma crainte face à la façon dont les idées simples peuvent parfois avoir les représentations les plus complexes.
Les variables impliquées dans le calcul de la perte d’entropie croisée sont p, y, m, et K. Tous les deux je et k sont utilisés comme compteurs pour itérer de 1 à m et K respectivement.
- Z: est un tableau où chaque ligne représente les neurones de sortie d’une instance. m: est le nombre d’instances.
- K: est le nombre de classes.
- p: est la probabilité du réseau de neurones cette instance je appartient à la classe k. Il s’agit de la même probabilité calculée à partir de softmax.
- y: est l’étiquette d’instance je. Il s’agit soit de 1, soit de 0 selon que y appartient à la classe k ou pas.
- Journal: est le logarithme naturel.
Supposons que nous effectuons une tâche de classification multi-classes où le nombre de classes possibles est de trois (K= 3). Chaque instance ne peut appartenir qu’à une seule classe. Par conséquent, chaque instance est affectée à un vecteur d’étiquettes avec deux zéros et un. Par exemple y=[0,0,1] signifie que l’instance de y appartient à la classe 2. De même, y=[1,0,0] signifie que l’instance de y appartient à la classe 0. L’index du 1 fait référence à la classe à laquelle appartient l’instance. Nous disons que les étiquettes sont codé à chaud.
Prenons maintenant deux instances (m= 2). Nous calculons leur z valeurs et nous trouvons: Z = [[0.1, 0.4, 0.2], [0.3, 0.9, 0.6]]. Ensuite, nous calculons leurs probabilités softmax et trouvons: Activations = [[0.29, 0.39, 0.32], [0.24, 0.44, 0.32]]. Nous savons que la première instance appartient à la classe 2 et la seconde instance appartient à la classe 0, car: y =[[[0,0,1],[1,0,0]].
Pour calculer l’entropie croisée:
- Nous prenons le log des activations softmax: journal (activations) = [[-1.24, -0.94, -1.14], [-1.43, -0.83, -1.13]].
- On multiplie par -1 pour obtenir le log négatif: -log (activations) = [[1.24, 0.94, 1.14], [1.43, 0.83, 1.13]].
- Multiplication du journal (activations) par y donne: [[0., 0., 1.14], [1.43, 0., 0.]].
- La somme de toutes les classes donne: [[0.+0.+1.14], [1.43+0.+0.]]= [[1.14], [1.43]]
- La somme de toutes les instances donne: [1.14+1.43] = [2.57]
- La division par le nombre d’instances donne: [2.57 / 2] = [1.285]
Observations:
- Les étapes 3 et 4 sont équivalentes à la simple récupération du journal négatif de la classe cible.
- Les étapes 5 et 6 équivalent au calcul de la moyenne.
- La perte est égale à 1,14 lorsque le réseau neuronal a prédit que l’instance appartient à la classe cible avec une probabilité de 0,32.
- La perte est égale à 1,43 lorsque le réseau neuronal a prédit que l’instance appartient à la classe cible avec une probabilité de 0,24.
- Nous pouvons voir que dans les deux cas, le réseau n’a pas donné la probabilité la plus élevée à la classe correcte. Mais par rapport à la première instance, le réseau était plus confiant quant à la deuxième instance n’appartenant pas à la classe correcte. Par conséquent, il a été pénalisé avec une perte plus élevée de 1,43.
Nous combinons les étapes et les observations ci-dessus dans notre implémentation de l’entropie croisée. Comme d’habitude, nous allons également passer par la méthode équivalente de Pytorch, avant de comparer les deux sorties.
Remarque: Au lieu de stocker le codage à chaud des étiquettes, nous stockons simplement l’index du 1. Par exemple, le précédent y devient [2,0]. Remarquez, à l’index 0, la valeur de y est 2, et à l’indice 1, la valeur de y est 0. En utilisant les indices de y et leurs valeurs, nous pouvons récupérer directement les journaux négatifs pour les classes cibles. Pour ce faire, accédez à -log (activations) à la ligne 0, colonne 2 et à la ligne 1, colonne 0. Cela nous permet d’éviter les multiplications et les ajouts inutiles de zéros aux étapes 3 et 4. Cette astuce est appelée indexation de tableaux entiers et est expliqué par Jeremy Howard dans son Deep Learning From The Foundations conférence 9 à 34:57