IFT 616 Intelligence Artificielle Jean-François Landry Département d’informatique Université de Sherbrooke Réseaux de neurones artificiels http://planiart.usherbrooke.ca/~eric/ift615
Sujets couverts Réseau de neurones artificiel Quelques architectures Quelques algorithmes d’apprentissage Exemples d’applications IFT615
Réseau de neurones artificiel (RNA) Un modèle de calcul inspiré du cerveau humain. Cerveau humain : 10 milliards de neurones 60 milliards de connexions (synapses) Un synapse peut être inhibant ou excitant. RNA : Un nombre fini de processeurs élémentaires (neurones). Liens pondérés passant un signal d’un neurone vers d’autres. Plusieurs signaux d’entrée par neurone Un seul signal de sortie Tiré du manuel du cours (Stuart et Russel), ch.1, page 11. Un neurone est une cellule du cerveau dont la principale fonction est la collecte, le traitement et la dissémination de signaux nerveux (électriques). On pense que la capacité de traitement de l’information du cerveau émane essentiellement de réseaux de tels neurones. Chaque neurone est constitué d’un corps (soma) contenant le noyau de la cellule. De la cellule émanent plusieurs fibres appelés dendrites et une seule longue fibre appelée axon. L’axon s’étale sur une très longue distance bien plus que suggéré par le dessin. Il peut facilement varier de 1 cm à 1m. Un neurone fait des connexions avec 10 à 10 000 autres neurones à des jonctions appelées synapes. Les signaux sont propagés d’un neurone à un autre par des réactions électrochimiques très complexes. Les signaux contrôlent l’activité du cerveau dans le court terme et aussi permettent des changements long-termes dans l’état des neurones et leurs connectivités. On pensent que ces mécanismes constituent la base de l’apprentissage dans le cerveau. La plus part des traitement se déroulent dans le cortex cérébral (partie la plus extérieure du cerveau). Tiré du manuel du cours (Stuart et Russel), ch.20, page 737. Un réseau de neurones est constitué de nœuds (ou unité ou processeurs élémentaires) connectés par des liens directes. Un lien d’un neurone i vers le neurone j sert à propager l’activation du neurone i vers le neurone j. Chaque lien a un poids qui sert à déterminer la force de la sortie associée dans la combinaison linéaire avec les autres signaux. Les réseaux de neurones sont aussi connus comme des approches connexionnistes de l’intelligence artificielle ou des approches de traitement distribué. En effet, le calcul dans chaque neurone se fait en parallèle avec les autres. Conceptuellement, le caractère distribué rend les réseaux de neurones plus robustes aux fautes. Contrairement aux approches symboliques, un réseau de neurone ne se programme pas comme tel – une fois l’architecture défini. Il apprend. Les réseaux de neurones sont surtout pratiques pour des problèmes n’ayant pas une syntaxe bien définie pour s’apprêter à la programmation explicite: par exemple, des problèmes de reconnaissance de formes. Un réseau de neurone est généralement déterminé par: Sa topologie L’algorithme d’apprentissage Le codage des données (interprétation des entrées sorties) Cerveau RNA cellule (soma) neurone dendrites entrées synapses poids axon sortie IFT615
Comment un neurone calcule sa sortie ? [McCulloch-Pitts, 1943] net = Σ wixi f(net)= +1 si net ≥ 0, -1 sinon. C.à-d. : f(net) = sign(net) n Un model mathématique simple d’un neurone, model conçu par McCulloch et Pitts en 1943. Entrée: -1 (inhibition) ou +1 (excitation) Sortie: -1 ou +1 Threshold: 0 En gros, il « s’active » lorsque la combinaison linéaire de ses entrées dépasse un certain seuil (zéro dans ce cas-ci). Un lien d’un neurone i vers le neurone j sert à propager l’activation xi du neurone i vers le neurone j. Chaque lien a un poids wi qui sert à déterminer la force de la sortie associée dans la combinaison linéaire avec les autres signaux. La fonction d’activation f est conçue pour remplir deux rôles: On veut que le neurone soit actif (≥ 0) lorsqu’une entrée correcte est donnée, inactif (<= 0) lorsqu’une entrée erronée est donnée. On veut que f ne soit pas linéaire, autrement on n’a pas besoin d’un réseau de neurones, une fonction linéaire simple ferait l’affaire. Dans le manuel de référence la fonction « f » est nommée « g ». i=1 IFT615
Comment un neurone calcule sa sortie ? [McCulloch-Pitts, Exemples] xi wi xi wi x y x+y-2 x+y-1 1 -1 -2 Pour avoir une idée des opérations d’’un neurone, on peut comparer le comparer à une porte ET, OU logique. En fait, une des motivations de la conceptions des neurones par McCulloch et Pitts étaient justement leur habilité à modéliser des fonctions binaires de base. Ceci est fondamental, puisque cela veut dire qu’on peut utiliser un réseau de neurone pour implémenter n’importe quelle fonction booléenne. Notez l’utilisation du paramètre d’entrée 1! Un tel paramètre est souvent appelé un biais. Il sert en fait à établir le seuil d’activation pour la combinaison linéaire. Ainsi, dans le premier cas, le neurone s’active lorsque la combinaison linéaire de x et y est plus grande ou égale 2. IFT615
Fonction d’activation sigmoïde x= Σ wixi f(x) = 1 1+e-λx Souvent la fonction d’activation sigmoide est préférée à la fonction signe puisqu’elle est dérivable. La dérivabilité est une propriété requise pour certains algorithmes d’apprentissage. f(x) = sign(x) IFT615
Comment un RNA apprend ? Les liens entre les neurones ont des poids numériques. Un poids reflète la force, l’importance, de l’entrée correspondante. La sortie de chaque neurone est fonction de la somme pondérée de ses entrées. Un RNA apprend en ajustant ses poids itérativement jusqu’à ce que les sorties soient en accord avec les entrées. IFT615
Est-ce qu’un seul neurone peut apprendre ? Oui. Perceptron [Rosenblatt, 1958] i=1 n net = Σ wixi Paramètres xi : entrée wi : poids (nombre réel) c : pas(step) d’apprentissage:0 ≤ c ≤1 d : sortie désirée y=f(net)= sign(net) Algorithme d’apprentissage Pour chaque donnée d’entraînement, incrémenter le poids wi par : wi = c(d-y)xi Une perceptron est un réseau de neurones à une seule couche, c.à-d., les entrées sont directement connectées aux sorties. En particulier, les exemples des portes ET et OU vus auparavant sont des perceptrons à trois neurones d’entrées et un seul neurone de sortie. En général on va avoir plusieurs neurones d’entrées et plusieurs neurones de sorties dans un perceptron. L’idée de base de l’apprentissage, qui est derrière tous les algorithmes d’apprentissage des RN, est d’ajuster les poids du RN, pour minimiser une certaine mesure d’erreur sur l’échantillon d’apprentissage. Ainsi, l’apprentissage est formulée comme une recherche optimale dans l’espace des poids! La mesure de l’erreur classique est la somme des carrées des écarts qui est aussi utilisée pour la méthode des moindres carrées pour la régression linéaire: on va ajuster les poids pour minimiser la somme des carrés des écarts entre les sorties observées et les sorties désirées. IFT615
Exemple net = Σ wixi x1 x2 d 1.0 1 9.4 6.4 -1 2.5 2.1 8.0 7.7 0.5 2.2 7.9 8.4 7.0 2.8 0.8 1.2 3.0 7.8 6.1 1 c = 0.2 wi = c (d-y)xi i=1 n net = Σ wixi y=f(net)= sign(net) 1. Initialisation : w = [w1, w2, w3] = [.75, .5, -.6] 2. f(net) = sign(.75×1+.5×1-.6×1)=sign(.65)=1; w = 0.2(1-1)X= 0; donc w est inchangé. 3. f(net) = sign(.75×9.4+.5×6.4-.6×1)=sign(9.65)=1; w = -.4X; donc w = w -.4 [9.4, 6.4, 1] = [-3.01, -2.06, -1] … w = [-1.3, -1.1, +10.9]. Équation de la ligne séparant les données : -1.3x1 + -1.1x2+10.9 = 0. Ces données pourraient provenir par un exemple d’un microphone, représentant les valeurs sonores d’une voix d’une personne. On essaie alors de reconnaitre les sons représentant effectivement la voie de la personne (+1) de celle d’une autre (-1). Ou ce pourrait par exemple être les données digitalisées provenant d’un défibrillateur cardiaque. On essaie alors de classifier les données en deux pathologies différentes. Les données pourraient aussi être pour le contrôle du régime moteur d’un véhicule: x1 = régime (vitesse) d’un moteur à propulsion. x2 = température du moteur. Données calibrées sur l’intervalle [0,10]. Quand la température et la vitesse sont excessivement élevée, on veut donner une alerte : dangereux (-1) ou sécuritaire (+1). Pour les classifier, on essaie de trouver une fonction qui minimise la distance entre les données. On peut montrer que si les données sont linéairement séparable, Alors une telle fonction existe. Le perceptron montré ici permet d’apprendre la fonction. IFT615
Exemple Après dix itérations x1 x2 d 1.0 1 9.4 6.4 -1 2.5 2.1 8.0 7.7 0.5 2.2 7.9 8.4 7.0 2.8 0.8 1.2 3.0 7.8 6.1 Après dix itérations IFT615
Un perceptron peut-il apprendre le ET, OU, XOR ? Oui pour le ET et le OU. Non pour le Ou-Exclusif (XOR) Parce qu’un perceptron peut apprendre seulement des données linéairement séparables. x2 (0,1) (1,1) Une autre façon de voir que le perceptron ne peut pas apprendre le OU-Exclusif est d’observer ceci. Considérons un perceptron avec deux entrées x1, x2 et deux poids correspondants, w1 et w2, et le seuil t. Pour apprendre la fonction Ou-Exclusif, l’apprentissage du réseau de neurones doit trouver/aboutir/converger vers des poids satisfaisant les équations suivantes: 0 + 0 < t (c.à-d., t doit être positif) W1* 1 + 0 >= t 0 + w2*1 >= t w1*1 + w2*1 <=t Ce système d’équations n’a pas de solution. Le perceptron ne peut donc pas apprendre le Xor. On verra qu’un réseau multi-couches lui peut faire l’apprentissage. Ce qui rend le XOR impossible à apprendre avec le perceptron est le fait que les deux classes à distinguer (données en noir et données en vert) sont linéairement non séparables. Le problème d’apprendre une classification binaire d’un ensemble de données revient à les séparer en deux groupe. Dans l’espace à deux dimensions, chaque donné correspond à un point dans l’espace 2D et il s’agit de trouver une ligne droite les séparant. Dans l’espace à 3 dimensions, il s’agit de trouver un plan. Ainsi de suite, dans l’espace à n dimensions, un ensemble de données est linéairement séparable s’ils peuvent être séparés par un hyperplan de dimension n-1. x1 (0,0) (1,0) XOR ET OU IFT615
Apprentissage d’un perceptron avec une fonction d’activation sigmoïde x1i xni f(neti) oi : sortie du neurone i di : sortie désirée pour le neurone i c : pas d’apprentissage : 0 ≤ c ≤1 wji : ajustement du poids de l’entrée j au neurone i. f ’(neti)= λ× f(neti) × (1-f(neti)) n j=1 neti = Σ wjixji oi=f(neti) = 1 1+e-λneti Algorithme d’apprentissage Pour chaque donnée d’entraînement, incrémenter le poids wji par : wji = c(di-oi)f ’(neti)xji L’algorithme est décrit dans le manuel de référence (Stuart et Russel), page 740-744. Comme pour la fonction signe, on va utiliser la méthode des moindres carrées, c.à-.d., il faut ajuster les poids du réseau des neurones pour minimiser la sommes des carrés des écarts entre les sorties obtenues et les sorties désirées. Le livre explique comment arriver à l’algorithme (page 740-744). Grosso modo: Le carré de l’erreur pour le neurone i est E=1/2 Err2=1/2 (di-oi)2 Garder à l’esprit que oi = f(neti) = 1 / 1+e-λneti On va utiliser la descente du gradient pour réduire l’erreur, en calculant la dérivée partielle de l’erreur par rapport au poids. Cela donne (di-oi)f ’(neti)xj Ainsi, on va donc ajuster le poids Wij comme suit : Wji ← Wji + c(di-oi)f ’(neti)xj L’avantage d’une fonction sigmoïdale par rapport à la fonction signe est qu’elle permet une mesure de l’erreur plus précise. Intuitivement, c (le pas d’apprentissage) détermine la grandeur des « pas » entre deux poids successives dans l’apprentissage: wi= wi_old + c*deltawi. Plus le pas est petit, l’apprentissage va être précise, mais ça va prendre plus de temps. Par contre, plus le pas est grand, plus l’apprentissage est rapide, mais on risque de manquer le minimum et on risque d’osciller au tour des minimum locaux. On trouve la valeur optimale de c par des ajustements expérimentaux. IFT615
RNA à plusieurs couches Il existe deux types de structures de réseaux de neurones: Feed-forward (non récurrents) Récurrents Dans les structures feed-forward, on ne peut pas avoir de boucles. Ces structures sont généralement organisées en couches successives. Elles sont surtout utilisées pour des problèmes de classification ou de régression. En particulier, nous avons vu que lorsqu’il y a un seul niveau, c.à-d., les entrées sont directement connectées aux sorties, la structure est appelée un perceptron. n j=1 neti = Σ wjixji oi=f(neti) = 1 1+e-λneti IFT615
Ajustement des poids, fonction signe. Luger. Artificial Intelligence, 4th Ed., 2002 n j=1 neti = Σ wjixji oi=f(neti) = 1 1+e-λneti f ’(neti)= λ× f(neti) × (1-f(neti)) Neurones dans la couche de sortie : wki = - c(di-Oi)×Oi(1-Oi)xk Neurones cachés : wki = - cOi(1-Oi)Σj(-deltaj×wji)xki avec deltaj= c(di-Oi)×Oi(1-Oi) L’algorithme est décrit dans le manuel de référence (Stuart et Russel), page 745-746. Fondamentalement, l’algorithme est similaire au cas du perceptron. La différence est que nous avons maintenant plusieurs couches. Dans le cas du perceptron, les sorties sont directement connectées aux entrées et on pouvait calculer l’erreur entre la sortie du RN est celle désirée selon les données d’entrainement directement et utiliser la méthode du gradient descendant pour ajuster les poids. Avec un réseau multi-couche, comment calculer l’erreur pour les neurones dans les couchées cachées? Eh bien, il apparait qu’on peut simplement propager vers l’arrière l’erreur entre entre les sorties et les sorties désirées. IFT615
Exemple 1 : RNA pour XOR 1 2.6 -7 7 -5 -11 -4 Fig. 10.12 Luger. Artificial Intelligence, 4th Ed., 2002 I1 I2 O 1 Après 1400 itérations, on obtient le vecteur des poids sur la figure. IFT615
Ajustement des poids, fonction sigmoïde. L’algorithme est une généralisation de celui du perceptron pour la fonction sigmoïde, en suivant le même principe que pour le cas de la fonction signe. Voir, le manuel de référence (Stuart et Russel), page 745-747. IFT615
Exemple 2 NET TALK : Reconnaissance vocale Fig. 10.12 Luger. Artificial Intelligence, 4th Ed., 2002 21 phonèmes + 5 accents NETtalk apprenait à prononcer les textes en anglais. C’est une tâche difficile pour une approche symbolique puisque la prononciation de l’anglais est très irrégulière. NETtalk lisait une chaîne de caractère et retournait le phonème correspondant. Vu que la prononciation d’une lettre dépend de la lettre et des lettres aux alentours, NETtalk considérait une fenêtre de 7 lettres consécutives. Entrées: 7*29 : 29=26 lettres + espace + 2 caractères de ponctuation. Les 26 sorties correspondent à 21 phonèmes (différents traits de la prononciation humaine). Les 5 neurones restant correspondent aux accents. En tout 18 629 connections. Les couches cachées permettent à un réseau de généraliser. Comme les humains, plus il y a des exemples, plus le réseau va prononcer bien. 26 lettres + espace + 2 caractères de ponctuation Fenêtre de 7 lettres pour tenir compte du contexte IFT615
Apprentissage compétitif (winner-take-all) [Kohonen, 1984] Dans une couche, il y a un seul nœud activé : le noeud gagnant. Le nœud gagnant est celui avec la plus petite distance Euclidienne ||X-W||. Les vecteur des poids W du nœud gagnant sont mis à jour comme suit : W = c(X-W). L’apprentissage est non supervisée. Dans l’apprentissage compétitif l’activation se fait par un test du nœud ayant le niveau/valeur d’activation la plus élevé. Les poids du nœuds gagnant sont alors récompensés en les rapprochant des données d’entrée. Soit W le vecteur des poids du nœud gagnant. En lui ajoutant W (c.à-d., la composante wi devient wi+c(xi-wi)), l’effet est de rendre le nœud gagnant plus proche des entrées. L’algorithme winner-take-all n’a pas besoin de calculer explicitement les valeurs d’activation de chacun des nœuds et de les comparer ensuite. Il est plus efficace de calculer les normes ||X-W|| pour chacun des nœuds (c.à-d., la distance euclidienne entre le vecteur des poids W et le vecteur des entrées X). L’apprentissage est non supervisée: on démarre avec un certains nombres de classes et le but est de raffiner la classification. IFT615
Exemple 1 x1 x2 d 1.0 1 9.4 6.4 -1 2.5 2.1 8.0 7.7 0.5 2.2 7.9 8.4 7.0 2.8 0.8 1.2 3.0 7.8 6.1 Fig. 10.15 Luger. Artificial Intelligence, 4th Ed., 2002 Nous avons déjà vu un perceptron capable de classifier ces données. L’apprentissage était supervisée: colonne d. L’ architecture compétitive (winner-take-all) ci-haut fait la même chose. Par contre on choisit deux prototypes d’entraînement au départ, correspondant à chacune des classes -1 et +1. Les données pourraient aussi être pour le contrôle du régime moteur d’un véhicule: x1 = régime (vitesse) d’un moteur à propulsion. x2 = température du moteur. Données calibrées sur l’intervalle [0,10]. Quand la température et la vitesse sont excessivement élevée, on veut donner une alerte : dangereux (-1) ou sécuritaire (+1). Pour le winner-take-all, la colonne de droites n’est plus présente puisque l’apprentissage n’est pas supervisée. Pour l’entrainement, on va choisir un ensemble de données représentant la classe -1 et un ensemble de donnée représentant la classe 1 et entraîner le réseau sur chacune d’elle. Intuitivement, le nœud va finir par « mémoriser » une des classes et le nœud b l’autre. IFT615
Exemple 2 Winner-take-all, supervisé. Fig. 10.17Luger. x1 x2 d 1.0 1 9.4 6.4 -1 2.5 2.1 8.0 7.7 0.5 2.2 7.9 8.4 7.0 2.8 0.8 1.2 3.0 7.8 6.1 Winner-take-all, supervisé. On connecte la sortie du winner-take-all à une autre couche (la nouvelle sortie) qu’on va superviser par les entrées « Safe » et « Dangerous ». Ce type de réseau est appelé réseau contre-propagation (counterpropagation). Les données sont pour le contrôle du régime moteur d’un véhicule: x1 = régime (vitesse) d’un moteur à propulsion. x2 = température du moteur. Données calibrées sur l’intervalle [0,10]. Quand la température et la vitesse sont excessivement élevée, on veut donner une alerte : dangereux (0, anciennement -1) ou sécuritaire (+1). Les nœuds S et D sont supervisés dans ce sens quel les entrées des nœuds Safe et Dangerous se feront pas un superviseur/enseignant selon la colonne d de la table. Les données [x1, x2, 1] dans la table, vont être entrainées par les entrées correspondant2s [x1, x2, 1, 0]. Les données [x1, x2, -1] dans la table, vont être entrainées par les entrées correspondantes [x1, x2, 0, 1]. IFT615
Exemple 2 NEAT Coevolution Robots IFT615 Utilise winner-take-all comme structure de réseaux de neurones. Utilise la programmation génétique pour faire évoluer la structure du réseau. IFT615
Apprentissage Hebbienne Luger. Artificial Intelligence, 4th Ed., 2002 [Hebb, 1949] Conjoncture : Deux neurones directement connectés tel que l’un active (inhibe) l’autre fréquemment, finissent par avoir leur lien renforcée. Application à l’apprentissage non supervisée x1i xni f(neti) yi Étant donné Xi = [x1i, .., xni] et Wi = [w1i, .., wni] : Wi = c*yi*X IFT615
Exemple Simulation simplifiée de l’expérience de Pavlov c = 0.2 1 -1 1 -1 c = 0.2 Donc W= 0.2 f(x)*X Après 13 itérations, on a W=[3.4, -3.4, 3.4, -2.4, 2.4, -2.4] A cet étape, le réseau répond positivement (+1) au stimulus de conditionnement. Expérience de Pavlov: En activant une sonnerie chaque fois que de la nourriture était présentée à un chien, le chien a fini par associer la sonnerie à l’heure du repas. Une sorte d’apprentissage par conditionnement. [1, -1, 1] est la nourriture (stimuli non conditionné) et [-1, 1, -1] est la sonnerie (stimuli de conditionnement). Au départ de l’entrainement, on suppose que le réseau répond déjà au stimuli non conditionné, mais reste neutre à toute autre entrée. Donc le poids initial du réseau est [1, -1, 1, 0, 0, 0]. A la fin de l’entraînement, on constate que le réseau répond positivement à tout stimuli [x1, x2, x2, -1, 1, -1] pour x1, x2, x3 arbitraires. Il répond à la sonnerie! IFT615
Réseaux récurrents Les types de réseaux que nous avons jusqu’ici sont dits non récurrents: pas de boucles. Les réseaux récurrents ont des boucles. Cela augmente les possibilités d’apprentissage : par exemple, l’association de différents concepts. Exemple : RNA de Hopfield La sortie de chaque nœud est retro-propagée aux autres sauf lui-même. IFT615
Applications Jeux vidéo: Natural Motion Robot apprenant à marcher (Endorphin dans ses débuts) Endorphin : http://www.naturalmotion.com/ R N et algorithmes génétiques dans Endorphin : http://www.mega-tex.nl/3dsoftware/endorphin2.0.php Endorphin combine les algorithmes génétiques et les RN. Leur site web ne dit pas précisement comment. Possibilités d’utilisation dans les jeux vidéos: Contrôle : Contrôle des moteurs (ex: contrôle d’une voiture de course ou d’un avion). Évaluation de la menace : C’est un problème de classification. Entrées: nombre de troupes ennemis au sol, troupes ennemis aériens, etc. Sortie: niveau de la menace. Décision des actions : Entrées : niveau de vie, distance de l’ennemi, capacité de l’ennemi. Sortie: la bonne action à prendre (exemples: attaquer, fuir, se cacher). Prédiction/Anticipation : Prédire le nouveau coup du jouer. Entrées: coups précédents du joueur. Sortie: coup prochain du joueur. IFT615
Applications Problèmes de classification : Reconnaissance de visages Reconnaissance vocale Reconnaissance de caractèrs Beaucoup d’autres applications IFT615
Références Le contenu de cette leçon est tiré en grande partie du Chapitre 10 du livre: G. F. Lugel Artificial Intelligence : Structures and Strategies for Complex Problem Solving. Fourth Edition. Addison-Wesley, 2002. Le manuel de référence du cours se limite aux structures de réseaux « feed-forward » (non récurrents).: Stuart Russel & Peter Norvig. Artificial Intelligence: A Modern Approach. Second Edition. Prentice Hall, 2002. IFT615