\chapter{Résultats}
  
Dans cette section, sauf mention contraire, les figures se composent de
trois graphes.  Le premier en haut à gauche indique les données de départ.
Le second en haut à droite montre la sortie du réseau. La sortie est testée
sur les données de la base d'apprentissage et sur les valeur de (x,y) sur
$[-1;1]^2$ avec un pas de 0.05. Enfin, le graphique du bas représente
l'évolution de l'erreur sur la base d'apprentissage sur 1000 époques.

  \section{Perceptron simple}
    \subsection{Tests simples}

Pour tester  notre bibliothèque, nous  utilisons tout d'abord un  test tout
simple. On a ici  (en \ref{b07}) créé un PMC d'une couche  auquel on a fait
apprendre deux points: un vert  un rouge. Le réseaux converge rapidement (1
ou 2 itérations) vers un résultat sans surprises.

      \begin{figure}[!ht]
        \caption{\label{b07} Problème simple avec un PMC une couche}
        \includegraphics[width=\linewidth/2]{bench/07in}
        \includegraphics[width=\linewidth/2]{bench/07out}\\
        \begin{center}
          \includegraphics[width=\linewidth/2]{bench/07error}
        \end{center}
      \end{figure}
      % 1 : PMC une couche, deux points, converge très vite
    
    \subsection{Limite rapidement atteinte}
    
