Dans le précédent article, nous avons vu les raisons et la chronologie de l’émergence du deep learning, ainsi que quelques unes de ses applications. Nous avons aussi essayé de définir ce qui faisait la particularité du deep learning en tant que méthode de machine learning. Dans ce qui suit, nous allons à présent chercher à comprendre le fonctionnement des briques de base de tout réseau neuronal artificiel : les neurones.

Le neurone biologique

Avant d’aller plus avant vers le deep learning, nous devons faire un détour par la biologie. L’analogie la plus courante, présente dans le nom même de « réseau neuronal », est celle du cerveau humain1)A titre personnel, je trouve cette analogie utile pour une compréhension au niveau intuitif, mais elle devient rapidement plus encombrante qu’aidante dès qu’on rentre dans le détail. J’y ferait occasionnellement référence par la suite, mais il faudra aussi pouvoir s’en détacher.. Notre cerveau compte environ 100 milliards de neurones. Ces cellules sont connectées entre elles via les dendrites (en entrée) et les synapses (en sortie), formant ainsi un réseau de l’ordre de $10^{15}$ connexions – un million de milliards ! Même le plus complexe des ANN compte un nombre de connexions infinitésimal en comparaison.

 (Source: Wikimedia Commons)

Dans les années 1940, la recherche en neurophysiologie détermina que les neurones se comportaient comme des “portes” : chaque neurone reçoit un signal électrique des neurones connectés en entrée via les dendrites. Si la combinaison des signaux en entrée dépasse un seuil d’activation, alors le neurone va lui même créer un signal qui va se propager dans son axone puis ses synapses, et ainsi envoyer un influx nerveux dans les neurones qui lui sont reliés en sortie. Ceux-ci vont à leur tour s’exciter ou non selon que leur potentiel d’activation est dépassé ou pas.
Les connexions entre neurones et les conditions d’excitation évoluent. Ainsi, l’exercice répété de certaines activités va favoriser les structures facilitant leur réalisation : c’est l’apprentissage2)Je demande pardon aux éventuels spécialistes en physiologie pour cette simplification outrancière du fonctionnement de nos neurones….

Fonctionnement d’un « neurone » artificiel

Un réseau neuronal artificiel (ANN) peut être représenté comme un réseau de petites unités de calcul qui échangent de l’information. Comme dans notre cerveau, chaque neurone artificiel reçoit des signaux, les combine puis émet un signal si un seuil est dépassé. Il peut donc être ainsi schématisé 3)Ce modèle, nommé Perceptron, date de 1957 et constitue une bonne entrée en matière pour comprendre la logique des réseaux neuronaux:

Le Perceptron (1957) – Dans cette représentation, le neurone est constitué des deux cercles orange.

Ce neurone est affublé d’un seuil d’activation $\theta$. Il reçoit des signaux de 3 nœuds en entrée $X_1$, $X_2$ et $X_3$, des valeurs réelles (par exemple 1.2, -3.5, 0.15 etc.). La contribution de chacun de ces nœuds est pondérée par un poids $W_j$. La somme des signaux ainsi pondérés, que l’on nommera $\sigma$, est comparée à $\theta$. Si $\sigma$ dépasse $\theta$, le neurone émet un signal $y = 1$ qui est transmis au neurone suivant. Dans le cas contraire, le neurone émet la valeur $y = 0$.

La fonction effectuant la comparaison, notée $A$, se nomme fonction d’activation. Elle renvoie $0$ ou $1$ selon la valeur de $\sigma$.

Ce comportement simule très grossièrement le fonctionnement d’un neurone biologique. En langage mathématique, le processus décrit ci-dessus donne :

\begin{align}
\sigma &= X_1 \times W_1 + X_2 \times W_2 + X_3 \times W_3 \\
&= \sum\limits_{j=1}^{3} X_j \times W_j \\
A(\sigma) &= \left\{ 1 \; si \; \sigma \geqslant \theta, \quad 0 \; sinon \right\} \\
y &= A(\sigma)
\end{align}

