Intelligence Artificielle

Avant propos

Cette partie est dédié à Intelligence Artificielle (IA), plutôt une partie de celle ci consacré à la vulgarisation et l'utilisation des neurones artificielles.

On découvrira les fondements de cette science, le perceptron, les réseaux de neurones, ... utilisation de la bibliothèque FANN (Fast Artificial Neural Network)..., et nous nous intéresserons à l'utilisation d'un réseau de neurones.

Le but n'est pas d'écrire un éième bibliothéque ou algorithme sur le fonctionnement d'un neurone perceptron avec retro-propagation avec fonction sigmoïd, ..., mais sans réinventer la roue car il existe déjà une multitude de code (FANN libre est portable sur 22 languages) c'est plutôt l'utilisation d'un réseau de neurones. Le RNA(réseau de neurone artificielles) est un outil mais faut il encore savoir s'en servir. Le meilleur ciseau à bois ne fait pas le sculpteur!

Les RNA, c'est quoi?

Les réseaux de neurones artificielles s'inspirent du fonctionnement du cerveau et du système nerveux. C'est une modélisation mathématique et algorithmique qui simule au plus prêt des connaissances actuelles ces unités de "calcul" que nous avons par milliards dans chacun de nous. Estimation de 1000 milliards par cerveau. 


Aujourd'hui, les réseaux de neurones ont de nombreuses applications dans des domaines très variés :

  • traitement d'image : compression d'images, reconnaissance de caractères et de signatures, reconnaissance de formes et de motifs, cryptage, classification, ...
  • traitement du signal : traitement de la parole, identification de sources, filtrage, classification, ...
  • contrôle : diagnostic de pannes, commande de processus, contrôle qualité, robotique, ...
  • optimisation : allocation de ressources, planification, régulation de trafic, gestion, finance, ...
  • simulation : simulation boîte noire, prévisions météorologiques
  • classification d'espèces animales étant donnée une analyse ADN
  • modélisation de l'apprentissage et perfectionnement des méthodes de l'enseignement
  • approximation d'une fonction inconnue ou modélisation d'une fonction connue mais complexe à calculer avec précision

Description et modèle d'un neurone

