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).
[Vous devriez voir ici une image du simulateur...]

1/ Génération de données d'apprentissage

  1. 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 :
  2. 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é.

  3. 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 ?).

  4. 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

Lancez maintenant jaNet, l'outil d'apprentissage de réseau neuronal utilisé durant le premier TP sur les réseaux neuronaux.
  1. Dimensionnez votre réseau en fonction des nombres d'entrées et sorties des exemples du fichier d'apprentissage que vous souhaitez utiliser.
  2. 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.
  3. Une fois que vous pensez avoir obtenu un apprentissage satisfaisant, sauvegardez le réseau :
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 :
  1. Ouvrez le fichier *texte* d'un réseau avec le bouton "Load NN".
  2. Vérifiez que la simulation du modèle physique est bien arrêtée (et sinon, faites "STOP_SIM").
  3. 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) !!
  4. 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.
  5. 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 ? 
  6. 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...
  7. 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.