(le symbole $\sum\limits_{j=1}^{3}$ se lit « somme pour j égale 1 à 3 »)

Note mathématique : Pour simplifier les calculs, on effectue une manipulation très simple : on fait passer $\theta$ à gauche du signe $=$ et on appelle $b$ la constante $-\theta$ ($b$ vient de “bias” en Anglais, ou biais). On nomme $\sigma’$ la nouvelle valeur ainsi calculée. Cela donne donc à présent :

\begin{align}
\sigma’ &= \sum\limits_{j=1}^{3} X_j \times W_j + b \quad avec \; b = -\theta \\
A(\sigma’) &= \left\{ 1 \; si \; \sigma’ \geqslant 0, \quad 0 \; sinon \right\} \\
y &= A(\sigma’)
\end{align}

… et la représentation suivante, exactement équivalente, où l’activation n’intervient plus lorsque $\sigma$ dépasse $\theta$ mais lorsque $\sigma’$ dépasse $0$ :

Optimisation du neurone

La raison d’être d’un réseau neuronal est de prédire, classifier, calculer, bref de fournir un résultat le plus exact possible. Imaginons par exemple que nos $X_j$ soient la taille, le poids et l’âge d’une personne, et nous cherchons en sortie à déterminer si la personne souffre d’obésité ou non (donc 2 catégories).

Il nous faut donc trouver les valeurs des $W_j$ et de $b$ (nos paramètres) qui donnent en sortie une valeur de $y$ correcte. Pour cela, nous devons utiliser un jeu de données comportant, pour un échantillon d’individus, les données suivantes :

  • $X_{i, 1}$: Taille de l’individu $i$
  • $X_{i, 2}$: Poids de l’individu $i$
  • $X_{i, 3}$: Age de l’individu $i$
  • $y_i$: Obésité (oui/non) de l’individu $i$

Notez que ces quatre variables ont des valeurs spécifiques à chaque individu, alors que les paramètres $W_j$ et $b$ sont communs à tous.

En l’absence d’information précédente, nous commençons avec des valeurs aléatoires pour nos paramètres $W_j$ et $b$. Pour chaque individu $i$ de notre échantillon, notre neurone calcule une réponse binaire $\hat y_i$ concernant son obésité : 1 si le neurone est activé (c’est-à-dire quand $\sigma’ \geqslant 0$), 0 sinon. Ce résultat $\hat y_i$ est l’estimation par notre neurone de l’obésité de l’individu.

Remarque : pour des raisons d’optimisation des calculs, on ajoute généralement une « variable » supplémentaire $X_{i, 0}$ toujours égale à 1 quelque soit l’individu observé. Dans la combinaison linéaire avec les poids, cette variable se voit alors affecter un poids $W_0 = b$. Cela permet d’intégrer la constante $b$ à la somme dans l’expression de $\sigma’$ comme suit :

$$
\sigma’ = \sum\limits_{j=0}^{3} X_{i, j} \times W_i  \quad avec \; W_0 = b \; et \; X_{i, 0} = 1 \; pour \; chaque \; individu \; i
$$

Avec des paramètres aléatoires, ces prédictions seront nécessairement très erronées. Mais nous pouvons à présent comparer l’estimation $\hat y_i$ à la vraie valeur $y_i$ pour chaque membre de l’échantillon et en déduire s’il faut augmenter ou diminuer chaque paramètre.

Nous faisons donc bouger $W_1$ dans la direction (+ ou -) qui rapprochera les $\hat y_i$ des $y_i$. Nous allons faire de même pour $W_0$, $W_2$ et $W_3$, et tout ceci pour chacun des individus de l’échantillon.

Note mathématique : le neurone définit une séparation linéaire entre les deux classes de $\hat y$. Le but de l’optimisation est d’orienter cette séparation de manière à ce que tous les $y=0$ soient d’un côté, et tous les $y=1$ de l’autre. Avec deux variables en entrée, la séparation est une droite qui coupe le plan en deux. Avec davantage de variables, elle devient un plan puis un hyper-plan.

