Dernière mise à jour :2008-07-24

sciences

Introduction aux réseaux multi-couches

À la fin des années soixantes, une publication de Minski et Papert fait une critique des perceptrons et démontre les limites de ces réseaux à deux couches. En effet, on peut montrer que le perceptron ne peut apprendre que dans les cas dans lesquels les catégories à apprendre sont linéairement séparables comme par exemple dans la fonction logique 'ET'. Le cas le plus connu de tels catégories ne pouvant être séparés linéairement est la fonction logique XOR. La figure 1.0 ci-dessous illustre ces 2 fonctions.


figure 1.0

Dans les années 80, plusieurs chercheurs présentent des solutions à ce problème comme par exemple Rumelhart, Hinton and Williams en 1986. En fait, pour qu'un réseaux de neurones de type perceptron (2 couches) puissent interpréter correctement la fonction XOR, il suffit de lui ajouter une couche. À l'aide de cette couche centrale, il devient alors facile de faire apprendre une telle fonction au réseau. Pour ajuster les poids des connexions, il faut rétro-propager l'erreur de la couche de sortie vers la/les couches cachée(s) et pour finir, vers la rétine.

La suite du présent article visera à démontrer par un exemple, comment bâtir un réseau de neurones composé de deux cellules d'entré (x et y) ainsi que d'une cellule de sortie (z) et faire interpréter par celui-ci le OU exclusif. Cette fonction XOR est définit de la façon suivante:

z=xor(x,y)
x y z
1 0 1
0 0 0
0 1 1
1 1 0

La figure ci-dessous illustre l'aspect qu'aura le réseau utilisé dans l'exemple. Les cercles sur la figure représentent chacun un neurone. Chaque ligne représente une connexion. Le réseaux est composé de trois couches soit: Une couche d'entré comportant 2 cellules ainsi qu'une couche cachée et une couche de sortie composées chacunes d'une seule cellule. La couche cachée est appellée ainsi car ont peut l'interpréter comme une sorte de boite noire dans laquelle on ne peut regarder contrairement aux couche d'entré et sortie qui sont visibles. Finalement, vous pourrez remarquer deux cellules supplémentaires. Celles-ci sont appelées cellules de polarité (bias units). Les valeurs de ces cellules sont toujours de 1.0.

Note: La plupart du temps, lorsqu'un réseau est shématisé, une seule de ces cellules est présentée ou même, bien souvent, on en retrouve aucune.

Dans le cas des connections, vous remarquerez aussi deux connections partant de la rétine et se dirigeant directement vers la couche de sortie. Il faut noter que la plupart du temps, les réseaux multi-couches n'ont des connections qu'avec les couches adjacentes contrairement à ce réseau. Cette méthode est utilisée dans certains problèmes tel celui du XOR dans le but d'accélérer l'entrainement du réseau.


figure 2.0

Fonctionnement du réseau

Le calcul de la valeur de la cellule de sortie s'effectut en deux étapes. On calcul en premier lieu l'activation de la cellule cachée (H sur la figure 2.0) et ensuite, on peut trouver la valeur de la cellule de sortie.

Ces deux calculs se font en utilisant approximativement la même méthode. Le résultat est donné en faisant la somme des intensités des cellules actives. Voici la formule utilisée:

où :

  • Ai = Activation totale de la jième cellule (et non, Artificial Intelligence)
  • Xi = Valeur de la iième cellule de la rétine (0 ou 1)
  • Wij = Intensité (poid) de la connection entre la iième cellule d'entré et la jième cellule de sortie

Dans certain réseau, il convient, après avoir effectué ce calcul, de concerver la valeur trouver en guise d'activation. On dit d'un tel cas qu'on utilise une fonction d'activation linéaire. Par contre, il faut noter que la rétro-propagation est à son mieux lorsque le résultat est passé à une fonction non-linéaire. La fonction non-linéaire qui est le plus courrement utilisé est la fonction logistique qui possède la propriété intéressante de rester dans le domaine 0,1. La figure ci-dessous présente cette fonction.

Les poids des connections entre les cellules doivent être initialiser en utilisant un générateur de nombres aléatoires. Dans notre exemple, les intensités de connections du réseau pourraient être celles-ci:


figure 3.0

Après avoir initialisé les poids de notre réseau, nous pouvons dire que celui-ci est fonctionnel c'est à dire qu'il est maintenant apte à interpréter les valeurs étant présentées sur la rétine. On pourrait le comparer à un nouveau né. En effet, si vous demandez à un bébé de vous donner la réponse au calcul arithmétique 2+2, il est probable que celui-ci vous réponde avec le plus grand sourire quelque chose comme: "buiua ba bla boua!". Ceci signifi peut-être 'j'aime mon papa' ou encore 'j'ai faim' mais à moins que le petit poupon ne possède des facultés différente d'un être humain normal, il n'aura en fait rien compri de ce que vous lui aurai dit. C'est un peu la même chose dans le cas de notre réseau. Si à sa création vous lui demander une réponse, il est presque certain que celle-ci soit inexacte.

