Nouvelles Chroniques d'Amethyste

Penser au Sens, pas au Verbe

Réseau de neurones: le perceptron simple

Poster un commentaire

Je souhaite entamer une petite série sur quelques techniques d’intelligence artificielle. Il ne s’agira que d’une initiation, pas d’un cours complet que je serai bien incapable d’élaborer.

Il n’est pas étonnant que la recherche en intelligence artificielle à très tôt cherchée à s’inspirer du cerveau. Un des champs de recherche les plus intéressant dans cette voie sont les réseaux de neurones ou réseau neuro-mimétiques. C’est par ce volet que nous entamerons notre exploration…

Les réseaux de neurones sont actuellement très utilisés dans de nombreux domaines industriels ou de la vie de tous les jours: reconnaissance d’images, d’écriture de sons. Analyse de cours boursiers, classifications, ils font fonctionner des sondes spatiales ou des robots sur Mars…

Présentation

Un neurone biologique peut être représenté ainsi:

2015-09-13_17-35-48

La fonction d’un neurone est de transmettre l’influx nerveux, un signal électrique, mais il ne s’agit pas d’une simple liaison passive. Structurellement le neurone est relié d’une part à un ensemble de dendrites et d’autre part à un axone.

Les dendrites constituent les entrées et servent à accumuler de la charge électrique au niveau du neurone jusqu’à atteindre un certain seuil. C’est alors que le neurone transmet un signal via l’axone qui agit comme sortie du neurone.

L’expérience montre de plus que les dendrites ne sont pas toutes équivalentes, certaines contribuent plus fortement que d’autre à atteindre le seuil, on associe donc les dendrites à un poids.

 

Les réseau de neurones sont une histoire ancienne qui a démarrée dès la fin des années 50 avec les travaux de deux neurologues: Warren Mc Culloch et Walter Pitts (morts curieusement la même année). Ils ont inventé le « neurone formel » qui s’inspire du neurone biologique décrit plus haut.

 

2015-09-06_16-50-40

On dispose d’une série d’entrées x1…x2, chacune associées à un poids w1…w2. Les entrées sont l’équivalent des dendrites. On calcule la somme S:

2015-09-06_16-57-09

Dans laquelle b représente un biais. Il est parfois pratique de considérer le biais comme une entrée dont la valeur vaut toujours 1 affectée du poids b.

S est ensuite passée à travers une fonction dite fonction de transfert. Dans le modèle de Pitts et McCulloch il s’agit d’une fonction de seuil (ou fonction de Heaviside) qui renvoie 0 ou 1 en fonction de la valeur de S:

2015-09-06_17-02-03

Le résultat est aussi appelé « sortie du neurone« , c’est l’analogue du signal transmit par l’axone.

Une étude de diverses fonctions de transfert:

https://visualstudiomagazine.com/articles/2015/06/01/alternative-activation-functions.aspx

 

Pitts et McCulloch n’ont pas explicité la manière de fournir des valeurs de biais et de poids. Vers la même époque le physiologiste Donald Hebb a décrit ce qui est appelé la règle de Hebb. Plus tard  Franck RosenBlatt améliora cette règle afin de tenir compte de l’erreur de sortie pour proposer le Perceptron qui est le premier modèle informatique opérationnel de réseau de neurones. C’est le modèle qui va faire l’objet de cet article.

Le perceptron

Le Perceptron simple est caractérisé par:

  • Le perceptron est constitué d’un unique neurone qui répond à l’équation proposée plus haut.
  • La fonction de transfert est une fonction de seuil ou toute autres fonction du même type.
  • A la différence avec le modèle de neurone formel est que le neurone peut « apprendre » en utilisant les règles de Hebb/RosenBlatt.

Quel type de problème peut résoudre le Perceptron?

Revenons sur cette équation:

2015-09-06_16-57-09

Si vous vous rappelez de vos cours de lycée, vous reconnaissez l’équation d’un plan dans un espace de dimension N, ce que les mathématiciens appellent hyper-plan.

