Réseaux Neuro-Mimétiques
Un article de Games Creators Network.
Sommaire |
[modifier] Introduction
Il est à la mode ces derniers temps dans certains domaines de la programmation de mettre en place des systèmes permettant de donner une certaine forme d'intelligence aux programmes. Notamment on se retrouve de plus en plus face à des chatterbots, ou autres programmes réalisant un apprentissage automatique. C'est de ceci que traite ce didacticiel : l'apprentissage automatique, et plus particulièrement les réseaux neuro-mimétiques.C'est une expression bien barbare plus connue sous le doux nom de réseaux de neurones ou réseaux neuronaux. Mais que sont donc ces fameux réseaux ? Que permettent-ils de faire ? Et surtout comment sont-ils programmés ? Voici quelques questions auxquelles je vais tenter de répondre à travers ce document.
[modifier] Qu'est-ce que c'est ?
Les réseaux neuro-mimétiques sont des réseaux complexes d'unité de calcul élémentaires interconnectées. (je sais ça fait peur dit comme ça.) Plus simplement, on peut imaginer les réseaux neuro-mimétiques comme une sorte de boîte noire capable d'apprendre une fonction à N paramètres d'entrée et retournant M données en sortie et ensuite d'utiliser cette fonction. Voici une façon de voir les réseaux neuro-mimétiques réellement très succinte.Pour se donner une idée plus biologique des réseaux neuro-mimétiques, puisque ces réseaux s'inspirent directement d'une entité biologique bien précise : le cerveau. Un réseau neuro-mimétique est en quelque sorte un cerveau miniature réalisant des opérations plus ou moins complexes. Voyons quels types d'opérations ils peuvent réaliser...
Learn(Rétine X[],Sortie Attendue A[]){
//Calcul de la sortie
S=Out(X);
//Calcul des erreurs Dab (a étant la couche et b la neurone) par rétropropagation
Pour toute Neurone i de la dernière couche j faire
Dji=Si*(1-Si)*(A[i]-Si);
Fin Pour
Pour chaque couche i de l'avant dernière couche à la première faire
//Si = Sortie de la couche i
Pour chaque neurone j de la couche i faire
Dij=0;
//Sij=Sortie de la neurone j de la couche i
Pour chaque neurone k de la couche l=i+1 faire
//Wlkj = Poids de la neurone k associé à l'entrée en provenance de la neurone j
Dij+=Dlk*Wlkj;
Fin Pour
Dij*=Sij*(1-Sij);
Fin Pour
Fin Pour
//Mise à jour des poids
Pour tout poids Wijk (poids de la neurone j de la couche i associé à l'entrée provenant de la neurone k de la couche i-1) faire
//Sk = Sortie de la neurone k
Wijk+=Dij*Sk
Fin Pour
}
[modifier] Que permettent-ils de faire ?
Les premiers exemples qui me viennent à l'esprit sont surtout du domaine de la cognition. En effet, les réseaux de neurones sont à mon avis ce qu'il y a de plus efficace pour mettre en place la cognition dans un programme. Qu'entends-je par cognition ?... Vous avez sûrement dû déjà entendre parler ou même utiliser des outils comme l'OCR (reconnaissance de caractères), la reconnaissance vocale, ou encore la reconnaissance d'images. Les réseaux de neurones permettent de faire tout cela. Mais ce n'est pas tout. Leurs capacités vont bien au delà de la simple cognition. Les réseaux de neurones peuvent également être utilisés pour la synthèse vocale, ou l'improvisation de mélodies (en temps réel !) appuyée par une musique déjà existante. Ils peuvent également être utilisés dans des cas comme les IDS (Intrusion Detection System), ou encore pour donner "vie" à des robots virtuels ou non. Le très célèbre robot Mars Pathfinder qui roula sur le sol martien est un bon exemple : l'un des principes régissant ce robot sont les réseaux neuro-mimétiques.Et ce n'est pas tout, mais il serait réellement beaucoup trop long d'énumérer tout ce que les réseaux neuro-mimétiques peuvent faire. Comme je l'ai dit précédemment, les réseaux neuro-mimétiques sont capable d'apprendre une fonction F(R^N)=>R^M, c'est à dire une fonction à N paramètres dans l'ensemble des Réels retournant un ensemble de M valeurs Réelles également. A partir de cette constatation, il est sage de dire qu'un réseau de neurones est capable d'apprendre n'importe quelle fonction de ce type.En cela les réseaux neuro-mimétiques sont plus ou moins semblables aux systèmes experts qui pour un ensemble de valeurs d'entrée donné retourne un ensemble de valeurs de sortie. Cependant, j'aurais tendance à dire que les réseaux neuro-mimétiques sont beaucoup plus impressionnants, dans la mesure où un système expert n'apprend rien, mais est simplement programmé. Et une fois programmé, il est incapable d'évoluer. En revanche, les réseaux neuro-mimétiques sont des usines à apprendre, elles évoluent sans cesse (pour peu qu'on leur demande) et si par exemple un jour, un paramètre venait à changer, contrairement aux systèmes experts, les réseaux neuro-mimétiques s'adapteraient automatiquement sans intervention humaine.
Learn(Rétine X[],Sortie Attendue A[]){
//Calcul de la sortie
S=Out(X);
//Calcul des erreurs Dab (a étant la couche et b la neurone) par rétropropagation
Pour toute Neurone i de la dernière couche j faire
Dji=Si*(1-Si)*(A[i]-Si);
Fin Pour
Pour chaque couche i de l'avant dernière couche à la première faire
//Si = Sortie de la couche i
Pour chaque neurone j de la couche i faire
Dij=0;
//Sij=Sortie de la neurone j de la couche i
Pour chaque neurone k de la couche l=i+1 faire
//Wlkj = Poids de la neurone k associé à l'entrée en provenance de la neurone j
Dij+=Dlk*Wlkj;
Fin Pour
Dij*=Sij*(1-Sij);
Fin Pour
Fin Pour
//Mise à jour des poids
Pour tout poids Wijk (poids de la neurone j de la couche i associé à l'entrée provenant de la neurone k de la couche i-1) faire
//Sk = Sortie de la neurone k
Wijk+=Dij*Sk
Fin Pour
}
[modifier] Comment ça marche ?
Tout le code est réalisé en pseudo-langage. Nous entrons donc dans le vif du sujet, la partie qui vous intéresse. Comment ça marche. Assez de blabla, passons à la pratique.
[modifier] Un Neurone...
Avant de programmer un Réseau à proprement dit, il convient de comprendre le fonctionnement d'un neurone. Si vous vous rappelez de vos cours de BIO, une neurone est composée d'un corps réalisant l'intégration des signaux électriques reçus par les dendrites, et si cette intégration dépasse un certain seuil, un signal est envoyé à travers un axone. Et bien en informatique, c'est plus ou moins la même chose. Un neurone numérique sera constituée d'un ensemble de "dendrites" qui seront représentés sous formes de "poids" (souvent notés Wi), ainsi qu'un corps réalisant l'intégration (ici une somme pondérée seuillée) et un axone (la sortie du neurone). Voici la représentation schématique d'un neurone. Les Xi correspondent aux entrées présentées au neurone, les Wi correspondent aux poids associés à ces entrées. La sortie se calcule de cette manière :
Out(Entrée du neurone X[]){
Sortie=0;
Pour tout poids W[i] faire
Sortie+=W[i]*X[i];
Fin Pour
Sortie=H(Sortie);
Retourner Sortie;
}
Il s'agit donc d'une simple somme pondérée seuillée. Avec H une fonction de seuil. Cette fonction de seuil peut être une simple fonction binaire : H=(Sortie>Seuil)?1:0; ou bien une fonction plus évoluée, comme une fonction sigmoïde : H=1/(1+exp(-Sortie)); ou encore tout autre fonction présentant un seuil semblable à ces fonctions.
[modifier] le Perceptron Multi-couche
Ce type de réseau est organisé en couches de neurones. On se retrouve facilement avec des choses ressemblant à ceci :Les cercles représentent les neurones, les traits précédant les neurones correspondent aux poids des neurones (les couleurs ne sont là que pour aider à la lisibilité et n'ont aucune importance). les Xi sont la rétine (les paramètres d'entrée) et S est l'ensemble de décision (ou sortie). Ce perceptron multi-couche se désigne ainsi : {3,2,1}. 3 neurones en couche 0, 2 en couche 1 et 1 en couche 2.Ceci ne constitue qu'un exemple de PMC (perceptron multi-couche). Ainsi, il est courant de trouver des PMC de ce type : {200,100,50} ou autre. Il est également possible d'avoir plusieurs couches cachées : {4,3,2,5,2,1,4}. Les PMC sont véritablement des boîtes noires chaotiques, il est d'ailleurs impossible de comprendre pourquoi les poids, une fois le réseau apprit, sont ainsi. Les PMC ont deux fonctions principales : Apprendre (Learn) et Sortie (Out). Voyons leurs fonctionnements.
[modifier] Sortie (Out)
On va tout simplement calculer successivement les sorties de chaque couches et les présenter en entrée de la couche suivante. Voyons donc tout d'abord une fonction permettant à une couche de retourner sa sortie :
Out(Entrée de la couche X[]){
Pour chaque Neurone N[i] de la couche d'entrée faire
S[i]=N[i].out(X);
Fin Pour
Retourner S;
}
Une fois que nous avons cette fonction, il ne nous reste plus qu'à calculer la succession des sorties :
Out(Rétine X[]){
Pour chaque Couche C[i] du PMC faire
X=C[i].out(X);
Fin Pour
Retourner X;
}
Après cela, X contient la sortie du PMC. Cependant, il fait encore bien des erreurs, normal : il n'a rien appris. Il nous reste donc à voir la fonction d'apprentissage du PMC.
[modifier] Apprentissage par rétropropagation du gradient (Learn)
Le principe est simple, il s'agit de calculer la sortie du PMC suivant une série d'échantillons et de calculer l'erreur avec la sortie attendue, l'erreur étant ensuite corrigée.
Learn(Rétine X[],Sortie Attendue A[]){
//Calcul de la sortie
S=Out(X);
//Calcul des erreurs Dab (a étant la couche et b la neurone) par rétropropagation
Pour toute Neurone i de la dernière couche j faire
Dji=Si*(1-Si)*(A[i]-Si);
Fin Pour
Pour chaque couche i de l'avant dernière couche à la première faire
//Si = Sortie de la couche i
Pour chaque neurone j de la couche i faire
Dij=0;
//Sij=Sortie de la neurone j de la couche i
Pour chaque neurone k de la couche l=i+1 faire
//Wlkj = Poids de la neurone k associé à l'entrée en provenance de la neurone j
Dij+=Dlk*Wlkj;
Fin Pour
Dij*=Sij*(1-Sij);
Fin Pour
Fin Pour
//Mise à jour des poids
Pour tout poids Wijk (poids de la neurone j de la couche i associé à l'entrée provenant de la neurone k de la couche i-1) faire
//Sk = Sortie de la neurone k
Wijk+=Dij*Sk
Fin Pour
}
A présent l'erreur se corrige. Le réseau neuro-mimétique est capable d'apprendre de nouvelles informations en temps réel. Il existe d'autres types de réseaux de neurones et même d'autres types de neurones, mais nous verrons tout cela un autre jour.
Learn(Rétine X[],Sortie Attendue A[]){
//Calcul de la sortie
S=Out(X);
//Calcul des erreurs Dab (a étant la couche et b la neurone) par rétropropagation
Pour toute Neurone i de la dernière couche j faire
Dji=Si*(1-Si)*(A[i]-Si);
Fin Pour
Pour chaque couche i de l'avant dernière couche à la première faire
//Si = Sortie de la couche i
Pour chaque neurone j de la couche i faire
Dij=0;
//Sij=Sortie de la neurone j de la couche i
Pour chaque neurone k de la couche l=i+1 faire
//Wlkj = Poids de la neurone k associé à l'entrée en provenance de la neurone j
Dij+=Dlk*Wlkj;
Fin Pour
Dij*=Sij*(1-Sij);
Fin Pour
Fin Pour
//Mise à jour des poids
Pour tout poids Wijk (poids de la neurone j de la couche i associé à l'entrée provenant de la neurone k de la couche i-1) faire
//Sk = Sortie de la neurone k
Wijk+=Dij*Sk
Fin Pour
}
Ce document a été publié sur la version 3 du G.C.N. par Eva.
- Auteur Original : Eva
- Date de publication : 10 août 2003