On essaye  maintenant d'appliquer  notre PMC à  une couche sur  un problème
plus complexe (que l'on voit en \ref{b08}).  On remarque qu'aucune solution
n'est trouvée.  Ce  résultat est normal vu que le  problème posé ne possède
pas  de solution  linéaire.   Un PMC  à  une couche  n'a  pas les  capacité
d'apprendre des problème de cette complexité.

      \begin{figure}[!ht]
        \caption{\label{b08} Problème non résolvable par un PMC à une couche}
        \includegraphics[width=\linewidth/2]{bench/08in}
        \includegraphics[width=\linewidth/2]{bench/08out}\\
        \begin{center}
          \includegraphics[width=\linewidth/2]{bench/08error}
        \end{center}
      \end{figure}
      % 2 : PMC une couche sur pb plus complexe, marche pas...

      \FloatBarrier

  \section{Utilisation d'une couche intermédiaire}
    \subsection{Choix de $\epsilon$}
    
On ajoute  donc maintenant  une seconde couche  de 10 neuronnes.   On place
$\epsilon$\footnote{Rappel  :  $\epsilon$ correspond  à  la pondération  de
  l'apprentissage  de   l'exemple  en   cours  de  traitement   pendant  la
  back-propagation  par rapport  aux valeurs  actuelles des  poids  pour un
  neuronne} sur $0.9$.  On remarque sur la figure \ref{b10} que le résultat
du PMC varie enorment et n'arrive pas à converger.

      \begin{figure}[!ht]
        \caption{\label{b10} Avec $\epsilon = 0.9$, le réseau converge mal}
        \includegraphics[width=\linewidth/2]{bench/10in}
        \includegraphics[width=\linewidth/2]{bench/10out}\\
        \begin{center}
          \includegraphics[width=\linewidth/2]{bench/10error}
        \end{center}
      \end{figure}
      % 3.1 deux couches epsilon fort

On  place maintenant  espilon à  l'extrème inverse  : epsilon  =  0.05.  On
remarque sur la  figure \ref{b11} que notre problème  est résolu en environ
100 époques.

      \begin{figure}[!ht]
        \caption{\label{b11} Avec $\epsilon = 0.05$, converge lentement}
        \includegraphics[width=\linewidth/2]{bench/11in}
        \includegraphics[width=\linewidth/2]{bench/11out}\\
        \begin{center}
          \includegraphics[width=\linewidth/2]{bench/11error}
        \end{center}
      \end{figure}
      % 3.2 deux couches epsilon faible
    
On place maintenant $\epsilon = 0.2$. Notre problème est alors résolu en 50
époques environ, soit deux fois  moins d'époques qu'avec $\epsilon = 0.05$. 
On remarque  que epsilon  doit être  choisi avec prudence,  si il  est trop
fort, le réseau  convergera difficilement, n'arrivant pas à  se fixer a une
solution.  Si  elle est  trop faible, le  réseau convergera  lentement.  La
règle   des  $\delta-\delta$   et   les  optimisations   du  type   R-prop,
etc...\footnote{non-implémentées}  permettraient de rendre  moins important
le choix de $\epsilon$ sur l'apprentissage du réseau.

      \begin{figure}[!ht]
        \caption{\label{b09} $\epsilon = 0.20$ semble être un bon compromis}
        \includegraphics[width=\linewidth/2]{bench/09in}
        \includegraphics[width=\linewidth/2]{bench/09out}\\
        \begin{center}
          \includegraphics[width=\linewidth/2]{bench/09error}
        \end{center}
      \end{figure}
      % 3.3 ok
    
      \FloatBarrier

    \subsection{Choix de $\Phi$}
    
Dans les graphique précédant,  nous utilisions une sigmoide normalisé entre
-1.5 et 1.5 comme fonction  d'activation (notée $\Phi$).  Nous avons essayé
d'utiliser d'autre fonctions d'activation.
    
La première valeur de $\Phi$ venant naturellement est la fonction linéaire.
Les résultats  sont très  mauvais (\ref{b13}). Un  neurone ayant  une forte
sortie pertube l'intégralité du réseau.

      \begin{figure}[!ht]
        \caption{\label{b13} $\Phi(x) = x$}
        \includegraphics[width=\linewidth/2]{bench/13in}
        \includegraphics[width=\linewidth/2]{bench/13out}\\
        \begin{center}
          \includegraphics[width=\linewidth/2]{bench/13error}
        \end{center}
      \end{figure}
      % 4.1 phi(x) = x
    
Pour  normaliser la sortie  des neurones,  on pense  ensuite à  la fonction
binaire (renvoyant  -1 ou 1). Cette  fonction est en  contradiction avec la
théorie de la back-propagation vu qu'elle n'est pas dérivable. On sait déjà
que les  résultats ne  seront pas bon  quoi que  l'on fasse. On  trouve les
résultats (attendus) en \ref{b14} en utilsiant $\Phi'(x) = 1$.

      \begin{figure}[!ht]
        \caption{\label{b14} $\Phi(x) = -1 \text{ ou } 1$}
        \includegraphics[width=\linewidth/2]{bench/14in}
        \includegraphics[width=\linewidth/2]{bench/14out}\\
        \begin{center}
          \includegraphics[width=\linewidth/2]{bench/14error}
        \end{center}
      \end{figure}
      % 4.2 phi(x) = 1 ou -1
    
Naturellement,  on pense  à utiliser  une  fonction proche  de la  fonction
binaire mais dérivable.  Nous avons utilisé une sigmoide normalisée entre 1
et -1  \cite{All02}.  Les  valeur des neuronnes  de sortie se  trouvent par
conséquent entre -1 et 1 alors  que les valeurs optimqle demandés au réseau
sont -1 et 1.  Par consequent, la sortie du PMC ne peut jamais atteindre la
valeur attendue.   La back-propagation corrige alors toujours  les poids et
ceux-ci  atteignent  des grandes  valeurs.   Ces  valeurs empechent  toutes
possibilités de  retour.  Par conséquent,  les résultats de  cette fonction
sont généralement le premier minimum  local trouvé (souvent la même couleur
rempli  tout l'écran).   Apres quelques  tests, on  trouve  qu'une fonction
variant de -1.5 à 1.5 est préférable.

     % Pas de photos, trop chiant....
     % 4.3 phi ne peut depasser -1/1
    
On    remarque    que    la    fonction   tanh    donne    des    résultats
équivalents\footnote{voir  meilleurs}  à ceux  de  la sigmoide.  Néanmoins,
l'utilisation de la  sigmoide permet d'optimiser le code  en calculant plus
facilement   la   dérivée    lors   de   la   back-propagation\footnote{non
  implémenté}\cite{YJ}.

      \begin{figure}[!ht]
        \caption{\label{b12} $\Phi(x) = \tanh(x)$}
        \includegraphics[width=\linewidth/2]{bench/12in}
        \includegraphics[width=\linewidth/2]{bench/12out}\\
        \begin{center}
          \includegraphics[width=\linewidth/2]{bench/12error}
        \end{center}
      \end{figure}
      % 4.4 phi = tanh

      \FloatBarrier

    \subsection{Valeurs d'initialisations}
    
Pour tous tests, nous avons  utilisé une initialisation aléatoire des poids
des  neurones.  Néanmoins, nous  avons  remarqué  une  forte dépendance  de
l'initilisation  sur  la  convergence   du  PMC  (allant  même  jusqu'à  la
non-convergence du  réseau au  bout de 1000  époques).  Le projet  à l'état
actuel  n'implémente pas d'algorithme  permettant d'initialiser  de manière
plus intelligente  les poids des  entrées des neurones.  Néanmoins,  il est
certain que de tels algorithmes amélioreraient fortement les résultats.

    \subsection{Pas de solutions pour tous les problèmes}

Lors de nos recherches, nous avons  observé des cas que nous n'avons pas su
résoudre même en (sur-)redimentionant notre PMC. La figure \ref{b16} est un
exemple de cas ne fonctionnant pas.

      \begin{figure}[!ht]
        \caption{\label{b16} Un exemple de problème que nous n'avons pas 
          réussi à résoudre}
        \includegraphics[width=\linewidth/2]{bench/16in}
        \includegraphics[width=\linewidth/2]{bench/16out}\\
        \begin{center}
          \includegraphics[width=\linewidth/2]{bench/16error}
        \end{center}
      \end{figure}
      % 5 : Ca marche pas tjrs...
  
Vous   trouverez   en   annexe   une  gallerie   des   quelques   résultats
supplémentaires du réseau.


