Les réseaux mono-couche (couche d’entrée et/ou de sortie) peuvent être entraînés avec des règles d’apprentissage relativement simple. En contrepartie, ce genre de réseau est limité au calcul de fonctions très simples. D’ou l’intérêt de créer des réseaux plus élaborés, contenant par exemple des neurones cachés, c'est à dire des neurones qui ne sont ni de la couche d'entrée ni de la couche de sortie. Cependant, même si ces réseaux ont des capacités de calcul plus grandes, leur apprentissage ou l’attribution des poids des connexions devient très difficile. Les réseaux multil-couches comme par exemple le perceptron multicouche sont assez récents. Ce dernier utilise d'ailleurs l’algorithme de rétro-propagation du gradient pour effectuer la mise en place de la pondération du réseau.
Le réseau présenté ici présente les caractéristiques suivantes:
Rappelons les formules de calcul pour un neurone. Considérons donc un neurone i de la couche intermédiaire k + 1. Il reçoit en entrée une somme pondérée fonction de l'état des neurones précédents. On effectue donc:
Les calculs présentés ci-dessus sont d'ordre général et peuvent s'appliquer à un grand nombre de réseaux.
Architecture de base du réseau
L’algorithme de rétro-propagation du gradient est utilisé dans le perceptron multicouche. La phase importante ou ce dernier est utilisé est bien évidemment l’apprentissage.
Dans un cadre plus général, l’apprentissage consiste en un entraînement du réseau. On présente au réseau des entrées et on lui demande de modifier sa pondération de telle sorte que l’on retrouve la sortie correspondante. L’algorithme consiste dans un premier temps à propager vers l’avant les entrées jusqu'à obtenir une entrée calculée par le réseau. La seconde étape compare la sortie calculée à la sortie réelle connue. On modifie alors les poids de telle sorte qu’à la prochaine itération, l’erreur commise entre la sortie calculée et connue soit minimisée. Malgré tout, il ne faut pas oublier que l’on a des couches cachées. On rétro-propage alors l’erreur commise vers l’arrière jusqu'à la couche d’entrée tout en modifiant la pondération. On répète ce processus sur tous les exemples jusqu'à temps que l’on obtienne une erreur de sortie considérée comme négligeable.
Un Exemple
Afin de voir un petit peu mieux ce qui se passe considérons un réseau assez simple composé d’une couche d’entrée, une seule couche intermédiaire et une couche de sortie.
On commence tout d’abord les calculs par une initialisation aléatoire des poids. Examinons alors la méthode d’ajustement des poids sur un seul essai :
On re-ajuste les poids vers les neurones intermédiaires.
Les notations utilisées sont les suivantes:
L’algorithme de généralisation est très simple dans le sens ou il ne fait qu’une propagation de l’entrée vers l’avant. On ne calcule pas d’erreur étant donné d’une part que la modification doit nous donner « un bon résultat » et d'autre part, que la vraie valeur de sortie n'est pas connue.
Exemple de structure
de données
Le programme proposé est écrit en langage C. La structure utilisée pour coder le réseau est relativement intuitive :
Un neurone est donc une entité comprenant le vecteur des poids vers les neurones de la couche suivante, sa valeur de sortie réelle entre 0 et 1 et enfin l'erreur en rétro-propagation.
Pour modéliser, on peut créer un tableau de neurones tel que:
A chaque neurone du tableau on alloue un tableau de poids (w) correspondant aux connexions partants du neurone vers tous les neurones de la couche suivante.
Pour créer un réseau de n neurones, on crée simplement un tableau de n neurones. On s'arrange ensuite pour garder en mémoire la position des couches dans ce tableau.
L'algorithme utilisé
Source du programme en C: Cliquez ici
Six bases de données ont été testées en généralisation sur apprentissage avec l’algorithme de rétro-propagation du gradient.
Lenses | Iris | Bupa | Vote | Mushroom | Chess |
---|---|---|---|---|---|
24 cas |
150 cas |
345 cas |
435 cas |
8124 cas |
3196 cas |
5 entrées |
8 entrées |
22 entrées |
16 entrées |
55 entrées |
37 entrées |
3 sorties |
3 sorties |
2 sorties |
2 sorties |
2 sorties |
2 sorties |
La généralisation sur apprentissage consiste à représenter au réseau les données qu'il a appris. Le résultat doit être normalement de 0% d'erreur si le réseau a effectivement bien appris.
Le premier tableau montre les résultats obtenus sur un réseau mono-couche:
Le tableau suivant montre l'importance de bien choisir le nombre de couches dans son réseau. En effet le raisonnement consistant à dire que plus on met de couche plus le réseau donnera de bons résultats est faux.
Erreur | Lenses | Iris | Bupa | Vote | Mushroom | Chess |
---|---|---|---|---|---|---|
0% |
. |
. |
22-5-2 |
16-5-2 |
55-5-2 |
37-5-2 |
. |
. |
22-4-2 |
16-3-2 |
55-2-2 |
. |
. |
0.09% |
. |
. |
. |
. |
37-2-2 |
. |
0.29% |
. |
. |
22-02 |
. |
. |
. |
2.67% |
. |
8-4-3 (75) |
. |
. |
. |
. |
4.17% |
5-3-3 |
. |
. |
. |
. |
. |
13% |
. |
8-4-3 (150) |
. |
. |
. |
. |
Erreur en fonction de l'architecture du réseau en rétro-propagation