Outils pour utilisateurs

Outils du site


apprentissage_par_renforcement

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
apprentissage_par_renforcement [2021/01/28 11:01] – [Source sur Github] sergeapprentissage_par_renforcement [2022/02/10 07:52] (Version actuelle) – [Apprentissage Par Renforcement] serge
Ligne 1: Ligne 1:
 ====== Apprentissage Par Renforcement ====== ====== Apprentissage Par Renforcement ======
- 
 <WRAP center round box 60% centeralign> <WRAP center round box 60% centeralign>
 **{{tagpage>ia|Intelligence Artificielle}}**     **[[http://translate.google.com/translate?hl=&sl=auto&tl=en&u=https%3A%2F%2Fressources.labomedia.org%2Fapprentissage_par_renforcement|English Version]]** **{{tagpage>ia|Intelligence Artificielle}}**     **[[http://translate.google.com/translate?hl=&sl=auto&tl=en&u=https%3A%2F%2Fressources.labomedia.org%2Fapprentissage_par_renforcement|English Version]]**
Ligne 7: Ligne 6:
 **[[les_pages_intelligence_artificielle_en_details|Les Pages Intelligence Artificielle en détails]]** **[[les_pages_intelligence_artificielle_en_details|Les Pages Intelligence Artificielle en détails]]**
 </WRAP> </WRAP>
- 
 {{ :media_14:cartpole.gif |}} {{ :media_14:cartpole.gif |}}
  
 ===== Le Hello World de l'Apprentissage Par Renforcement ===== ===== Le Hello World de l'Apprentissage Par Renforcement =====
 +<WRAP group> 
 +<WRAP third column>
 Linéaire: Linéaire:
- 
-{{youtube>0wSAGwgzrp8?small}} 
 {{youtube>qMlcsc43-lg?small}} {{youtube>qMlcsc43-lg?small}}
-{{youtube>Lt-KLtkDlh8?small}} +</WRAP
 +<WRAP third column>
 Rotatif: Rotatif:
- 
-{{youtube>hGSn9DyvZDU?small}} 
-{{youtube>rhg0wcAvvhc?small}} 
 {{youtube>pbvmbebFZoY?small}} {{youtube>pbvmbebFZoY?small}}
 +</WRAP> 
 +<WRAP third column>
 Flying: Flying:
 {{youtube>15DIidigArA?small}} {{youtube>15DIidigArA?small}}
-{{youtube>XxFZ-VStApo?small}} +</WRAP
- +</WRAP> 
-Double pendule+  * Rotary Inverted PendulumSwing Up and Stabilization https://www.youtube.com/watch?v=2koXcs0IhOc 
-{{youtube>N-yrQu9zuOI?small}} +  * Double Inverted Furuta Pendulum https://www.youtube.com/watch?v=lwJ2jzVexaI 
 +  * Furuta Pendulum avec une belle finition https://www.youtube.com/watch?v=VVQ-PGfJMuA
 =====Apprentissage par renforcement===== =====Apprentissage par renforcement=====
   * **[[https://fr.wikipedia.org/wiki/Apprentissage_par_renforcement|Apprentissage par renforcement @ fr.wikipedia.org]]**. En intelligence artificielle, plus précisément en apprentissage automatique, l'apprentissage par renforcement consiste, pour un agent autonome (robot, etc.), à apprendre à partir d'expériences, de façon à optimiser une récompense quantitative au cours du temps, positive ou négative. En répétant les expériences, le robot progresse.   * **[[https://fr.wikipedia.org/wiki/Apprentissage_par_renforcement|Apprentissage par renforcement @ fr.wikipedia.org]]**. En intelligence artificielle, plus précisément en apprentissage automatique, l'apprentissage par renforcement consiste, pour un agent autonome (robot, etc.), à apprendre à partir d'expériences, de façon à optimiser une récompense quantitative au cours du temps, positive ou négative. En répétant les expériences, le robot progresse.
  
-====Directeur Semour Skinner====+====Directeur Seymour Skinner====
 {{ youtube>0cmklEiZFYI?medium }} {{ youtube>0cmklEiZFYI?medium }}
 Le directeur de l'école des enfants **[[https://fr.wikipedia.org/wiki/Les_Simpson|Simpson]]** s'appelle **[[https://fr.wikipedia.org/wiki/Seymour_Skinner|Seymour Skinner]]**, inspiré de **[[https://fr.wikipedia.org/wiki/Burrhus_Frederic_Skinner|Burrhus Frederic Skinner]]**, inventeur de la **[[https://fr.wikipedia.org/wiki/Bo%C3%AEte_de_Skinner|Boîte de Skinner]]** Le directeur de l'école des enfants **[[https://fr.wikipedia.org/wiki/Les_Simpson|Simpson]]** s'appelle **[[https://fr.wikipedia.org/wiki/Seymour_Skinner|Seymour Skinner]]**, inspiré de **[[https://fr.wikipedia.org/wiki/Burrhus_Frederic_Skinner|Burrhus Frederic Skinner]]**, inventeur de la **[[https://fr.wikipedia.org/wiki/Bo%C3%AEte_de_Skinner|Boîte de Skinner]]**
- 
 {{ :media_14:23765.jpg?400 |}} {{ :media_14:23765.jpg?400 |}}
  
Ligne 47: Ligne 41:
   * [[https://winderresearch.com/a-comparison-of-reinforcement-learning-frameworks-dopamine-rllib-keras-rl-coach-trfl-tensorforce-coach-and-more/|Dopamine, RLLib, Keras-RL, Coach, TRFL, Tensorforce, Coach and more]] @ winderresearch.com/   * [[https://winderresearch.com/a-comparison-of-reinforcement-learning-frameworks-dopamine-rllib-keras-rl-coach-trfl-tensorforce-coach-and-more/|Dopamine, RLLib, Keras-RL, Coach, TRFL, Tensorforce, Coach and more]] @ winderresearch.com/
   * [[https://larevueia.fr/apprentissage-par-renforcement/|Apprentissage par renforcement]] @ larevueia.fr Article général.   * [[https://larevueia.fr/apprentissage-par-renforcement/|Apprentissage par renforcement]] @ larevueia.fr Article général.
-  * [[https://neptune.ai/blog/the-best-tools-for-reinforcement-learning-in-python|The Best Tools for Reinforcement Learning in Python You Actually Want to Try]] Posted November 17, 2020, parle de: +  * [[https://neptune.ai/blog/the-best-tools-for-reinforcement-learning-in-python|The Best Tools for Reinforcement Learning in Python You Actually Want to Try]] Posted November 17, 2020, compare KerasRLTensorforcePyqlearningRL_CoachTFAgentsMAME RLMushroomRL
-    * KerasRL +
-    * Tensorforce +
-    * Pyqlearning +
-    * RL_Coach +
-    * TFAgents +
-    * MAME RL +
-    * MushroomRL+
   * [[https://github.com/aidudezzz/deepbots|commande de robots]]   * [[https://github.com/aidudezzz/deepbots|commande de robots]]
 +
 +====Principe vulgarisé d'une boucle PID===
 +  * [[https://fr.wikipedia.org/wiki/R%C3%A9gulateur_PID|Régulateur PID]] sur Wikipedia. 2 images de l'article:
 +
 +Dans une boucle de régulation, il faut atteindre la valeur de consigne le plus vite possible, mais sans dépasser la valeur, sans à dire "sans pomper".
 +{{ :media_14:reponse_echelon_pid.jpg?300 | }}\\
 +Une boucle PID (proportionnelle dérivée intégrale) est très performante:
 +{{ :media_14:correcteurpidclassique.jpg?500 |}}
 +
 +====Principe vulgarisé de l'Apprentissage par Renforcement====
 +**RL = Reinforcement Learning = Apprentissage par Renforcement**
 +{{ :media_14:apprentissage-par-renforcement.png?400 |}}
 +L'IA (Intelligence Artificielle) dont nous parlons ici n'est pas intelligente, par contre l'auteur est intelligent sinon il n'aurait jamais réussi à faire un truc pareil!\\
 +Dans l'exemple du pendule:
 +L'**agent** est le programme de RL de l'**IA**.\\
 +L'**action** est "à droite" ou "à gauche".\\
 +L’**environnement** est l'installation du pendule, le capteur de mesure de l'angle du pendule, le moteur droite gauche. Il retourne l'**état** soit la position et la vitesse du chariot, l'angle et la vitesse de rotation du pendule, mis à jour un peu après l'application d'une action.\\
 +La **récompense** est calculée en fonction de l'état.\\
 +Une nouvelle **action** est calculée par l'agent. L'agent s'optimise pour avoir la plus grande récompense possible.
 +[[https://ressources.labomedia.org/apprentissage_par_renforcement#comment_est_definit_l_objectif_a_atteindre|Des explications]] sur le calcul de la récompense.\\
 +Dans [[https://ressources.labomedia.org/apprentissage_par_renforcement#le_jeu_du_pendule_dans_blender|Le jeu du pendule dans Blender]], l'environnement est Blender, l'IA sont gym, baselines, les scripts. La communication entre l'IA et Blender se fait en OSC: l'action est envoyée, Blender retourne le résultat de cette action.
  
 =====Frameworks possibles===== =====Frameworks possibles=====
 ====Gym de OpenAI==== ====Gym de OpenAI====
 ===OpenAI=== ===OpenAI===
-  * **[[https://openai.com/|openai.com]]**  +[[https://fr.wikipedia.org/wiki/OpenAI|fr.wikipedia.org]] **[[https://openai.com/|openai.com]]**  est une entreprise à « but lucratif plafonné » en intelligence artificielle, basée à San Francisco. En 2019, OpenAI a reçu a 1 000 000 000 $ de Microsoft. OpenAi utilise [[https://blogs.microsoft.com/ai/openai-azure-supercomputer/|le super Calculateur de Micro$]] pour ses apprentissages.\\ Avant mars 2019, elle était reconnue association à but non lucratif. L'objectif de cette société était de promouvoir et développer une intelligence artificielle à visage humain qui bénéficierait à toute l'humanité. L'objectif actuel est de se faire des $.
-[[https://fr.wikipedia.org/wiki/OpenAI|fr.wikipedia.org]] **OpenAI** est une entreprise à « but lucratif plafonné » en intelligence artificielle, basée à San Francisco. En 2019, OpenAI a reçu a 1 000 000 000 $ de Microsoft. OpenAi utilise le super Calculateur de Micro$ pour ses apprentissages.\\ Avant mars 2019, elle était reconnue association à but non lucratif. L'objectif de cette société était de promouvoir et développer une intelligence artificielle à visage humain qui bénéficierait à toute l'humanité. L'objectif actuel est de se faire des $.+
  
 ===Gym=== ===Gym===
-Gym is a toolkit for developing and comparing reinforcement learning algorithms+Gym is a toolkit for developing and comparing reinforcement learning algorithms[[https://en.wikipedia.org/wiki/OpenAI#Gym|Gym]] @ en.wikipedia.org[[https://github.com/openai/gym|Gym]] @ github.com/openai[[http://gym.openai.com/docs/|Gym]] @ gym.openai.com/docs
-  * [[https://en.wikipedia.org/wiki/OpenAI#Gym|Gym]] @ en.wikipedia.org +
-  * [[https://github.com/openai/gym|Gym]] @ github.com/openai +
-  * [[http://gym.openai.com/docs/|Gym]] @ gym.openai.com/docs+
  
 ====Baselines vs Stable-baselines vs Stable-baselines3==== ====Baselines vs Stable-baselines vs Stable-baselines3====
-OpenAI Baselines is a set of high-quality implementations of reinforcement learning algorithms. **"Chef, Le meilleur des meilleurs, chef"** 
- 
 ===Baselines=== ===Baselines===
-[[https://github.com/openai/baselines|Baselines]] est un projet OpenAI. Les dépendances sont anciennesl'installation est quasi impossible et Stable-baselines est mieux!+[[https://github.com/openai/baselines|Baselines]] est un projet OpenAI. Mal foutuplus maintenu.
  
 ===Stable-baselines=== ===Stable-baselines===
-Main differences with OpenAI Baselines. This toolset is a fork of OpenAI Baselines, with a major structural refactoringand code cleanups: +Le code de Stable-baselines est le code de Baselines nettoyéaméliorédocumenté. **[[https://stable-baselines.readthedocs.io/en/master/index.html|Documentation de stable-baselines]]** @ stable-baselines.readthedocs.io
-  Unified structure for all algorithms +
-  PEP8 compliant (unified code style) +
-  Documented functions and classes +
-  More tests & more code coverage +
-  * Additional algorithms: SAC and TD3 (+ HER support for DQN, DDPG, SAC and TD3)+
  
    sudo pip3 install stable-baselines    sudo pip3 install stable-baselines
-  
-Successfully installed Pillow-7.2.0 atari-py-0.2.6 cloudpickle-1.6.0 cycler-0.10.0 future-0.18.2 gym-0.18.0 joblib-1.0.0 kiwisolver-1.3.1 matplotlib-3.3.3 opencv-python-4.5.1.48 pandas-1.1.5 pyglet-1.5.0 pyparsing-2.4.7 python-dateutil-2.8.1 pytz-2020.5 scipy-1.5.4 stable-baselines-2.10.1 
- 
-  * **[[https://stable-baselines.readthedocs.io/en/master/index.html|Documentation de stable-baselines]]** @ stable-baselines.readthedocs.io 
  
 ===Stable-baselines3=== ===Stable-baselines3===
 +**[[https://stable-baselines3.readthedocs.io/en/master/|Stable-Baselines3]]** est la prochaine version. Mais beaucoup d'exemples ne sont plus compatibles. **[[https://stable-baselines3.readthedocs.io/en/master/guide/examples.html|Documentation de stable-baselines3]]** @ stable-baselines3.readthedocs.io
  
-Stable Baselines3 (SB3) is a set of reliable implementations of reinforcement learning algorithms in PyTorch. It is the next major version of Stable Baselines.+  sudo pip3 install stable-baselines3 stable-baselines3[extra]
  
-  * **[[https://stable-baselines3.readthedocs.io/en/master/|Stable-Baselines3]]** +=====Modélisation d'un système physique===== 
 +Pour les exemples de la doc du pendule, compris dans gym, les calculs physiques sont quelques lignes 
 +dans le fichier de "env". Le rendu est effectué avec [[http://pyglet.org/|pyglet]], [[pyglet_cross-platform_windowing_and_multimedia_library|présenté ici]]Un step [[https://github.com/sergeLabo/balance/blob/main/cartpole_doc_baselines.py|ici]] dure 1 ms avec 4 CPU, dans Blender un step dure 20 ms.\\ 
 +Un fichier pour le tester: [[https://github.com/sergeLabo/balance/blob/main/cartpole_doc_baselines.py|cartpole_doc_baselines.py]]
  
-  sudo pip3 install stable-baselines3 +Dans le § suivant, un pendule est modélisé dans un moteur de rendu 3D qui représente ce que serait un vrai pendule de la vie réelle: il n'est pas possible d'accélérer la simulation.\\ 
-  sudo pip3 install stable-baselines3[extra] +Pour faire des recherches et simuler l'influence de nombreux paramètres, il ne faut pas faire de visualisation et utiliser des moteurs physique: [[pybullet|Bullet]] (libre), [[http://mujoco.org|Mujoco]] (propriétaire et payant, très cher), qui simule le réelLes calculs peuvent alors aller beaucoup plus vite, 20 fois par rapport au réel.
- +
- +
-  * **[[https://stable-baselines3.readthedocs.io/en/master/guide/examples.html|Documentation de stable-baselines3]]** @ stable-baselines3.readthedocs.io+
  
 =====Le jeu du pendule dans Blender===== =====Le jeu du pendule dans Blender=====
-La modélisation d'un pendule dans Blender avec le moteur physique intégré (Bullet) est délicate. +  * **[[https://github.com/sergeLabo/balance|Balance]]** Sources sur Github 
- +====Installation====
-====Un axe static et un cube Rigid Body avec un trou==== +
-{{:media_14:axe_axe_1.png?200|}} +
-{{:media_14:axe_axe_2.png?200|}} +
-{{:media_14:axe_pendule_1.png?200|}} +
-{{:media_14:axe_pendule_2.png?200|}} +
- +
-Le pendule fini rapidement par se décrocher de l'axe, si un vertex du trou est dans l'axe sur une frame, la physics va le faire tomber dans l'infini de l'espace. +
-====Constraint Rigid Body Joint==== +
- +
-===Axe=== +
-{{:media_14:balance_1.png?200|}} +
-{{:media_14:balance_4.png?200|}} +
- +
-===Rigid Body Joint=== +
-{{ :media_14:balance_2.png?400 |}} +
- +
-===Pendule=== +
-{{:media_14:balance_3.png?200|}}{{:media_14:balance_5.png?200|}} +
- +
-Cette 2ème solution permet de bien faire tourner le pendule, par contre le stabiliser verticalement est corriace.\\ +
-Le Empty a été remplacer par un Cube en Dynamic avec une masse de 1 et le pendule une masse de 0.1 +
- +
-==== Source sur Github ==== +
-  * **[[https://github.com/sergeLabo/balance|Balance]]** sur Github +
- +
-===Installation===+
   * Debian 10 Buster   * Debian 10 Buster
   * python 3.7   * python 3.7
   * blender game engine 2.79   * blender game engine 2.79
-  * gym modifié dans my_gym +  * stable-baselines [[apprentissage_par_renforcement#Baselines vs Stable-baselines vs Stable-baselines3|]] qui installe gym
-  * stable-baselines+
   * [[https://ressources.labomedia.org/kivy_oscpy|oscpy de kivy super pratique]] pour la com entre le BGE et le script python   * [[https://ressources.labomedia.org/kivy_oscpy|oscpy de kivy super pratique]] pour la com entre le BGE et le script python
 +  * CUDA: Pour une carte graphique, [[https://ressources.labomedia.org/debian_installation_configuration#installation_de_xubuntu_1804_pour_du_calcul_d_ia|Installation de cuda sur Xubuntu 18.04]]. Il faut configurer la gestion de l'alimentation en définissant la veille à jamais, et éteindre votre écran avec le bouton on/off.
  
-Installation de CUDA:  
-  sudo apt install blender python3-mpi4py 
-  sudo python3 -m pip install numpy tensorflow==1.15 
-   
 ===gym=== ===gym===
-gym est installé dans le système avec l'installation de stable-baselines. Ce projet est construit en modifiant des fichiers sources de gym, dans une copie nommée my_gym, importée dans les fichiers avec:+gym est installé dans le système avec l'installation de stable-baselines. Balance est construit en modifiant des fichiers sources de gym, dans une copie nommée my_gym, importée dans les fichiers avec:
  
   import sys   import sys
Ligne 148: Ligne 112:
   import gym   import gym
  
-Désinstallation de gym+Il faut désinstaller gym
   sudo pip3 uninstall gym   sudo pip3 uninstall gym
-   
-===Bullet dans blender=== 
-Le moteur physique de Blender est Bullet. Il vit sa vie en parallèle du moteur de jeu, une commande demandée dans un script python sur une frame agit dans le moteur physique lors des frames suivantes mais en interaction avec la physique en cours. Le script python n'est pas un dictateur qui donne des ordres strictes à Bullet. Exemple d'un reset position et orientation sur 100 frames: 
-<code python> 
-def reset(): 
  
-    gl.num_reset ++===Modification de my_gym=== 
-    x, x_dot, teta, teta_dot gl.reset+Définition de mon environnement dans: **[[https://github.com/sergeLabo/balance/blob/main/my_gym/gym/envs/__init__.py|__init__.py]]** **[[https://github.com/sergeLabo/balance/blob/main/my_gym/gym/envs/classic_control/__init__.py|__init__.py]]** **[[https://github.com/sergeLabo/balance/blob/main/my_gym/gym/envs/classic_control/my_cartpole.py|my_cartpole.py]]**\\ 
 +Un fichier obtenu avec un apprentissage est à: [[https://github.com/sergeLabo/balance/blob/main/weights/ppo2_cartpole250000.zip|ppo2_cartpole250000.zip]]
  
-    if 1 < gl.num_reset < 100: +====Modélisation==== 
-        gl.cube.worldPosition [x, 0.738772, 0] +La modélisation d'un pendule dans Blender avec le moteur physique intégré (Bullet) est délicate. 
-        gl.cube.worldLinearVelocity[0] = x_dot+===Un axe static et un cube Rigid Body avec un trou=== 
 +{{:media_14:axe_axe_1.png?240|}} 
 +{{:media_14:axe_axe_2.png?140|}} 
 +{{:media_14:axe_pendule_1.png?110|}} 
 +{{:media_14:axe_pendule_2.png?150|}} 
 +Le pendule fini rapidement par se décrocher de l'axe, si un vertex du trou est dans l'axe sur une frame, la physics va le faire partir dans l'infini de l'espace.
  
-        xyz gl.pendulum.worldOrientation.to_euler() +===Constraint Rigid Body Joint=== 
-        xyz[1] = teta +Cette 2ème solution permet de bien faire tourner le pendule, par contre le stabiliser verticalement est corriaceLe Empty a été remplacer par un Cube en Dynamic avec une masse de 1 et le pendule une masse de 0.1 
-        gl.pendulum.worldOrientation = xyz.to_matrix() +<WRAP group> 
-        gl.pendulum.worldAngularVelocity[1] teta_dot+<WRAP third column> 
 +**Axe** 
 +{{ :media_14:balance_1.png?100 |}} 
 +{{ :media_14:balance_4.png?220 |}} 
 +</WRAP> 
 +<WRAP third column> 
 +**Rigid Body Joint** 
 +{{ :media_14:balance_2.png?300 |}} 
 +</WRAP> 
 +<WRAP third column> 
 +**Pendule** 
 +{{ :media_14:balance_3.png?200 |}}{{ :media_14:balance_5.png?130 |}} 
 +</WRAP> 
 +</WRAP> 
 +   
 +===Bullet dans blender=== 
 +Le moteur physique de Blender est Bullet. Il vit sa vie en parallèle du moteur de jeu, une commande demandée dans un script python sur une frame agit dans le moteur physique lors des frames suivantes mais en interaction avec la physique en cours. Le script python n'est pas un dictateur qui donne des ordres strictes à Bullet. \\ 
 +Il est important d'ajouter des substeps dans **Blender Properties Scene Physics** 
 +{{ :media_14:scene_physics.png?250|}}\\
  
-    if gl.num_reset == 100: +Exemple d'un reset position et orientation sur 25 frames[[https://github.com/sergeLabo/balance/blob/main/balance/always.py#L71|def reset():]] \\ 
-        gl.num_reset = 0 +Le fps est défini à 120 dans le panneau de rendu, le script once.py défini bge.logicsetLogicTicRate(120). Le FPS affiché est calculé avec time().
-        gl.reset = 0 +
-</code>+
  
-===Visualisation dans blender=== +====Lancement du jeu==== 
-Dans le dossier du projet +Lancer blender comme ci-dessus et le script **[[https://github.com/sergeLabo/balance/blob/main/my_cartpole_ppo2_rendu.py|my_cartpole_ppo2_rendu.py]]**
-  blenderplayer ./balance/balance.blend +
-   +
-Le fps est défini à 120 dans le panneau de rendu, le script once.py défini bge.logicsetLogicTicRate(120)\\  +
-Cela devrait faire tourner le rendu et le moteur physique à 120 ! +
- +
-===Lancement de l'apprentissage=== +
-Définition de mon environnement dans: +
-  * **[[https://github.com/sergeLabo/balance/blob/main/my_gym/gym/envs/__init__.py|__init__.py]]** +
-  * **[[https://github.com/sergeLabo/balance/blob/main/my_gym/gym/envs/classic_control/__init__.py|__init__.py]]** +
-  * **[[https://github.com/sergeLabo/balance/blob/main/my_gym/gym/envs/classic_control/my_cartpole.py|my_cartpole.py]]**+
  
   blenderplayer ./balance/balance.blend   blenderplayer ./balance/balance.blend
 +et dans un autre terminal, pour l'apprentissage:
   python3 my_cartpole_ppo2_train.py   python3 my_cartpole_ppo2_train.py
-   +ou pour le rendu
-Le fichier d'apprentissage est à: [[https://github.com/sergeLabo/balance/blob/main/weights/acktr_blender_250000_1.zip| acktr_blender_250000_1.zip]] +
- +
-===Utilisation=== +
-Lancer blender comme ci-dessus et le script **[[https://github.com/sergeLabo/balance/blob/main/blender_baselines_acktr.py|blender_baselines_acktr.py]]** +
- +
-  blenderplayer ./balance/balance.blend+
   python3 my_cartpole_ppo2_rendu.py   python3 my_cartpole_ppo2_rendu.py
  
 ===Remarque=== ===Remarque===
-Le jeu (avec blenderplayer ...) ne doit être lancé qu'une seule fois! On peut lancer ou stopper les scripts python, à son bon vouloir, la reconnexion est automatique avec le BGE.+Le jeu (avec blenderplayer ...) ne doit être lancé qu'une seule fois! On peut lancer ou stopper le script python ou Blender, à son bon vouloir, la reconnexion est automatique. Çà c'est trop fort et super génial! 
 ====Résultat du 1er essai==== ====Résultat du 1er essai====
-Avec un apprentissage de quelques heures .... 
-{{ vimeo>503157923?large }} 
  
-=====Comment est définit l'objectif à atteindre===== +{{ :media_14:cartpole_avec_blender_game_engine.mp4?500 |}}
-**Objectif = target = goal = but**+
  
-Le goal est définit par les règles définissant le "reward", la récompense. +Avec un apprentissage de quelques heures ....
- +
-Le goal est le centre d'un intervale.\\ +
-En dehors de cet intervalle, pas de récompense: reward = 0 +
-Dans l'intervalle, la récompense est une fonction décroissante de l'écart au centreIdem est (un peu de latin, ça fait prof au Collège de France) plus l'écart est faible, plus la récompense est grandeLa récompense est calculée à chaque step.+
  
 +=====Comment est définit l'objectif à atteindre=====
 +**Objectif = target = goal = but**\\
 +Le goal est définit par les règles définissant le "reward", la récompense. Il est le centre d'un intervale. En dehors de cet intervalle, pas de récompense: reward = 0\\
 +Dans l'intervalle, la récompense est une fonction décroissante de l'écart au centre. Idem est (un peu de latin, ça fait prof au Collège de France) plus l'écart est faible, plus la récompense est grande. La récompense est calculée à chaque step.\\
 Exemple extrait de Swing Up Exemple extrait de Swing Up
 <code python> <code python>
 # La récompense est définie ici, le goal est 0 # La récompense est définie ici, le goal est 0
-# Reward_teta is + 
-1 when teta is 90 +# Reward_teta is 1 when teta is 90 soit np.cos(teta) de 0 to 90 or -90 to 0,
-np.cos(teta) de 0 to 90 or -90 to 0,+
 # 0 if between 90 and 270 or -270 to -90 # 0 if between 90 and 270 or -270 to -90
 # 0 < Reward_teta < 1 # 0 < Reward_teta < 1
 reward_teta = max(0, np.cos(teta)) reward_teta = max(0, np.cos(teta))
  
-Reward_x is 0 when cart is at the edge of the screen, when it's in the centre+Récompense sur x: au centre (x=0), 0 si x = +ou-self.x_threshold
 reward_x = np.cos((x / self.x_threshold) * (np.pi / 2.0)) reward_x = np.cos((x / self.x_threshold) * (np.pi / 2.0))
  
Ligne 228: Ligne 191:
 reward = reward_teta * reward_x reward = reward_teta * reward_x
 </code> </code>
- 
 Ici, il y a une récompense si le pendule est au-dessus du diamètre horizontal. Plus il est près de la position verticale, plus la récompense est grande. Sinon la récompense est nulle. Ici, il y a une récompense si le pendule est au-dessus du diamètre horizontal. Plus il est près de la position verticale, plus la récompense est grande. Sinon la récompense est nulle.
 ===== Relèvement du pendule appelé Swing-up===== ===== Relèvement du pendule appelé Swing-up=====
 +Les [[https://gym.openai.com/envs/Pendulum-v0/|exemples de Gym]] proposent Pendulum, il faut redresser le pendule en applicant un couple sur l'axe. Ici nous déplaçons le chariot pour le Swing. Cet exemple est construit à partir de[[https://github.com/TTitcombe/CartPoleSwingUp|CartPoleSwingUp]]. Il y a beaucoup d'autres dépôts sur GitHub sur ce problème.\\
 +Les sources sont dans le dossier **[[https://github.com/sergeLabo/balance/tree/main/redressement|redressement]]** de balance. [[https://github.com/sergeLabo/balance/blob/main/redressement/swing_avec_reprise.py|Training ou Rendu]] en modifiant le script ligne 47.L'import de my_gym est réalisé avec un chemin absolu, pour tester il faut adapter ce chemin à votre cas.\\
 +Ce pendule a été construit dans l'**Atelier du C01N de mon salon**:
  
-Les [[https://gym.openai.com/envs/Pendulum-v0/|exemples de Gym]] proposent Pendulumil faut redresser le pendule en applicant un couple sur l'axe.\\ +{{ :media_14:swingup_dans_le_blender_game_engine.mp4?500 |}} 
-Ici nous déplaçons le chariot pour le SwingCet exemple est construit à partir de[[https://github.com/TTitcombe/CartPoleSwingUp|CartPoleSwingUp]]. Il a beaucoup d'autres dépôts sur GitHub sur ce problème.+ 
 +L'apprentissage a duré 88 heures, 17 millions de stepsplus plusieurs semaines de recherches et d'ordinateurs qui calcule 24h/24hLe fichier de poids fonctionne sur Xubuntu 18.4 mais pas sur Debian 10il doit avoir une version d'une des librairies qui diffèrent
  
-Un résultat après 6 heures d'apprentissage, soit 1 million de steps. 
-{{ vimeo>504768109?large }} 
-Vous pouvez remarquer que maintenant c'est en couleurs! 
 =====Quelques explications===== =====Quelques explications=====
-====Comment améliorer le SwingUp==== +====Relations scripts vs Blender==== 
-===Actions discrètes ou continue=== +L'apprentissage exécuté avec [[https://github.com/sergeLabo/balance/blob/main/my_cartpole_ppo2_train.py#L21|model.learn()]] est une boucle qui appelle la méthode step() de [[https://github.com/sergeLabo/balance/blob/main/my_gym/gym/envs/classic_control/my_cartpole.py#L79|my_cartpole.py]] ou [[https://github.com/sergeLabo/balance/blob/main/my_gym/gym/envs/cartpoleswingup/my_swing_continuous.py#L119|my_swing_continuous.py]], avec une action en argument.\\ 
-  * Dans CartPole, les actions sont discrètes, **une force fixe est appliquée __à chaque step__**, vers la gauche ou vers la droite. Le chariot est toujours en mouvement   +L'action possible est définie par action_space: discrète ou continue.\\ 
-  * Pour SwingUp de l'exemple ci-dessus, la même méthode est utilisée. Mais les actions auraient besoin d'être forte pour le relevé et plus faible pour le maintenir en haut. Les actions sont toujours appliquées à chaque step.+Dans step(action), l'action est envoyée en OSC  à Blender, step() attend la réponse qui est envoyée la frame suivante. Cette réponse est une observation à cet instant, position et vitesse du chariot, angle et vitesse angulaire du pendule.\\ 
 + 
 +**Dans gym**, dans my_cartpole.py\\ 
 +step() retourne l'observation, la récompense = reward, si c'est fini = done\\ 
 +Si done = 1, un [[https://github.com/sergeLabo/balance/blob/main/my_gym/gym/envs/classic_control/my_cartpole.py#L114|reset()]] est fait.\\ 
 +done = 1 si 20 < x ou x < 20 ou teta > 0.1 ou teta < -0.1, donc si le chariot est trop décalé, ou si le pendule est parti pour tomber. Il y a aussi un nombre maxi d'itération qui provoque un reset() défini dans [[https://github.com/sergeLabo/balance/blob/main/my_gym/gym/envs/__init__.py#L84|__init__.py#L84]] \\ 
 +Une récompense (reward) est calculée à chaque step.\\ 
 +Le principe est le même dans my_swing_continuous.py 
 +====Comment a été amélioré le SwingUp ?==== 
 +===Actions discrètes ou continues=== 
 +  * Dans CartPole, les actions sont discrètes, **une force fixe est appliquée __à chaque step__**, vers la gauche ou vers la droite. Cette action est appliquée par une vitesse dans Blender  
 +  * Pour SwingUp de l'exemple ci-dessus, la même méthode est utilisée. Mais les actions sont comprises entre -1 et 1.
  
 Définition des actions, avec 2 valeurs possibles: 0 ou 1, 0 = force à gauche, 1 = force à droite Définition des actions, avec 2 valeurs possibles: 0 ou 1, 0 = force à gauche, 1 = force à droite
- 
   action_space = spaces.Discrete(2)   action_space = spaces.Discrete(2)
      
 Définition des actions de SwingUp, avec des valeurs possibles entre -1 et 1 Définition des actions de SwingUp, avec des valeurs possibles entre -1 et 1
- 
   action_space = spaces.Box(-1.0, 1.0, shape=(1,))   action_space = spaces.Box(-1.0, 1.0, shape=(1,))
  
 ===Algorithme d'apprentissage=== ===Algorithme d'apprentissage===
 +L'algorithme d'optimisation est **[[https://stable-baselines.readthedocs.io/en/master/modules/ppo2.html|PPO2]]** dans les 2 cas. De longs essais avec **[[https://stable-baselines.readthedocs.io/en/master/modules/ddpg.html|DDPG]]** n'a rien donné de bien. D'autres algorithmes sont possibles. L'objectif de l'auteur était d'y arriver, **quoiqu'il en coûte**. Que le training dure longtemps ne donne pas une mauvaise note !
  
-L'algorithme d'optimisation est **[[https://stable-baselines.readthedocs.io/en/master/modules/ppo2.html|PPO2]]** dans les 2 cas**[[https://stable-baselines.readthedocs.io/en/master/modules/ddpg.html|DDPG]]** avec des actions "continuesserait mieux+===Récompense revue pour les débuts des calculs==== 
 +La plage de récompense sur x a été réduite à +ou2le chariot ne fonce plus en bout de course.\\ 
 +Après un long apprentissagele pendule ne se stabilise pas en haut, il préfère tourner en rondLa formule de récompense ne favorise pas la stabilisation en hautAjout d'une récompense en haut = RV, utilisée pour les 5 premiers millions de steps. 
 +  Si le pendule est proche de la position verticale avec une vitesse angulaire faible, la récompense "vitesseest 1 
 +  * Si la vitesse est proche de la vitesse angulaire maxi (environ=5), la récompense n'est que de 0.8
  
-====Relations scripts vs Blender==== +  reward_total reward_chariot * reward_balancier * RV
-L'apprentissage exécuté avec [[https://github.com/sergeLabo/balance/blob/main/my_cartpole_ppo2_train.py#L18|model.learn()]] est une boucle qui appelle la méthode step() de [[https://github.com/sergeLabo/balance/blob/main/my_gym/gym/envs/classic_control/my_cartpole.py|my_cartpole.py]] ou [[https://github.com/sergeLabo/balance/blob/main/my_gym/gym/envs/cartpoleswingup/cartpoleswingup.py|cartpoleswingup.py]], avec une action en argument.\\ +
-L'action possible est définie par action_space: discrète ou continue.\\ +
-Dans step(action), l'action est envoyée en OSC  à Blender, step() attend la réponse qui est envoyée 2 frames plus tard. Cette réponse est une observation à cet instant, position et vitesse du chariot, angle et vitesse angulaire du pendule.\\+
  
-step() retourne l'observation, la récompense reward, si c'est fini done\\ +=====Repartir d'un apprentissage terminé et Enregistrement intermédiaire===== 
-Si done 1un [[https://github.com/sergeLabo/balance/blob/main/my_gym/gym/envs/classic_control/my_cartpole.py#L114|reset()]] est fait.\\ +Comment repartir du fichier PPO2_Swing_35.zipet enregistrement tous les 100 000 stepsHow to create checkpoints ? 
-done = 1 si 20 < x ou x < 20 ou teta > 0.1 ou teta < -0.1donc si le chariot est trop décaléou si le pendule est parti pour tomber. Il y a aussi un nombre maxi d'itération qui provoque un reset() défini dans [[https://github.com/sergeLabo/balance/blob/main/my_gym/gym/envs/__init__.py#L84|__init__.py#L84]] \\ + 
-Une récompense (rewardest calculée si le pendule n'est pas tombé ou si la boucle est finie.+<code python> 
 +import gym 
 +from time import time, strftime 
 +from stable_baselines.common.policies import MlpPolicy 
 +from stable_baselines.common import make_vec_env 
 +from stable_baselines import PPO2 
 + 
 +log = strftime("%Y%m%d-%H%M%S"
 +env = make_vec_env('CartPoleSwingUpContinuous-v0', n_envs=1
 +model = PPO2.load("./weights/PPO2_Swing_35.zip"env=envcloudpickle=False, verbose=0) 
 +for i in range(20): 
 +    model.learn(total_timesteps=100000) 
 +    partial = "./weights/SR-" + log + "-" + str(i) 
 +    model.save(partial, cloudpickle=False) 
 +</code>
  
 =====Ressources complémentaires===== =====Ressources complémentaires=====
-====Gym CartPole Ressources====+====Quels sonts les défauts de Gym ?==== 
 +Gym impose un cadre pour tous les chercheurs de RL, ce qui permet de faire des comparaisons entre les solutions.\\ 
 +Mais cela empêche de trouver des solutions originales. En Intelligence Artificielle, trop de méthodes sont empiriques et pifométriques. Il y a certainement des solutions innovantes à inventer. 
  
-  [[https://github.com/openai/gym/wiki/CartPole-v0|CartPole-v0]] wiki @ github.com+====Réflexions philosophiques==== 
 +  Ce type d'apprentissage s'appelle la carotte **et** le bâtonmanagement très pratiquéOn promet des carottes mais on ne donne que des coups de bâtons. 
 +  * Encore pratiqué dans l'enseignement en France, alors que les pays nordiques considèrent les apprenants comme des êtres humains responsables. 
 +====Gym CartPole Ressources====
  
-Définition des Observations = Liste de 4 items:\\ +  * [[https://github.com/openai/gym/wiki/CartPole-v0|CartPole-v0]] 
-^ Num ^  Observation          Min      Max   ^ +
-| 0   | Cart Position        | -2.4     | 2.4    | +
-| 1   | Cart Velocity        | -Inf     Inf    | +
-| 2   | Pole Angle           | ~ -41.8° | ~ 41.8°| +
-| 3   | Pole Velocity At Tip | -Inf      Inf   |+
  
 ====pybullet===== ====pybullet=====
Ligne 283: Ligne 271:
 Bullet est le moteur physique de Blender Bullet est le moteur physique de Blender
  
-==== Création de votre propre environnement ==== 
-  * [[https://github.com/openai/gym/blob/master/docs/creating-environments.md|How to create new environments for Gym]] @  openai / gym\\ 
  
-L'étape suivante de la visualisation dans blender serait de créer un environnement spécifique pour ce my_cartpole et l'installer en dur. Puis d'utiliser gym en l'installant et supprimant les imports locaux de gym. 
  
 ====Un cartpole réel documenté mais sans RL==== ====Un cartpole réel documenté mais sans RL====
apprentissage_par_renforcement.1611831718.txt.gz · Dernière modification : 2021/01/28 11:01 de serge