\chapter{Réseaux de neurones}

\section{Principe}
L'idée du réseau de neurones formel vient de l'étude du cerveau humain. Le
cerveau humain est composé d'un ensemble de cellules appelées neurones. Un
neurone est composé d'un noyau,  de connexions entrantes (les dendrites) et
d'une connexion sortante, l'axone. L'influx nerveux se déplace toujours des
dendrites vers le noyau et  du noyau vers l'axone. L'influx transmis dans
l'axone,  est   fonction  de  la   valeur  de  l'influx  dans   chacune  des
dendrites. Certaines dendrites peuvent  avoir un effet moteur favorisant la
transmission d'une  information dans l'axone, d'autres au  contraire ont un
effet inhibiteur  qui bloque la  transmission de l'influx dans  l'axone. Il
semble  que  le noyau  agisse  comme un  sommateur  des  influx venant  des
dendrites, en affectant un poids  (qui peut être négatif) à chacune d'entre
elles. Si  la somme  des influx est  supérieure à  un seuil, un  influx est
transmis dans l'axone. Si la somme  est inférieure à ce seuil, aucun signal
n'est  transmis.   Un axone  peut,  pas la  suite,  soit  se subdiviser  en
plusieurs filaments qui serviront chacun d'entrée à d'autres neurones en se
connectant aux  dendrites de ces  neurones via des synapses,  soit attaquer
directement un élément moteur (muscle par exemple).

%%\section{Implementation} %% useless

\section{Les mémoires associatives (modèle de Hopfield)}
\subsection{Présentation}
Les mémoires associatives sont un type de réseau neuronal qui ne permet de
stocker un  certain nombre  de ``forme'' et,  en fournissant au  réseau une
partie  des  formes stockées,  nous  souhaitons  que  le réseau  reconstitue
l'intégralité de la forme stockée.

Un  exemple   typique  d'utilisation  d'une  mémoire   associative  est  la
reconnaissance et  la reconstruction d'images. On stocke  un certain nombre
d'images. Le  réseau doit  par la suite  reconstruire à partir  d'un détail
qu'on lui fournit l'ensemble de l'image la plus proche de ce détail.

\subsection{Principe}
Tous les neurones d'une mémoire associative sont connectés les uns aux
autres. Chacun des neurones peut fournir une valeur d'activation +1 ou
-1. La valeur d'activation d'un neurone dépend de la somme pondérée de ses
entrées ($O{i}=\sum_i W_{ji}O{i}$ avec $W$ le poids et $O$ la valeur). On
remarque que l'on peut évaluer le réseau de deux manières : asynchrone ou
synchrone. Dans le mode synchrone, tous les éléments du réseau évoluent en
même temps en calculant simultanément les valeurs de chaque neurone. Dans
le mode asynchrone, les neurones évoluent les uns après les autres, de
manière aléatoire par exemple. Dans le cas des mémoire associatives, il est
de coutume d'utiliser le mode asynchrone de préférence au mode synchrone.

\subsection{Évaluation}
Pour évaluer une mémoire associative, on initialise les valeurs de
chaque neurone avec les valeurs d'entrée, puis on itère le processus
précédant (de manière synchrone ou asynchrone) jusqu'à arriver à une image
stable du réseau. La valeur de chaque neurone est alors notre résultat.

\subsection{Apprentissage}
L'apprentissage consiste dans la mémoire associative à définir les valeurs
des poids des entrées de chaque neurone à l'aide d'exemples.
On peut facilement démontrer que les poids $W_{ij}$ d'une entrée $j$ sur un
neurone $i$ doivent être:
\begin{displaymath}
W_{ij} = \frac{1}{N} \sum_{k=1}^PO^k_jO^k_i
\end{displaymath}
Avec:
\begin{itemize}
\item $W_{ij}$: le poids d'une entrée $j$ sur un neurone $i$
\item $O^k_i$: La valeur du neurone $i$ pour l'exemple $k$
\item $P$: Le nombre d'exemples
\item $N$: Le nombre de neurones.
\end{itemize}

