
|
T.P.
"Identification neuronale"
Fabien Moutarde, centre de Robotique (CAOR)
|
|
Principe du TP
Le but de ce TP est d'illustrer la
capacité de modélisation des réseaux
neuronaux sur un système dynamique non-linéaire
simple, en menant à terme une identification neuronale, depuis la génération des données
d'apprentissage, jusqu'au test du modèle obtenu.
Préalables
Pour
ce TP, booter de préférence sous Windows (mais Linux est possible aussi).
- Téléchargez le fichier identNN.jar et enregistrez-le dans un répertoire à créer pour ce TP dans votre homedir.
-
Pour
exécuter le programme simulant le système dynamique
à modéliser, double-cliquez sur identNN.jar (sous Windows
; ou bien, sous Linux, utilisez un terminal, placez-vous dans le
répertoire contenant le jar auto-exécutable et
faites :
"java -jar identNN.jar"
1/ Génération de données d'apprentissage
- Prise en main du simulateur et compréhension du système dynamique à modéliser
L'interface du simulateur du
système dynamique (à démarrer avec le jar
auto-exécutable : cf plus haut) doit ressembler à
ce qui est ci-dessus. Commencez par "jouer" un peu avec, pour comprendre
en quoi consiste ce système dynamique non-linéaire
très simple :
- le bouton "SIMUL" permet de démarrer la simulation ;
- le bouton "INIT" permet de réinitialiser le
système dans une position aléatoire (avec vitesse
initiale nulle pour la balle) ;
- on peut aussi "attraper" le plateau à la souris et
modifier son angle à la main en gardant le bouton de la souris
enfoncé (mode "dragMouse") ;
- quand la simulation fonctionne, le bouton "STOP_SIM" permet de l'arrêter.
- Principe de la génération de données d'apprentissage
Pour générer des
données d'apprentissage, il faut d'abord choisir la ou les
entrée(s) à enregistrer, en cochant au moins une
entrée parmi "thetaIN", "vbIN" et "xbIN"), et la ou les
sortie(s), en cochant "vbOUT" et/ou "xbOUT". Ensuite, il suffit de
cocher la case "Record", puis de choisir une position de
démarrage (avec "INIT", ou bien à la main), et de
démarrer la simulation (bouton "SIMUL"). Durant
l'enregistrement, on peut arrêter/redémarrer la
simulation, bouger le plateau "manuellement" à la souris (avec
la
simulation en marche ou arrêtée), et enfin
réinitialiser la position du plateau (bouton "INIT"),
même en cours de simulation. Le système enregistre des
données d'apprentissage si et seulement si la simulation est
active (autrement dit "STOP_SIM" permet de suspendre temporairement
l'enregistrement de données).
Pour arrêter l'enregistrement, il suffit de décocher
"Record" : un fichier nommé rec.txt a alors été
généré dans le répertoire où le
simulateur a été démarré.
- Choix des entrées et sorties
En considérant la
physique du système, choisissez une ou des entrée(s) et une
ou des sortie(s). Plusieurs choix sont envisageables... Justifiez votre
choix, ou sinon par défaut prenez de préférence, pour commencer, theta et vb en entrées, et vb en sortie (à votre avis, pourquoi ?).
- Stratégie pour générer une bonne séquence d'apprentissage
Une fois vos
entrées-sorties choisies, réfléchissez à votre
stratégie pour la génération de la séquence
d'apprentissage : que faut-il s'efforcer de faire pour maximiser les
chances d'obtenir ensuite par apprentissage un modèle neuronal
satisfaisant ??
Penser aussi que pour des raisons méthodologiques (cf cours sur
les réseaux neuronaux, et rappels dans le cadre
général des techniques d'apprentissage) il est
souhaitable d'avoir DEUX bases d'exemples : une d'apprentissage, et une
de validation (éventuellement, les fichiers de données
étant de type texte, vous pouvez aussi couper en 2 "à la
main" une grosse base, sous réserve de bien dupliquer
l'en-tête dans le 2° fichier créé
manuellement).
ATTENTION :
chaque nouvel enregistrement écrase le fichier rec.txt !! Il est
donc conseillé, après sa génération, de le
copier sous un nom rappelant son contenu (notamment en terme
d'entrées et sorties, pour vous y retrouver entre divers essais).
2/ Apprentissage sous jaNet
- Dimensionnez
votre réseau en fonction des nombres d'entrées et sorties
des exemples du fichier d'apprentissage que vous souhaitez
utiliser.
- Chargez une base d'exemples en
apprentissage, et une comme "validation" (improprement nommée
"base de test" dans jaNet), et faites un apprentissage. A votre avis,
quel(s) critère(s) d'erreur est/sont le(s) plus pertinent(s), en
dehors de l'erreur moyenne ? Pourquoi ? En regardant les valeurs des
sorties dans le fichier des données d'apprentissage,
évaluer le niveau d'erreur qu'il serait souhaitable d'obtenir
sur un maximum d'exemples d'apprentissage.
- Une fois que vous pensez avoir obtenu un apprentissage satisfaisant, sauvegardez le réseau :
- au format binaire .bpn (seul
permettant de recharger ensuite le réseau sous jaNet), en sélectionnant,
dans le menu "File", l'option "Save As..." ;
- IMPERATIVEMENT aussi en format
TEXTE (le seul que le simulateur sait charger !), en choissisant, dans
le menu "Network", l'option "Save Weights in text file".
Pensez à nommer vos
réseaux de façon à vous y retrouver au cas
où vous feriez plusieurs essais...
3/ Test du modèle neuronal obtenu
Pour tester un modèle neuronal, revenir à l'outil de simulation identNN.jar et :
- Ouvrez le fichier *texte* d'un réseau avec le bouton "Load NN".
- Vérifiez que la simulation du modèle physique est bien arrêtée (et sinon, faites "STOP_SIM").
- Cochez
IMPERATIVEMENT les entrées et sorties utilisées par le
réseau (si vous avez un doute, vérifiez sur le
commentaire en 2° ligne du fichier d'exemples utilisé en
apprentissage) !!
- Initialisez la position de départ comme bon vous semble,
puis démarrez le test du modèle neuronal en appuyant sur
le bouton "SimuNN". Comme dans le cas de la simulation basée sur
les équations physiques, vous pouvez à tout moment
réinitialiser la position, ou modifier l'angle du plateau
à la main.
- Si vous avez entraîné un réseau avec
(theta,vb) en entrée et vb(t+1) en sortie, quel défaut
constatez-vous ? Est-ce normal ? Pourquoi l'ajout de xb en
entrée pourrait-il peut-être permettre d'éviter
cela ?
- Dans un premier temps, pour tester plus
commodément votre réseau, utilisez la
possibilité, en cochant "ForceStop" de "forcer"
l'arrêt de la balle quand elle arrive au bord du plateau...
- Enfin, essayer maintenant de regénérer des données
et faire un apprentissage avec cette fois-ci (theta,vb, xb) en
entrées, et vb en sortie.
NOTE : dans un certain nombre de cas,
le comportement dynamique du modèle neuronal est très peu
satisfaisant, alors que l'erreur d'apprentissage, et même de
validation, paraissaient suffisamment faibles. Compte tenu de ce qui a
été dit en cours, et du type d'apprentissage
utilisé (le seul disponible dans jaNet pour le moment...),
comment cela peut-il s'expliquer ? Que faudrait-il faire comme type
d'apprentissage pour obtenir de meilleurs résultats pour la
dynamique du modèle neuronal rebouclé ?
4/ Vers une commande neuronale...
A la lumière de ce qui a
été exposé en cours sur la commande neuronale,
comment pourrait-on essayer de s'y prendre(sous réserve d'avoir
un outil capable de le faire) pour entraîner un réseau
neuronal de commande qui
amène la balle à un point donné du plateau (par exemple le centre,
mais pas forcément) et l'y maintienne ?
Faites et expliquez un schéma illustrant ce qu'il faudrait faire.