(extrait de : http://www.sciences.ch/htmlfr/infotheorique/infomethnum02.php)
Les réseaux de neurones, fabriquées de structures cellulaires artificielles, constituent une approche permettant d'aborder sous des angles nouveaux les problèmes de perception, de mémoire, d'apprentissage et de raisonnement (en d'autres termes... d'intelligence artificielle ou abrégée "I.A.") au même titre que les algorithmes génétiques. Ils s'avèrent aussi des alternatives très prometteurs pour contourner certaines des limitations des méthodes numériques classiques. Grâce à leur traitement parallèle de l'information et à leurs mécanismes inspirés des cellules nerveuses (neurones), ils infèrent des propriétés émergentes permettant de solutionner des problèmes jadis qualifiés de complexes.
Nous aborderons ici les principales architectures des réseaux de neurones. Il ne s'agit pas de les étudier toutes, car elles sont trop nombreuses, mais plutôt d'en comprendre les mécanismes internes fondamentaux et de savoir comment et quant les utiliser. Nous aborderons également certaines notions relatives aux ensembles flous et à la logique (voir chapitre de logique floue pour plus de détails) dans la mesure où ces derniers sont incorporés dans certaines architectures de réseaux de neurones que nous étudierons.
Le cerveau humain contient environ 100 milliards de neurones. Ces neurons nous permettent entre autre, de lire un texte tout en maintenant une respiration régulière permettant d'oxygéner notre sang, en actionnant notre cœur qui assure une circulation efficace de ce sang pour nourrir non cellules, etc. Ils nous permettent même de comprendre certaines idées (…)
Chacun de ces neurones est par ailleurs fort complexe. Essentiellement, il s'agit de tissu vivant et de chimie. Les neurophysiciens commencent à peine à comprendre quelques uns de leurs mécanismes internes. On croit en général que leurs différentes fonctions neuronales , y compris celle de la mémoire sont stockées au niveau des connexions (synapses) entre les neurones. C'est ce genre de théorie qui a inspiré la plupart des architectures de réseaux de neurones artificiels (dits "formels"). L'apprentissage consiste alors soit à établir de nouvelles connexions, soit à en modifier des existantes (nous nous concentrerons en particulier sur cette dernière possibilité).
Ceci nous amène à poser une question fondamentale : en ce basant sur nos connaissances actuelles, peut-on construire des modèles approximatifs de neurones et les entraîner pour, éventuellement, réaliser des tâches utiles ? Eh bien, la réponse courte est : oui !, même si les réseaux que nous allons développer ne possèdent qu'une infime fraction de la puissance du cerveau humain, et c'est l'objectif ici de montrer comment nous pouvons y arriver.
Les réseaux de neurones servent aujourd'hui à toutes sortes d'application dans divers domaines. Par exemple, nous avons développé un auto-pilote pour avion, ou encore un système de guidage pour automobile, nous avons conçu des systèmes de lecture automatique de chèques bancaires et d'adresses postales, nous produisons des systèmes de traitement du signal pour différentes applications militaires, un système pour la synthèse de la parole, des réseaux sont aussi utilisés pour bâtir des systèmes de vision par ordinateur, pour faire des prévisions sur les marchés monétaires, pour évaluer le risque financier ou en assurance, pour différents processus manufacturiers, pour la diagnostic médical, pour l'exploration pétrolière ou gazière, en robotique, en télécommunication, et bien d'autres. Bref, les réseaux de neurones ont aujourd'hui un impact considérable et, il y a fort à parier, que leur importance ira grandissant dans le futur.
Le modèle mathématique d'un neurone artificiel (ou "perceptron") est illustré à la figure ci-dessous. Un neurone est essentiellement constitué d'un intégrateur qui effectue la somme pondérée de ses entrées (comme l'espérance statistique!). Le résultat de cette somme ensuite transformée par une fonction de transfert f qui produit la sortie a du neurone.
Les R entrées du neurones correspondent au vecteur noté traditionnellement en ligne (mais au fait on prend la transposée d'où le T en suffixe) :
alors que :
représente le vecteur des poids du neurone (nous les distinguons pour préparer le terrain à des neurones un peu plus complexes).
La sortie n de l'intégrateur est définie (car il s'agit d'une technique de l'ingénieur) par l'équation suivante :
que nous pouvons aussi écrire sous forme matricielle (on pourrait aussi l'écrire sous forme tensorielle mais bon…) :
Cette sorti correspond à une somme pondérée des poids et des entrées moins que ce nous nommons "le biais b du neurone" (facteur correctif décidé par tâtonnement). Le résultat n de la somme pondérée s'appelle le "niveau d'activation du neurone". Le biais b s'appelle aussi le "seuil d'activation du neurone". Lorsque le niveau d'activation atteint ou dépasse le seuil b, alors l'argument de f devient positif ou bien évidemment positif (ou nul). Sinon, il est négatif.
Nous pouvons faire un parallèle entre ce modèle mathématique et certaines informations que nous connaissons (ou que nous croyons connaître) à propos du neurone biologique. Ce dernier possède trois principales composantes : les dendrites, le corps cellulaire et l'axone :
Les dendrites forment un maillage de récepteurs nerveux qui permettent d'acheminer vers le corps du neurone des signaux électriques en provenance d'autres neurones. Celui-ci agit comme une espèce d'intégrateur en accumulant des charges électriques. Lorsque le neurone devient suffisamment excité (lorsque la charge accumulée dépasse un certain seuil), par un processus électrochimique, il engendre un potentiel électrique qui se propage à travers son axone pour éventuellement venir exciter d'autres neurones. Le point de contact entre l'axone d'un neurone et le dendrite d'une autre neurone s'appelle le "synapse". Il semble que c'est l'arrangement spatial des neurones et leur axone, ainsi que la qualité des connexions synaptiques individuelles qui détermine la fonction précise d'un réseau de neurones biologique. C'est en se basant sur ces connaissances que le modèle mathématique décrit ci-dessus a été défini.
Une poids d'un neurone artificiel représente donc en quelque sorte l'efficacité d'une connexion synaptique. Une poids négatif inhibe en quelque sorte une entrée, alors qu'une poids positif vient l'accentuer. Il importe de retenir que ceci est une grossière approximation d'un véritable synapse qui résulte en fait d'un processus chimique très complexe et dépendant de nombreux facteurs extérieurs encore mal connus. Il faut bien comprendre que notre neurone artificiel est un modèle pragmatique qui, comme nous le verrons plus tard, nous permettra d'accomplir des tâches intéressantes. La vraisemblance biologique de ce modèle nous importe peu. Ce qui compte est le résultat que ce modèle nous permettra d'atteindre.
Un autre facteur limitatif dans le modèle que nous nous sommes donnés concerne son caractère discret. En effet, pour pouvoir simuler un réseau de neurones, nous allons rendr el temps discret dans non équations. Autrement dit, nous allons supposer que tous les neurones sont synchrones, c'est-à-dire qu'à chaque temps t, ils vont simultanément calculer leur somme pondérée et produire une sortie . Dans les réseaux biologiques, tous les neurones sont en fait asynchrones.
Revenons donc à notre modèle tel que formulé par l'équation précédent et ajoutons la fonction d'activation f pour obtenir la sortie du neurone :
Il est temps maintenant de remplacer (parce que la notation est un peu lourde à la longue) par une matrice d'une seule ligne que nous noterons . Nous obtenons alors une forme générale que nous adopterons tout le long de notre étude :
Cette équation nous amène à introduire un nouveau schéma plus formel de notre RNF (ou perceptron) :
Nous y représentons les R entrées comme un rectangle noir (le nombre d'entrées est indiqué sous le rectangle). De ce rectangle sort le vecteur dont la dimension matricielle est . Ce vecteur est multiplié par une matrice W qui contient les poids (synaptiques) du neurone. Dans le cas d'un neurone simple, cette matrice possède la dimension . Le résultat de la multiplication correspond au niveau d'activation qui est ensuite comparé au seuil b (un scalaire) par soustraction. Finalement, la sortie du neurone est calculée par la fonction f. La sortie d'un neurone simple est alors toujours un scalaire.
Jusqu'à présent, nous n'avons pas spécifié la nature de la fonction d'activation de notre modèle. Il se trouve que plusieurs possibilités existent et celles-ci sont quasiment empiriques et à adapter en fonction des situations. Les plus courantes et les plus citées dans la littérature sont énumérées dans la figure ci-dessous :
il manque la fonction gaussienne
Les trois les plus utilisées dans le domaine de l'ingénierie sont les fonctions "seuil" (a) (en anglais "hard limit"), "linéaire" (b) et "sigmoïde" (c) comme représentées ci-dessous :
a = 1/(1+e^-n)
elle ressemble soit à la fonction seuil, soit à la fonction linéaire, selon que nous somme loin ou près de b respectivement. La fonction seuil est très non linéaire car il y a une discontinuité lorsque . De son côté, la fonction linéaire est tout à fait linéaire. Elle ne comporte aucun changement de pente. La sigmoïde est un compris intéressant entre les deux précédentes. Notons finalement que la fonction "tangente hyperbolique" est une version symétrique de la sigmoïde:
f(x)=tanh(a*x+b)
Par définition, un réseau de neurones est un maillage de plusieurs neurones, généralement organisés en couches. Pour construire une couche de S neurones, il s'agit simplement des les assembler comme à la figure ci-dessous :
Les S neurones d'une même couche sont tous branchés aux R entrées. Nous disons alors que la couche est "totalement connectée". Un poids est associé à chacune des connexions. Nous noterons toujours le premier indice par i et le deuxième par j (jamais l'inverse). Le premier indice (rangée) désigne toujours le numéro de neurone sur la couche, alors que le deuxième indice (colonne) spécifie le numéro de l'entrée. Ainsi, désigne le poids de la connexion qui relie le neurone i à sont entrée j. L'ensemble des poids d'une couche forme donc une matrice W de dimension :
Il faut bien sûr prendre en compte que nous n'avons pas nécessairement dans le cas général (les nombres de neurones et d'entrées sont indépendants). Si nous considérons que les S neurones forment un vecteur de neurones, alors nous pouvons créer les vecteurs :
Ceci nous amène à la représentation simplifiée illustrée ci-dessous :
Finalement, pour construire un réseau de neurones (ou PMC pour "Perceptron Multi-Couches") , il ne suffit plus que de combiner des couches comme ci-dessous :
Cet exemple comporte R entrées et trois couches de neurones comptant respectivement neurones. Dans le cas général, de nouveau ces nombres ne sont pas nécessairement égaux. Chaque couche possède aussi sa propre matrice de poids , où k désigne l'indice de couche. Dans le contexte des vecteurs et des matrices relatives à une couche, nous emploierons toujours un exposant pour désigner cet indice. Ainsi, les vecteurs sont aussi associés à la couche k.
Il importe de remarquer dans cet exemple que les couches qui suivent la première ont comme entrée la sortie de la couche précédente. Ainsi, nous pouvons enfiler autant de couches que nous voulons, du moins en théorie. Nous pouvons fixer un nombre quelconque de neurones sur chaque couche. En pratique, nous verrons plus tard qu'il n'est cependant pas souhaitable d'utiliser trop de neurones. Notons aussi que rien ne nous empêche de changer de fonction de transfert d'une couche à l'autre. Ainsi, dans le cas général nous n'avons pas nécessairement .
Définitions : La dernière couche est nommée "couche de sortie". Les couches qui précèdent la couche de sortie son nommées "couches cachées".
Remarque : les réseaux multicouches sont beaucoup plus puissant que les réseaux simples à une seule couche bien évidemment. En utilisant deux couches, à condition d'employer une fonction d'activation sigmoïde sur la couche cachée, nous pouvons "entraîner" un réseau à produire une approximation de la plupart des fonctions, avec une précision arbitraire. Sauf dans de rares cas, les réseaux de neurones formels exploitent deux ou trois couches.
Définition : "entraîner" un réseau de neurones signifie modifier la valeur de ses poids et de ses biais pour qu'il réalise la fonction d'entrée sortie (I/O). Nous étudierons en détails différents algorithmes et méthodes d'approche heuristiques pour y parvenir dans différents contextes.