\section{Les perceptrons et les réseaux à couches}
\subsection{Principe}
Dans un  réseau à  couches, la  sortie d'un neurone  ne peut  alimenter que
l'entrée d'un  neurone situé  dans une couche  postérieure. On ne  savait au
début  faire l'apprentissage  de ces  réseaux que  sur deux  couches. Cette
limite   disparut  dans   les  années   80   avec  la   découverte  de   la
rétro-propagation (backprop). Un neurone  devient actif si et seulement si
la fonction d'activation appliquée sur  la somme pondérée de ses entrées est
supérieure   à   un  seuil   donné   (c'est-à-dire  $f(\sum_iW_{ij}O_i)   >
{seuil}$). Les  résultats théoriques montrent que la  fonction d'activation ne
doit  pas être  linéaire  pour que  la  retro-propagation fonctionne.  Pour
évaluer  le réseau, on  calcule la  valeur de  chaque neurone  couche après
couche.

\subsection{Apprentissage par rétro-propagation}
Nous   ne   détaillerons   pas   la  démonstration   de   l'algorithme   de
rétro-propagation. Il peut se résumer en trois équations:
\begin{equation}
 W_{ji} = W_{ji} + \delta_j f(N_i)
\end{equation}
\begin{equation}
 \delta_j = (T_j - f(N_j)) f'_j(N_j)
\end{equation}
\begin{equation}
 \delta_j = \sum_k\delta_kW_{kj} f'_j(N_j)
\end{equation}
Avec:
\begin{itemize}
\item $W_{ji}$: Le poids de l'entrée $i$ du neurone $j$
\item $\delta_i$: L'erreur du neurone $i$
\item $T_i$: La valeur théorique du neurone $i$
\item $f$: La fonction d'activation
\item $N_i$: La somme pondérée des entrées du neurone $i$ (c'est à dire la
  valeur du neurone avant d'être réévaluée par $f$)
\end{itemize}
La première  équation indique comment  calculer la nouvelle valeur  du poids
$W_{ji}$  en fonction  de l'erreur  $\delta$. La  seconde  équation indique
comment  calculer  l'erreur $\delta$  pour  un  neurone  sur la  couche  de
sortie. La dernière  équation indique  comment calculer  l'erreur $\delta$
pour un neurone d'une couche intermédiaire.

\section{Les réseaux de neurones logiques (ALN)}
\subsection{Principes}
Dans un  ALN, un  neurone est une  porte logique  à deux entrées  (gauche et
droite) booléennes et une sortie booléenne. Cette porte peut-être une porte
OU, une  porte ET, une porte DROITE  (la sortie vaut la  valeur de l'entrée
droite)  ou  une  porte  GAUCHE  (la  sortie vaut  la  valeur  de  l'entrée
gauche).  Un réseau de  neurones logiques  est un  arbre binaire  où chaque
noeud est un neurone. Un réseau  de profondeur $n$ calcule donc un 1~bit en
sortie pour $2^{n-1}$~bits d'entrée.

\subsection{Apprentissage}
L'apprentissage des réseaux logiques se fait par modification des fonctions
des portes logiques. Au début,  la valeur des fonctions des portes logiques
est  aléatoire. Puis,  par présentation  d'exemples, et  comparaison  de la
sortie  théorique  avec  la  sortie  calculée, on  modifie  la  valeur  des
fonctions de  certaines portes. Le  problème est de déterminer  quelles sont
les portes à modifier et comment les modifier.

La    première   notion   que    l'on   peut    définir   est    celle   de
\emph{responsabilité}. Un  neurone est \emph{responsable}  si le changement
de sa valeur de sortie change la valeur de la sortie du réseau (en gardant,
bien entendu, les valeurs des autres neurones). On peut facilement savoir si
un  noeud  est responsable  en  partant du  noeud  de  sortie et  calculant
récursivement si  un changement  sur l'entrée de  droite et/ou  l'entrée de
gauche modifie la valeur de sortie du neurone.

Il  faut ensuite  remarquer  que le  type  de fonction  n'a d'influence  que
lorsque les entrées sont $(0,1)$  ou $(1,0)$. C'est donc seulement pour ces
valeurs  que   l'on  peut  adapter  la   valeur  de  sortie   (et  donc  la
fonction). Une technique simple consiste à associer, pour chaque neurone, à
l'entrée $(0,1)$  un compteur $C_{0,1}$  et à l'entrée $(1,0)$  un compteur
$C_{1,0}$. En  phase d'apprentissage, lorsque l'entrée est  $(0,1)$, que le
neurone  est responsable  et que  la sortie  théorique est  1,  le compteur
$C_{0,1}$  est  incrémenté; si  la  sortie  théorique  est 0,  le  compteur
$C_{0,1}$ est décrémenté. On applique  le même algorithme pour $C_{1,0}$. A
chaque étape, la sortie d'un neurone est calculée à partir de la valeur des
deux  compteurs. Si  les compteurs  sont positifs  tous les  deux,  alors le
neurone se comportera  comme un OU. Si ils sont négatifs  tous les deux, le
neurone se comportera comme un ET.  Si le compteur $C_{0,1}$ est positif et
$C_{1,0}$  est négatif,  alors le  neurone  se comportera  comme une  porte
DROITE et symétriquement comme une porte GAUCHE.