Un plan sépare l’espace géométrique en deux parties, nous dirons que l’on a un classificateur linéaire. Le perceptron va donc être capable de classer des entrées et décider si elles corresponde à un côté du plan ou bien à un autre.

C’est la fonction de transfert qui distribue la réponse S d’un côté ou l’autre du plan.

A ce stade ça devrait paraître un peu abstrait, le mieux est de faire tourner du code et observer ce qui se passe.

Vous trouverez le code dans mon espace Github:

https://github.com/DeLeneMirouze/NeuralNetwork

Mais je voudrai insister sur un point. Les mathématiques du Perceptron et d’une façon générale des réseaux de neurones sont très simples, mais pleines de pièges. On a vite fait d’avoir l’impression de comprendre alors qu’il n’en est rien.

C’est pourquoi je vous propose de tomber volontairement dans tous les pièges en écrivant vous même votre propre code. Et vous verrez que souvent rien ne marchera du premier coup, mais vous allez apprendre énormément et en profondeur votre modèle. C’est comme cela que tout le monde fait et c’est payant.

Autre chose, je ne prêtant absolument pas le code prêt pour être industrialisé. Il a lourdement besoin d’être optimisé.

Présentation du projet

On va s’intéresser au projet Perceptron et laisser les autres tranquilles pour l’instant. Il s’agit d’une application Console qui démontre le fonctionnement du Perceptron en essayant de reconnaître des lettres de l’alphabet.

Nos lettres sont modélisées dans le fichier Alphabet.txt sous la forme d’une matrice 5×6. Nous allons entraîner le Perceptron à reconnaître la lettre B parmi un choix de plusieurs autres lettres ainsi que des B avec plus ou moins de bruits, c’est à dire d’erreurs.

On commence par instancier la classe Perceptron. Elle modélise un Perceptron à partir de la classe Neurone qui modélise le comportement d’un neurone. Vous constaterez que j’utilise la fonction de transfert sigmoïde qui ressemble un peu à la fonction de seuil, mais avec des changements plus graduels.

2015-09-06_17-31-17

Apprentissage du Perceptron

La partie intéressante du programme est la phase d’apprentissage qui est implémentée dans Perceptron.Entrainer.

L’apprentissage est effectué sur un jeu d’essai. Une série de B et d’autres lettres avec un éventuel bruit. Ce jeu d’essai sera présenté un certain nombre de fois au Perceptron jusqu’à la minimisation d’une fonction d’erreur.

Puisque chaque lettre est modélisée dans une matrice 5×6, alors le Perceptron disposera de 5×6 = 30 entrées avec autant de valeur de poids plus une valeur de biais. La phase d’apprentissage consiste à ajuster le biais et les poids de façon à minimiser une fonction d’erreur calculée sur chaque itération du jeu de test.

Le code important est celui-ci:

 

while (iteration < maxIteration && erreurCourante[0] > erreurCible)
{
   // pour chaque élément de test
   foreach (string lettre in jeuEssai.Keys)
   {
      // récupère le jeu d'entraînement courant
      double[] entraineur = jeuEssai[lettre];
      // détermine si c'est la valeur cible (1) ou pas (-1)
      int valeurCible = (lettre == lettreCible) ? 1 : 0; // la fonction de transfert doit donc produire des -1 ou des 1
 
      double sortie = neurone.CalculerSortie(entraineur);
      // de combien la sortie s'écarte de la cible
      double ecart = valeurCible - sortie;
 
      if (ecart != 0)
      {
         // réévalue le poids de chaque entrée
         for (int p = 0; p < neurone.NbEntrees; p++)
         {
            neurone.Poids[p] = neurone.Poids[p] + (pas * ecart * entraineur[p]);
         }
         // réévalue le biais
         // le biais est considéré comme une entrée supplémentaire avec un coefficient toujours égal à 1
         neurone.Biais = neurone.Biais + (pas * ecart);
      }
   }
 
   ++iteration;
}