Un neurone est une unité de calcul. Elle peut comporter 1 ou plusieurs entrèes et une sortie calculé (rien n'empèche de connecter lasortie vers d'autres neurones, cela ne fait quand même qu'une sortie).

  • Chaque entrée (noté x) peut varié de 0 à 1, (-1 à 1 avec fonction sigmoïd) , la sortie idem
  • Chaque entrée a un poids (noté W), valeur qui renforce plus ou moins la valeur d'entrée (pour imagé).
  • Le resultat du calcul du neurone est autre que la somme des produits de toutes les entrées et de poids, le tout passé par un "filtre" que l'on appel fonction d'activation.

 

On pourra noté le resultat comme ci :   y=Factivation ( ∑ xn x Wn )

 (la notation n'est pas pure mathématique, certains vont grincer des dents, mais je vulgarise comme dis plus haut)

la fonction f(x) d'activation peut etre une fonction

  • à seuil, resultat binaire, exemple si  f ∑ >0.5 alors renvoi 1 , sinon 0, bien pour le binaire, mais pas super pour faire de l'approximation 
  • à Sigmoîd (on utilisera plutot ce genre de fonction)
  • à tangante hyperbolique

Pour plus d'infos : 

Vidéos sympa explicative (en Québécois)

 

L'apprentissage

 Utilisé comme cela, on se doute bien qu'on ne peut avoir de résultat, on a des états entrée, on peut connaitre des états de sortie(tous ou une partie, voir aucun), mais pour les poids W, mystère. Il faut bien les initialiser à quelque chose pour que la magie opère!

C'est donc le but de l'apprentissage. Il faut apprendre à un neurone des resultats en fonction de ses entrèes. Le but consiste à faire une liste comme sur un tableau excel des entrées et des sorties, d'énumerer tous les cas possibles connus et d'envoyer le tout  à apprendre.

A chaque phase(valeur + boucle suivant la precision d'erreur) d'apprentissage le neurone va mettre à jour les poids de chaque entrèe.

Exemple d'algortihme d'apprentissage : (cliquez sur l'image pour aller sur le site : http://tanmayonrun.blogspot.fr/2011/07/single-layer-perceptron-learning.html

Limitation

L'utilisation d'un neurone est très limité, c'est pour cela qu'on l'associe à d'autres neurones pour créer un RNA.

C'est très bien pour faire des choses basiques, calcul binaire, comparaison, mémoire, decision "linéaire"... mais pas pour des problèmes plus complexes

Pourquoi? car un neurone est un peu "binaire" il ne peut séparer que 2 ensemble d'entrées/sortie, voir le graphe ci après.

LES RNA

Un reseau de neurones artificiel (RNA) est organisé d'une ou plusieurs couches de neurones. Ces couche neurones sont connectés entre elles, suivant plusieurs topologies differentes, chaque couche comportant plusieurs neurones.  

Neurones biologiques

Modèle de reseau de neurones artificielles

un noeud =  un neurone | Wn = poids 

Utilisation d'un RNA

...

à suivre

 

 

 

 

La bibliothèque FANN (Fast Artifical Neural Network)

Il est parfois inutile de réinventé la roue et de réutiliser un bibliothèque déjà assez complète pour les besoin que l'on a. Pour les superman des RNA... cela ne suffira peut être pas, mais pour nous oui.

Il ne faut parfois pas de chose complexe pour faire de grande chose, c'est valable pour la vie, la programmation quand on ecrit du code... il faut des briques pour faire des murs, des murs pour batir une maison....... idem des atomes pour faire de molécules, puis des molécules pour faire tous type d'organisme...

Nous allons donc utiliser la bibliothèque FANN (site : http://leenissen.dk/fann/wp/), elle a l'avantage d'être libre, gratuit, portable dans une vingtaines de langages et de plateforme (windows, linux, mac). Que demander de mieux !

Les sources sont disponible, il faudra les compiler pour les utiliser.

Pour ma part je m'interesserai à l'installation de la bibliothèque FANN pour PHP, utilisable sur un site internet. Biensur pour des applications embarquées sur un robot... on utilisera la bibliotheque pure en C++ par exemple. Les noms de functions, paramètres et fonctionnement reste les mêmes quelque soit le language, seul la syntaxe propre du language gravitant autour change, la logique est la même.

Installation de PHP FANN sur UBUNTU

Liste des commandes : (pour la bibli de php/fann, NE PAS TELECHARGER celle du site, ca ne marche pas!) 

  • sudo apt-get install libfann-dev       
  • sudo pecl install g++   (ca peut etre utile)
  • sudo pecl install fann
    • si pecl marche pas faire comme ceci : 
      • wget https://github.com/bukka/php-fann/archive/master.zip
      • mv master.zip php-fann-master.zip
      • unzip php-fann-master.zip
      • cd php-fann-master
      • phpize
      • ./configure
      • make all
      • sudo make install
      • --------
      • après ca, faut cela, il faut modifier le php.ini (locate php.ini) et mettre extension=fann.so
      • ne pas oublier de redémarer apache : apachectl restart

voir sur la "doc" officiel php en anglais : http://php.net/manual/fr/fann.installation.php

pour savoir si la bibliotheque s'est bien installée, faire :  php -v | grep fann  , si ca dit rien, c'est pas bon signe. 

 

Simulation d'une sinusoïde

Grâce à la bibliothèque FANN, nous allons simuler une sinusoïde de un cycle entier. Ca sert à rien, puisqu'on a déjà une fonction sin() mais c'est un très bon exemple, surtout que ça serpente dur!

Notre RNA aura 1 entrée, x - > les degrés et une sortie sin(x). donc 1 neurone en entrée et 1 neurone en sortie.

Il faut choisir après cela le nombre de neurone de la couche cachée. Il n'y pas pas de méthode fiable (peut être y a t'il des théories??), pour choisir le nombre correcte de neurones.

Trop peu de neurones donnera un résultat approximatif, bizarre ou loin de la réalité, trop de neurones donnera une meilleurs précision, et avec encore plus de neurone pas grande chose de mieux mais avec un temps de calcul lors de l'apprentissage assez long.

Donc au filling, on peut choisir, 2, 5 , un nombre premier... et tester. J'ai pris dans cet exemple 32 neurones pour la couche.

La marge d'erreur demandé était de 0.0001 lors de l'apprentissage. L'apprentissage a utilisé 18 valeurs de de sin(x) 0°, 20°....340°, on peut aussi prendre 19 valeur jusqu’à 360°, car il se peut que ça "rebique" dans les 20 derniers degrés.

la valeur d'entrée dans le premier neurone ne peut pas être compris entre 0 et 360, puisque le neurone ne travaille qu'en -1 et 1, ou 0 et 1. donc on mettra les données d'entrée à l’échelle

  • si on veut travailler de 0 à 1 -> Xneurone = 1/360 * Xdeg
  • si on veut travailler de -1 a 1 -> Xneurone= 2/360 * Xdeg +1
  • Pour les valeurs de sortie, pas de mis à l'echelle car sin (x)  ⇒ [-1 ; 1]
  • ATTENTION : lors de l'intégoration du RNA, il faudra aussi envoyer en entrée des valeurs à l'échelle dans la même tranche de valeur. Si les min et max d'entrée avant mise à l'echelle changaient, les données de sortie serait alors fausses, décalé... car elle ne correspondrai plus. il faudrait alors refaire le RNA avec les nouvelle tranche de valeur. 

Les points en rouge sont les points de la fonction mathématique sin(x)

Les gros points vert, les valeurs d'apprentissage sin(0°), sin(20°), sin(40°)....,sin(340°)

Les points bleu les valeurs calculés par le RNA après apprentissage des 18 valeurs vertes

Conclusion : impréssionnant non ! c'est presque parfait. avec 34 neurones! 

Téléchargement du fichier source PHP(sinusoide.php), avec un fichier RNA(sin.net) et les données d'apprentissage(sin.txt) : TELECHARGER