\subsection{Avantages et inconvénients}
Malheureusement,  cette  méthode  d'apprentissage  est  trop  simple  et  à
tendance à entraîner le réseau vers un minimum local. D'autres méthodes ont
été développées pour pallier cet inconvénient.

D'un autre  coté, les ALUN  figurent parmi les  réseaux de neurones  les plus
rapides. % FIXED
On  peut effectivement facilement élaguer  des parties du réseau  lors de
l'évaluation et de l'apprentissage.

De plus,  une fois  l'apprentissage terminé, il  est aisé de  construire un
réseau électronique reprenant  l'architecture logique apprise. Des réseaux
tels  que ceux-ci  peuvent calculer  les différentes  valeurs des  portes en
parallèle  et  ont  des  temps  de  calcul  incomparablement  supérieurs  à
n'importe quel autre système.

\section{Les réseaux de Kohonen}
\subsection{Principe}
Les réseaux de  Kohonen sont des réseaux à  apprentissage non supervisé. Il
n'y a pas d'apprentissage  par présentation d'exemple, mais auto-adaptation
à  des  stimuli   d'entrée.  Le  réseau  est  constitué   de  deux  couches
seulement.  Chaque  neurone  de  la  couche d'entrée  alimente  tous  les
neurones de la couche de sortie et tous les neurones de la souche de sortie
sont  connectés entre  eux. On  associe à  chaque couple  de neurone  de la
couche de sortie  une distance. Un seul neurone de la  couche de sortie est
actif lorsqu'une entrée est présentée. Le  but du réseau est de fournir une
sortie identique pour des entrées proches.

\subsection{Évaluation}
On calcule la valeur d'un neurone de  la couche de sortie en fonction de la
somme pondérée  de chaque neurone d'entrée  et de la somme  pondérée par la
distance de chaque  neurone de la couche de sortie. On  itère le calcul des
valeurs des  neurones de  la couche de  sortie jusqu'à obtenir  un résultat
stable et  on considère le neurone de  la couche de sortie  ayant la valeur
minimale comme le neurone actif\footnote{Rappel: il ne peut y avoir qu'un
neurone actif}.

\subsection{Apprentissage}
Après l'évaluation du réseau, on modifie les poids de chaque entrée des
neurones de la couche de sortie en fonction de sa distance avec le neurone
actif et de la valeur de l'entrée.

\section{Conclusion}
L'approche connexionniste présente plusieurs avantages : le premier est que
la connaissance est distribuée dans le  réseau et que la panne d'une partie
du réseau n'empêche pas forcément l'ensemble du système de fonctionner.

Surtout, ces  systèmes ont  une capacité à  la généralisation.  Comme l'ont
montré plusieurs équipes, lorsque le  réseau a appris certaines formes (des
lettres  par exemple),  il  est  capable de  reconnaître  ces mêmes  formes
légèrement   déformées,   sans   qu'il    soit   besoin   de   refaire   un
apprentissage. Enfin,  la solution d'un problème peut,  pour certains types
de  réseaux,  être donnée  de  façon  quasi-instantannée, puisqu'il  suffit
d'effectuer une passe à travers le réseau.

Les réseaux neuronaux ne résoudront  pas, du jour au lendemain, l'ensemble
des problèmes  de l'informatique. En particulier, on  doit toujours prendre
soin de comparer les résultats obtenus avec les réseaux de neurones formels
et  les résultats obtenus  par les  méthodes classiques  (statistiques par
exemple)  et se  méfier  des  phénomènes de  mode  qui accompagnent  chaque
nouvelle méthode. Il s'agit  cependant d'un champ de recherche complètement
nouveau, et d'une approche absolument différente qui mérite d'être examinée
avec intérêt.