L’algorithme est le suivant:

 

  1. On commence par obtenir la valeur cible espérée (ligne 9). On attend la valeur 1 si on présente au Perceptron un B et 0 dans tous les autres cas.
  2. On présente alors un des éléments du jeu d’essai et on calcule la sortie qu’en donne le Perceptron (ligne 11)
  3. On calcule l’écart qui est la différence entre la sortie et la valeur espérée (ligne 13)
  4. On ajuste chaque valeur de poids ainsi que le bais en fonction de cet écart (lignes 18 à 24)
  5. On recommence pour chaque élément du jeu d’essai et sur plusieurs itérations du jeu d’essai

Le pas est une constante dans certains modèles. C’est le pas d’apprentissage.

Plus il est élevé, plus le Perceptron apprend vite, mais risque d’osciller autour de la solution sans parvenir à l’atteindre. Plus il est petit, plus le Perceptron apprend lentement, mais risque de rester coincer dans un minimum local. Il s’agit d’un choix de compromis. Dans certains modèles il diminue dans le temps, c’est à dire avec le nombre d’itérations.

Pour chaque valeur i du poids, on calcule la nouvelle valeur en appliquant la formule de Rosenblatt:

w(N+1) = w(N) + pas * ecart * cible(i)

Dans laquelle w(N+1) est le nouveau poids et cible(i) la ième valeur de l’entrée.

 

La phase d’apprentissage produit la sortie suivante:

2015-09-06_18-02-42

On a itéré 100 fois avec le pas d’apprentissage 0.05 qui est constant dans cette implémentation.

On affiche la valeur obtenue du biais ainsi que les 30 valeurs de poids.

Phase de test

La phase de tests consiste à présenter au Perceptron des lettres qui sont ou non des B ou bien des B avec un certain niveau de bruit aléatoire. L’affichage reproduit la lettre telle qu’elle est pour le test.

2015-09-06_18-07-59

On déforme B en ajoutant de plus en plus de bruit, c’est à dire de plus en plus de case avec une valeur incorrecte dans la matrice. Entropie = 0 signifie que la lettre n’est pas déformée. Elle est évidemment reconnue par le Perceptron!

On recommence jusqu’à l’obtention d’un résultat incorrect. Il se produit avec des valeurs plus ou moins élevées de l’entropie selon l’essai.

Conclusions

Le résultat est sensible à de nombreux paramètres comme le choix de la fonction de transfert ou du pas d’apprentissage.

Le point intéressant est que le réseau apprend à reconnaître une lettre B sans que l’on ai besoin de lui décrire explicitement ce qu’est une lettre B. C’est ce qui distingue les réseaux de neurones d’un système expert.

L’avantage est qu’il est capable de fonctionner (au sens de faire mieux que le hasard) même dans des situations où le signal d’entrée est bruité, par exemple parce que l’on n’est pas absolument certain de ce qu’est une lettre B ou que l’on n’a pas certaines informations.

Notez bien le côté abstrait des poids calculés lors de la phase d’apprentissage. Il est absolument impossible de déduire quoi que ce soit de ces valeurs. Le réseau sait faire quelque chose, mais il ne sait pas dire comment il a fait.

 

Un des problèmes du Perceptron est qu’il ne peut résoudre que des problèmes linéaires (souvenez vous de l’hyper plan). Ce n’est pas la seule limitation. En 1966 Marvin Minsky et Seymour Paper ont publié un livre critique sur le Perceptron dans lequel ils étudiaient de façon systématique ses limitations. Ce travail a d’ailleurs failli mettre fin aux recherches sur les réseaux de neurones.

Il faudra attendre le début des années 80 avec les travaux de Hopfield pour que ce domaine acquiert de la rigueur et redevienne respectable. Depuis on a vu l’émergence de nombreux travaux dans ce domaine.

Les réseaux de neurones sont maintenant partout dans l’industrie. Ils aident à la classification, aux diagnostiques médicaux. Ils sont aussi sur Mars avec les sondes martiennes, dans votre bureau de poste pour lire les adresses sur une lettre, ils savent reconnaître des visages sur une photo, jouer au foot ou prédire l’évolution de cours boursier…

Un domaine passionnant.

Dans le prochain article je vais développer une version plus élaborée du Perceptron qui va corriger les défauts du Perceptron simple.

 

Bibliographie

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s