Afin de pouvoir espérer une réponse adéquate de notre réseau multi-couche, nous devrons d'abord entrainer celui-ci. La liste ci-dessous présente chacune des étapes du cycle d'entrainement d'un réseau.

  1. Placer le groupe de données (pattern) en entré
  2. Trouver les valeurs des cellules cachées
  3. Trouver les valeurs des cellules de sortie
  4. Trouver l'erreur dans la couche de sortie
  5. Utiliser l'algorithme de rétro-propagation pour ajuster les poids des connections menant aux cellules de sortie
  6. Utiliser une formule pour trouver les erreurs sur la couche cachée
  7. Ajuster les poids menant aux cellules de la couche cachée

Ces étapes doivent être répété une fois pour chaque 'pattern' du XOR (0,0;0,1;1,0;1,1). Lorsque les étapes pour chaque 'pattern' sont terminées, on appelle ca une itération ou époque.

Nous allons poursuivre notre exemple en démontrant le cheminement à suivre pour compléter chacune des étapes en utilisant un seul 'pattern' soit: 1,1. Pour compléter la première étape, nous placerons donc la valeur 1 pour x et 1 pour y (figure 2.0). Celle-ci étant terminée, nous passerons à la seconde qui est tel qu'indiqué dans la liste, trouver la valeur de notre cellule cachée en calculant la somme des cellules actives (incluant la cellule de polarité) et en passant le résultat obtenu dans la fonction logistique. Le calcul ressemblera à ceci:

(1.0 * 4.5) = 4.5
(1.0 * -2.45) = -2.45
(1.0 * -3.8) = -3.8


4.5 + - 2.5 + -3.8 = -1.8

Maintenant que nous connaissons la valeur de la cellule cachée, nous pouvons trouver celle de la cellule de sortie (étape 3) en utilisant les même formules ce qui donne:

(1.0 * 0.3) = 0.3
(1.0 * -2.65) = -2.65
(0.14 * 7.43) = 1.04
(1.0 * 1.4) = 1.4


0.3 + -2.65 + 1.04 + 1.4 = 0.09

Après avoir passé le résultat 0.09, la fonction logistique donne : 0.52

L'étape 4 propose l'évaluation des valeurs des cellules de sortie par rapport aux valeurs qui auraient dû être données. Notre réseau ne possède qu'une seule cellule de sortie et selon les données entrées sur la rétine, celui-ci aurait dû donner 0 (réponse théorique) pour réponse ce qui n'est pas le cas.

Il faut maintenant utiliser une formule pour ajuster les poids des connections menant à notre cellule de sortie. Pour celà, il faut d'abord détecter le signal d'erreur.

La formule à utiliser est la suivante

Où :
Z : la matrice des connections reliants les cellules de la couche cachée aux cellules de la couche de sortie.
h : le vecteur de réponses de la couche cachée
t : la réponse théorique
o : le vecteur de réponse en sortie
s : le signal d'erreur
k : indice f' : la dérivée de la fonction d'activation. Dans le cas de la fonction qui est utilisée dans cet exemple, c'est à dire la fonction logistique, sa dérivé est la suivante:



Si on remplace f(x) par ok pour mieux illustrer la fonction dans notre exemple, ceci donne: ok(1-ok)

Dans notre exemple, le signal d'erreur est donc calculé de la façon suivante:

Il reste maintenant une seule valeur à déterminer avant de pouvoir utiliser la formule de changement des poids. Cette valeur, généralement représenté par le caractère 'n' est appelé règle d'apprentissage. n est une constante réelle positive qui en général est du domaine [0 1]. Le choix d'une valeur pour n est la plupart du temps assez délicat. Il se trouve que plus la valeur de la constante est élevé, plus l'apprentissage sera rapide. Par contre, si la valeur dépasse un certain seuil, l'entrainement peut échouer. Pour notre exemple, nous choisirons une valeur de 1.0 pour la constante n.

Maintenant que nous avons choisit cette valeur, nous en sommes rendu à effectuer le calcul de changement de poids des connections reliées à la couche de sortie. Voici la formule servant à procéder au changement:

Voici le résultat des changements des quatres connections:
7.43+0.1*-0.13*0.14=7.3
1.4+0.1*-0.13*1.0=1.39
0.3+0.1*-0.13*1.0=0.29
-2.65+0.1*-0.13*1.0=-2.66

Nous en sommes maintenant à l'étape 6 soit : trouver l'erreur dans la couche caché. Pour celà, nous utiliserons la formule présenté ci-dessous:

Le calcul de l'erreur donnera donc -0.11 tel qu'illustré ci-dessous:

En terminant, il reste à effectuer le calcul de changement de poids entre les cellules de la couche d'entré et de la couche caché à l'aide de la formule suivante:

Les poids des trois connections recevront donc les nouvelles valeurs suivante:
4.5+0.1*-0.11*1.0=4.49
-2.45+0.1*-0.11*1.0=-2.46
-3.8+0.1*-0.11*1.0=-3.81

Les sept premières étapes d'un première époque pour un premier 'pattern' ont été complétées. Si vous poursuivez l'entrainement du réseau, vous constaterez que les réponse que celui-ci donnera seront de plus en plus précise jusqu'à ce qu'il conaisse parfaitement la réponse.

Auteur : Sylvain Bilodeau

Date de mise en ligne : 2001-11-19

Aucun commentaire pour l'instant.