Par exemple pour $W_1$, nous allons le remplacer par une nouvelle valeur calculée comme suit :

$$
W_1 \gets W_1 + \sum\limits_{i=1}^{m}[(y_i – \hat y_i) X_{i,1}]
$$
où $y_i, \hat y_i$ représentent respectivement la valeur réelle et la prédiction pour l’individu $i$
$X_{i, 1}$ est la taille de l’individu $i$
$m$ est le nombre d’individus dans l’échantillon.

En pratique, cette opération revient à réorienter le séparateur et à le déplacer par translation jusqu’à ce qu’il définisse la bonne frontière entre les deux classes.

Dans l’exemple ci-contre, nous avons 3 individus notés $1, 2, 3$. Les points bleus correspondent à $y_i=1$, le point transparent à $y_i=0$. Donc ici nous avons $y_1 = 0$ (pas d’obésité constatée) et $y_2 = y_3 = 1$ (obésité constatée). Cela constitue notre référence pour entraîner l’algorithme.

Pour simplifier la représentation, je ne représente que deux variables $X_1$ et $X_2$ et je suppose qu’il n’y a pas de terme de biais (autrement dit $W_0 = 0$).

La droite bleue est la frontière définie par le neurone. La zone bleu clair correspond aux valeurs de $X_1$ et $X_2$ qui donnent une prédiction $\hat y_i$ positive ($=1$, obésité prédite), la zone incolore aux prédictions négatives ($\hat y_i=0$, pas d’obésité prédite).

L’algorithme du Perceptron va faire pivoter la droite jusqu’à ce que les trois observations soient correctement classifiées. 

Dans un monde idéal, cette procédure est répétée jusqu’à ce que toutes les erreurs soient corrigées et nous pouvons alors penser que notre neurone sait parfaitement prédire l’obésité ou non d’un individu à partir des trois variables fournies. Dans la réalité, ce n’est pas aussi simple car les données sont entachées de « bruit » aléatoire qui fait qu’il y a rarement une relation mathématique parfaite entre nos variables et notre résultat. On détermine donc un seuil d’approximation $\epsilon$ considéré comme satisfaisant et on arrête la procédure une fois que la moyenne des écarts (en valeur absolue) entre réalité et prédictions passe sous ce seuil. Autrement dit, on s’arrête quand :

$$
\frac1m \sum\limits_{i=1}^{m} |y_i – \hat y_i| \leqslant \epsilon
$$

Note : les matheux remarqueront que la plupart des calculs ci-dessus peut s’écrire sous forme d’opérations matricielles. En pratique, on utilise justement le calcul matriciel autant que possible car de nombreuses bibliothèques de fonctions optimisent ces opérations de façon bien plus efficace que si on les effectuait séquentiellement comme décrit ci-dessus.

Mise en réseau

A l’aide de ce simple neurone, nous sommes déjà capable de traiter des cas de classification simples. Mais il est très limité ; en particulier il ne peut classifier parfaitement que des groupes « linéairement séparables », c’est-à-dire qui peuvent être séparés par une frontière rectiligne. Pour tenter de pallier ce problème, nous allons mettre plusieurs neurones en réseau. C’est ce que nous verrons dans le prochain article.


Article précédent : Introduction

References   [ + ]

1. A titre personnel, je trouve cette analogie utile pour une compréhension au niveau intuitif, mais elle devient rapidement plus encombrante qu’aidante dès qu’on rentre dans le détail. J’y ferait occasionnellement référence par la suite, mais il faudra aussi pouvoir s’en détacher.
2. Je demande pardon aux éventuels spécialistes en physiologie pour cette simplification outrancière du fonctionnement de nos neurones…
3. Ce modèle, nommé Perceptron, date de 1957 et constitue une bonne entrée en matière pour comprendre la logique des réseaux neuronaux